diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 609f811f3d58b182a5018f22912ea340e1e4cac6..31f3a01bf1fbbcb972378b6632f46ad319a74337 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -152,7 +152,12 @@ build-job:       # This job runs in the build stage, which runs first.
     # - apt-cache gencaches
     # - apt install -y zip unzip
     # - zip --help
+    # - echo "Cleaning caches"
+    - rm -rf $CI_PROJECT_DIR/.m2/*
+    - rm -rf ~/.m2/*
+    # - ls $CI_PROJECT_DIR/.m2/repository
     - echo "Compiling the code..."
+    - top -b -n 1 -e m
     - echo "BUILD_JOB_ID=$CI_JOB_ID" >> build.env
     - cat build.env
     - cd org.etsi.mts.tdl.parent
diff --git a/features/org.etsi.mts.tdl.converters.feature/feature.xml b/features/org.etsi.mts.tdl.converters.feature/feature.xml
index 4a6703c6e62a86b87deb914fb818136d69225f8f..1b35cf34d5f1c847c862ad3cf803ae1bd0d32412 100644
--- a/features/org.etsi.mts.tdl.converters.feature/feature.xml
+++ b/features/org.etsi.mts.tdl.converters.feature/feature.xml
@@ -374,4 +374,11 @@ any resulting litigation.
          version="0.0.0"
          unpack="false"/>
 
+   <plugin
+         id="org.etsi.mts.tdl.yang2tdl"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
 </feature>
diff --git a/features/org.etsi.mts.tdl.execution.feature/.project b/features/org.etsi.mts.tdl.execution.feature/.project
index 64a248ec85b2b95c3e053f717207d155d472b000..26314baa2a886d0aaa8aeb77c405bea090b0c995 100644
--- a/features/org.etsi.mts.tdl.execution.feature/.project
+++ b/features/org.etsi.mts.tdl.execution.feature/.project
@@ -20,4 +20,15 @@
 		<nature>org.eclipse.m2e.core.maven2Nature</nature>
 		<nature>org.eclipse.pde.FeatureNature</nature>
 	</natures>
+	<filteredResources>
+		<filter>
+			<id>1705077780099</id>
+			<name></name>
+			<type>30</type>
+			<matcher>
+				<id>org.eclipse.core.resources.regexFilterMatcher</id>
+				<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
 </projectDescription>
diff --git a/features/org.etsi.mts.tdl.execution.feature/feature.xml b/features/org.etsi.mts.tdl.execution.feature/feature.xml
index cc7ae3386e79bfebae4855e421f485a905be81de..d0c2a6dd58df95e0ef4fdfc997794edb136e4db6 100644
--- a/features/org.etsi.mts.tdl.execution.feature/feature.xml
+++ b/features/org.etsi.mts.tdl.execution.feature/feature.xml
@@ -315,4 +315,11 @@ any resulting litigation.
          version="0.0.0"
          unpack="false"/>
 
+   <plugin
+         id="org.etsi.mts.tdl.execution.java.codegen"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
 </feature>
diff --git a/features/org.etsi.mts.tdl.graphical.editor.feature/.project b/features/org.etsi.mts.tdl.graphical.editor.feature/.project
index 0df058158812834a68a2e60f341a4feb3be28d6f..21031bf3244c5f2653c9cf454fd5dabdc48450d4 100644
--- a/features/org.etsi.mts.tdl.graphical.editor.feature/.project
+++ b/features/org.etsi.mts.tdl.graphical.editor.feature/.project
@@ -20,4 +20,15 @@
 		<nature>org.eclipse.m2e.core.maven2Nature</nature>
 		<nature>org.eclipse.pde.FeatureNature</nature>
 	</natures>
+	<filteredResources>
+		<filter>
+			<id>1705077780106</id>
+			<name></name>
+			<type>30</type>
+			<matcher>
+				<id>org.eclipse.core.resources.regexFilterMatcher</id>
+				<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
 </projectDescription>
diff --git a/features/org.etsi.mts.tdl.model.feature/feature.xml b/features/org.etsi.mts.tdl.model.feature/feature.xml
index 9a83e6d1b87047b219e6ce01be76c9e5ec9e2b60..86e7d47edf57d02b18449921a6f4cd9f1ec43543 100644
--- a/features/org.etsi.mts.tdl.model.feature/feature.xml
+++ b/features/org.etsi.mts.tdl.model.feature/feature.xml
@@ -321,4 +321,11 @@ any resulting litigation.
          version="0.0.0"
          unpack="false"/>
 
+   <plugin
+         id="org.etsi.mts.tdl.library"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
 </feature>
diff --git a/features/org.etsi.mts.tdl.tools.to.docx.feature/.project b/features/org.etsi.mts.tdl.tools.to.docx.feature/.project
index deed3e6bd692d3b0d41a7a1fd02d3edfe04b7aa4..18fac50f3bb11c153f4870b101d8b3b0fb996ece 100644
--- a/features/org.etsi.mts.tdl.tools.to.docx.feature/.project
+++ b/features/org.etsi.mts.tdl.tools.to.docx.feature/.project
@@ -20,4 +20,15 @@
 		<nature>org.eclipse.m2e.core.maven2Nature</nature>
 		<nature>org.eclipse.pde.FeatureNature</nature>
 	</natures>
+	<filteredResources>
+		<filter>
+			<id>1705077780117</id>
+			<name></name>
+			<type>30</type>
+			<matcher>
+				<id>org.eclipse.core.resources.regexFilterMatcher</id>
+				<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
 </projectDescription>
diff --git a/features/org.etsi.mts.tdl.ttcn3.feature/.project b/features/org.etsi.mts.tdl.ttcn3.feature/.project
index a82aa2ecfb93084a4538a5cf3dcd1df54a168430..f2003d3bddbfa6dfe54420740b02186ffda54e6c 100644
--- a/features/org.etsi.mts.tdl.ttcn3.feature/.project
+++ b/features/org.etsi.mts.tdl.ttcn3.feature/.project
@@ -20,4 +20,15 @@
 		<nature>org.eclipse.m2e.core.maven2Nature</nature>
 		<nature>org.eclipse.pde.FeatureNature</nature>
 	</natures>
+	<filteredResources>
+		<filter>
+			<id>1705077780119</id>
+			<name></name>
+			<type>30</type>
+			<matcher>
+				<id>org.eclipse.core.resources.regexFilterMatcher</id>
+				<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
 </projectDescription>
diff --git a/features/org.etsi.mts.tdl.util.feature/.project b/features/org.etsi.mts.tdl.util.feature/.project
index c1918b5713abed96c48cd4955b1dfce2df5540db..4c5e926264fdb3c0bac1a069d4a2f63bbeaceb18 100644
--- a/features/org.etsi.mts.tdl.util.feature/.project
+++ b/features/org.etsi.mts.tdl.util.feature/.project
@@ -20,4 +20,15 @@
 		<nature>org.eclipse.m2e.core.maven2Nature</nature>
 		<nature>org.eclipse.pde.FeatureNature</nature>
 	</natures>
+	<filteredResources>
+		<filter>
+			<id>1705077780128</id>
+			<name></name>
+			<type>30</type>
+			<matcher>
+				<id>org.eclipse.core.resources.regexFilterMatcher</id>
+				<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
 </projectDescription>
diff --git a/org.etsi.mts.tdl.parent/.project b/org.etsi.mts.tdl.parent/.project
index a65215cfe368a6232fd11310c05b7867f252f3b7..32543298134d0a8bf5918b0d89b5c12f7124e304 100644
--- a/org.etsi.mts.tdl.parent/.project
+++ b/org.etsi.mts.tdl.parent/.project
@@ -14,4 +14,15 @@
 	<natures>
 		<nature>org.eclipse.m2e.core.maven2Nature</nature>
 	</natures>
+	<filteredResources>
+		<filter>
+			<id>1705077780114</id>
+			<name></name>
+			<type>30</type>
+			<matcher>
+				<id>org.eclipse.core.resources.regexFilterMatcher</id>
+				<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
 </projectDescription>
diff --git a/org.etsi.mts.tdl.parent/pom.xml b/org.etsi.mts.tdl.parent/pom.xml
index 0ba5e19aace2a5798288d2c05ca9b062f335b6a3..6107ac1b8a0f9a0a4bd01986adbf2a3776223c80 100644
--- a/org.etsi.mts.tdl.parent/pom.xml
+++ b/org.etsi.mts.tdl.parent/pom.xml
@@ -13,6 +13,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xs
 		<module>../plugins/org.etsi.mts.tdl.model</module>
 		<module>../plugins/org.etsi.mts.tdl.common</module>
 		<module>../plugins/org.etsi.mts.tdl.helper</module>
+		<module>../plugins/org.etsi.mts.tdl.library</module>
 		<!-- Textual Legacy -->
 		<module>../plugins/org.etsi.mts.tdl.TDLan2</module>
 		<module>../plugins/org.etsi.mts.tdl.TDLan2.ide</module>
@@ -35,18 +36,21 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xs
 		<module>../plugins/org.etsi.mts.tdl.json2tdl</module>
 		<module>../plugins/org.etsi.mts.tdl.to2tdl</module>
 		<module>../plugins/org.etsi.mts.tdl.asn2tdl</module>
+		<module>../plugins/org.etsi.mts.tdl.yang2tdl</module>
+		<module>../plugins/org.etsi.mts.tdl.yang2json</module>
 		<module>../plugins/org.etsi.mts.tdl.ttcn3</module>
 		<module>../plugins/org.etsi.mts.tdl.ttcn3.ui</module>
 		<module>../plugins/org.etsi.mts.tdl.importers.ui</module>
 		<!-- Converters Legacy -->
-		<module>../plugins/org.etsi.mts.tdl.tools.to.docx</module>
-		<module>../plugins/org.etsi.mts.tdl.tools.to.docx.ui</module>
+		<!-- <module>../plugins/org.etsi.mts.tdl.tools.to.docx</module> -->
+		<!-- <module>../plugins/org.etsi.mts.tdl.tools.to.docx.ui</module> -->
 		<!-- Extras -->
 		<module>../plugins/org.etsi.mts.tdl.rt.ui</module>
 		<module>../plugins/org.etsi.mts.tdl.perspective</module>
 		<module>../plugins/org.etsi.mts.tdl.project</module>		
 		<module>../plugins/org.etsi.mts.tdl.wizards</module>
 		<module>../plugins/org.etsi.mts.tdl.execution.java</module>
+		<module>../plugins/org.etsi.mts.tdl.execution.java.codegen</module>
 		<!-- Constraints -->
 		<module>../plugins/org.etsi.mts.tdl.constraints</module>
 		<module>../plugins/org.etsi.mts.tdl.constraints.ui</module>
diff --git a/org.etsi.mts.tdl.parent/top.target b/org.etsi.mts.tdl.parent/top.target
index 8e9b747c643f4f7130d4e81ea3060f8f478066f0..6e0817be3794342d825cc016af8d51a365563f39 100644
--- a/org.etsi.mts.tdl.parent/top.target
+++ b/org.etsi.mts.tdl.parent/top.target
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?pde version="3.8"?>
-<target name="targetplatform.target" sequenceNumber="1">
+<target name="top.target" sequenceNumber="1">
 <locations>
 <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
 <unit id="org.eclipse.platform.feature.group" version="0.0.0"/>
@@ -12,7 +12,7 @@
 <unit id="com.google.gson" version="0.0.0"/>
 <unit id="org.eclipse.sirius.specifier.feature.group" version="0.0.0"/>
 <unit id="org.eclipse.sirius.aql.feature.group" version="0.0.0"/>
-<repository location="https://download.eclipse.org/releases/2023-09"/>
+<repository location="https://download.eclipse.org/releases/2024-09"/>
 </location>
 <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
 <unit id="org.eclipse.emf.mwe2.launcher.feature.group" version="0.0.0"/>
@@ -20,6 +20,7 @@
 </location>
 <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
 <unit id="org.eclipse.xtext.sdk.feature.group" version="0.0.0"/>
+<unit id="org.eclipse.xtext.generator" version="0.0.0"/>
 <repository location="https://download.eclipse.org/modeling/tmf/xtext/updates/releases/2.32.0/"/>
 </location>
 <location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit">
@@ -61,13 +62,15 @@
 		<unit id="org.opentest4j" version="1.2.0.v20211018-1956"/>
 		<unit id="org.apache.xmlbeans" version="3.1.0.v20221112-0806"/>
 		<unit id="org.apache.commons.compress" version="1.21.0.v20211103-2100"/>
+		<unit id="org.apache.commons.logging" version="0.0.0"/>
+		<unit id="org.apache.logging.log4j" version="2.17.1.v20220106-2156"/>
 		<unit id="com.fasterxml.jackson.core.jackson-core" version="2.13.2.v20220426-1653"/>
 		<unit id="com.fasterxml.jackson.core.jackson-databind" version="2.13.2.v20220426-1653"/>
 		<unit id="com.fasterxml.jackson.core.jackson-annotations" version="2.13.2.v20220426-1653"/>
 	</location>
 	<location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit">
 		<repository location="https://top.etsi.org/top-extras/updatesite/stable"/>
-		<unit id="org.etsi.mts.tdl.extras.feature.feature.group" version="1.0.0.202311021145"/>
+		<unit id="org.etsi.mts.tdl.extras.feature.feature.group" version="0.0.0"/>
 	</location>
 </locations>
-</target>
\ No newline at end of file
+</target>
diff --git a/plugins/org.etsi.mts.tdl.TDLan2/.launch/TOP (1).launch b/plugins/org.etsi.mts.tdl.TDLan2/.launch/TOP (1).launch
index 6fc4305c9b7902e2a6ef95665c53cffbcf46c596..2892d6749c9da9c0d038cb00610f8012987e1f7a 100644
--- a/plugins/org.etsi.mts.tdl.TDLan2/.launch/TOP (1).launch	
+++ b/plugins/org.etsi.mts.tdl.TDLan2/.launch/TOP (1).launch	
@@ -32,13 +32,12 @@
     <stringAttribute key="pde.version" value="3.3"/>
     <stringAttribute key="product" value="org.eclipse.platform.ide"/>
     <setAttribute key="selected_target_bundles">
-        <setEntry value="com.google.guava@default:default"/>
+        <setEntry value="com.google.guava*32.1.3.jre@default:default"/>
         <setEntry value="com.google.inject@default:default"/>
         <setEntry value="com.ibm.icu@default:default"/>
         <setEntry value="com.jcraft.jsch@default:default"/>
         <setEntry value="com.sun.jna.platform@default:default"/>
         <setEntry value="com.sun.jna@default:default"/>
-        <setEntry value="io.github.classgraph@default:default"/>
         <setEntry value="jakarta.servlet-api@default:default"/>
         <setEntry value="javax.annotation@default:default"/>
         <setEntry value="javax.inject@default:default"/>
@@ -64,8 +63,6 @@
         <setEntry value="org.apache.felix.gogo.shell@default:default"/>
         <setEntry value="org.apache.felix.scr@1:true"/>
         <setEntry value="org.apache.log4j@default:default"/>
-        <setEntry value="org.apache.lucene.analyzers-common@default:default"/>
-        <setEntry value="org.apache.lucene.analyzers-smartcn@default:default"/>
         <setEntry value="org.apache.lucene.core@default:default"/>
         <setEntry value="org.apache.xerces@default:default"/>
         <setEntry value="org.apache.xml.resolver@default:default"/>
@@ -89,7 +86,6 @@
         <setEntry value="org.eclipse.core.databinding@default:default"/>
         <setEntry value="org.eclipse.core.expressions@default:default"/>
         <setEntry value="org.eclipse.core.filebuffers@default:default"/>
-        <setEntry value="org.eclipse.core.filesystem.macosx@default:false"/>
         <setEntry value="org.eclipse.core.filesystem@default:default"/>
         <setEntry value="org.eclipse.core.jobs@default:default"/>
         <setEntry value="org.eclipse.core.net@default:default"/>
@@ -118,7 +114,6 @@
         <setEntry value="org.eclipse.e4.ui.services@default:default"/>
         <setEntry value="org.eclipse.e4.ui.widgets@default:default"/>
         <setEntry value="org.eclipse.e4.ui.workbench.addons.swt@default:default"/>
-        <setEntry value="org.eclipse.e4.ui.workbench.renderers.swt.cocoa@default:false"/>
         <setEntry value="org.eclipse.e4.ui.workbench.renderers.swt@default:default"/>
         <setEntry value="org.eclipse.e4.ui.workbench.swt@default:default"/>
         <setEntry value="org.eclipse.e4.ui.workbench3@default:default"/>
@@ -186,7 +181,6 @@
         <setEntry value="org.eclipse.equinox.p2.updatesite@default:default"/>
         <setEntry value="org.eclipse.equinox.preferences@default:default"/>
         <setEntry value="org.eclipse.equinox.registry@default:default"/>
-        <setEntry value="org.eclipse.equinox.security.macosx@default:false"/>
         <setEntry value="org.eclipse.equinox.security@default:default"/>
         <setEntry value="org.eclipse.equinox.simpleconfigurator.manipulator@default:default"/>
         <setEntry value="org.eclipse.equinox.simpleconfigurator@1:true"/>
@@ -226,8 +220,6 @@
         <setEntry value="org.eclipse.help.ui@default:default"/>
         <setEntry value="org.eclipse.help@default:default"/>
         <setEntry value="org.eclipse.jdt.apt.core@default:default"/>
-        <setEntry value="org.eclipse.jdt.compiler.apt@default:false"/>
-        <setEntry value="org.eclipse.jdt.compiler.tool@default:false"/>
         <setEntry value="org.eclipse.jdt.core.manipulation@default:default"/>
         <setEntry value="org.eclipse.jdt.core@default:default"/>
         <setEntry value="org.eclipse.jdt.debug@default:default"/>
@@ -246,12 +238,6 @@
         <setEntry value="org.eclipse.jface@default:default"/>
         <setEntry value="org.eclipse.ltk.core.refactoring@default:default"/>
         <setEntry value="org.eclipse.ltk.ui.refactoring@default:default"/>
-        <setEntry value="org.eclipse.modisco.eclipseplugin@default:default"/>
-        <setEntry value="org.eclipse.modisco.infra.common.core@default:default"/>
-        <setEntry value="org.eclipse.modisco.java@default:default"/>
-        <setEntry value="org.eclipse.modisco.manifest@default:default"/>
-        <setEntry value="org.eclipse.modisco.omg.kdm@default:default"/>
-        <setEntry value="org.eclipse.modisco.xml@default:default"/>
         <setEntry value="org.eclipse.ocl.common.ui@default:default"/>
         <setEntry value="org.eclipse.ocl.common@default:default"/>
         <setEntry value="org.eclipse.ocl.ecore@default:default"/>
@@ -315,7 +301,6 @@
         <setEntry value="org.eclipse.team.ui@default:default"/>
         <setEntry value="org.eclipse.text@default:default"/>
         <setEntry value="org.eclipse.ui.cheatsheets@default:default"/>
-        <setEntry value="org.eclipse.ui.cocoa@default:false"/>
         <setEntry value="org.eclipse.ui.console@default:default"/>
         <setEntry value="org.eclipse.ui.editors@default:default"/>
         <setEntry value="org.eclipse.ui.forms@default:default"/>
@@ -375,6 +360,11 @@
         <setEntry value="org.w3c.dom.svg@default:default"/>
     </setAttribute>
     <setAttribute key="selected_workspace_bundles">
+        <setEntry value="de.ugoe.cs.swe.T3Q@default:default"/>
+        <setEntry value="de.ugoe.cs.swe.TTCN3.tests@default:default"/>
+        <setEntry value="de.ugoe.cs.swe.TTCN3.ui@default:default"/>
+        <setEntry value="de.ugoe.cs.swe.TTCN3@default:default"/>
+        <setEntry value="de.ugoe.cs.swe.TTCN3Configuration@default:default"/>
         <setEntry value="org.etsi.mts.tdl.TDLan2.ide@default:default"/>
         <setEntry value="org.etsi.mts.tdl.TDLan2.ui@default:default"/>
         <setEntry value="org.etsi.mts.tdl.TDLan2@default:default"/>
@@ -387,17 +377,18 @@
         <setEntry value="org.etsi.mts.tdl.constraints.ui@default:default"/>
         <setEntry value="org.etsi.mts.tdl.constraints@default:default"/>
         <setEntry value="org.etsi.mts.tdl.execution.java@default:default"/>
+        <setEntry value="org.etsi.mts.tdl.extras.openapi.generator.wrapper@default:default"/>
         <setEntry value="org.etsi.mts.tdl.graphical.labels.data.ui@default:default"/>
         <setEntry value="org.etsi.mts.tdl.graphical.labels.data@default:default"/>
         <setEntry value="org.etsi.mts.tdl.graphical.viewpoint@default:default"/>
         <setEntry value="org.etsi.mts.tdl.importers.ui@default:default"/>
         <setEntry value="org.etsi.mts.tdl.json2tdl@default:default"/>
+        <setEntry value="org.etsi.mts.tdl.library@default:default"/>
         <setEntry value="org.etsi.mts.tdl.model@default:default"/>
         <setEntry value="org.etsi.mts.tdl.openapi.generator.ui@default:default"/>
-        <setEntry value="org.etsi.mts.tdl.openapi.generator.wrapper@default:default"/>
         <setEntry value="org.etsi.mts.tdl.openapi2tdl.next@default:default"/>
-        <setEntry value="org.etsi.mts.tdl.openapi2tdl@default:default"/>
         <setEntry value="org.etsi.mts.tdl.perspective@default:default"/>
+        <setEntry value="org.etsi.mts.tdl.project@default:default"/>
         <setEntry value="org.etsi.mts.tdl.rt.ui@default:default"/>
         <setEntry value="org.etsi.mts.tdl.to2tdl@default:default"/>
         <setEntry value="org.etsi.mts.tdl.tools.to.docx.poi.ui@default:default"/>
@@ -413,6 +404,8 @@
         <setEntry value="org.etsi.mts.tdl.txi.ui@default:default"/>
         <setEntry value="org.etsi.mts.tdl.txi@default:default"/>
         <setEntry value="org.etsi.mts.tdl.wizards@default:default"/>
+        <setEntry value="org.etsi.mts.tdl.yang2json@default:default"/>
+        <setEntry value="org.etsi.mts.tdl.yang2tdl@default:default"/>
     </setAttribute>
     <booleanAttribute key="show_selected_only" value="false"/>
     <stringAttribute key="templateConfig" value="${target_home}/configuration/config.ini"/>
diff --git a/plugins/org.etsi.mts.tdl.common/src/org/etsi/mts/tdl/scoping/TDLScopeProvider.java b/plugins/org.etsi.mts.tdl.common/src/org/etsi/mts/tdl/scoping/TDLScopeProvider.java
index 38d2097c4579a916e4f1295970b27a017d1a52aa..904cd360a6070482f2556e42a9b3eb858ed41bce 100644
--- a/plugins/org.etsi.mts.tdl.common/src/org/etsi/mts/tdl/scoping/TDLScopeProvider.java
+++ b/plugins/org.etsi.mts.tdl.common/src/org/etsi/mts/tdl/scoping/TDLScopeProvider.java
@@ -24,6 +24,7 @@ import org.etsi.mts.tdl.Action;
 import org.etsi.mts.tdl.ActionReference;
 import org.etsi.mts.tdl.Behaviour;
 import org.etsi.mts.tdl.Block;
+import org.etsi.mts.tdl.CastDataUse;
 import org.etsi.mts.tdl.CollectionDataType;
 import org.etsi.mts.tdl.ComponentInstance;
 import org.etsi.mts.tdl.ComponentInstanceBinding;
@@ -201,7 +202,8 @@ public class TDLScopeProvider extends AbstractDeclarativeScopeProvider {
 						if (!targets.isEmpty()) {
 							ICompositeNode oppositeNode = NodeModelUtils.findActualNodeFor(targets.get(0));
 							if (oppositeNode != null) {
-								String targetGateName = oppositeNode.getText()
+								String text = NodeModelUtils.getTokenText(oppositeNode);
+								String targetGateName = text
 										.replaceAll("(the|a|an)\\s+", "")
 										.replaceAll("(?s)where\\s+it\\s+is.+", "")
 										.replaceAll("(?s)assigned\\s*.+", "")
@@ -382,10 +384,50 @@ public class TDLScopeProvider extends AbstractDeclarativeScopeProvider {
 						return scope;
 					} else if (dataElement == null) {
 						//TODO: use more widely! Will save a lot of the code in here...
+						//if reduction?
+						if (context.eContainer().eContainer() instanceof ParameterBinding) {
+							//TODO: use newly introduced resolveParameterType?
+							EList<MemberReference> reduction = ((ParameterBinding)context.eContainer().eContainer()).getReduction();
+							if (reduction.size() > 0) {
+								if (reduction.get(reduction.size()-1).getMember() == null) {
+									DataType dataType = ((ParameterBinding)reduction.get(reduction.size()-1).eContainer()).getParameter().getDataType();
+									if (dataType instanceof StructuredDataType) {
+										IScope scope = Scopes.scopeFor(((StructuredDataType)dataType).allMembers());
+										return scope;
+									} else if (dataType instanceof CollectionDataType) {
+										DataType itemType = ((CollectionDataType)dataType).getItemType();
+										if (itemType instanceof StructuredDataType) {
+											IScope scope = Scopes.scopeFor(((StructuredDataType) itemType).allMembers());
+											return scope;
+										}
+									}
+								} else {
+									DataType dataType = reduction.get(reduction.size()-1).getMember().getDataType();
+									if (dataType instanceof StructuredDataType) {
+										IScope scope = Scopes.scopeFor(((StructuredDataType)dataType).allMembers());
+										return scope;
+									} else if (dataType instanceof CollectionDataType) {
+										DataType itemType = ((CollectionDataType)dataType).getItemType();
+										if (itemType instanceof StructuredDataType) {
+											IScope scope = Scopes.scopeFor(((StructuredDataType) itemType).allMembers());
+											return scope;
+										}
+									}
+									IScope scope = Scopes.scopeFor(((StructuredDataType) dataType).allMembers());
+									return scope;
+								}
+							}
+						}
 						DataType resolvedDataType = ((DataElementUse)context.eContainer()).resolveDataType();
 						if (resolvedDataType instanceof StructuredDataType) {
 							IScope scope = Scopes.scopeFor(((StructuredDataType)resolvedDataType).allMembers());
 							return scope;
+						} else if (resolvedDataType instanceof CollectionDataType) {
+							DataType itemType = ((CollectionDataType)resolvedDataType).getItemType();
+							if (itemType instanceof StructuredDataType) {
+								IScope scope = Scopes.scopeFor(((StructuredDataType) itemType).allMembers());
+								return scope;
+							}
 						} else if (resolvedDataType == null) {
 //							DataType resolvedContextDataType = null;
 //							if (context.eContainer().eContainer() instanceof DataElementUse) {
@@ -403,6 +445,12 @@ public class TDLScopeProvider extends AbstractDeclarativeScopeProvider {
 						
 //					IScope scope = Scopes.scopeFor(dataElement.eContents());
 //					return scope;
+				} else if (context.eContainer() instanceof ParameterBinding) {
+					DataType pdt = ((ParameterBinding)context.eContainer()).getParameter().getDataType();
+					if (pdt instanceof StructuredDataType) {
+						IScope scope = Scopes.scopeFor(((StructuredDataType) pdt).allMembers());
+						return scope;
+					}
 				} else if (context.eContainer() instanceof LiteralValueUse) {
 					DataType resolvedDataType = ((LiteralValueUse)context.eContainer()).resolveDataType();
 					if (resolvedDataType instanceof StructuredDataType) {
@@ -411,46 +459,84 @@ public class TDLScopeProvider extends AbstractDeclarativeScopeProvider {
 					}
 				}
 			} else if (context instanceof MemberReference) {
-				if (((DataUse)context.eContainer()).getReduction().indexOf(context)>0) {
-					EObject targetContext = ((DataUse)context.eContainer()).getReduction().get(((DataUse)context.eContainer()).getReduction().indexOf(context)-1);
-					if (((MemberReference)targetContext).getMember()!=null) {
-						if (((MemberReference)targetContext).getMember().getDataType() instanceof StructuredDataType) {
-							IScope scope = Scopes.scopeFor(((StructuredDataType)((MemberReference)targetContext).getMember().getDataType()).allMembers());
-							return scope;
-						}
-					} else if (((MemberReference)targetContext).getCollectionIndex()!=null) {
-						if (targetContext.eContainer() instanceof DataInstanceUse) {
-							DataInstanceUse dataInstanceUse = (DataInstanceUse)targetContext.eContainer();
-							if (dataInstanceUse.getDataType()!=null) {
-								//TODO:?
-							} else if (dataInstanceUse.getDataInstance()!=null) {
-								//TODO: check type
-								DataType itemType = ((CollectionDataType)dataInstanceUse.getDataInstance().getDataType()).getItemType();
+				if (context.eContainer() instanceof ParameterBinding) {
+					//TODO: use newly introduced resolveParameterType?
+					if (((ParameterBinding)context.eContainer()).getReduction().indexOf(context)>0) {
+						EObject targetContext = ((ParameterBinding)context.eContainer()).getReduction().get(((ParameterBinding)context.eContainer()).getReduction().indexOf(context)-1);
+						if (((MemberReference)targetContext).getMember()!=null) {
+							if (((MemberReference)targetContext).getMember().getDataType() instanceof StructuredDataType) {
+								IScope scope = Scopes.scopeFor(((StructuredDataType)((MemberReference)targetContext).getMember().getDataType()).allMembers());
+								return scope;
+							} else if (((MemberReference)targetContext).getMember().getDataType() instanceof CollectionDataType) {
+								DataType itemType = ((CollectionDataType)((MemberReference)targetContext).getMember().getDataType()).getItemType();
 								if (itemType instanceof StructuredDataType) {
-									IScope scope = Scopes.scopeFor(((StructuredDataType)itemType).allMembers());
+									IScope scope = Scopes.scopeFor(((StructuredDataType) itemType).allMembers());
 									return scope;
 								}
 							}
-						} else if (targetContext.eContainer() instanceof DataElementUse) {
-							DataElementUse dataElementUse = (DataElementUse)targetContext.eContainer();
-							DataType resolvedDataType = dataElementUse.resolveDataType();
-							if (resolvedDataType instanceof StructuredDataType) {
-								IScope scope = Scopes.scopeFor(((StructuredDataType)resolvedDataType).allMembers());
+						} else if (((MemberReference)targetContext).getCollectionIndex() != null) {
+							DataType dataType = ((ParameterBinding)targetContext.eContainer()).getParameter().getDataType();
+							if (dataType instanceof StructuredDataType) {
+								IScope scope = Scopes.scopeFor(((StructuredDataType) dataType).allMembers());
 								return scope;
-							} else if (resolvedDataType instanceof CollectionDataType) {
-								DataType itemType = ((CollectionDataType)resolvedDataType).getItemType();
+							} else if (dataType instanceof CollectionDataType) {
+								DataType itemType = ((CollectionDataType)dataType).getItemType();
 								if (itemType instanceof StructuredDataType) {
 									IScope scope = Scopes.scopeFor(((StructuredDataType) itemType).allMembers());
 									return scope;
 								}
-								
 							}
-							
 						}
-						//TODO: handle other scenarios?
-						
+					} else {
+						DataType pdt = ((ParameterBinding)context.eContainer()).getParameter().getDataType();
+						if (pdt instanceof StructuredDataType) {
+							IScope scope = Scopes.scopeFor(((StructuredDataType) pdt).allMembers());
+							return scope;
+						}
 					}
 				} 
+				if (context.eContainer() instanceof DataUse) {
+					if (((DataUse)context.eContainer()).getReduction().indexOf(context)>0) {
+						EObject targetContext = ((DataUse)context.eContainer()).getReduction().get(((DataUse)context.eContainer()).getReduction().indexOf(context)-1);
+						if (((MemberReference)targetContext).getMember()!=null) {
+							if (((MemberReference)targetContext).getMember().getDataType() instanceof StructuredDataType) {
+								IScope scope = Scopes.scopeFor(((StructuredDataType)((MemberReference)targetContext).getMember().getDataType()).allMembers());
+								return scope;
+							}
+						} else if (((MemberReference)targetContext).getCollectionIndex()!=null) {
+							if (targetContext.eContainer() instanceof DataInstanceUse) {
+								DataInstanceUse dataInstanceUse = (DataInstanceUse)targetContext.eContainer();
+								if (dataInstanceUse.getDataType()!=null) {
+									//TODO:?
+								} else if (dataInstanceUse.getDataInstance()!=null) {
+									//TODO: check type
+									DataType itemType = ((CollectionDataType)dataInstanceUse.getDataInstance().getDataType()).getItemType();
+									if (itemType instanceof StructuredDataType) {
+										IScope scope = Scopes.scopeFor(((StructuredDataType)itemType).allMembers());
+										return scope;
+									}
+								}
+							} else if (targetContext.eContainer() instanceof DataElementUse) {
+								DataElementUse dataElementUse = (DataElementUse)targetContext.eContainer();
+								DataType resolvedDataType = dataElementUse.resolveDataType();
+								if (resolvedDataType instanceof StructuredDataType) {
+									IScope scope = Scopes.scopeFor(((StructuredDataType)resolvedDataType).allMembers());
+									return scope;
+								} else if (resolvedDataType instanceof CollectionDataType) {
+									DataType itemType = ((CollectionDataType)resolvedDataType).getItemType();
+									if (itemType instanceof StructuredDataType) {
+										IScope scope = Scopes.scopeFor(((StructuredDataType) itemType).allMembers());
+										return scope;
+									}
+									
+								}
+								
+							}
+							//TODO: handle other scenarios?
+							
+						}
+					} 
+				}
 				if (context.eContainer() instanceof DataInstanceUse) {
 					if (((DataInstanceUse)context.eContainer()).getDataInstance() instanceof StructuredDataInstance) {
 						DataInstance dataInstance = ((DataInstanceUse)context.eContainer()).getDataInstance();
@@ -478,8 +564,11 @@ public class TDLScopeProvider extends AbstractDeclarativeScopeProvider {
 					NamedElement dataElement = ((DataElementUse) context.eContainer()).getDataElement();
 					//TODO: duplicated from above ->extract
 					if (dataElement instanceof org.etsi.mts.tdl.Function) {
-						IScope scope = Scopes.scopeFor(((org.etsi.mts.tdl.Function)dataElement).getFormalParameter());
-						return scope;
+						DataType returnType = ((org.etsi.mts.tdl.Function)dataElement).getReturnType();
+						if (returnType instanceof StructuredDataType) {
+							IScope scope = Scopes.scopeFor(((StructuredDataType)returnType).allMembers());
+							return scope;
+						}
 					} else if (dataElement instanceof FormalParameter) {
 						IScope scope = Scopes.scopeFor(((StructuredDataType)((FormalParameter) dataElement).getDataType()).allMembers());
 						return scope;
@@ -505,6 +594,18 @@ public class TDLScopeProvider extends AbstractDeclarativeScopeProvider {
 						IScope scope = Scopes.scopeFor(((StructuredDataType)resolvedDataType).allMembers());
 						return scope;
 					}
+				} else if (context.eContainer() instanceof CastDataUse) {
+					DataType resolvedDataType = ((CastDataUse)context.eContainer()).resolveDataType();
+					if (resolvedDataType instanceof StructuredDataType) {
+						IScope scope = Scopes.scopeFor(((StructuredDataType)resolvedDataType).allMembers());
+						return scope;
+					}
+				} else if (context.eContainer() instanceof PredefinedFunctionCall) {
+//					DataType resolvedDataType = ((PredefinedFunctionCall)context.eContainer()).resolveDataType();
+//					if (resolvedDataType instanceof StructuredDataType) {
+//						IScope scope = Scopes.scopeFor(((StructuredDataType)resolvedDataType).allMembers());
+//						return scope;
+//					}
 				} else {
 				}
 			} else if (context instanceof ValueAssignment) {
diff --git a/plugins/org.etsi.mts.tdl.common/src/org/etsi/mts/tdl/transform/AbstractTranslator.java b/plugins/org.etsi.mts.tdl.common/src/org/etsi/mts/tdl/transform/AbstractTranslator.java
index eaab3188699a038385ab2531033418e54d2c9cfd..0268522a6301da84ba942c88f967cd3bc2991471 100644
--- a/plugins/org.etsi.mts.tdl.common/src/org/etsi/mts/tdl/transform/AbstractTranslator.java
+++ b/plugins/org.etsi.mts.tdl.common/src/org/etsi/mts/tdl/transform/AbstractTranslator.java
@@ -1,14 +1,20 @@
 package org.etsi.mts.tdl.transform;
 
+import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Optional;
+import java.util.Set;
 import java.util.TreeMap;
 import java.util.function.Predicate;
 
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.xtext.EcoreUtil2;
 import org.etsi.mts.tdl.Annotation;
 import org.etsi.mts.tdl.AnnotationType;
+import org.etsi.mts.tdl.CollectionDataType;
+import org.etsi.mts.tdl.Comment;
 import org.etsi.mts.tdl.Constraint;
 import org.etsi.mts.tdl.ConstraintType;
 import org.etsi.mts.tdl.DataElementMapping;
@@ -17,11 +23,13 @@ import org.etsi.mts.tdl.DataType;
 import org.etsi.mts.tdl.Element;
 import org.etsi.mts.tdl.ElementImport;
 import org.etsi.mts.tdl.EnumDataType;
+import org.etsi.mts.tdl.Extension;
 import org.etsi.mts.tdl.NamedElement;
 import org.etsi.mts.tdl.Package;
 import org.etsi.mts.tdl.PackageableElement;
 import org.etsi.mts.tdl.Parameter;
 import org.etsi.mts.tdl.ParameterMapping;
+import org.etsi.mts.tdl.SimpleDataInstance;
 import org.etsi.mts.tdl.SimpleDataType;
 import org.etsi.mts.tdl.StructuredDataInstance;
 import org.etsi.mts.tdl.StructuredDataType;
@@ -73,7 +81,15 @@ public abstract class AbstractTranslator {
 	protected EnumDataType getEnumDataTypeFor(String name) {
 		return getTypeFor(getCleanName(name), tdlPackage.Literals.ENUM_DATA_TYPE);
 	}
-	
+
+	protected SimpleDataInstance getSimpleDataInstanceFor(String name) {
+		return getTypeFor(getCleanName(name), tdlPackage.Literals.SIMPLE_DATA_INSTANCE);
+	}
+
+	protected SimpleDataInstance getEnumDataInstanceFor(String name, EnumDataType type) {
+		return getContentWithName(getCleanName(name), type, tdlPackage.Literals.SIMPLE_DATA_INSTANCE);
+	}
+
 	protected StructuredDataType getStructuredDataTypeFor(String name) {
 		return getTypeFor(getCleanName(name), tdlPackage.Literals.STRUCTURED_DATA_TYPE);
 	}
@@ -81,8 +97,41 @@ public abstract class AbstractTranslator {
 	protected StructuredDataInstance getStructuredDataInstanceFor(String name) {
 		return getTypeFor(getCleanName(name), tdlPackage.Literals.STRUCTURED_DATA_INSTANCE);
 	}
+	
+	protected CollectionDataType getCollectionDataTypeFor(DataType itemType) {
+		CollectionDataType collectionType = getTypeFor(itemType.getName() + "_collection",
+				tdlPackage.Literals.COLLECTION_DATA_TYPE);
+		collectionType.setItemType(itemType);
+		return collectionType;
+	}
 
-	protected String idStartDigitRegex = "\\A\\d";
+	protected <T extends DataType> void addSuperType(T type, T superType) {
+		if (superType == null)
+			return;
+		List<Extension> ext = null;
+		if (type instanceof SimpleDataType) {
+			Extension extension = ((SimpleDataType) type).getExtension();
+			if (extension != null)
+				ext = Collections.singletonList(extension);
+		}
+		if (type instanceof StructuredDataType)
+			ext = ((StructuredDataType) type).getExtension();
+		if (ext == null)
+			return;
+		for (Extension e : ext) {
+			if (e.getExtending().equals(superType))
+				return;
+		}
+		Extension e = tdlFactory.eINSTANCE.createExtension();
+		e.setExtending(superType);
+		if (type instanceof SimpleDataType)
+			((SimpleDataType) type).setExtension(e);
+		if (type instanceof StructuredDataType)
+			((StructuredDataType) type).getExtension().add(e);
+	}
+
+
+	protected String idStartDigitRegex = "\\A\\d.*";
 	protected String idInvalidCharRegex = "\\W";
 	public static String cleanName(String name) {
 		//TODO: use keywords filter?
@@ -95,7 +144,9 @@ public abstract class AbstractTranslator {
 		name = name.replaceAll("-", "_")
 				.replaceAll(" ", "_")
 				.replaceAll(":", "_")
-				.replaceAll("\\.", "_");
+				.replaceAll("@", "_")
+				.replaceAll("\\.", "_")
+				.replaceFirst("^(\\d)", "_\\1");
 		return name;
 	}
 	public String getCleanName(String name) {
@@ -182,30 +233,58 @@ public abstract class AbstractTranslator {
 				.findFirst();
 		return optional;
 	}
-	
-	protected void annotateWith(final DataType generatedType, String annotationName) {
+	protected Annotation getAnnotation(final Element element, String annotationName) {
 		AnnotationType annotationType = getTypeFor(getCleanName(annotationName), tdlPackage.Literals.ANNOTATION_TYPE);
-		if (!generatedType.getAnnotation().stream().anyMatch(a->a.getKey()==annotationType)) {
+		Optional<Annotation> optional = element.getAnnotation().stream().filter(a->a.getKey()==annotationType).findFirst();
+		return optional.orElseGet(() -> {
 			Annotation annotation = tdlFactory.eINSTANCE.createAnnotation();
 			annotation.setKey(annotationType);
-			generatedType.getAnnotation().add(annotation);
-		}
+			element.getAnnotation().add(annotation);
+			return annotation;
+		});
 	}
 
-	protected void constrainWith(final DataType generatedType, String constraintName) {
+	protected Comment getComment(final Element element, String noteName) {
+		Optional<Comment> optional = element.getComment().stream().filter(a->a.getName()==noteName).findFirst();
+		return optional.orElseGet(() -> {
+			Comment comment = tdlFactory.eINSTANCE.createComment();
+			comment.setName(noteName);
+			element.getComment().add(comment);
+			return comment;
+		});
+	}
+	
+	protected void annotateWith(final Element element, String annotationName, String annotationValue) {
+		Annotation annotation = getAnnotation(element, annotationName);
+		annotation.setValue(annotationValue);
+	}
+	
+	protected void annotateWith(final Element element, String annotationName) {
+		getAnnotation(element, annotationName);
+	}
+
+	protected void noteWith(final Element element, String commentName, String body) {
+		Comment comment = getComment(element, commentName);
+		comment.setBody(body);
+	}
+
+	protected Constraint constrainWith(final DataType generatedType, String constraintName) {
 		ConstraintType constraintType = getTypeFor(getCleanName(constraintName), tdlPackage.Literals.CONSTRAINT_TYPE);
 		if (!generatedType.getConstraint().stream().anyMatch(a->a.getType()==constraintType)) {
 			Constraint constraint = tdlFactory.eINSTANCE.createConstraint();
 			constraint.setType(constraintType);
 			generatedType.getConstraint().add(constraint);
+			return constraint;
 		}
+		//TODO: return existing constraint?
+		return null;
 	}
 	
-	protected DataElementMapping addDataElementMapping(String uri, DataType dataType, String tag) {
+	protected DataElementMapping addDataElementMapping(String uri, DataType dataType, String tag, DataResourceMapping resourceMapping) {
 		DataElementMapping mapping = getTypeFor(dataType.getName()+"_"+tag, tdlPackage.Literals.DATA_ELEMENT_MAPPING);
 		mapping.setMappableDataElement(dataType);
 		mapping.setElementURI(uri);
-		mapping.setDataResourceMapping(drm);
+		mapping.setDataResourceMapping(resourceMapping);
 		return mapping;
 	}
 	
@@ -235,4 +314,30 @@ public abstract class AbstractTranslator {
 		this.generatedPackage = generatedPackage;
 	}
 
+	public void ensureUniqueNames(Package p) {
+		Set<String> names = new HashSet<>();
+		for (PackageableElement pe: p.getPackagedElement()) {
+			makeUnique(pe, names);
+			if (pe instanceof EnumDataType)
+				for (PackageableElement l: ((EnumDataType) pe).getValue()) 
+					makeUnique(l, names);
+			else if (pe instanceof Package) {
+				ensureUniqueNames((Package) pe);
+			}
+		}
+		
+	}
+
+	private void makeUnique(NamedElement e, Set<String> names) {
+		String name = e.getName();
+		int i = 1;
+		String newName = name;
+		while (names.contains(newName)) {
+			newName = name + "_" + i++;
+		}
+		if (!newName.equals(name))
+			e.setName(newName);
+		names.add(newName);
+	}
+
 }
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.execution.java.codegen/.classpath b/plugins/org.etsi.mts.tdl.execution.java.codegen/.classpath
new file mode 100644
index 0000000000000000000000000000000000000000..e801ebfb4680123285c15553dc70584276fe0057
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.execution.java.codegen/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/org.etsi.mts.tdl.execution.java.codegen/.project b/plugins/org.etsi.mts.tdl.execution.java.codegen/.project
new file mode 100644
index 0000000000000000000000000000000000000000..e47a13b7a8bd9463011f2e6417b27a3f143c63b1
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.execution.java.codegen/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.etsi.mts.tdl.execution.java.codegen</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.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/plugins/org.etsi.mts.tdl.openapi.generator.wrapper/.settings/org.eclipse.core.resources.prefs b/plugins/org.etsi.mts.tdl.execution.java.codegen/.settings/org.eclipse.core.resources.prefs
similarity index 100%
rename from plugins/org.etsi.mts.tdl.openapi.generator.wrapper/.settings/org.eclipse.core.resources.prefs
rename to plugins/org.etsi.mts.tdl.execution.java.codegen/.settings/org.eclipse.core.resources.prefs
diff --git a/plugins/org.etsi.mts.tdl.openapi.generator.wrapper/.settings/org.eclipse.jdt.core.prefs b/plugins/org.etsi.mts.tdl.execution.java.codegen/.settings/org.eclipse.jdt.core.prefs
similarity index 88%
rename from plugins/org.etsi.mts.tdl.openapi.generator.wrapper/.settings/org.eclipse.jdt.core.prefs
rename to plugins/org.etsi.mts.tdl.execution.java.codegen/.settings/org.eclipse.jdt.core.prefs
index 7adc0fb9a0d32bd6b4e3ce6f305ab7165208865c..c9545f06a4120d5b4a1228fb19f67a1171bc0f5b 100644
--- a/plugins/org.etsi.mts.tdl.openapi.generator.wrapper/.settings/org.eclipse.jdt.core.prefs
+++ b/plugins/org.etsi.mts.tdl.execution.java.codegen/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,4 @@
 eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
 org.eclipse.jdt.core.compiler.compliance=11
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
diff --git a/plugins/org.etsi.mts.tdl.execution.java.codegen/META-INF/MANIFEST.MF b/plugins/org.etsi.mts.tdl.execution.java.codegen/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..5f2f3bd978250d7b41aa2bb122322df1b38a4beb
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.execution.java.codegen/META-INF/MANIFEST.MF
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.etsi.mts.tdl.execution.java.codegen
+Bundle-SymbolicName: org.etsi.mts.tdl.execution.java.codegen
+Bundle-Version: 1.0.0.qualifier
+Export-Package: org.etsi.mts.tdl.execution.java.codegen
+Require-Bundle: org.etsi.mts.tdl.model
+Automatic-Module-Name: org.etsi.mts.tdl.execution.java.codegen
+Bundle-ClassPath: .
+Bundle-RequiredExecutionEnvironment: JavaSE-11
diff --git a/plugins/org.etsi.mts.tdl.execution.java.codegen/build.properties b/plugins/org.etsi.mts.tdl.execution.java.codegen/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..34d2e4d2dad529ceaeb953bfcdb63c51d69ffed2
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.execution.java.codegen/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/plugins/org.etsi.mts.tdl.execution.java.codegen/pom.xml b/plugins/org.etsi.mts.tdl.execution.java.codegen/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..46f1e2c098cc6704350434e370be99878f607b69
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.execution.java.codegen/pom.xml
@@ -0,0 +1,21 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.etsi.mts.tdl</groupId>
+		<artifactId>org.etsi.mts.tdl.parent</artifactId>
+		<version>1.0.0-SNAPSHOT</version>
+		<relativePath>../../org.etsi.mts.tdl.parent</relativePath>
+
+	</parent>
+	<artifactId>org.etsi.mts.tdl.execution.java.codegen</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<build>
+		<plugins>
+			<plugin>
+				<artifactId>maven-compiler-plugin</artifactId>
+			</plugin>
+		</plugins>
+	</build>
+</project>
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.execution.java/src/org/etsi/mts/tdl/execution/java/codegen/JUnitTestGenerator.java b/plugins/org.etsi.mts.tdl.execution.java.codegen/src/org/etsi/mts/tdl/execution/java/codegen/JUnitTestGenerator.java
similarity index 83%
rename from plugins/org.etsi.mts.tdl.execution.java/src/org/etsi/mts/tdl/execution/java/codegen/JUnitTestGenerator.java
rename to plugins/org.etsi.mts.tdl.execution.java.codegen/src/org/etsi/mts/tdl/execution/java/codegen/JUnitTestGenerator.java
index c09e14e5316c5109216bd88e7c2af747323745e2..92867b5db012b7e0c7205763520c48c514e9c611 100644
--- a/plugins/org.etsi.mts.tdl.execution.java/src/org/etsi/mts/tdl/execution/java/codegen/JUnitTestGenerator.java
+++ b/plugins/org.etsi.mts.tdl.execution.java.codegen/src/org/etsi/mts/tdl/execution/java/codegen/JUnitTestGenerator.java
@@ -19,6 +19,7 @@ import org.etsi.mts.tdl.Action;
 import org.etsi.mts.tdl.ActionBehaviour;
 import org.etsi.mts.tdl.ActionReference;
 import org.etsi.mts.tdl.AlternativeBehaviour;
+import org.etsi.mts.tdl.Annotation;
 import org.etsi.mts.tdl.Assertion;
 import org.etsi.mts.tdl.Assignment;
 import org.etsi.mts.tdl.AtomicBehaviour;
@@ -26,6 +27,7 @@ import org.etsi.mts.tdl.Behaviour;
 import org.etsi.mts.tdl.Block;
 import org.etsi.mts.tdl.BoundedLoopBehaviour;
 import org.etsi.mts.tdl.Break;
+import org.etsi.mts.tdl.CastDataUse;
 import org.etsi.mts.tdl.CollectionDataType;
 import org.etsi.mts.tdl.CombinedBehaviour;
 import org.etsi.mts.tdl.ComponentInstance;
@@ -77,6 +79,7 @@ import org.etsi.mts.tdl.SingleCombinedBehaviour;
 import org.etsi.mts.tdl.SpecialValueUse;
 import org.etsi.mts.tdl.Stop;
 import org.etsi.mts.tdl.StructuredDataInstance;
+import org.etsi.mts.tdl.StructuredDataType;
 import org.etsi.mts.tdl.Target;
 import org.etsi.mts.tdl.TestConfiguration;
 import org.etsi.mts.tdl.TestDescription;
@@ -136,6 +139,8 @@ public class JUnitTestGenerator extends Renderer {
 
 	private ComponentInstance currentTester = null;
 
+	private Map<DataType, String> declaredTypes = new Hashtable<DataType, String>();
+
 	public JUnitTestGenerator(Package model, Settings settings) {
 		super(settings.outputFile, settings.outPackage);
 		this.model = model;
@@ -156,7 +161,7 @@ public class JUnitTestGenerator extends Renderer {
 		List<TestDescription> tdList = new ArrayList<TestDescription>();
 		gatherPackageableElements(model, false, e -> {
 			if (e instanceof TestDescription)
-				if (((TestDescription)e).isIsLocallyOrdered())
+				if (((TestDescription) e).isIsLocallyOrdered())
 					tdList.add((TestDescription) e);
 		});
 
@@ -184,11 +189,15 @@ public class JUnitTestGenerator extends Renderer {
 	}
 
 	protected DataElementMapping getMapping(MappableDataElement e) {
+		return getMapping(e, JAVA_MAPPING_VALUE);
+	}
+
+	protected DataElementMapping getMapping(MappableDataElement e, String mappingName) {
 		Set<DataElementMapping> mappings = this.elementMappings.get(e);
 		if (mappings != null && !mappings.isEmpty()) {
 			for (DataElementMapping m : mappings) {
 				if (m.getDataResourceMapping().getAnnotation().stream().anyMatch(
-						a -> a.getKey().getName().equals(MAPPING_KEY) && a.getValue().equals(JAVA_MAPPING_VALUE)))
+						a -> a.getKey().getName().equals(MAPPING_KEY) && a.getValue().equalsIgnoreCase(mappingName)))
 					return m;
 			}
 		}
@@ -221,10 +230,36 @@ public class JUnitTestGenerator extends Renderer {
 		return null;
 	}
 
+	private boolean isUnmapped() {
+		return this.settings.unmappedData;
+	}
+
+	@Override
+	protected String getElementName(Element e) {
+		if (isUnmapped()) {
+			if (e instanceof DataType) {
+				return CORE_PACKAGE + ".ValueImpl";
+			}
+		}
+		return super.getElementName(e);
+	}
+
 	private boolean hasAnnotation(Element e, String keyName) {
 		return e.getAnnotation().stream().anyMatch(a -> a.getKey().getName().equals(keyName));
 	}
 
+	private Annotation getAnnotation(Element e, String keyName) {
+		Optional<Annotation> op = e.getAnnotation().stream().filter(a -> a.getKey().getName().equals(keyName))
+				.findAny();
+		if (op.isPresent())
+			return op.get();
+		return null;
+	}
+
+	private boolean isVerdict(DataType t) {
+		return t.getQualifiedName().equals("TDL::Verdict");
+	}
+
 	protected void addImport(DataElementMapping m, Set<String> imports) {
 		if (m == null)
 			return;
@@ -299,14 +334,20 @@ public class JUnitTestGenerator extends Renderer {
 	private void writeComponentType(TestConfiguration tc, ComponentType ct, String className) {
 
 		ct.getVariable().forEach(v -> {
-			line("public " + getElementName(v.getDataType()) + " " + getElementName(v) + ";");
+			append("public " + getElementName(v.getDataType()) + " " + getElementName(v));
+			if (isUnmapped()) {
+				append(" = new ");
+				append(CORE_PACKAGE + ".ValueImpl");
+				append("();");
+			}
+			line(";");
 		});
 		newLine();
 
 		ct.getTimer().forEach(t -> {
 			String timerClass = CORE_PACKAGE + ".Timer ";
-			line("public " + timerClass + getTimerName(t) + " = new " + timerClass + "(TimeUnit.Second"
-					+ ", \"" + t.getName() + "\", \"" + t.getQualifiedName() + "\");");
+			line("public " + timerClass + getTimerName(t) + " = new " + timerClass + "(TimeUnit.Second" + ", \""
+					+ t.getName() + "\", \"" + t.getQualifiedName() + "\");");
 		});
 		newLine();
 
@@ -390,6 +431,10 @@ public class JUnitTestGenerator extends Renderer {
 		newLine();
 
 		writeTestConfiguration(td);
+
+		newLine();
+		writeTypes(td);
+
 		newLine();
 		writeTestDescription(td);
 
@@ -456,7 +501,7 @@ public class JUnitTestGenerator extends Renderer {
 			connectionNames.add(connectionName);
 
 			List<GateReference> endpoints = conn.getEndPoint();
-			append("Connection " + connectionName + " = new Connection");
+			append("Connection " + connectionName + " = new ConnectionImpl");
 			callOpen();
 			line("\"" + conn.getName() + "\", ");
 			writeGateReference(endpoints.get(0));
@@ -480,11 +525,13 @@ public class JUnitTestGenerator extends Renderer {
 	}
 
 	private void writeGateReference(GateReference e) {
-		append("new GateReference(");
+		append("new GateReferenceImpl(");
 		writeElement(e.getGate());
 		append(", ");
 		writeElement(e.getGate().getType());
 		append(", ");
+		append("GateTypeKind." + e.getGate().getType().getKind());
+		append(", ");
 		writeElement(e.getComponent());
 		append(", ");
 		writeElement(e.getComponent().getType());
@@ -502,8 +549,158 @@ public class JUnitTestGenerator extends Renderer {
 		append("getGateReference(\"" + tester.getComponent().getName() + "\", \"" + tester.getGate().getName() + "\")");
 	}
 
+	private void writeTypes(TestDescription tc) {
+		if (!isUnmapped())
+			return;
+
+		append("protected void declareTypes()");
+		blockOpen();
+
+		TreeIterator<EObject> i = tc.eAllContents();
+		while (i.hasNext()) {
+			EObject e = i.next();
+			if (e instanceof DataUse) {
+				DataType type = ((DataUse) e).resolveDataType();
+				if (type != null)
+					declareType(type, declaredTypes);
+			} else if (e instanceof Variable) {
+				declareType(((Variable) e).getDataType(), declaredTypes);
+			}
+
+		}
+
+//		XXX
+//		final List<String> connectionNames = new ArrayList<String>();
+//		config.getConnection().forEach(conn -> {
+//			String connectionName = getElementName(conn);
+//			connectionNames.add(connectionName);
+//
+//			List<GateReference> endpoints = conn.getEndPoint();
+//			append("Connection " + connectionName + " = new Connection");
+//			callOpen();
+//			line("\"" + conn.getName() + "\", ");
+//			writeGateReference(endpoints.get(0));
+//			line(", ");
+//			writeGateReference(endpoints.get(1));
+//			callClose();
+//
+//		});
+//		append("configure(new Connection[] {");
+//		boolean first = true;
+//		for (String cn : connectionNames) {
+//			if (!first)
+//				append(", ");
+//			first = false;
+//			append(cn);
+//		}
+//		line("});");
+
+		blockClose();
+		newLine();
+	}
+
+	private String declareType(DataType t, Map<DataType, String> declaredTypes) {
+		if (declaredTypes.containsKey(t))
+			return declaredTypes.get(t);
+		String name = super.getElementName(t);
+		declaredTypes.put(t, name);
+
+		if (t instanceof StructuredDataType) {
+			for (Member m : ((StructuredDataType) t).allMembers()) {
+				DataType mType = m.getDataType();
+				declareType(mType, declaredTypes);
+			}
+		} else if (t instanceof CollectionDataType) {
+			DataType iType = ((CollectionDataType) t).getItemType();
+			declareType(iType, declaredTypes);
+		}
+
+		// TODO add mapping name to mapping
+		DataElementMapping mapping = getMapping(t);
+		if (mapping == null)
+			mapping = getMapping(t, settings.useMapping);
+		String mappingName = name + "_mapping";
+		if (mapping != null)
+			writeMapping(mapping, mappingName, false);
+
+		line(CORE_PACKAGE + ".TypeImpl " + name + " = new " + CORE_PACKAGE + ".TypeImpl()");
+		writeSetName(t);
+		writeAddAnnotations(t);
+		if (mapping != null) {
+			line(".setMapping(" + mappingName + ")");
+		}
+		if (t instanceof StructuredDataType) {
+			line(".setIsStructure(true)");
+			for (Member m : ((StructuredDataType) t).allMembers()) {
+				String mTypeName = declaredTypes.get(m.getDataType());
+				line(".setParameter(\"" + m.getName() + "\", " + mTypeName + ")");
+			}
+
+		} else if (t instanceof CollectionDataType) {
+			line(".setIsCollection(true)");
+			String iTypeName = declaredTypes.get(((CollectionDataType) t).getItemType());
+			line(".setItemType(" + iTypeName + ")");
+		}
+		line(";");
+
+		line("addType(\"" + name + "\", " + name + ");");
+		return name;
+	}
+
+	private void writeMapping(DataElementMapping mapping, String mappingVarName, boolean inline) {
+		Annotation nameAnnotation = getAnnotation(mapping.getDataResourceMapping(), MAPPING_KEY);
+		String name = nameAnnotation != null ? nameAnnotation.getValue() : null;
+
+		if (!inline)
+			append(CORE_PACKAGE + ".MappingImpl " + mappingVarName + " = ");
+
+		append("new " + CORE_PACKAGE + ".MappingImpl(");
+		append("\"" + name + "\", ");
+		// XXX
+		String uri = mapping.getElementURI().replaceAll("\\n|\\r", " ").replaceAll("\\\\", "_");
+		append("\"" + uri + "\"");
+		line(")");
+
+		DataResourceMapping rsMapping = mapping.getDataResourceMapping();
+		append(".setResource");
+		blockOpenParen();
+		line("new " + CORE_PACKAGE + ".MappingImpl(\"" + name + "\", \"" + rsMapping.getResourceURI() + "\")");
+		line(".setIsResource(true)");
+		writeAddAnnotations(rsMapping);
+		blockCloseParen();
+
+		for (ParameterMapping pMapping : mapping.getParameterMapping()) {
+			String pName = pMapping.getParameter().getName();
+			append(".setParameter");
+			blockOpenParen();
+			line("\"" + pName + "\", ");
+			line("new " + CORE_PACKAGE + ".MappingImpl(\"" + name + "\", \"" + pMapping.getParameterURI() + "\")");
+			line(".setIsParameter(true)");
+			writeAddAnnotations(pMapping);
+			blockCloseParen();
+		}
+
+		if (!inline)
+			line(";");
+	}
+
+	private void writeSetName(NamedElement e) {
+		line(".setName(\"" + e.getName() + "\", \"" + e.getQualifiedName() + "\")");
+	}
+
+	private void writeAddAnnotations(Element e) {
+		for (Annotation a : e.getAnnotation()) {
+			String value = a.getValue();
+			line(".addAnnotation(\"" + a.getKey().getQualifiedName() + "\", "
+					+ (value != null ? "\"" + a.getValue() + "\"" : "null") + ")");
+		}
+	}
+
 	private void writeElement(Element e) {
-		append("new Element(\"" + e.getName() + "\")");
+		if (e instanceof NamedElement)
+			append("new NamedElementImpl(\"" + e.getName() + "\", \"" + ((NamedElement) e).getQualifiedName() + "\")");
+		else
+			append("new ElementImpl(\"" + e.getName() + "\")");
 	}
 
 	private void writeTestDescription(TestDescription tc) {
@@ -723,7 +920,7 @@ public class JUnitTestGenerator extends Renderer {
 				writeObjective(b);
 				writeAfter = false;
 
-				line("throw new " + STOP_EXCEPTION + "(\"Stop " + getQName(b) + "\");");
+				line("throw new " + STOP_EXCEPTION + "Impl" + "(\"Stop " + getQName(b) + "\");");
 				thrownExceptions.add(STOP_EXCEPTION);
 
 			}
@@ -943,7 +1140,7 @@ public class JUnitTestGenerator extends Renderer {
 						}
 
 					} else if (f.kind.equals("TimeoutResult")) {
-						line("throw new " + STOP_EXCEPTION + "(\"Timeout\");");
+						line("throw new " + STOP_EXCEPTION + "Impl" + "(\"Timeout\");");
 						thrownExceptions.add(STOP_EXCEPTION);
 
 					} else
@@ -1409,31 +1606,49 @@ public class JUnitTestGenerator extends Renderer {
 
 			}
 			if (type == null && !isTime) {
-				// XXX meta-model problem
-				if (d instanceof LiteralValueUse) {
-					LiteralValueUse ld = (LiteralValueUse) d;
-					if (ld.getBoolValue() != null)
-						line("boolean" + " " + varName + ";");
-					else if (ld.getIntValue() != null)
-						line("int" + " " + varName + ";");
-					else
-						line("String" + " " + varName + ";");
-
-				} else if (d instanceof PredefinedFunctionCall) {
-					line("// TODO Meta-model problem: DataUse.resolveDataType() return null");
-					line(getPredefinedFunctionType(((PredefinedFunctionCall) d).getFunction()) + " " + varName + ";");
+				if (isUnmapped()) {
+					line(CORE_PACKAGE + ".ValueImpl" + " " + varName + ";");
 
 				} else {
-					line("// TODO Meta-model problem: DataUse.resolveDataType() return null");
-					line("String" + " " + varName + ";");
+					// XXX meta-model problem
+					if (d instanceof LiteralValueUse) {
+						LiteralValueUse ld = (LiteralValueUse) d;
+						if (ld.getBoolValue() != null)
+							line("boolean" + " " + varName + ";");
+						else if (ld.getIntValue() != null)
+							line("int" + " " + varName + ";");
+						else
+							line("String" + " " + varName + ";");
+
+					} else if (d instanceof PredefinedFunctionCall) {
+						line("// TODO Meta-model problem: DataUse.resolveDataType() return null");
+						line(getPredefinedFunctionType(((PredefinedFunctionCall) d).getFunction()) + " " + varName
+								+ ";");
+
+					} else {
+						line("// TODO Meta-model problem: DataUse.resolveDataType() return null");
+						line("String" + " " + varName + ";");
+					}
 				}
 
 			} else if (type instanceof Time || isTime)
 				line("long " + varName + ";");
-			else if (type instanceof CollectionDataType)
-				line("java.util.List<" + getElementName(((CollectionDataType) type).getItemType()) + "> " + varName + ";");
-			else
-				line(getElementName(type) + " " + varName + ";");
+
+			else if (type instanceof CollectionDataType) {
+				if (isUnmapped()) {
+					line(CORE_PACKAGE + ".ValueImpl" + " " + varName + ";");
+				} else {
+					line("java.util.List<" + getElementName(((CollectionDataType) type).getItemType()) + "> " + varName
+							+ ";");
+				}
+			} else {
+				if (isUnmapped()) {
+					line(CORE_PACKAGE + ".ValueImpl" + " " + varName + ";");
+				} else {
+					line(getElementName(type) + " " + varName + ";");
+				}
+			}
+
 			dataUseVariables.put(d, varName);
 		}
 
@@ -1469,7 +1684,7 @@ public class JUnitTestGenerator extends Renderer {
 				initializeDataUse(idx, dataUseVariables);
 		}
 		if (d instanceof DataElementUse) {
-			for (DataUse item: ((DataElementUse)d).getItem()) {
+			for (DataUse item : ((DataElementUse) d).getItem()) {
 				initializeDataUse(item, dataUseVariables);
 			}
 		}
@@ -1481,9 +1696,6 @@ public class JUnitTestGenerator extends Renderer {
 
 		if (!dataUseVariables.containsKey(d))
 			declareDataUse(d, dataUseVariables, "");
-		String ref = dataUseVariables.get(d);
-		append(ref);
-		append(" = ");
 
 		DataInstance dataInstance = null;
 		DataType dataType = null;
@@ -1492,6 +1704,15 @@ public class JUnitTestGenerator extends Renderer {
 		PredefinedFunction predefinedFunction = null;
 		List<MemberAssignment> memberAssignments = null;
 		List<DataUse> collectionItems = null;
+		DataType castTo = null;
+
+		String ref = dataUseVariables.get(d);
+		List<ParameterBinding> arguments = getDataUseArguments(d);
+		
+		if (d instanceof CastDataUse) {
+			castTo = ((CastDataUse) d).getDataType();
+			d = ((CastDataUse) d).getDataUse();
+		}
 
 		if (d instanceof DataElementUse) {
 			NamedElement element = ((DataElementUse) d).getDataElement();
@@ -1518,8 +1739,11 @@ public class JUnitTestGenerator extends Renderer {
 			else if (element instanceof PredefinedFunction)
 				predefinedFunction = (PredefinedFunction) element;
 
-			else
-				throw new RuntimeException("Unsupported element in DataElementUse " + d.getName());
+			else {
+				dataType = d.resolveDataType();
+				if (dataType == null)
+					throw new RuntimeException("Unresolved type of DataElementUse " + d.getName());
+			}
 
 		} else if (d instanceof DataInstanceUse) {
 			dataInstance = ((DataInstanceUse) d).getDataInstance();
@@ -1533,11 +1757,23 @@ public class JUnitTestGenerator extends Renderer {
 			predefinedFunction = ((PredefinedFunctionCall) d).getFunction();
 		}
 
+		append(ref);
+		if (!isUnmapped()) {
+			append(" = ");
+			if (castTo != null) {
+				DataElementMapping m = getMappingChecked(castTo);
+				append("(" + m.getElementURI() + ")");
+			}
+		}
+
+		String typeName = declaredTypes.get(d.resolveDataType());
+		String unmappedDataInitializer = " = new " + CORE_PACKAGE + ".ValueImpl(getType(\"" + typeName + "\"))";
+
 		if (dataInstance != null) {
 			DataElementMapping m = getMapping(dataInstance);
 			if (m == null) {
 				DataType t = dataInstance.getDataType();
-				if (t.getQualifiedName().equals("TDL::Verdict")) {
+				if (isVerdict(t)) {
 					append("Verdict." + dataInstance.getName());
 
 				} else
@@ -1545,10 +1781,20 @@ public class JUnitTestGenerator extends Renderer {
 
 			} else {
 				// TODO instance function
-				String classQName = m.getDataResourceMapping().getResourceURI();
-				append(classQName + "." + m.getElementURI());
-				if (hasAnnotation(m, MAPPING_ANNOTATION_METHOD) || hasAnnotation(m, MAPPING_ANNOTATION_STATIC_METHOD))
-					append("()");
+
+				if (isUnmapped()) {
+					line(unmappedDataInitializer);
+					append(".setMapping(");
+					writeMapping(m, ref + "_mapping", true);
+					line(")");
+
+				} else {
+					String classQName = m.getDataResourceMapping().getResourceURI();
+					append(classQName + "." + m.getElementURI());
+					if (hasAnnotation(m, MAPPING_ANNOTATION_METHOD)
+							|| hasAnnotation(m, MAPPING_ANNOTATION_STATIC_METHOD))
+						append("()");
+				}
 			}
 
 		} else if (dataType != null) {
@@ -1559,17 +1805,29 @@ public class JUnitTestGenerator extends Renderer {
 				if (d instanceof DataElementUse)
 					collectionItems = ((DataElementUse) d).getItem();
 			}
-			DataElementMapping m = getMapping(dataType);
-			if (m != null) {
-				if (hasAnnotation(m, MAPPING_ANNOTATION_CLASS)) {
-					append("new ");
-					if (isCollection)
-						append("java.util.ArrayList<");
-					String classQName = m.getDataResourceMapping().getResourceURI();
-					append(classQName + "." + m.getElementURI());
-					if (isCollection)
-						append(">");
-					append("()");
+			if (isUnmapped()) {
+				append(unmappedDataInitializer);
+				if (isCollection)
+					line(".setIsCollection(true)");
+				else
+					line(".setIsStructure(true)");
+
+			} else {
+				DataElementMapping m = getMapping(dataType);
+				if (m != null) {
+					if (hasAnnotation(m, MAPPING_ANNOTATION_CLASS)) {
+						append("new ");
+						if (isCollection)
+							append("java.util.ArrayList<");
+						String classQName = m.getDataResourceMapping().getResourceURI();
+						append(classQName + "." + m.getElementURI());
+						if (isCollection)
+							append(">");
+						append("()");
+						
+					} else if (isCollection) {
+						append("new java.util.ArrayList()");
+					}
 				}
 			}
 
@@ -1577,6 +1835,8 @@ public class JUnitTestGenerator extends Renderer {
 			// XXX
 
 		} else if (d instanceof LiteralValueUse) {
+			if (isUnmapped())
+				append(unmappedDataInitializer + ".setValue(");
 			String str = ((LiteralValueUse) d).getValue();
 			BigInteger i = ((LiteralValueUse) d).getIntValue();
 			Boolean b = ((LiteralValueUse) d).getBoolValue();
@@ -1586,8 +1846,12 @@ public class JUnitTestGenerator extends Renderer {
 				append(Integer.toString(i.intValue()));
 			else if (b != null)
 				append(Boolean.toString(b));
+			if (isUnmapped())
+				append(")");
 
 		} else if (function != null || predefinedFunction != null) {
+			if (isUnmapped())
+				append(unmappedDataInitializer + ".setValue(");
 
 			if (function != null) {
 				// TODO instance function
@@ -1619,17 +1883,29 @@ public class JUnitTestGenerator extends Renderer {
 			}
 			append(")");
 
+			if (isUnmapped())
+				append(")");
+
 		} else if (formalParameter != null) {
+			if (isUnmapped())
+				append(unmappedDataInitializer + ".setValue(");
 			append(getElementName(formalParameter));
+			if (isUnmapped())
+				append(")");
 
 		} else if (d instanceof VariableUse) {
-			append(HELPER_FIELD + ".clone(" + getElementName(((VariableUse) d).getVariable()) + ")");
+			write(d, dataUseVariables);
+//			append(HELPER_FIELD + ".clone(" + getElementName(((VariableUse) d).getVariable()) + ")");
 
 		}
+
 		line(";");
+		if (d instanceof VariableUse) {
+			lineComment("TODO " + HELPER_FIELD + ".clone(" + getElementName(((VariableUse) d).getVariable()) + ")");
+		}
 
-		if (!getDataUseArguments(d).isEmpty()) {
-			for (ParameterBinding arg : getDataUseArguments(d)) {
+		if (!arguments.isEmpty()) {
+			for (ParameterBinding arg : arguments) {
 				// TODO members of collection type
 				append(ref);
 				append(".");
@@ -1648,27 +1924,46 @@ public class JUnitTestGenerator extends Renderer {
 			}
 		}
 		if (collectionItems != null) {
-			for (DataUse item: collectionItems) {
+			for (DataUse item : collectionItems) {
 				String itemRef = dataUseVariables.get(item);
-				append(ref + ".add(" + itemRef + ")");
+				if (isUnmapped())
+					append(ref + ".addItem(" + itemRef + ".asData())");
+				else
+					append(ref + ".add(" + itemRef + ")");
 				line(";");
-				
+
 			}
 		}
 	}
 
 	private void writeMemberAssignment(Parameter p, DataUse v, Map<DataUse, String> dataUseVariables) {
-		ParameterMapping mapping = getParameterMapping(p);
-		if (hasAnnotation(mapping, MAPPING_ANNOTATION_SETTER)) {
-			append(mapping.getParameterURI());
+		if (isUnmapped()) {
+			append("setParameter");
 			append("(");
+			append("\"" + p.getName() + "\", ");
 			write(v, dataUseVariables);
 			append(")");
 
 		} else {
-			append(mapping.getParameterURI());
-			append(" = ");
-			write(v, dataUseVariables);
+			ParameterMapping mapping = getParameterMapping(p);
+			if (mapping != null) {
+				if (hasAnnotation(mapping, MAPPING_ANNOTATION_SETTER)) {
+					append(mapping.getParameterURI());
+					append("(");
+					write(v, dataUseVariables);
+					append(")");
+
+				} else {
+					append(mapping.getParameterURI());
+					append(" = ");
+					write(v, dataUseVariables);
+				}
+			} else {
+				append(p.getName());
+				append(" = ");
+				write(v, dataUseVariables);
+				lineComment(" Parameter not mapped");
+			}
 		}
 	}
 
@@ -1699,6 +1994,8 @@ public class JUnitTestGenerator extends Renderer {
 
 			} else {
 				append(dataUseVariables.get(d));
+				if (isUnmapped())
+					append(".asData()");
 			}
 		}
 
@@ -1712,11 +2009,16 @@ public class JUnitTestGenerator extends Renderer {
 				Member prop = ref.getMember();
 				ParameterMapping pm = getParameterMapping(prop);
 
-				String mappedName = pm.getParameterURI();
+				String mappedName = null;
+				Annotation getter = getAnnotation(pm, MAPPING_ANNOTATION_GETTER);
+				if (getter != null)
+					mappedName = getter.getValue();
+				else
+					mappedName = pm.getParameterURI();
 				if (mappedName == null)
 					mappedName = getElementName(prop);
 				append("." + mappedName);
-				if (hasAnnotation(pm, MAPPING_ANNOTATION_GETTER))
+				if (getter != null)
 					append("()");
 
 				if (idx != null)
@@ -1753,13 +2055,18 @@ public class JUnitTestGenerator extends Renderer {
 	}
 
 	private void convertToData(DataUse d, Map<DataUse, String> dataUseVariables) {
-		append("new PojoData(");
+		if (!isUnmapped())
+			append("new PojoData(");
 		write(d, dataUseVariables);
-		append(")");
+		if (!isUnmapped())
+			append(")");
 	}
 
 	private void convertToArgument(String parameterName, DataUse d, Map<DataUse, String> dataUseVariables) {
-		append("new PojoArgument(");
+		if (!isUnmapped())
+			append("new PojoArgument(");
+		else
+			append("new Argument(");
 		write(d, dataUseVariables);
 		append(", \"" + parameterName + "\"");
 		append(")");
diff --git a/plugins/org.etsi.mts.tdl.execution.java/src/org/etsi/mts/tdl/execution/java/codegen/Renderer.java b/plugins/org.etsi.mts.tdl.execution.java.codegen/src/org/etsi/mts/tdl/execution/java/codegen/Renderer.java
similarity index 95%
rename from plugins/org.etsi.mts.tdl.execution.java/src/org/etsi/mts/tdl/execution/java/codegen/Renderer.java
rename to plugins/org.etsi.mts.tdl.execution.java.codegen/src/org/etsi/mts/tdl/execution/java/codegen/Renderer.java
index 731d80c86a922604d0951bc65cb4926f64b185fd..453af80511b83420d9be7a2d8688e3baa2879048 100644
--- a/plugins/org.etsi.mts.tdl.execution.java/src/org/etsi/mts/tdl/execution/java/codegen/Renderer.java
+++ b/plugins/org.etsi.mts.tdl.execution.java.codegen/src/org/etsi/mts/tdl/execution/java/codegen/Renderer.java
@@ -13,6 +13,8 @@ import java.util.Hashtable;
 import java.util.Map;
 import java.util.Set;
 
+import javax.lang.model.SourceVersion;
+
 import org.etsi.mts.tdl.DataElementMapping;
 import org.etsi.mts.tdl.Element;
 import org.etsi.mts.tdl.MappableDataElement;
@@ -96,13 +98,12 @@ public abstract class Renderer {
 			if (mapping != null)
 				return mapping.getElementURI();
 
-		} else {
-			String name = this.elementNames.get(e);
-			if (name != null)
-				return name;
 		}
+		String name = this.elementNames.get(e);
+		if (name != null)
+			return name;
 
-		String name = e.getName();
+		name = e.getName();
 		if (name == null)
 			name = e.eClass().getName();
 		String identifier = getIdentifier(name);
@@ -196,6 +197,8 @@ public abstract class Renderer {
 	private String getIdentifier(String name) {
 		if (name == null)
 			return null;
+		if (SourceVersion.isKeyword(name))
+			name = name + "_";
 		char[] chars = name.toCharArray();
 		for (int i = 0; i < chars.length; i++) {
 			if (i == 0) {
diff --git a/plugins/org.etsi.mts.tdl.execution.java/src/org/etsi/mts/tdl/execution/java/codegen/Settings.java b/plugins/org.etsi.mts.tdl.execution.java.codegen/src/org/etsi/mts/tdl/execution/java/codegen/Settings.java
similarity index 68%
rename from plugins/org.etsi.mts.tdl.execution.java/src/org/etsi/mts/tdl/execution/java/codegen/Settings.java
rename to plugins/org.etsi.mts.tdl.execution.java.codegen/src/org/etsi/mts/tdl/execution/java/codegen/Settings.java
index 35cd6d2256f18924c0873918949f78e55a260379..3a9653eaae8d97099ed81ad2c78dbd7930da2083 100644
--- a/plugins/org.etsi.mts.tdl.execution.java/src/org/etsi/mts/tdl/execution/java/codegen/Settings.java
+++ b/plugins/org.etsi.mts.tdl.execution.java.codegen/src/org/etsi/mts/tdl/execution/java/codegen/Settings.java
@@ -6,20 +6,26 @@ public class Settings {
 
 	private static final String PREFIX = "JavaRendering.";
 	public static final String OUTPUT_DIR = PREFIX + "OutputDir", PACKAGE = PREFIX + "Package",
-			INJECTOR = PREFIX + "Injector", DATE_FORMAT = PREFIX + "DateFormat";
+			INJECTOR = PREFIX + "Injector", DATE_FORMAT = PREFIX + "DateFormat", USE_MAPPING = PREFIX + "UseMapping",
+			UNMAPPED_DATA = PREFIX + "UnmappedData";
 
 	public String outputPath;
 	public File outputFile;
 	public String outPackage;
 	public String injector;
 	public String customDateFormat;
+	public String useMapping;
+	public boolean unmappedData;
 
-	public Settings(String outputPath, File outputFile, String outPackage, String injector, String customDateFormat) {
+	public Settings(String outputPath, File outputFile, String outPackage, String injector, String customDateFormat,
+			String useMapping, boolean unmappedData) {
 		this.outputPath = outputPath;
 		this.outputFile = outputFile;
 		this.outPackage = outPackage;
 		this.injector = injector;
 		this.customDateFormat = customDateFormat;
+		this.useMapping = useMapping;
+		this.unmappedData = unmappedData;
 	}
 
 }
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/.project b/plugins/org.etsi.mts.tdl.execution.java.runtime/.project
index 9d6106e2e7ded0d942db7621d971aff28d50a59e..47d3d0f18138778cd90adefe86d922f29d4f1f05 100644
--- a/plugins/org.etsi.mts.tdl.execution.java.runtime/.project
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/.project
@@ -20,4 +20,15 @@
 		<nature>org.eclipse.m2e.core.maven2Nature</nature>
 		<nature>org.eclipse.jdt.core.javanature</nature>
 	</natures>
+	<filteredResources>
+		<filter>
+			<id>1705077780105</id>
+			<name></name>
+			<type>30</type>
+			<matcher>
+				<id>org.eclipse.core.resources.regexFilterMatcher</id>
+				<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
 </projectDescription>
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/pom.xml b/plugins/org.etsi.mts.tdl.execution.java.runtime/pom.xml
index 7468d4ff2b090fa71dce604f977ee72c9f014fb3..7f00ced748aa8a578730c568e76111293ca31e34 100644
--- a/plugins/org.etsi.mts.tdl.execution.java.runtime/pom.xml
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/pom.xml
@@ -4,7 +4,7 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>org.etsi.mts.tdl</groupId>
 	<artifactId>org.etsi.mts.tdl.execution.java</artifactId>
-	<version>1.0.0-SNAPSHOT</version>
+	<version>1.0.0</version>
 	<build>
 		<sourceDirectory>src</sourceDirectory>
 		<plugins>
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/adapters/DefaultAdapter.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/adapters/DefaultAdapter.java
index 3df18df29a28df5501c8491d26c42ec5abbb1f84..35883391f5aba1444f21a2ef95afc97abfab13cd 100644
--- a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/adapters/DefaultAdapter.java
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/adapters/DefaultAdapter.java
@@ -2,20 +2,16 @@ package org.etsi.mts.tdl.execution.java.adapters;
 
 import org.etsi.mts.tdl.execution.java.tri.Data;
 import org.etsi.mts.tdl.execution.java.tri.Reporter;
-import org.etsi.mts.tdl.execution.java.tri.RuntimeHelper;
-import org.etsi.mts.tdl.execution.java.tri.StopException;
 import org.etsi.mts.tdl.execution.java.tri.Validator;
 import org.etsi.mts.tdl.execution.java.tri.Verdict;
 
-public class DefaultAdapter implements Validator, Reporter, RuntimeHelper {
+public class DefaultAdapter implements Validator, Reporter {
 
-	@Override
 	public boolean equals(Object o0, Object o1) {
 		// TODO Auto-generated method stub
 		return false;
 	}
 
-	@Override
 	public <T> T clone(T object) {
 		// TODO Auto-generated method stub
 		return object;
@@ -60,7 +56,7 @@ public class DefaultAdapter implements Validator, Reporter, RuntimeHelper {
 	@Override
 	public void setVerdict(Verdict verdict) {
 		// TODO Auto-generated method stub
-		System.out.println("Set verdict to " + verdict.name);
+		System.out.println("Set verdict to " + verdict.getName());
 	}
 
 }
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/adapters/http/HttpParameterLocation.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/adapters/http/HttpParameterLocation.java
index b385481b6fa40f0ff0aa3bb80ece88fb62f45f8d..5fbd1de2be84ad29147bf08a4391845a8928a10c 100644
--- a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/adapters/http/HttpParameterLocation.java
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/adapters/http/HttpParameterLocation.java
@@ -1,5 +1,5 @@
 package org.etsi.mts.tdl.execution.java.adapters.http;
 
 public enum HttpParameterLocation {
-	path, quey, cookie;
+	path, query, cookie;
 }
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/adapters/http/HttpSystemAdapter.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/adapters/http/HttpSystemAdapter.java
index 1b2da7f52f15ce09337349ba48d9deb359f6e3b2..05d150df5a7856d31c070978a6b1fd7ce53eed52 100644
--- a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/adapters/http/HttpSystemAdapter.java
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/adapters/http/HttpSystemAdapter.java
@@ -2,6 +2,9 @@ package org.etsi.mts.tdl.execution.java.adapters.http;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
 
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URLEncoder;
@@ -20,14 +23,18 @@ import org.etsi.mts.tdl.execution.java.rt.core.PojoData;
 import org.etsi.mts.tdl.execution.java.tri.Argument;
 import org.etsi.mts.tdl.execution.java.tri.Connection;
 import org.etsi.mts.tdl.execution.java.tri.Data;
+import org.etsi.mts.tdl.execution.java.tri.ElementAnnotation;
+import org.etsi.mts.tdl.execution.java.tri.Mapping;
+import org.etsi.mts.tdl.execution.java.tri.NamedElement;
 import org.etsi.mts.tdl.execution.java.tri.Procedure;
 import org.etsi.mts.tdl.execution.java.tri.Reporter;
 import org.etsi.mts.tdl.execution.java.tri.SystemAdapter;
+import org.etsi.mts.tdl.execution.java.tri.Type;
 import org.etsi.mts.tdl.execution.java.tri.Validator;
+import org.etsi.mts.tdl.execution.java.tri.Value;
 import org.openapitools.jackson.nullable.JsonNullableModule;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
@@ -35,14 +42,13 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
 
 public class HttpSystemAdapter implements SystemAdapter {
 
-	private Validator validator;
-	private Reporter reporter;
+	protected Validator validator;
+	protected Reporter reporter;
 
 	private HttpClient.Builder builder;
 	private HttpClient client;
 	private ObjectMapper mapper;
 
-
 	private String baseUri = "https://example.com";
 	private List<HttpHeader> defaultHeaders = new ArrayList<HttpHeader>();
 
@@ -54,18 +60,18 @@ public class HttpSystemAdapter implements SystemAdapter {
 		this.validator = validator;
 		this.reporter = reporter;
 	}
-	
+
 	public void setBaseUri(String baseUri) {
 		this.baseUri = baseUri;
 	}
-	
+
 	/**
-	 * Set headers that are applied to all requests, such as authentication.
-	 * The default implementation adds by default:
+	 * Set headers that are applied to all requests, such as authentication. The
+	 * default implementation adds by default:
 	 * <ul>
 	 * <li>Content-Type: application/json</li>
 	 * <li>Accept: application/json</li>
-	 * </ul>   
+	 * </ul>
 	 */
 	public void setDefaultHeaders(List<HttpHeader> defaultHeaders) {
 		this.defaultHeaders = defaultHeaders;
@@ -91,12 +97,12 @@ public class HttpSystemAdapter implements SystemAdapter {
 		mapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING);
 		mapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
 		/*
-		 * TODO optional modules 
+		 * TODO optional modules
 		 * 
 		 */
 		mapper.registerModule(new JavaTimeModule());
 		mapper.registerModule(new JsonNullableModule());
-		
+
 	}
 
 	private void handleResponse(HttpResponse<String> response, Throwable t) {
@@ -111,6 +117,7 @@ public class HttpSystemAdapter implements SystemAdapter {
 	}
 
 	private void handleError(Throwable t) {
+		t.printStackTrace();
 		reporter.runtimeError(t);
 		throw new RuntimeException(t);
 	}
@@ -118,14 +125,14 @@ public class HttpSystemAdapter implements SystemAdapter {
 	private void applyDefaults(HttpRequest.Builder requestBuilder) {
 		requestBuilder.header("Content-Type", "application/json");
 		requestBuilder.header("Accept", "application/json");
-		for (HttpHeader h: defaultHeaders) {
+		for (HttpHeader h : defaultHeaders) {
 			requestBuilder.header(h.name, h.value);
 		}
 	}
 
 	@Override
 	public void send(Data message, Connection connection) {
-		HttpRequestData httpData = (HttpRequestData) message.getValue();
+		HttpRequestData httpData = getRequestData(message);
 
 		HttpRequest.Builder requestBuilder = HttpRequest.newBuilder();
 		applyDefaults(requestBuilder);
@@ -140,7 +147,7 @@ public class HttpSystemAdapter implements SystemAdapter {
 				httpData.uri = httpData.uri.replaceAll(Pattern.quote("{" + p.name + "}"), p.value);
 				break;
 			}
-			case quey: {
+			case query: {
 				String queryParameter = p.name + "=" + URLEncoder.encode(p.value, UTF_8);
 				if (query == null)
 					query = queryParameter;
@@ -160,7 +167,7 @@ public class HttpSystemAdapter implements SystemAdapter {
 				if (uri.getQuery() != null)
 					query = uri.getQuery() + "&" + query;
 				uri = new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(), uri.getPath(),
-						URLEncoder.encode(query, UTF_8), uri.getFragment());
+						query, uri.getFragment());
 			}
 		} catch (URISyntaxException e) {
 			handleError(e);
@@ -170,9 +177,9 @@ public class HttpSystemAdapter implements SystemAdapter {
 			requestBuilder.uri(uri);
 
 			// TODO logging
-			reporter.comment("Outgoing: " + httpData.method.toString() + " | " + uri + " | " + mapper.writeValueAsString(httpData.body));
+			reporter.comment("Outgoing (headers): " + httpData.method.toString() + " | " + uri);
 
-			byte[] body = mapper.writeValueAsBytes(httpData.body);
+			byte[] body = encodeBody(httpData.body);
 			requestBuilder.method(httpData.method.toString(), HttpRequest.BodyPublishers.ofByteArray(body));
 
 			for (HttpHeader header : httpData.headers)
@@ -183,14 +190,14 @@ public class HttpSystemAdapter implements SystemAdapter {
 
 			responseFuture.whenCompleteAsync(this::handleResponse);
 
-		} catch (JsonProcessingException e) {
+		} catch (IOException e) {
 			handleError(e);
 		}
 	}
 
 	@Override
 	public Data receive(Data expected, Connection connection) throws InterruptedException, AssertionError {
-		HttpResponseData expectedHttpData = expected != null ? (HttpResponseData) expected.getValue() : null;
+		HttpResponseData expectedHttpData = expected != null ? getResponseData(expected) : null;
 
 		synchronized (unhandledResponses) {
 			HttpResponse<String> response = unhandledResponses.peek();
@@ -215,8 +222,7 @@ public class HttpSystemAdapter implements SystemAdapter {
 				Data received = new PojoData<>(receivedHttpData);
 				if (expected != null) {
 					if (expectedHttpData.body != null) {
-						receivedHttpData.body = this.mapper.readValue(response.body(),
-								expectedHttpData.body.getClass());
+						receivedHttpData.body = decodeBody(response.body(), expectedHttpData.body.getClass());
 					}
 					if (this.validator.matches(expected, received)) {
 						unhandledResponses.remove();
@@ -229,7 +235,7 @@ public class HttpSystemAdapter implements SystemAdapter {
 					return received;
 				}
 
-			} catch (JsonProcessingException e) {
+			} catch (IOException e) {
 				handleError(e);
 			}
 		}
@@ -237,6 +243,17 @@ public class HttpSystemAdapter implements SystemAdapter {
 		return null;
 	}
 
+	protected byte[] encodeBody(Object body) throws IOException {
+		reporter.comment("Outgoing (body): " + mapper.writeValueAsString(body));
+		return mapper.writeValueAsBytes(body);
+	}
+
+	protected Object decodeBody(String body, Class<?> type) throws IOException {
+		if (body.length() == 0)
+			return null;
+		return this.mapper.readValue(body, type);
+	}
+
 	@Override
 	public Data call(Procedure operation, Argument[] arguments, Data expectedReturn, Data expectedException,
 			Connection connection) {
@@ -252,4 +269,81 @@ public class HttpSystemAdapter implements SystemAdapter {
 	public void replyCall(Procedure operation, Data returnValue, Data exception, Connection connection) {
 		throw new UnsupportedOperationException("Procedure-based communication is not supported by this adapter.");
 	}
+
+	@Override
+	public Data callFunction(NamedElement function, Argument[] arguments) {
+		throw new UnsupportedOperationException("Custom function implementations should be provided by extensions.");
+	}
+
+	protected HttpRequestData getRequestData(Data message) {
+		if (message.getValue() instanceof HttpRequestData)
+			return (HttpRequestData) message.getValue();
+		if (message.getType() instanceof Type) {
+			HttpRequestData req = (HttpRequestData) getMappedObject(message);
+			return req;
+		}
+		throw new RuntimeException("Request data in unsupported format");
+	}
+
+	private Object getMappedObject(Data<Type, Value> data) {
+		Type t = (Type) data.getType();
+		Value v = data.getValue();
+
+		if (!t.isStructure() && !t.isCollection() && v.getValue() != null)
+			return v.getValue();
+
+		Mapping m = t.getMapping();
+		if (m == null || !m.getMappingName().equalsIgnoreCase("Java"))
+			return data;
+
+		Mapping rs = m.getResource();
+		boolean isMapped = false;
+		for (ElementAnnotation a : rs.getAnnotations()) {
+			if (a.getKey().equals("Tdl::MappingName") && a.getValue().equals("Java")) {
+				isMapped = true;
+				break;
+			}
+		}
+
+		if (!isMapped)
+			return null;
+
+		String cName = rs.getUri() + "." + m.getUri();
+		Object obj = null;
+		try {
+			Class<?> cl = getClass().getClassLoader().loadClass(cName);
+			if (cl.isEnum()) {
+				String literal = null;
+				if (v.getValue() != null)
+					literal = v.getValue().toString();
+				else if (v.getMapping() != null)
+					literal = v.getMapping().getUri();
+				obj = Enum.valueOf((Class<Enum>) cl, literal);
+			} else
+				obj = cl.getDeclaredConstructor().newInstance();
+
+			if (t.isStructure()) {
+				for (String pName : t.getParameters()) {
+					Data<Type, Value> pData = data.getValue().getParameter(pName);
+					if (pData != null) {
+						Object pObj = getMappedObject(pData);
+						Field pField = cl.getDeclaredField(m.getParameterMapping(pName).getUri());
+						pField.set(obj, pObj);
+					}
+				}
+			}
+//			TODO isCollection()
+		} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | IllegalArgumentException
+				| InvocationTargetException | NoSuchMethodException | SecurityException | NoSuchFieldException e) {
+			handleError(e);
+		}
+		return obj;
+	}
+
+	protected HttpResponseData getResponseData(Data message) {
+		if (message.getValue() instanceof HttpResponseData)
+			return (HttpResponseData) message.getValue();
+//		XXX
+		return null;
+	}
 }
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/ArgumentImpl.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/ArgumentImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..06d59fe401cd56ff4dc9edcab209976574a14a2f
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/ArgumentImpl.java
@@ -0,0 +1,21 @@
+package org.etsi.mts.tdl.execution.java.rt.core;
+
+import org.etsi.mts.tdl.execution.java.tri.Data;
+
+public class ArgumentImpl<T, V> extends DataImpl<T, V> {
+	private String parameterName;
+
+	public ArgumentImpl(T type, V value, String parameterName) {
+		super(type, value);
+		this.parameterName = parameterName;
+	}
+
+	public ArgumentImpl(Data<T, V> data, String parameterName) {
+		super(data.getType(), data.getValue());
+		this.parameterName = parameterName;
+	}
+
+	public String getParameterName() {
+		return parameterName;
+	}
+}
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/ConnectionImpl.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/ConnectionImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..2920c661b5cfe38039ffd43a93c19c88bf84fb5f
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/ConnectionImpl.java
@@ -0,0 +1,27 @@
+package org.etsi.mts.tdl.execution.java.rt.core;
+
+import org.etsi.mts.tdl.execution.java.tri.Connection;
+import org.etsi.mts.tdl.execution.java.tri.GateReference;
+
+public class ConnectionImpl extends ElementImpl implements Connection {
+
+
+	private final GateReference[] endPoints = new GateReference[2];
+
+	public ConnectionImpl(String name, GateReference sourceGate, GateReference targetGate) {
+		super(name);
+		getEndPoints()[0] = sourceGate;
+		getEndPoints()[1] = targetGate;
+	}
+	
+	public GateReference[] getEndPoints() {
+		return endPoints;
+	}
+
+	@Override
+	public String toString() {
+		if (name != null)
+			return name;
+		return getEndPoints()[0].toString() + " :: " + getEndPoints()[1].toString();
+	}
+}
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/DataImpl.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/DataImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..2a82986da1a0e8c1f305784dbb5ebf1683909f9c
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/DataImpl.java
@@ -0,0 +1,29 @@
+package org.etsi.mts.tdl.execution.java.rt.core;
+
+import org.etsi.mts.tdl.execution.java.tri.Data;
+
+/**
+ * In Java environment the <code>type</code> is a Java class and
+ * <code>value</code> is an object of that class or a lambda expression that
+ * returns such object.
+ */
+public class DataImpl<T, V> implements Data<T, V> {
+
+	private T type;
+
+	private V value;
+
+	public DataImpl(T type, V value) {
+		this.type = type;
+		this.value = value;
+	}
+
+	public V getValue() {
+		return value;
+	}
+
+	public T getType() {
+		return type;
+	}
+
+}
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/ElementAnnotationImpl.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/ElementAnnotationImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..096e6ff503de2dd7e7bc6e7a73de5bed72e4514a
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/ElementAnnotationImpl.java
@@ -0,0 +1,22 @@
+package org.etsi.mts.tdl.execution.java.rt.core;
+
+import org.etsi.mts.tdl.execution.java.tri.ElementAnnotation;
+
+public class ElementAnnotationImpl implements ElementAnnotation {
+
+	public String key, value;
+
+	public ElementAnnotationImpl(String key, String value) {
+		this.key = key;
+		this.value = value;
+	}
+
+	public String getKey() {
+		return key;
+	}
+
+	public String getValue() {
+		return value;
+	}
+
+}
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/ElementImpl.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/ElementImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..b1f54b2b378bf3d9eab215bc079a41f8eef94b57
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/ElementImpl.java
@@ -0,0 +1,42 @@
+package org.etsi.mts.tdl.execution.java.rt.core;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.etsi.mts.tdl.execution.java.tri.Element;
+import org.etsi.mts.tdl.execution.java.tri.ElementAnnotation;
+
+public class ElementImpl implements Element {
+
+	protected String name;
+
+
+	private List<ElementAnnotation> annotations = new ArrayList<ElementAnnotation>();
+
+	public ElementImpl() {
+	}
+
+	public ElementImpl(String name) {
+		this.name = name;
+	}
+
+	@Override
+	public String getName() {
+		return name;
+	}
+
+	@Override
+	public List<ElementAnnotation> getAnnotations() {
+		return annotations;
+	}
+
+
+	public void setAnnotations(List<ElementAnnotation> annotations) {
+		this.annotations = annotations;
+	}
+	
+	public ElementImpl addAnnotation(String key, String value) {
+		this.getAnnotations().add(new ElementAnnotationImpl(key, value));
+		return this;
+	}
+}
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/GateReferenceImpl.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/GateReferenceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..db1dbcce418d692acaa69ded20f0d19454fd0e17
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/GateReferenceImpl.java
@@ -0,0 +1,85 @@
+package org.etsi.mts.tdl.execution.java.rt.core;
+
+import org.etsi.mts.tdl.execution.java.tri.ComponentInstanceRole;
+import org.etsi.mts.tdl.execution.java.tri.Element;
+import org.etsi.mts.tdl.execution.java.tri.GateReference;
+import org.etsi.mts.tdl.execution.java.tri.GateTypeKind;
+import org.etsi.mts.tdl.execution.java.tri.NamedElement;
+
+/**
+ * Encapsulation of a connection end-point specification. It's an aggregation of
+ * following TDL model elements:
+ * <ul>
+ * <li>GateInstance</li>
+ * <li>GateType</li>
+ * <li>ComponentInstance</li>
+ * <li>ComponentType</li>
+ * <li>ComponentInstanceRole</li>
+ * </ul>
+ *
+ */
+public class GateReferenceImpl implements GateReference {
+	private Element gate;
+	private NamedElement gateType;
+	private GateTypeKind gateTypeKind;
+	private Element component;
+	private NamedElement componentType;
+	private ComponentInstanceRole role;
+
+	public GateReferenceImpl(Element gate, NamedElement gateType, GateTypeKind gateTypeKind, Element component, NamedElement componentType,
+			ComponentInstanceRole role) {
+		this.gate = gate;
+		this.gateType = gateType;
+		this.gateTypeKind = gateTypeKind;
+		this.component = component;
+		this.componentType = componentType;
+		this.role = role;
+	}
+	
+	@Override
+	public Element getGate() {
+		return gate;
+	}
+
+	@Override
+	public NamedElement getGateType() {
+		return gateType;
+	}
+
+	@Override
+	public GateTypeKind getGateTypeKind() {
+		return gateTypeKind;
+	}
+
+	@Override
+	public Element getComponent() {
+		return component;
+	}
+
+	@Override
+	public NamedElement getComponentType() {
+		return componentType;
+	}
+
+	@Override
+	public ComponentInstanceRole getComponentRole() {
+		return role;
+	}
+
+	@Override
+	public int hashCode() {
+		return gate.hashCode() << 8 + gateType.hashCode() << 6 + component.hashCode() << 4
+				+ componentType.hashCode() << 2 + role.hashCode();
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (obj instanceof GateReferenceImpl) {
+			GateReferenceImpl gr = (GateReferenceImpl) obj;
+			return gate.equals(gr.gate) && gateType.equals(gr.gateType) && component.equals(gr.component)
+					&& componentType.equals(gr.componentType) && role.equals(gr.role);
+		}
+		return super.equals(obj);
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/MappingImpl.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/MappingImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..160c71e5ca54a0e5bdcc5295417335ee9bb4a9b9
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/MappingImpl.java
@@ -0,0 +1,89 @@
+package org.etsi.mts.tdl.execution.java.rt.core;
+
+import java.util.Hashtable;
+import java.util.Map;
+
+import org.etsi.mts.tdl.execution.java.tri.Mapping;
+
+public class MappingImpl extends ElementImpl implements Mapping, TriImpl<MappingImpl, MappingImpl> {
+	private String mappingName;
+
+	private boolean resource;
+	private boolean parameter;
+	private String uri;
+
+	private MappingImpl container;
+	private Map<String, MappingImpl> parameters = new Hashtable<String, MappingImpl>();
+
+	public MappingImpl() {
+	}
+
+	public MappingImpl(String mappingName, String uri) {
+		this.mappingName = mappingName;
+		this.uri = uri;
+	}
+
+	@Override
+	public String getUri() {
+		return uri;
+	}
+
+	@Override
+	public String getMappingName() {
+		return mappingName;
+	}
+
+	public MappingImpl setIsResource(boolean resource) {
+		this.resource = resource;
+		return this;
+	}
+
+	public MappingImpl setIsParameter(boolean parameter) {
+		this.parameter = parameter;
+		return this;
+	}
+
+	@Override
+	public boolean isResource() {
+		return resource;
+	}
+
+	@Override
+	public boolean isParameter() {
+		return parameter;
+	}
+
+	public MappingImpl setResource(MappingImpl container) {
+		this.container = container;
+		return this;
+	}
+
+	@Override
+	public MappingImpl getResource() {
+		return container;
+	}
+
+	@Override
+	public MappingImpl setParameter(String name, MappingImpl mapping) {
+		this.parameters.put(name, mapping);
+		return this;
+	}
+
+	@Override
+	public MappingImpl getParameterMapping(String name) {
+		return this.parameters.get(name);
+	}
+
+	@Override
+	public MappingImpl setName(String name, String qualifiedName) {
+		this.name = name;
+		return this;
+	}
+	
+	@Override
+	public MappingImpl addAnnotation(String key, String value) {
+		super.addAnnotation(key, value);
+		return this;
+	}
+
+}
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/NamedElementImpl.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/NamedElementImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..7b0fdaf07a2a795529422595a9b6f838ab8b2215
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/NamedElementImpl.java
@@ -0,0 +1,25 @@
+package org.etsi.mts.tdl.execution.java.rt.core;
+
+import org.etsi.mts.tdl.execution.java.tri.NamedElement;
+
+public class NamedElementImpl extends ElementImpl implements NamedElement {
+
+	protected String qualifiedName;
+
+	public NamedElementImpl() {
+	}
+
+	public NamedElementImpl(String name, String qualifiedName) {
+		super(name);
+		this.setQualifiedName(qualifiedName);
+	}
+
+	@Override
+	public String getQualifiedName() {
+		return qualifiedName;
+	}
+
+	protected void setQualifiedName(String qualifiedName) {
+		this.qualifiedName = qualifiedName;
+	}
+}
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/ParameterImpl.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/ParameterImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..47eba181da5c9ef9d6d00fb4b6d694d60a38ca91
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/ParameterImpl.java
@@ -0,0 +1,29 @@
+package org.etsi.mts.tdl.execution.java.rt.core;
+
+import org.etsi.mts.tdl.execution.java.tri.Parameter;
+
+public class ParameterImpl extends ElementImpl implements Parameter<TypeImpl> {
+	
+	private TypeImpl type;
+
+	public ParameterImpl(String parameterName) {
+		super(parameterName);
+	}
+
+	@Override
+	public ParameterImpl addAnnotation(String key, String value) {
+		super.addAnnotation(key, value);
+		return this;
+	}
+	
+	public ParameterImpl setType(TypeImpl type) {
+		this.type = type;
+		return this;
+	}
+
+	@Override
+	public TypeImpl getType() {
+		return type;
+	}
+
+}
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/PojoArgument.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/PojoArgument.java
index 2a46bab2ea8583c6a77eb87c137fee9cf2d71454..c3c8ecc34416abe757d07dd15b242035824de74c 100644
--- a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/PojoArgument.java
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/PojoArgument.java
@@ -1,8 +1,6 @@
 package org.etsi.mts.tdl.execution.java.rt.core;
 
-import org.etsi.mts.tdl.execution.java.tri.Argument;
-
-public class PojoArgument<V> extends Argument<Class<V>, V> {
+public class PojoArgument<V> extends ArgumentImpl<Class<V>, V> {
 
 	public PojoArgument(V value, String parameterName) {
 		super((Class<V>) value.getClass(), value, parameterName);
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/PojoData.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/PojoData.java
index 9c7b111681c0ab07bb1217e7f8d672773c35f39e..460be0db696e86cfb18136c7309d02e1ad721fcc 100644
--- a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/PojoData.java
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/PojoData.java
@@ -1,8 +1,6 @@
 package org.etsi.mts.tdl.execution.java.rt.core;
 
-import org.etsi.mts.tdl.execution.java.tri.Data;
-
-public class PojoData<V> extends Data<Class<V>, V> {
+public class PojoData<V> extends DataImpl<Class<V>, V> {
 
 	public PojoData(V value) {
 		super((Class<V>) value.getClass(), value);
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/PredefinedFunctionsImpl.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/PredefinedFunctionsImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..74797f303e75c00688be98904408bc5d7896ae13
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/PredefinedFunctionsImpl.java
@@ -0,0 +1,151 @@
+package org.etsi.mts.tdl.execution.java.rt.core;
+
+import java.util.Collection;
+
+import org.etsi.mts.tdl.execution.java.tri.Data;
+import org.etsi.mts.tdl.execution.java.tri.PredefinedFunctions;
+import org.etsi.mts.tdl.execution.java.tri.Value;
+
+import com.google.inject.Inject;
+
+/**
+ * Default implementation of predefined functions specified in TDL.
+ */
+public class PredefinedFunctionsImpl implements PredefinedFunctions {
+
+	@Inject
+	public PredefinedFunctionsImpl() {
+	}
+
+	@Override
+	public boolean equals(Data<?, ?> d0, Data<?, ?> d1) {
+		return d0.equals(d1);
+	}
+
+	@Override
+	public boolean notEquals(Data<?, ?> d0, Data<?, ?> d1) {
+		return !equals(d0, d1);
+	}
+
+	@Override
+	public boolean and(boolean b0, boolean b1) {
+		return b0 && b1;
+	}
+
+	@Override
+	public boolean or(boolean b0, boolean b1) {
+		return b0 || b1;
+	}
+
+	@Override
+	public boolean xor(boolean b0, boolean b1) {
+		return b0 ^ b1;
+	}
+
+	@Override
+	public boolean not(boolean b) {
+		return !b;
+	}
+
+	@Override
+	public boolean lt(int i0, int i1) {
+		return i0 < i1;
+	}
+
+	@Override
+	public boolean gt(int i0, int i1) {
+		return i0 > i1;
+	}
+
+	@Override
+	public boolean lteq(int i0, int i1) {
+		return i0 <= i1;
+	}
+
+	@Override
+	public boolean gteq(int i0, int i1) {
+		return i0 >= i1;
+	}
+
+	@Override
+	public boolean lt(long i0, long i1) {
+		return i0 < i1;
+	}
+
+	@Override
+	public boolean gt(long i0, long i1) {
+		return i0 > i1;
+	}
+
+	@Override
+	public boolean lteq(long i0, long i1) {
+		return i0 <= i1;
+	}
+
+	@Override
+	public boolean gteq(long i0, long i1) {
+		return i0 >= i1;
+	}
+
+	@Override
+	public int plus(int i0, int i1) {
+		return i0 + i1;
+	}
+
+	@Override
+	public int minus(int i0, int i1) {
+		return i0 - i1;
+	}
+
+	@Override
+	public int multiply(int i0, int i1) {
+		return i0 * i1;
+	}
+
+	@Override
+	public int divide(int i0, int i1) {
+		return i0 / i1;
+	}
+
+	@Override
+	public int mod(int i0, int i1) {
+		return i0 % i1;
+	}
+
+	@Override
+	public long plus(long i0, long i1) {
+		return i0 + i1;
+	}
+
+	@Override
+	public long minus(long i0, long i1) {
+		return i0 - i1;
+	}
+
+	@Override
+	public long multiply(long i0, long i1) {
+		return i0 * i1;
+	}
+
+	@Override
+	public long divide(long i0, long i1) {
+		return i0 / i1;
+	}
+
+	@Override
+	public long mod(long i0, long i1) {
+		return i0 % i1;
+	}
+
+	@Override
+	public int size(Data<?, ?> collection) {
+		Object v = collection.getValue();
+		if (v instanceof Collection<?>)
+			return ((Collection<?>) v).size();
+		if (v instanceof Value)
+			if (((Value) v).isCollection())
+				return ((Value) v).getItems().size();
+		throw new IllegalArgumentException("Argument is not a collection.");
+	}
+
+}
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/ProcedureImpl.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/ProcedureImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..54ccd30694f9f680a1ad76950934943bd7eff9b9
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/ProcedureImpl.java
@@ -0,0 +1,66 @@
+package org.etsi.mts.tdl.execution.java.rt.core;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Consumer;
+
+import org.etsi.mts.tdl.execution.java.tri.Parameter;
+import org.etsi.mts.tdl.execution.java.tri.Procedure;
+
+/**
+ * May optionally be mapped to a method that implements the calling of the
+ * procedure
+ */
+public class ProcedureImpl extends NamedElementImpl implements Procedure {
+
+	private List<ParameterImpl> in = new ArrayList<ParameterImpl>();
+	private List<ParameterImpl> out = new ArrayList<ParameterImpl>();
+	private List<ParameterImpl> exception = new ArrayList<ParameterImpl>();
+
+	private Consumer<Object[]> function;
+	
+	public ProcedureImpl addIn(ParameterImpl p) {
+		this.in.add(p);
+		return this;
+	}
+
+	public ProcedureImpl addOut(ParameterImpl p) {
+		this.out.add(p);
+		return this;
+	}
+
+	public ProcedureImpl addException(ParameterImpl p) {
+		this.exception.add(p);
+		return this;
+	}
+
+	@Override
+	public List<Parameter> getIn() {
+		return (List)in;
+	}
+
+	@Override
+	public List<Parameter> getOut() {
+		return (List)out;
+	}
+
+	@Override
+	public List<Parameter> getException() {
+		return (List)exception;
+	}
+
+	/**
+	 * Optional function that implements this procedure call.
+	 * <p>
+	 * The function parameters must match the order and types of parameters of the
+	 * procedure call. That is, for each parameter of a procedure call, a method
+	 * parameter must exist such that the procedure call parameter type is mapped to
+	 * the method parameter type (or class).
+	 */
+	public void setFunction(Consumer<Object[]> function) {
+		this.function = function;
+	}
+	public Consumer<Object[]> getFunction() {
+		return function;
+	}
+}
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/ReceiverHub.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/ReceiverHub.java
index 1baa798b16949d865bc025f70075d0810f0255ff..a68bf089116108ff2ec45a37e02c0509be2d43ae 100644
--- a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/ReceiverHub.java
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/ReceiverHub.java
@@ -25,7 +25,7 @@ public class ReceiverHub {
 		this.systemAdapter = systemAdapter;
 		this.connection = connection;
 
-		this.thread = new Thread(() -> run(), "Receive from SystemAdapter on " + connection.name);
+		this.thread = new Thread(() -> run(), "Receive from SystemAdapter on " + connection.getName());
 		this.thread.setDaemon(true);
 		this.thread.start();
 	}
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/StopExceptionImpl.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/StopExceptionImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..e1eca3654e05c67686d9463b21fedbb24a3db5cb
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/StopExceptionImpl.java
@@ -0,0 +1,23 @@
+package org.etsi.mts.tdl.execution.java.rt.core;
+
+import org.etsi.mts.tdl.execution.java.tri.StopException;
+import org.etsi.mts.tdl.execution.java.tri.Verdict;
+
+@SuppressWarnings("serial")
+public class StopExceptionImpl extends StopException {
+
+	private Verdict verdict;
+
+	public StopExceptionImpl(String message) {
+		super(message);
+	}
+
+	public StopExceptionImpl(String message, Verdict verdict) {
+		super(message);
+		this.verdict = verdict;
+	}
+
+	public Verdict getVerdict() {
+		return verdict;
+	}
+}
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/TestControl.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/TestControl.java
index 55b475bb0581bdc0984f641c5b12893259871a49..cc13d75c7636297f638a4ecf7d275625280c9ec8 100644
--- a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/TestControl.java
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/TestControl.java
@@ -19,8 +19,6 @@ import org.etsi.mts.tdl.execution.java.tri.Data;
 import org.etsi.mts.tdl.execution.java.tri.GateReference;
 import org.etsi.mts.tdl.execution.java.tri.PredefinedFunctions;
 import org.etsi.mts.tdl.execution.java.tri.Reporter;
-import org.etsi.mts.tdl.execution.java.tri.RuntimeHelper;
-import org.etsi.mts.tdl.execution.java.tri.StopException;
 import org.etsi.mts.tdl.execution.java.tri.SystemAdapter;
 import org.etsi.mts.tdl.execution.java.tri.Validator;
 
@@ -34,10 +32,10 @@ public class TestControl {
 	public Validator validator;
 	public Reporter reporter;
 	public PredefinedFunctions functions;
-	public RuntimeHelper runtimeHelper;
 
 	private Connection[] connections;
-	private Map<Connection, ReceiverHub> receiverHubs = Collections.synchronizedMap(new Hashtable<Connection, ReceiverHub>());
+	private Map<Connection, ReceiverHub> receiverHubs = Collections
+			.synchronizedMap(new Hashtable<Connection, ReceiverHub>());
 
 	protected ExecutorCompletionService<ExecutionResult> completionService;
 	protected ExecutorService executor;
@@ -47,6 +45,8 @@ public class TestControl {
 	private List<ExceptionalBehaviour> exceptionalBehaviours = Collections
 			.synchronizedList(new ArrayList<ExceptionalBehaviour>());
 
+	protected Map<String, TypeImpl> types = new Hashtable<String, TypeImpl>();
+
 	public TestControl(com.google.inject.Module guiceModule) {
 		super();
 
@@ -56,16 +56,15 @@ public class TestControl {
 		this.validator = injector.getInstance(Validator.class);
 		this.reporter = injector.getInstance(Reporter.class);
 		this.functions = injector.getInstance(PredefinedFunctions.class);
-		this.runtimeHelper = injector.getInstance(RuntimeHelper.class);
 
 		this.executor = Executors.newCachedThreadPool();
 		this.completionService = new ExecutorCompletionService<ExecutionResult>(executor);
 	}
-	
+
 	protected <A> A getInstance(Class<A> clazz) {
 		return this.injector.getInstance(clazz);
 	}
-	
+
 	private ReceiverHub getReceiver(Connection connection) {
 		ReceiverHub hub = this.receiverHubs.get(connection);
 		if (hub == null)
@@ -76,7 +75,7 @@ public class TestControl {
 	public void configure(Connection[] connections) {
 		this.systemAdapter.configure(connections);
 		this.connections = connections;
-		
+
 		this.receiverHubs.values().forEach(r -> r.stop());
 		this.receiverHubs.clear();
 		for (Connection c : connections) {
@@ -85,7 +84,7 @@ public class TestControl {
 
 			ExceptionalBehaviour anyReceiver = new ExceptionalBehaviour(false);
 			anyReceiver.behaviour = () -> {
-				throw new StopException("Unexpected message received");
+				throw new StopExceptionImpl("Unexpected message received");
 			};
 			anyReceiver.callable = new ExecutionCallable() {
 				@Override
@@ -93,10 +92,12 @@ public class TestControl {
 					Data data = hub.receive(null, false);
 					return data != null ? new InteractionResult(data) : null;
 				}
-				
+
 			};
 			hub.setAnyReceiver(anyReceiver);
 		}
+
+		declareTypes();
 	}
 
 	public Connection getConnection(String testerComponentName, String testerGateName, String remoteComponentName,
@@ -104,16 +105,16 @@ public class TestControl {
 		for (Connection c : connections) {
 			int testerEP = -1;
 			for (int i = 0; i <= 1; i++)
-				if (c.endPoints[i].component.name.equals(testerComponentName)
-						&& c.endPoints[i].gate.name.equals(testerGateName)) {
+				if (c.getEndPoints()[i].getComponent().getName().equals(testerComponentName)
+						&& c.getEndPoints()[i].getGate().getName().equals(testerGateName)) {
 					testerEP = i;
 					break;
 				}
 			if (testerEP == -1)
 				continue;
 			int targetEP = testerEP == 0 ? 1 : 0;
-			if (c.endPoints[targetEP].component.name.equals(remoteComponentName)
-					&& c.endPoints[targetEP].gate.name.equals(remoteGateName))
+			if (c.getEndPoints()[targetEP].getComponent().getName().equals(remoteComponentName)
+					&& c.getEndPoints()[targetEP].getGate().getName().equals(remoteGateName))
 				return c;
 		}
 		throw new RuntimeException(String.format("Unknown connection: from %s.%s to %s.%s", testerComponentName,
@@ -123,9 +124,9 @@ public class TestControl {
 	public GateReference getGateReference(String testerComponentName, String testerGateName) {
 		for (Connection c : connections) {
 			for (int i = 0; i <= 1; i++)
-				if (c.endPoints[i].component.name.equals(testerComponentName)
-						&& c.endPoints[i].gate.name.equals(testerGateName)) {
-					return c.endPoints[i];
+				if (c.getEndPoints()[i].getComponent().getName().equals(testerComponentName)
+						&& c.getEndPoints()[i].getGate().getName().equals(testerGateName)) {
+					return c.getEndPoints()[i];
 				}
 		}
 		throw new RuntimeException(String.format("Unknown gate: %s.%s", testerComponentName, testerGateName));
@@ -164,7 +165,7 @@ public class TestControl {
 			return future;
 		}
 	}
-	
+
 	public List<Future<ExecutionResult>> executeExceptionals() {
 		List<Future<ExecutionResult>> futures = new ArrayList<>();
 		exceptionalBehaviours.forEach(exc -> futures.add(exc.execute()));
@@ -234,7 +235,6 @@ public class TestControl {
 		return receive(expected, connection, true);
 	}
 
-
 	public ExecutionCallable receive(Data expected, Connection connection, boolean isTrigger) {
 		ExecutionCallableWithDefaults c = new ExecutionCallableWithDefaults() {
 			@Override
@@ -367,4 +367,19 @@ public class TestControl {
 			f2.cancel(true);
 		}
 	}
+
+	/**
+	 * This is called once before each test case. Implemented by generated code to
+	 * declare types and mappings if using unmapped data in TRI.
+	 */
+	protected void declareTypes() {
+	}
+
+	protected void addType(String name, TypeImpl type) {
+		this.types.put(name, type);
+	}
+
+	protected TypeImpl getType(String name) {
+		return this.types.get(name);
+	}
 }
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/Timer.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/Timer.java
index 097881ecb47c178f4cd359a1ecfa541892f5b0bc..ece89a6efeb9469b452ab4eccf6dafe004d525fc 100644
--- a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/Timer.java
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/Timer.java
@@ -1,8 +1,6 @@
 package org.etsi.mts.tdl.execution.java.rt.core;
 
-import org.etsi.mts.tdl.execution.java.tri.NamedElement;
-
-public class Timer extends NamedElement {
+public class Timer extends NamedElementImpl {
 	
 	private TimeUnit unit;
 
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/TriImpl.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/TriImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..4706a316ae982e92517cec8e4887fa6561c85687
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/TriImpl.java
@@ -0,0 +1,7 @@
+package org.etsi.mts.tdl.execution.java.rt.core;
+
+public interface TriImpl<I, P> {
+	I setName(String name, String qualifiedName);
+	I addAnnotation(String key, String value);
+	I setParameter(String name, P mapping);
+}
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/TypeImpl.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/TypeImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..654bbb3b9522332617101a13801c0d53a732bb73
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/TypeImpl.java
@@ -0,0 +1,114 @@
+package org.etsi.mts.tdl.execution.java.rt.core;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+
+import org.etsi.mts.tdl.execution.java.tri.Data;
+import org.etsi.mts.tdl.execution.java.tri.Mapping;
+import org.etsi.mts.tdl.execution.java.tri.Type;
+import org.etsi.mts.tdl.execution.java.tri.Value;
+
+public class TypeImpl extends NamedElementImpl implements Type, TriImpl<TypeImpl, TypeImpl> {
+	private boolean structure = false;
+	private boolean collection = false;
+	private boolean enumerated = false;
+
+	private Map<String, TypeImpl> parameters = new Hashtable<String, TypeImpl>();
+	private TypeImpl itemType = null;
+	private List<Data<Type, Value>> enumLiterals = new ArrayList<Data<Type,Value>>();
+
+	private MappingImpl mapping;
+
+	public TypeImpl setIsStructure(boolean structure) {
+		this.structure = structure;
+		return this;
+	}
+
+	public TypeImpl setIsCollection(boolean collection) {
+		this.collection = collection;
+		return this;
+	}
+	
+	public TypeImpl setIsEnum(boolean enumerated) {
+		this.enumerated = enumerated;
+		return this;
+	}
+
+	@Override
+	public boolean isStructure() {
+		return this.structure;
+	}
+
+	@Override
+	public boolean isCollection() {
+		return this.collection;
+	}
+	
+	@Override
+	public boolean isEnum() {
+		return this.enumerated;
+	}
+
+	public TypeImpl setMapping(Mapping mapping) {
+		this.mapping = (MappingImpl) mapping;
+		return this;
+	}
+
+	@Override
+	public MappingImpl getMapping() {
+		return mapping;
+	}
+
+	@Override
+	public TypeImpl setParameter(String name, TypeImpl type) {
+		this.parameters.put(name, type);
+		return this;
+	}
+
+	@Override
+	public TypeImpl getParameterType(String name) {
+		return this.parameters.get(name);
+	}
+
+	@Override
+	public Collection<String> getParameters() {
+		return this.parameters.keySet();
+	}
+
+	public TypeImpl setItemType(TypeImpl itemType) {
+		this.itemType = itemType;
+		return this;
+	}
+
+	@Override
+	public TypeImpl getItemType() {
+		return this.itemType;
+	}
+	
+	@Override
+	public List<Data<Type, Value>> getEnumLiterals() {
+		return this.enumLiterals;
+	}
+	
+	public TypeImpl addEnumLiteral(ValueImpl literal) {
+		this.enumLiterals.add(new DataImpl<Type, Value>(this, literal));
+		return this;
+	}
+
+	@Override
+	public TypeImpl setName(String name, String qualifiedName) {
+		this.name = name;
+		this.setQualifiedName(qualifiedName);
+		return this;
+	}
+
+	@Override
+	public TypeImpl addAnnotation(String key, String value) {
+		super.addAnnotation(key, value);
+		return this;	
+	}
+
+}
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/ValueImpl.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/ValueImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..efbd59cc7dd2859451124443b2397163b6481d76
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/ValueImpl.java
@@ -0,0 +1,126 @@
+package org.etsi.mts.tdl.execution.java.rt.core;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+
+import org.etsi.mts.tdl.execution.java.tri.Data;
+import org.etsi.mts.tdl.execution.java.tri.Mapping;
+import org.etsi.mts.tdl.execution.java.tri.Type;
+import org.etsi.mts.tdl.execution.java.tri.Value;
+
+public class ValueImpl extends NamedElementImpl implements Value, TriImpl<ValueImpl, Data<Type, Value>> {
+	private TypeImpl type;
+
+	private boolean collection = false;
+	private boolean structure = false;
+
+	private Object value = null;
+	private Map<String, Data<Type, Value>> parameters = new Hashtable<String, Data<Type, Value>>();
+	private List<Data<Type, Value>> items = new ArrayList<Data<Type, Value>>();
+
+	private MappingImpl mapping;
+
+	public ValueImpl() {
+	}
+
+	public ValueImpl(TypeImpl type) {
+		this.type = type;
+	}
+
+	public ValueImpl setType(TypeImpl type) {
+		this.type = type;
+		return this;
+	}
+
+	public ValueImpl setIsCollection(boolean collection) {
+		this.collection = collection;
+		return this;
+	}
+
+	public ValueImpl setIsStructure(boolean structure) {
+		this.structure = structure;
+		return this;
+	}
+
+	@Override
+	public boolean isCollection() {
+		return this.collection;
+	}
+
+	@Override
+	public boolean isStructure() {
+		return this.structure;
+	}
+
+	public ValueImpl setMapping(Mapping mapping) {
+		this.mapping = (MappingImpl) mapping;
+		return this;
+	}
+
+	@Override
+	public MappingImpl getMapping() {
+		return mapping;
+	}
+
+	@Override
+	public Object getValue() {
+		return this.value;
+	}
+
+	public ValueImpl setValue(Object value) {
+		this.value = value;
+		return this;
+	}
+
+	@Override
+	public Collection<String> getParameters() {
+		return this.parameters.keySet();
+	}
+
+	@Override
+	public Data<Type, Value> getParameter(String name) {
+		return this.parameters.get(name);
+	}
+
+	@Override
+	public ValueImpl setParameter(String name, Data<Type, Value> value) {
+		this.parameters.put(name, value);
+		return this;
+	}
+
+	@Override
+	public List<Data<Type, Value>> getItems() {
+		return this.items;
+	}
+
+	public ValueImpl addItem(Data<Type, Value> item) {
+		this.items.add(item);
+		return this;
+	}
+
+	public ValueImpl setItems(List<Data<Type, Value>> items) {
+		this.items = items;
+		return this;
+	}
+
+	@Override
+	public ValueImpl setName(String name, String qualifiedName) {
+		this.name = name;
+		this.setQualifiedName(qualifiedName);
+		return this;
+	}
+
+	@Override
+	public ValueImpl addAnnotation(String key, String value) {
+		super.addAnnotation(key, value);
+		return this;
+	}
+
+	public Data<Type, Value> asData() {
+		return new DataImpl<Type, Value>(type, this);
+	}
+
+}
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/VerdictImpl.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/VerdictImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..82495e9c4847b1c8313140e26ee7aa98e4228bd4
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/core/VerdictImpl.java
@@ -0,0 +1,15 @@
+package org.etsi.mts.tdl.execution.java.rt.core;
+
+import org.etsi.mts.tdl.execution.java.tri.Verdict;
+
+public class VerdictImpl extends NamedElementImpl implements Verdict {
+	/**
+	 * Verdict instance predefined in TDL.
+	 */
+	public static VerdictImpl pass = new VerdictImpl("pass"), fail = new VerdictImpl("fail"),
+			inconclusive = new VerdictImpl("inconclusive");
+
+	public VerdictImpl(String name) {
+		super(name, null);
+	}
+}
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/data/AcceptedType.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/data/AcceptedType.java
deleted file mode 100644
index c1295269ed5e609f0f16fde7cc32e3999e5d6483..0000000000000000000000000000000000000000
--- a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/rt/data/AcceptedType.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.etsi.mts.tdl.execution.java.rt.data;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * HTTP Accept header value usable on String fields.
- * XXX who dis?
- */
-@Retention(RetentionPolicy.RUNTIME)  
-@Target(ElementType.FIELD)
-public @interface AcceptedType {
-}
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Argument.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Argument.java
index 29c68da85103e5482578f7cab327bd7b9e9e2a21..ae35783d3fa5a6a6f58fd27061530f955657428f 100644
--- a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Argument.java
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Argument.java
@@ -4,18 +4,10 @@ package org.etsi.mts.tdl.execution.java.tri;
  * Extends {@link Data Data} to provide name of a parameter. The argument is
  * specified using <code>type</code> and <code>value</code>.
  */
-public class Argument<T, V> extends Data<T, V> {
+public interface Argument<T, V> extends Data<T, V> {
+
 	/**
 	 * Name of the parameter as specified in TDL model.
 	 */
-	private String parameterName;
-
-	public Argument(T type, V value, String parameterName) {
-		super(type, value);
-		this.parameterName = parameterName;
-	}
-
-	public String getParameterName() {
-		return parameterName;
-	}
+	String getParameterName();
 }
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Connection.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Connection.java
index 3b0303f1a260f75908e1f26c81b336f7a86fe14b..415dff5a22dc5a52fb4a56a2062258a38f5e09bb 100644
--- a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Connection.java
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Connection.java
@@ -4,23 +4,10 @@ package org.etsi.mts.tdl.execution.java.tri;
  * Encapsulation of connected <code>GateReference</code>s.
  *
  */
-public class Connection extends Element {
+public interface Connection extends Element {
 
 	/**
 	 * The end-points of this connection as specified in TDL model.
 	 */
-	public final GateReference[] endPoints = new GateReference[2];
-
-	public Connection(String name, GateReference sourceGate, GateReference targetGate) {
-		super(name);
-		endPoints[0] = sourceGate;
-		endPoints[1] = targetGate;
-	}
-	
-	@Override
-	public String toString() {
-		if (name != null)
-			return name;
-		return endPoints[0].toString() + " :: " + endPoints[1].toString();
-	}
+	GateReference[] getEndPoints();
 }
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Data.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Data.java
index 6f45ace0a54113a316a0566e2558e2a7c0b658d0..2343744e99ea1f42eb9e51cf7159136e5e04120f 100644
--- a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Data.java
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Data.java
@@ -3,41 +3,17 @@ package org.etsi.mts.tdl.execution.java.tri;
 /**
  * Encapsulation of type and value. The objects are resolved using TDL data
  * mappings.
- * <p>
- * In Java environment the <code>type</code> is a Java class and
- * <code>value</code> is an object of that class or a lambda expression that
- * returns such object.
  */
-public class Data<T, V> {
-
-	/**
-	 * The type information in environment specific form that can be used to decode
-	 * incoming data. For example, an annotated class.
-	 */
-	private T type;
-
+public interface Data<T, V> {
 	/**
 	 * The decoded value of the data that matches the type.
 	 */
-	private V value;
-
-	public Data(T type, V value) {
-		this.type = type;
-		this.value = value;
-	}
-
-	/**
-	 * @see #value
-	 */
-	public V getValue() {
-		return value;
-	}
+	V getValue();
 
 	/**
-	 * @see #type
+	 * The type information in environment specific form that can be used to decode
+	 * incoming data. For example, an annotated class.
 	 */
-	public T getType() {
-		return type;
-	}
+	T getType();
 
 }
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Element.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Element.java
index 138de06601a5b9ca12f8fc90eea28b25fe403ffc..6ee44bae4f8188ce49e707d05235bcef9e8194b4 100644
--- a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Element.java
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Element.java
@@ -1,6 +1,5 @@
 package org.etsi.mts.tdl.execution.java.tri;
 
-import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -10,21 +9,16 @@ import java.util.List;
  * meta-class.
  *
  */
-public class Element {
+public interface Element {
+
 	/**
 	 * The name of the element as specified in TDL model.
 	 */
-	public String name;
+	String getName();
 
 	/**
 	 * The annotations assigned to the element as specified in TDL model.
 	 */
-	public List<ElementAnnotation> annotations = new ArrayList<ElementAnnotation>();
-
-	public Element() {
-	}
+	List<ElementAnnotation> getAnnotations();
 
-	public Element(String name) {
-		this.name = name;
-	}
 }
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/ElementAnnotation.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/ElementAnnotation.java
index 62a1d4f957168270f2a96f9d22ca194e66d9be6d..d7062d83c2098d45be7095af8d0bf6b0fc41273b 100644
--- a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/ElementAnnotation.java
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/ElementAnnotation.java
@@ -3,15 +3,16 @@ package org.etsi.mts.tdl.execution.java.tri;
 /**
  * Annotation as specified in TDL model.
  */
-public class ElementAnnotation {
+public interface ElementAnnotation {
+
+	/**
+	 * Key of the annotation.
+	 */
+	String getKey();
+
 	/**
-	 * Key and value of the annotation.
+	 * Value of the annotation.
 	 */
-	public String key, value;
+	String getValue();
 
-	public ElementAnnotation(String key, String value) {
-		this.key = key;
-		this.value = value;
-	}
-	
 }
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/GateReference.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/GateReference.java
index f00f9e1d66df60ebfe37fd1dc4f563db1f8c82a0..382a7ef2b33bb24cd59f401daa41a2c4f03b2a01 100644
--- a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/GateReference.java
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/GateReference.java
@@ -12,36 +12,18 @@ package org.etsi.mts.tdl.execution.java.tri;
  * </ul>
  *
  */
-public class GateReference {
-	public Element gate;
-	public Element gateType;
-	public Element component;
-	public Element componentType;
-	public ComponentInstanceRole role;
+public interface GateReference {
 
-	public GateReference(Element gate, Element gateType, Element component, Element componentType,
-			ComponentInstanceRole role) {
-		this.gate = gate;
-		this.gateType = gateType;
-		this.component = component;
-		this.componentType = componentType;
-		this.role = role;
-	}
+	Element getGate();
 
-	@Override
-	public int hashCode() {
-		return gate.hashCode() << 8 + gateType.hashCode() << 6 + component.hashCode() << 4
-				+ componentType.hashCode() << 2 + role.hashCode();
-	}
+	NamedElement getGateType();
+	
+	GateTypeKind getGateTypeKind();
 
-	@Override
-	public boolean equals(Object obj) {
-		if (obj instanceof GateReference) {
-			GateReference gr = (GateReference) obj;
-			return gate.equals(gr.gate) && gateType.equals(gr.gateType) && component.equals(gr.component)
-					&& componentType.equals(gr.componentType) && role.equals(gr.role);
-		}
-		return super.equals(obj);
-	}
+	Element getComponent();
+
+	NamedElement getComponentType();
+
+	ComponentInstanceRole getComponentRole();
 
 }
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Mapping.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Mapping.java
new file mode 100644
index 0000000000000000000000000000000000000000..eef56892106ffe17975068980e830c83f1450421
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Mapping.java
@@ -0,0 +1,59 @@
+package org.etsi.mts.tdl.execution.java.tri;
+
+/**
+ * Representation of a TDL model element of class <i>DataResourceMapping</i>,
+ * <i>DataElementMapping</i> or <i>ParameterMapping</i>.
+ */
+public interface Mapping extends Element {
+	/**
+	 * Get the name applied to the associated <i>DataResourceMapping</i> element
+	 * using the predefined <i>MappingName</i> annotation.
+	 * 
+	 * @return A distinctive name for this mapping.
+	 */
+	String getMappingName();
+
+	/**
+	 * If this is a resource mapping.
+	 * 
+	 * @return <b>true</b> if this type represents a <i>DataResourceMapping</i>
+	 *         element.
+	 */
+	boolean isResource();
+
+	/**
+	 * If this is a parameter mapping.
+	 * 
+	 * @return <b>true</b> if this type represents a <i>ParameterMapping</i>
+	 *         element.
+	 */
+	boolean isParameter();
+
+	/**
+	 * Get the type-sepcific URI for this mapping.
+	 * 
+	 * @return The URI of this mapping as specified in corresponding model element.
+	 */
+	String getUri();
+
+	/**
+	 * Get the resource mapping for this data mapping.
+	 * 
+	 * @return The <code>Mapping</code> representing the <i>DataResourceMapping</i>
+	 *         element referenced by the associated <i>DataElementMapping</i>
+	 *         element.
+	 */
+	Mapping getResource();
+
+	/**
+	 * Get the parameter mappings of this data mapping.
+	 * 
+	 * @param parameterName Name of the parameter as returned by
+	 *                      {@link Type#getParameters() Type.getParameters()} or
+	 *                      {@link Value#getParameters() Value.getParameters()}.
+	 * @return A <code>Mapping</code> representing a <i>ParameterMapping</i>
+	 *         element.
+	 */
+	Mapping getParameterMapping(String parameterName);
+
+}
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/NamedElement.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/NamedElement.java
index 33f9847044a0f06afb3fffa27cce43bba19ae610..71e395ca77887557c5d0e915963c67cc8a3b69e9 100644
--- a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/NamedElement.java
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/NamedElement.java
@@ -5,17 +5,10 @@ package org.etsi.mts.tdl.execution.java.tri;
  * in TDL.
  *
  */
-public class NamedElement extends Element {
+public interface NamedElement extends Element {
+
 	/**
 	 * The qualified name of the element as specified in TDL model.
 	 */
-	public String qualifiedName;
-
-	public NamedElement() {
-	}
-
-	public NamedElement(String name, String qualifiedName) {
-		super(name);
-		this.qualifiedName = qualifiedName;
-	}
+	String getQualifiedName();
 }
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Parameter.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Parameter.java
new file mode 100644
index 0000000000000000000000000000000000000000..98c4b47389753d45c66041b165894dc22eee8e74
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Parameter.java
@@ -0,0 +1,10 @@
+package org.etsi.mts.tdl.execution.java.tri;
+
+/**
+ * Representation of a TDL model element of class <i>Parameter</i> and its
+ * sub-classes.
+ */
+public interface Parameter<T> extends Element {
+
+	T getType();
+}
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/PredefinedFunctions.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/PredefinedFunctions.java
index 16bea9c893cf71bfefedaaff7e1bf79aa6e08b53..b9870fd834d63bafafe5e349820a37fa1eae335d 100644
--- a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/PredefinedFunctions.java
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/PredefinedFunctions.java
@@ -1,122 +1,58 @@
 package org.etsi.mts.tdl.execution.java.tri;
 
-import java.util.Collection;
+public interface PredefinedFunctions {
 
-import com.google.inject.Inject;
+	boolean equals(Data<?, ?> d0, Data<?, ?> d1);
 
-/**
- * Default implementation of predefined functions specified in TDL.
- */
-public class PredefinedFunctions {
+	boolean notEquals(Data<?, ?> d0, Data<?, ?> d1);
 
-	public RuntimeHelper helper;
+	boolean and(boolean b0, boolean b1);
 
-	@Inject
-	public PredefinedFunctions(RuntimeHelper helper) {
-		this.helper = helper;
-	}
+	boolean or(boolean b0, boolean b1);
 
-	public boolean equals(Data<?, ?> d0, Data<?, ?> d1) {
-		return helper.equals(d0.getValue(), d1.getValue());
-	}
+	boolean xor(boolean b0, boolean b1);
 
-	public boolean notEquals(Data<?, ?> d0, Data<?, ?> d1) {
-		return !equals(d0, d1);
-	}
+	boolean not(boolean b);
 
-	public boolean and(boolean b0, boolean b1) {
-		return b0 && b1;
-	}
+	boolean lt(int i0, int i1);
 
-	public boolean or(boolean b0, boolean b1) {
-		return b0 || b1;
-	}
+	boolean gt(int i0, int i1);
 
-	public boolean xor(boolean b0, boolean b1) {
-		return b0 ^ b1;
-	}
+	boolean lteq(int i0, int i1);
 
-	public boolean not(boolean b) {
-		return !b;
-	}
+	boolean gteq(int i0, int i1);
 
-	public boolean lt(int i0, int i1) {
-		return i0 < i1;
-	}
+	boolean lt(long i0, long i1);
 
-	public boolean gt(int i0, int i1) {
-		return i0 > i1;
-	}
+	boolean gt(long i0, long i1);
 
-	public boolean lteq(int i0, int i1) {
-		return i0 <= i1;
-	}
+	boolean lteq(long i0, long i1);
 
-	public boolean gteq(int i0, int i1) {
-		return i0 >= i1;
-	}
+	boolean gteq(long i0, long i1);
 
-	public boolean lt(long i0, long i1) {
-		return i0 < i1;
-	}
+	int plus(int i0, int i1);
 
-	public boolean gt(long i0, long i1) {
-		return i0 > i1;
-	}
+	int minus(int i0, int i1);
 
-	public boolean lteq(long i0, long i1) {
-		return i0 <= i1;
-	}
+	int multiply(int i0, int i1);
 
-	public boolean gteq(long i0, long i1) {
-		return i0 >= i1;
-	}
+	int divide(int i0, int i1);
 
-	public int plus(int i0, int i1) {
-		return i0 + i1;
-	}
+	int mod(int i0, int i1);
 
-	public int minus(int i0, int i1) {
-		return i0 - i1;
-	}
+	long plus(long i0, long i1);
 
-	public int multiply(int i0, int i1) {
-		return i0 * i1;
-	}
+	long minus(long i0, long i1);
 
-	public int divide(int i0, int i1) {
-		return i0 / i1;
-	}
+	long multiply(long i0, long i1);
 
-	public int mod(int i0, int i1) {
-		return i0 % i1;
-	}
+	long divide(long i0, long i1);
 
-	public long plus(long i0, long i1) {
-		return i0 + i1;
-	}
-
-	public long minus(long i0, long i1) {
-		return i0 - i1;
-	}
-
-	public long multiply(long i0, long i1) {
-		return i0 * i1;
-	}
-
-	public long divide(long i0, long i1) {
-		return i0 / i1;
-	}
-
-	public long mod(long i0, long i1) {
-		return i0 % i1;
-	}
+	long mod(long i0, long i1);
 
 	/**
 	 * @param collection An object that a CollectionDataInstance is mapped to.
 	 */
-	public int size(Data<?, Collection<?>> collection) {
-		return collection.getValue().size();
-	}
+	int size(Data<?, ?> collection);
 
-}
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Procedure.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Procedure.java
index 22c086b50f501f7f3e2a1091541d6c5d790bbebd..46a8bf6e6b0083e22afc7f26491e89b6e11bd1d1 100644
--- a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Procedure.java
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Procedure.java
@@ -1,20 +1,25 @@
 package org.etsi.mts.tdl.execution.java.tri;
 
-import java.util.function.Consumer;
+import java.util.List;
 
 /**
- * Encapsulation of procedure signature as specified in TDL model that may
- * optionally be mapped to a method that implements the calling of the
- * procedure.
+ * Encapsulation of procedure signature as specified in TDL model .
  */
-public class Procedure extends NamedElement {
+public interface Procedure extends NamedElement {
+
+	/**
+	 * Get the parameters with <i>ParameterKind::In</i>.
+	 */
+	List<Parameter> getIn();
+
+	/**
+	 * Get the parameters with <i>ParameterKind::Out</i>.
+	 */
+	List<Parameter> getOut();
+
 	/**
-	 * Optional function that implements this procedure call.
-	 * <p>
-	 * The function parameters must match the order and types of parameters of the
-	 * procedure call. That is, for each parameter of a procedure call, a method
-	 * parameter must exist such that the procedure call parameter type is mapped to
-	 * the method parameter type (or class).
+	 * Get the parameters with <i>ParameterKind::Exception</i>.
 	 */
-	public Consumer<Object[]> function;
+	List<Parameter> getException();
 }
+	
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/ProviderModule.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/ProviderModule.java
index 66d7590387df0aef41853898ec3083d60a1b5613..12f9894d2541b926ae2d0eeb4f30f757290c2dd2 100644
--- a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/ProviderModule.java
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/ProviderModule.java
@@ -26,11 +26,5 @@ public interface ProviderModule extends com.google.inject.Module {
 
 	@Provides
 	@Singleton
-	default PredefinedFunctions providePredefinedFunctions(RuntimeHelper helper) {
-		return new PredefinedFunctions(helper);
-	}
-
-	@Provides
-	@Singleton
-	RuntimeHelper provideRuntimeHelper();
+	PredefinedFunctions providePredefinedFunctions();
 }
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/RuntimeHelper.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/RuntimeHelper.java
deleted file mode 100644
index 99a5ef3008c0344e670b0de0d548e618b0d2c7f9..0000000000000000000000000000000000000000
--- a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/RuntimeHelper.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.etsi.mts.tdl.execution.java.tri;
-
-/**
- * Helper functions to provide environment specific implementation for various
- * operations.
- */
-public interface RuntimeHelper {
-	/**
-	 * Compare two objects. Can be used to implement deep equals operation for
-	 * {@link Data Data} objects.
-	 * 
-	 * @return <code>True</code> if objects are equal.
-	 */
-	boolean equals(Object o0, Object o1);
-
-	/**
-	 * Create a copy of an object. Can be used to implement deep clone of
-	 * {@link Data Data} objects.
-	 */
-	<T> T clone(T object);
-}
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/SpecialValue.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/SpecialValue.java
new file mode 100644
index 0000000000000000000000000000000000000000..b3ad507d29ae0954623c29782365030228deda18
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/SpecialValue.java
@@ -0,0 +1,10 @@
+package org.etsi.mts.tdl.execution.java.tri;
+
+/**
+ * Designates a sub-class of <i>SpecialValueUse</i>.
+ */
+public enum SpecialValue {
+	AnyValue,
+	AnyValueOrOmit,
+	OmitValue
+}
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/StopException.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/StopException.java
index e0dfff77058e5f934a2423b4618f343f98402ed7..c7597d4627ecb71ae8c7bf2ea0a5b5df9f649532 100644
--- a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/StopException.java
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/StopException.java
@@ -13,22 +13,19 @@ package org.etsi.mts.tdl.execution.java.tri;
  *
  */
 @SuppressWarnings("serial")
-public class StopException extends Exception {
-	/**
-	 * Optional final verdict.
-	 */
-	private Verdict verdict;
+public abstract class StopException extends Exception {
 
 	public StopException(String message) {
 		super(message);
 	}
-
-	public StopException(String message, Verdict verdict) {
-		super(message);
-		this.verdict = verdict;
+	
+	@Override
+	public String getMessage() {
+		return super.getMessage();
 	}
 
-	public Verdict getVerdict() {
-		return verdict;
-	}
+	/**
+	 * Optional final verdict.
+	 */
+	public abstract Verdict getVerdict();
 }
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/SystemAdapter.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/SystemAdapter.java
index f68a0340bc612bc226ae7e062f5a84f53f88aef1..4f6f09d0a78b95cb27ffb434d7fbeefbc038a580 100644
--- a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/SystemAdapter.java
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/SystemAdapter.java
@@ -101,4 +101,8 @@ public interface SystemAdapter {
 	 */
 	void replyCall(Procedure operation, Data reply, Data exception, Connection connection);
 
+	/**
+	 * XXX do we need this?
+	 */
+	Data callFunction(NamedElement function, Argument[] arguments);
 }
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Type.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Type.java
new file mode 100644
index 0000000000000000000000000000000000000000..334ac9d7c117a8b51abdaf0cf84e5c5d1d4201a5
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Type.java
@@ -0,0 +1,80 @@
+package org.etsi.mts.tdl.execution.java.tri;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Representation of a TDL model element of class <i>DataType</i> and its
+ * sub-classes.
+ */
+public interface Type extends NamedElement {
+
+	/**
+	 * If this type is a structure.
+	 * 
+	 * @return <b>true</b> if this type represents a <i>StructureDataType</i>
+	 *         element.
+	 */
+	boolean isStructure();
+
+	/**
+	 * If this type is a collection.
+	 * 
+	 * @return <b>true</b> if this type represents a <i>CollectionDataType</i>
+	 *         element.
+	 */
+	boolean isCollection();
+
+	/**
+	 * If this type is an enum.
+	 * 
+	 * @return <b>true</b> if this type represents a <i>EnumDataType</i> element.
+	 */
+	boolean isEnum();
+
+	/**
+	 * Get the data mapping chosen for the runtime. The mapping that is chosen is
+	 * implementation specific.
+	 * 
+	 * @return A <code>Mapping</code> representing a <i>DataElementMapping</i>
+	 *         element.
+	 */
+	Mapping getMapping();
+
+	/**
+	 * Get the names of members of this structured type. Includes all inherited
+	 * members as well.
+	 * 
+	 * @return Collection of names from the <i>Member</i> elements contained or
+	 *         inherited in the corresponding <i>StructuredDataType</i> element.
+	 */
+	Collection<String> getParameters();
+
+	/**
+	 * Get the type of a parameter.
+	 * 
+	 * @param parameterName Name of the parameter as returned by
+	 *                      {@link #getParameters() getParameters()}.
+	 * @return The <code>Type</code> of the parameter representing the
+	 *         <i>DataType</i> of the <i>Member</i> element corresponding to the
+	 *         parameter.
+	 */
+	Type getParameterType(String parameterName);
+
+	/**
+	 * Get the type of items of this collection type.
+	 * 
+	 * @return The <code>Type</code> of the items contained in a collection of this
+	 *         <code>Type</code>.
+	 */
+	Type getItemType();
+
+	/**
+	 * Get the literal values of this enumerated type.
+	 * 
+	 * @return The <code>Data</code> objects representing the
+	 *         <i>SimpleDataInstance</i> elements contained in the corresponding
+	 *         <i>EnumDataType</i> element.
+	 */
+	List<Data<Type, Value>> getEnumLiterals();
+}
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Value.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Value.java
new file mode 100644
index 0000000000000000000000000000000000000000..6529e73afe64321e46ec9c59dc7bae2f532cf376
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Value.java
@@ -0,0 +1,71 @@
+package org.etsi.mts.tdl.execution.java.tri;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Representation of a TDL model element of class <i>DataInstance</i> or
+ * <i>DataUse</i> and their sub-classes.
+ */
+public interface Value extends NamedElement {
+	/**
+	 * If this value is a structure.
+	 * 
+	 * @return <b>true</b> if the type of this value represents a
+	 *         <i>StructureDataType</i> element.
+	 */
+	boolean isStructure();
+
+	/**
+	 * If this value is a collection.
+	 * 
+	 * @return <b>true</b> if the type of this value represents a
+	 *         <i>CollectionDataType</i> element.
+	 */
+	boolean isCollection();
+
+	/**
+	 * Get the data mapping chosen for the runtime. The mapping that is chosen is
+	 * implementation specific.
+	 * 
+	 * @return A <code>Mapping</code> representing a <i>DataElementMapping</i>
+	 *         element.
+	 */
+	Mapping getMapping();
+
+	/**
+	 * Get the primitive or special value of this value object.
+	 * 
+	 * @return A <code>String</code>, a <code>Boolean</code> or any other boxed
+	 *         primitive value or an instance of {@link SpecialValue SpecialValue}.
+	 */
+	Object getValue();
+
+	/**
+	 * Get the names of members of the structured type of this value. Only returns
+	 * the parameters that have a value assigned.
+	 * 
+	 * @return Collection of names from the <i>MemberAssignment</i> or
+	 *         <i>ParameterBinding</i> elements contained in the corresponding
+	 *         <i>DataInstance</i> or <i>DataUse</i> element.
+	 */
+	Collection<String> getParameters();
+
+	/**
+	 * Get the value data of a parameter.
+	 * 
+	 * @param parameterName Name of the parameter as returned by
+	 *                      {@link #getParameters() getParameters()}.
+	 * @return The <code>Value</code> of the parameter wrapped in <code>Data</code>
+	 *         object.
+	 */
+	Data<Type, Value> getParameter(String parameterName);
+
+	/**
+	 * Get the values contained in this collection value.
+	 * 
+	 * @return The <code>Value</code>s of the items wrapped in <code>Data</code>
+	 *         objects.
+	 */
+	List<Data<Type, Value>> getItems();
+}
diff --git a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Verdict.java b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Verdict.java
index 570cabcc137c36aa51667f38ab57c85ba101b740..8950cebd548a05a926decdb95b9255c891d051e0 100644
--- a/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Verdict.java
+++ b/plugins/org.etsi.mts.tdl.execution.java.runtime/src/org/etsi/mts/tdl/execution/java/tri/Verdict.java
@@ -3,14 +3,5 @@ package org.etsi.mts.tdl.execution.java.tri;
 /**
  * Either predefined or custom verdict.
  */
-public class Verdict extends NamedElement {
-	/**
-	 * Verdict instance predefined in TDL.
-	 */
-	public static Verdict pass = new Verdict("pass"), fail = new Verdict("fail"),
-			inconclusive = new Verdict("inconclusive");
-
-	public Verdict(String name) {
-		super(name, null);
-	}
+public interface Verdict extends NamedElement {
 }
diff --git a/plugins/org.etsi.mts.tdl.execution.java/.gitignore b/plugins/org.etsi.mts.tdl.execution.java/.gitignore
index b83d22266ac8aa2f8df2edef68082c789727841d..c188840704215ddf7b130068617520ffdbfa5140 100644
--- a/plugins/org.etsi.mts.tdl.execution.java/.gitignore
+++ b/plugins/org.etsi.mts.tdl.execution.java/.gitignore
@@ -1 +1,4 @@
 /target/
+/example-a-api
+/example-a-src
+/example-lib
diff --git a/plugins/org.etsi.mts.tdl.execution.java/.project b/plugins/org.etsi.mts.tdl.execution.java/.project
index 8e40f3b0c0ef06d9217cc05c9295c7d56a0039eb..95a1f9debf3cab0e19a514fcd5edc77f952e8251 100644
--- a/plugins/org.etsi.mts.tdl.execution.java/.project
+++ b/plugins/org.etsi.mts.tdl.execution.java/.project
@@ -31,4 +31,15 @@
 		<nature>org.eclipse.jdt.core.javanature</nature>
 		<nature>org.eclipse.pde.PluginNature</nature>
 	</natures>
+	<filteredResources>
+		<filter>
+			<id>1705077780104</id>
+			<name></name>
+			<type>30</type>
+			<matcher>
+				<id>org.eclipse.core.resources.regexFilterMatcher</id>
+				<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
 </projectDescription>
diff --git a/plugins/org.etsi.mts.tdl.execution.java/META-INF/MANIFEST.MF b/plugins/org.etsi.mts.tdl.execution.java/META-INF/MANIFEST.MF
index e51cf333201bb3962dce263f4030c14a19dcf9c5..b8ed33c489a8dee5ac5f00001726aa9382b11a67 100644
--- a/plugins/org.etsi.mts.tdl.execution.java/META-INF/MANIFEST.MF
+++ b/plugins/org.etsi.mts.tdl.execution.java/META-INF/MANIFEST.MF
@@ -14,5 +14,6 @@ Require-Bundle: org.eclipse.core.runtime,
  org.eclipse.emf,
  org.eclipse.emf.ecore,
  org.etsi.mts.tdl.model,
+ org.etsi.mts.tdl.execution.java.codegen,
  junit-jupiter-api
 
diff --git a/plugins/org.etsi.mts.tdl.execution.java/src/org/etsi/mts/tdl/execution/java/eclipse/commands/RenderHandler.java b/plugins/org.etsi.mts.tdl.execution.java/src/org/etsi/mts/tdl/execution/java/eclipse/commands/RenderHandler.java
index 4a2a985649daaf0a036d95976fbaf3fd145f9d5b..a9a05cf7e4b5cf95288a8f341f1fa32ab34fd159 100644
--- a/plugins/org.etsi.mts.tdl.execution.java/src/org/etsi/mts/tdl/execution/java/eclipse/commands/RenderHandler.java
+++ b/plugins/org.etsi.mts.tdl.execution.java/src/org/etsi/mts/tdl/execution/java/eclipse/commands/RenderHandler.java
@@ -67,7 +67,9 @@ public class RenderHandler extends AbstractHandler implements IHandler {
 				generationDir.getLocation().toFile(),
 				preferences.get(Settings.PACKAGE, ""),
 				preferences.get(Settings.INJECTOR, ""),
-				preferences.get(Settings.DATE_FORMAT, ""));
+				preferences.get(Settings.DATE_FORMAT, ""),
+				preferences.get(Settings.USE_MAPPING, ""),
+				preferences.getBoolean(Settings.UNMAPPED_DATA, false));
 		
 		JUnitTestGenerator generator = new JUnitTestGenerator(model, settings);
 
diff --git a/plugins/org.etsi.mts.tdl.execution.java/src/org/etsi/mts/tdl/execution/java/eclipse/ui/PropertyPage.java b/plugins/org.etsi.mts.tdl.execution.java/src/org/etsi/mts/tdl/execution/java/eclipse/ui/PropertyPage.java
index 351168d61ff03b779af0dedafc1d0cde7a8304d7..6211bf74a2e93aeff31d39213ad1d01715b2f00d 100644
--- a/plugins/org.etsi.mts.tdl.execution.java/src/org/etsi/mts/tdl/execution/java/eclipse/ui/PropertyPage.java
+++ b/plugins/org.etsi.mts.tdl.execution.java/src/org/etsi/mts/tdl/execution/java/eclipse/ui/PropertyPage.java
@@ -13,6 +13,7 @@ import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.preference.BooleanFieldEditor;
 import org.eclipse.jface.preference.FieldEditor;
 import org.eclipse.jface.preference.FieldEditorPreferencePage;
 import org.eclipse.jface.preference.IPreferenceStore;
@@ -81,7 +82,7 @@ public class PropertyPage extends FieldEditorPreferencePage implements IWorkbenc
 			FieldEditor e = (FieldEditor) event.getSource();
 
 			String name = e.getPreferenceName();
-			String value = (String) event.getNewValue();
+			String value = event.getNewValue().toString();
 
 			fields.put(e, value);
 
@@ -121,6 +122,14 @@ public class PropertyPage extends FieldEditorPreferencePage implements IWorkbenc
 		StringFieldEditor dateFormat = new StringFieldEditor(Settings.DATE_FORMAT, "Date format", parent);
 		addField(dateFormat);
 
+		parent = getFieldEditorParent();
+		StringFieldEditor useMapping = new StringFieldEditor(Settings.USE_MAPPING, "Mapping for TRI", parent);
+		addField(useMapping);
+
+		parent = getFieldEditorParent();
+		BooleanFieldEditor unmappedData = new BooleanFieldEditor(Settings.UNMAPPED_DATA, "Use unmapped data", parent);
+		addField(unmappedData);
+
 	}
 
 	private boolean isValid(FieldEditor e) {
diff --git a/plugins/org.etsi.mts.tdl.graphical.labels.data.ui/.project b/plugins/org.etsi.mts.tdl.graphical.labels.data.ui/.project
index 9245f7ce89747008b09e256b20daaadff972eda1..850a63b316149fdfbdf50dc3c68b23cf40df2e8e 100644
--- a/plugins/org.etsi.mts.tdl.graphical.labels.data.ui/.project
+++ b/plugins/org.etsi.mts.tdl.graphical.labels.data.ui/.project
@@ -37,4 +37,15 @@
 		<nature>org.eclipse.pde.PluginNature</nature>
 		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
 	</natures>
+	<filteredResources>
+		<filter>
+			<id>1705077780110</id>
+			<name></name>
+			<type>30</type>
+			<matcher>
+				<id>org.eclipse.core.resources.regexFilterMatcher</id>
+				<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
 </projectDescription>
diff --git a/plugins/org.etsi.mts.tdl.graphical.labels.data.ui/META-INF/MANIFEST.MF b/plugins/org.etsi.mts.tdl.graphical.labels.data.ui/META-INF/MANIFEST.MF
index a0def5e630a9b9cf3bbf605e5249dfd69357b09b..bfae79ec1686dea1ddb1a0c436fd323ce8e30f19 100644
--- a/plugins/org.etsi.mts.tdl.graphical.labels.data.ui/META-INF/MANIFEST.MF
+++ b/plugins/org.etsi.mts.tdl.graphical.labels.data.ui/META-INF/MANIFEST.MF
@@ -24,3 +24,4 @@ Export-Package: org.etsi.mts.tdl.graphical.labels.ui.quickfix,
  org.etsi.mts.tdl.graphical.labels.data.ui.internal,
  org.etsi.mts.tdl.graphical.labels.ide.contentassist.antlr.internal,
  org.etsi.mts.tdl.graphical.labels.ide.contentassist.antlr
+Bundle-Activator: org.etsi.mts.tdl.graphical.labels.data.ui.internal.DataActivator
diff --git a/plugins/org.etsi.mts.tdl.graphical.labels.data/.project b/plugins/org.etsi.mts.tdl.graphical.labels.data/.project
index c3a5640ee3fc256f172640e6ab13bd4e00040b4f..4de72f41c47d99cef2d7bd420d6fe2459f7824af 100644
--- a/plugins/org.etsi.mts.tdl.graphical.labels.data/.project
+++ b/plugins/org.etsi.mts.tdl.graphical.labels.data/.project
@@ -37,4 +37,15 @@
 		<nature>org.eclipse.pde.PluginNature</nature>
 		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
 	</natures>
+	<filteredResources>
+		<filter>
+			<id>1705077780109</id>
+			<name></name>
+			<type>30</type>
+			<matcher>
+				<id>org.eclipse.core.resources.regexFilterMatcher</id>
+				<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
 </projectDescription>
diff --git a/plugins/org.etsi.mts.tdl.graphical.viewpoint/.project b/plugins/org.etsi.mts.tdl.graphical.viewpoint/.project
index e6baecde9265cef5e81f7382e8ff87c34ea19d9b..184d52cfaf58566345eafe17d115f2ba47e89ed7 100644
--- a/plugins/org.etsi.mts.tdl.graphical.viewpoint/.project
+++ b/plugins/org.etsi.mts.tdl.graphical.viewpoint/.project
@@ -37,4 +37,15 @@
 		<nature>org.eclipse.jdt.core.javanature</nature>
 		<nature>org.eclipse.pde.PluginNature</nature>
 	</natures>
+	<filteredResources>
+		<filter>
+			<id>1705077780111</id>
+			<name></name>
+			<type>30</type>
+			<matcher>
+				<id>org.eclipse.core.resources.regexFilterMatcher</id>
+				<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
 </projectDescription>
diff --git a/plugins/org.etsi.mts.tdl.graphical.viewpoint/src/org/etsi/mts/tdl/graphical/project/ProjectWizard.java b/plugins/org.etsi.mts.tdl.graphical.viewpoint/src/org/etsi/mts/tdl/graphical/project/ProjectWizard.java
index f019d93860673965ed7ea9c3261a3b3f80da7636..9b1323615203c71f7a1d25436f882988f77664a9 100644
--- a/plugins/org.etsi.mts.tdl.graphical.viewpoint/src/org/etsi/mts/tdl/graphical/project/ProjectWizard.java
+++ b/plugins/org.etsi.mts.tdl.graphical.viewpoint/src/org/etsi/mts/tdl/graphical/project/ProjectWizard.java
@@ -50,6 +50,7 @@ public class ProjectWizard extends BasicNewProjectResourceWizard implements INew
 		try {
 			
 			addNature(project, "org.eclipse.xtext.ui.shared.xtextNature");
+			addNature(project, "org.etsi.mts.tdl.nature");
 			ModelingProjectManager.INSTANCE.convertToModelingProject(project, monitor);
 
 			IFile file = project.getFile("model.tdl");
diff --git a/plugins/org.etsi.mts.tdl.helper/META-INF/MANIFEST.MF b/plugins/org.etsi.mts.tdl.helper/META-INF/MANIFEST.MF
index cdd743600c0adfe1d203318909e01c962276646d..eccaded377c38231de25f0e529869aaf6cf256f2 100644
--- a/plugins/org.etsi.mts.tdl.helper/META-INF/MANIFEST.MF
+++ b/plugins/org.etsi.mts.tdl.helper/META-INF/MANIFEST.MF
@@ -23,5 +23,6 @@ Require-Bundle: org.eclipse.xtext,
  org.eclipse.emf.common,
  org.eclipse.emf.mwe.utils,
  org.eclipse.ocl.xtext.completeocl,
- com.google.guava
+ com.google.guava,
+ org.etsi.mts.tdl.common
 Export-Package: org.etsi.mts.tdl.helper
diff --git a/plugins/org.etsi.mts.tdl.helper/src/org/etsi/mts/tdl/helper/TDLHelper.java b/plugins/org.etsi.mts.tdl.helper/src/org/etsi/mts/tdl/helper/TDLHelper.java
index 5bc4994f83abafd885da27469a0cd9f77c6ac9c7..b513c4f42088121fdd85efaa137d22108c9ed886 100644
--- a/plugins/org.etsi.mts.tdl.helper/src/org/etsi/mts/tdl/helper/TDLHelper.java
+++ b/plugins/org.etsi.mts.tdl.helper/src/org/etsi/mts/tdl/helper/TDLHelper.java
@@ -2,8 +2,9 @@ package org.etsi.mts.tdl.helper;
 
 
 
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
-import java.net.URISyntaxException;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
@@ -15,7 +16,9 @@ import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.IResourceVisitor;
 import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.emf.common.util.URI;
@@ -43,6 +46,7 @@ import org.etsi.mts.tdl.TDLtxiStandaloneSetup;
 import org.etsi.mts.tdl.TPLan2StandaloneSetup;
 import org.etsi.mts.tdl.impl.tdlPackageImpl;
 import org.etsi.mts.tdl.structuredobjectives.impl.StructuredObjectivesPackageImpl;
+import org.osgi.framework.Bundle;
 
 import com.google.inject.Injector;
 
@@ -138,9 +142,22 @@ public class TDLHelper {
 	 * @param resource A resource to be saved.
 	 * @throws Exception 
 	 */
-	public static void store(Resource resource) throws Exception {
+	public static void store(Resource resource, boolean derived) throws Exception {
+		if (derived) {
+			IFile file = resourceToFile(resource);
+			if (file != null) {
+				if (!file.exists())
+					file.create(new ByteArrayInputStream(new byte[0]), false, null);
+				file.setDerived(derived, new NullProgressMonitor());
+			}
+		}
 		resource.save(Collections.emptyMap());
 	}
+	
+	public static IFile resourceToFile(Resource resource) {
+		URI uri = resource.getURI();
+		return ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(uri.toPlatformString(true)));
+	}
 
 
 	/**
@@ -260,11 +277,24 @@ public class TDLHelper {
 					}
 				};
 				prj.accept(finder);
-				
 				if (finder.file != null) {
 					URI uri = URI.createPlatformResourceURI(finder.file.getFullPath().toString(), true);
 					Resource tdlResource = resource.getResourceSet().getResource(uri, true);
 					return (Package) tdlResource.getContents().get(0);
+				} else {
+					//TODO: somewhat hacky way to load resources from the library if not found locally 
+					if (Platform.isRunning()) {
+						Bundle bundle = Platform.getBundle("org.etsi.mts.tdl.library");
+						ArrayList<Package> packages = new ArrayList<>();
+						bundle.findEntries("/","*.tdltx", true).asIterator().forEachRemaining(e-> {
+							org.eclipse.emf.common.util.URI pURI = org.eclipse.emf.common.util.URI.createURI(e.toString());
+							if (names.contains(pURI.lastSegment().toLowerCase())) {
+								Resource tdlResource = resource.getResourceSet().getResource(pURI, true);
+								packages.add((Package) tdlResource.getContents().get(0));
+							}
+						});
+						return packages.get(0);
+					}
 				}
 			}
 		} catch (CoreException e) {
diff --git a/plugins/org.etsi.mts.tdl.importers.ui/META-INF/MANIFEST.MF b/plugins/org.etsi.mts.tdl.importers.ui/META-INF/MANIFEST.MF
index 965ff1ae0c694418cb37c196d21a5c546d471099..58883f63eb5b2405df25661d7ea0df10e409c63c 100644
--- a/plugins/org.etsi.mts.tdl.importers.ui/META-INF/MANIFEST.MF
+++ b/plugins/org.etsi.mts.tdl.importers.ui/META-INF/MANIFEST.MF
@@ -19,7 +19,9 @@ Require-Bundle: org.eclipse.ui,
  org.etsi.mts.tdl.asn2tdl,
  org.etsi.mts.tdl.openapi2tdl.next,
  org.etsi.mts.tdl.to2tdl,
- org.etsi.mts.tdl.json2tdl
+ org.etsi.mts.tdl.json2tdl,
+ org.etsi.mts.tdl.yang2tdl,
+ org.etsi.mts.tdl.helper
 Bundle-ActivationPolicy: lazy
 Import-Package: org.eclipse.emf.common.util
 Bundle-RequiredExecutionEnvironment: JavaSE-11
diff --git a/plugins/org.etsi.mts.tdl.importers.ui/src/org/etsi/mts/tdl/importers/ui/handlers/TranslationHandler.java b/plugins/org.etsi.mts.tdl.importers.ui/src/org/etsi/mts/tdl/importers/ui/handlers/TranslationHandler.java
index b14839f53ce475a845823c12d74d9f0095d3cd23..e53cc9082bbb731e0cad0a1b3c26ea4946ae6cdb 100644
--- a/plugins/org.etsi.mts.tdl.importers.ui/src/org/etsi/mts/tdl/importers/ui/handlers/TranslationHandler.java
+++ b/plugins/org.etsi.mts.tdl.importers.ui/src/org/etsi/mts/tdl/importers/ui/handlers/TranslationHandler.java
@@ -6,8 +6,12 @@ import java.util.LinkedHashMap;
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IContainer;
 import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.resource.ResourceSet;
@@ -23,15 +27,17 @@ import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.dialogs.ElementListSelectionDialog;
 import org.eclipse.ui.handlers.HandlerUtil;
 import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.ui.statushandlers.StatusManager;
 import org.eclipse.xtext.resource.XtextResourceSet;
 import org.eclipse.xtext.ui.resource.IResourceSetProvider;
 import org.etsi.mts.tdl.Package;
 import org.etsi.mts.tdl.asn2tdl.ASN2TDLTranslator;
+import org.etsi.mts.tdl.helper.TDLHelper;
 import org.etsi.mts.tdl.json2tdl.JSON2TDLTranslator;
 import org.etsi.mts.tdl.openapi2tdl.next.OpenAPI2TDLTranslatorNext;
 import org.etsi.mts.tdl.to2tdl.TO2TDLTranslator;
 import org.etsi.mts.tdl.transform.AbstractTranslator;
-
+import org.etsi.mts.tdl.yang2tdl.Yang2TDLTranslator;
 import com.google.inject.Guice;
 import com.google.inject.Inject;
 import com.google.inject.Injector;
@@ -92,6 +98,7 @@ public class TranslationHandler extends AbstractHandler {
 		ISelection selection = HandlerUtil.getCurrentSelection(event);
 		IEditorInput input = HandlerUtil.getActiveEditorInput(event);
 		IFile file = null;
+		IContainer container = null; 
 		if (input != null && input instanceof FileEditorInput) {
 			file = ((FileEditorInput) input).getFile();
 		} else if (selection !=null && selection instanceof IStructuredSelection) {
@@ -100,9 +107,13 @@ public class TranslationHandler extends AbstractHandler {
 			if (firstElement instanceof IFile) {
 				file = (IFile) firstElement;
 			}
+			if (firstElement instanceof IContainer) {
+				container = (IContainer) firstElement;
+			}
 		}
 		
-		if (file !=null) {
+		if (file !=null || container != null) {
+			//TODO: handle directories as well..
 			URI uri = URI.createPlatformResourceURI(file.getFullPath().toString(), true);
 			ResourceSet rs = new ResourceSetImpl();
 			
@@ -138,15 +149,34 @@ public class TranslationHandler extends AbstractHandler {
 				if (type.contains("yaml")) {
 					translator = new OpenAPI2TDLTranslatorNext();
 				}
+				if (type.contains("yang")) {
+					translator = new Yang2TDLTranslator();
+					//determine limit for looking for related module definitions 
+					//also if linked folders are used
+					if (container == null) {
+						container = file.getParent();
+					}
+					while (container.getParent() != null 
+							&& !container.isLinked()
+							&& container.getType() == IResource.FOLDER
+							) {
+						container = container.getParent();
+					}
+					String limit = container.getLocation().toFile().getAbsolutePath();
+					((Yang2TDLTranslator) translator).setLimit(limit);
+				}
 				if (translator != null) {
 					translator.setTargetResource(tr);
-					translator.initTargetResource(translator.cleanName(file.getName()));
+					translator.initTargetResource(translator.getCleanName(file.getName()));
 					try {
 						translator.translate(filepath);
 					} catch (Exception e) {
 						// TODO Auto-generated catch block
 						e.printStackTrace();
-						showErrorDialog(e);
+//						showErrorDialog(e);
+						StatusManager.getManager().handle(
+								new Status(IStatus.ERROR, "org.etsi.mts.tdl.importers.ui", "Failed to translate", e),
+								StatusManager.LOG | StatusManager.SHOW);
 					}
 				}
 				
@@ -166,7 +196,7 @@ public class TranslationHandler extends AbstractHandler {
 				//tr.getContents().addAll(EcoreUtil.copyAll(r.getContents()));
 
 				try {
-					tr.save(null);
+					TDLHelper.store(tr, true);
 				} catch (Exception e) {
 					// TODO Auto-generated catch block
 					e.printStackTrace();
@@ -179,6 +209,11 @@ public class TranslationHandler extends AbstractHandler {
 	}
 
 	private void showErrorDialog(Exception e) {
+		String message = e.getMessage();
+		Throwable cause = e;
+		while ((cause = cause.getCause()) != null) {
+			message+="\n"+"Caused by: \n\t"+cause.getMessage();
+		}
 		MessageDialog errorDialog = new MessageDialog(
 				Display.getDefault().getActiveShell(), 
 				"Translation error...", 
@@ -187,7 +222,7 @@ public class TranslationHandler extends AbstractHandler {
 				+ "It may be due to problems occurring while processing the input, "
 				+ "e.g if the input could not be processed. "
 				+ "See details for a more technical description:\n\n"
-				+ e.getMessage()
+				+ message
 				,		
 				MessageDialog.ERROR, 
 				0, 
diff --git a/plugins/org.etsi.mts.tdl.json2tdl/META-INF/MANIFEST.MF b/plugins/org.etsi.mts.tdl.json2tdl/META-INF/MANIFEST.MF
index e90038f7948c5879018127d92cff21c93ce960a3..8dadaade1af4196f5bc6c96c4212eabbee269652 100644
--- a/plugins/org.etsi.mts.tdl.json2tdl/META-INF/MANIFEST.MF
+++ b/plugins/org.etsi.mts.tdl.json2tdl/META-INF/MANIFEST.MF
@@ -1,6 +1,6 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
-Bundle-Name: Json2tdl
+Bundle-Name: JSON to TDL Translator
 Bundle-SymbolicName: org.etsi.mts.tdl.json2tdl
 Bundle-Version: 1.0.0.qualifier
 Export-Package: org.etsi.mts.tdl.json2tdl
diff --git a/plugins/org.etsi.mts.tdl.json2tdl/src/org/etsi/mts/tdl/json2tdl/JSON2TDLTranslator.java b/plugins/org.etsi.mts.tdl.json2tdl/src/org/etsi/mts/tdl/json2tdl/JSON2TDLTranslator.java
index 744fad3a98763c510ae7602599565ed5240f50aa..fda185c38e4bc047361c649594d7c2edf5020b25 100644
--- a/plugins/org.etsi.mts.tdl.json2tdl/src/org/etsi/mts/tdl/json2tdl/JSON2TDLTranslator.java
+++ b/plugins/org.etsi.mts.tdl.json2tdl/src/org/etsi/mts/tdl/json2tdl/JSON2TDLTranslator.java
@@ -162,7 +162,7 @@ public class JSON2TDLTranslator extends AbstractTranslator{
         } else if (e.isJsonObject()) {
             StructuredDataType dataType = getStructuredDataTypeFor(prefix);
             //TODO: make replacement optional, more robust
-    		DataElementMapping addDataElementMapping = addDataElementMapping(prefix.replaceAll("_", "."), dataType, sourceMappingTag);
+    		DataElementMapping addDataElementMapping = addDataElementMapping(prefix.replaceAll("_", "."), dataType, sourceMappingTag, drm);
             ((JsonObject) e).entrySet().forEach(a -> addMappings(prefix, a));
         } else if (e.isJsonPrimitive()) {
         	//TODO: needs handling?
diff --git a/plugins/org.etsi.mts.tdl.openapi.generator.wrapper/.classpath b/plugins/org.etsi.mts.tdl.library/.classpath
similarity index 54%
rename from plugins/org.etsi.mts.tdl.openapi.generator.wrapper/.classpath
rename to plugins/org.etsi.mts.tdl.library/.classpath
index 02d2cd9ee321e5925f01a675971243e7b83a6359..685a6999c9acba0d0158b0929d7a4d384644452e 100644
--- a/plugins/org.etsi.mts.tdl.openapi.generator.wrapper/.classpath
+++ b/plugins/org.etsi.mts.tdl.library/.classpath
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry exported="true" kind="lib" path="openapi-generator-cli-6.3.0.jar" sourcepath="openapi-generator-cli-6.3.0-sources.jar">
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11">
 		<attributes>
-			<attribute name="javadoc_location" value="jar:platform:/resource/org.etsi.mts.tdl.openapi.generator.wrapper/openapi-generator-cli-6.3.0-javadoc.jar!/"/>
+			<attribute name="module" value="true"/>
 		</attributes>
 	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="output" path="target/classes"/>
 </classpath>
diff --git a/plugins/org.etsi.mts.tdl.openapi.generator.wrapper/.project b/plugins/org.etsi.mts.tdl.library/.project
similarity index 92%
rename from plugins/org.etsi.mts.tdl.openapi.generator.wrapper/.project
rename to plugins/org.etsi.mts.tdl.library/.project
index 0b1838521ffa0e7634b690fff4abaf55e68db60f..c6e2ee4d346214df5080b87809e67b41c3928bdc 100644
--- a/plugins/org.etsi.mts.tdl.openapi.generator.wrapper/.project
+++ b/plugins/org.etsi.mts.tdl.library/.project
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-	<name>org.etsi.mts.tdl.openapi.generator.wrapper</name>
+	<name>org.etsi.mts.tdl.library</name>
 	<comment></comment>
 	<projects>
 	</projects>
@@ -33,7 +33,7 @@
 	</natures>
 	<filteredResources>
 		<filter>
-			<id>1681418411918</id>
+			<id>1681412457721</id>
 			<name></name>
 			<type>30</type>
 			<matcher>
diff --git a/plugins/org.etsi.mts.tdl.library/.settings/org.eclipse.core.resources.prefs b/plugins/org.etsi.mts.tdl.library/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000000000000000000000000000000000000..99f26c0203a7844de00dbfc56e6a35d8ed3c022c
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.library/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/plugins/org.etsi.mts.tdl.library/.settings/org.eclipse.jdt.core.prefs b/plugins/org.etsi.mts.tdl.library/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000000000000000000000000000000000..a58ebdcad300d0a088dcbd63941d2c89e78a4f98
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.library/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,15 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=11
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
diff --git a/plugins/org.etsi.mts.tdl.openapi.generator.wrapper/.settings/org.eclipse.m2e.core.prefs b/plugins/org.etsi.mts.tdl.library/.settings/org.eclipse.m2e.core.prefs
similarity index 100%
rename from plugins/org.etsi.mts.tdl.openapi.generator.wrapper/.settings/org.eclipse.m2e.core.prefs
rename to plugins/org.etsi.mts.tdl.library/.settings/org.eclipse.m2e.core.prefs
diff --git a/plugins/org.etsi.mts.tdl.library/META-INF/MANIFEST.MF b/plugins/org.etsi.mts.tdl.library/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..f70487877b3b0fab0afdd46280baeb21744eb188
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.library/META-INF/MANIFEST.MF
@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Standard Libraries
+Bundle-SymbolicName: org.etsi.mts.tdl.library
+Bundle-Version: 1.0.0.qualifier
+Automatic-Module-Name: org.etsi.mts.tdl.library
+Export-Package: org.etsi.mts.tdl.library
diff --git a/plugins/org.etsi.mts.tdl.library/build.properties b/plugins/org.etsi.mts.tdl.library/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..56d776555503f2905e0642aae5be7938371a965d
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.library/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = target/classes/
+bin.includes = META-INF/,\
+               .
diff --git a/plugins/org.etsi.mts.tdl.openapi.generator.wrapper/pom.xml b/plugins/org.etsi.mts.tdl.library/pom.xml
similarity index 90%
rename from plugins/org.etsi.mts.tdl.openapi.generator.wrapper/pom.xml
rename to plugins/org.etsi.mts.tdl.library/pom.xml
index c282530a93c09ed34f0dbf0025c5eea81616da5e..133997be495b051f4b213dd32ab096776e0edf40 100644
--- a/plugins/org.etsi.mts.tdl.openapi.generator.wrapper/pom.xml
+++ b/plugins/org.etsi.mts.tdl.library/pom.xml
@@ -7,7 +7,7 @@
 	  <relativePath>../../org.etsi.mts.tdl.parent</relativePath>
 
   </parent>
-  <artifactId>org.etsi.mts.tdl.openapi.generator.wrapper</artifactId>
+  <artifactId>org.etsi.mts.tdl.library</artifactId>
   <packaging>eclipse-plugin</packaging>
   <build>
     <plugins>
diff --git a/plugins/org.etsi.mts.tdl.library/src/org/etsi/mts/tdl/library/HTTP.tdltx b/plugins/org.etsi.mts.tdl.library/src/org/etsi/mts/tdl/library/HTTP.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..7e2c4b71535f0f479bef1421c435f403a0be98b3
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.library/src/org/etsi/mts/tdl/library/HTTP.tdltx
@@ -0,0 +1,172 @@
+@Version: "1.0.0"
+Package HTTP {
+	
+	Package MessageBasedConfiguration {
+		Import all from MessageBased
+		Message Gate HTTPGate accepts Request,Response
+		Message Gate HTTPSGate accepts Request,Response
+		Component API {
+			// Add variables and timers here or define new component types and configurations 
+			gate HTTPGate http
+			gate HTTPSGate https
+		}
+		Configuration BasicClientServer {
+			API client as Tester,
+			API poller as Tester,
+			API server as SUT,
+			connect client::http to server::http
+		}
+	}
+	
+	Note : "Message based types and instances"
+	Package MessageBased {
+		Import all from TDL
+		
+		// HTTP methods
+		Enumerated Method {
+			Method GET,
+			Method POST,
+			Method PUT,
+			Method PATCH,
+			Method DELETE
+		}
+		
+		// Generic Request type    
+		Structure Request (
+			String uri,
+			optional Method method,
+			optional Headers headers,
+			optional Parameters parameters,
+			optional QueryParameters queryParameters,
+			optional PathParameters pathParameters,
+			optional Body body
+		)
+		
+		// Generic Response type    
+		Structure Response (
+			optional Integer status,
+			optional String statusMessage,
+			optional Headers headers,
+			optional Body body
+		)
+		
+		// Supporting types
+		Collection Parameters of Parameter
+		Structure Parameter (
+			Location location,
+			String ^name,
+			String ^value
+		)
+		Enumerated Location {
+			Location path,
+			Location query,
+			// TODO may need a structure, not necessarily relevant in standardized testing
+			Location cookie
+		}
+		
+		Structure PathParameters ()
+		Structure QueryParameters ()
+		
+		Collection Headers of Header
+		Structure Header (
+			String ^name,
+			String ^value
+		)
+		
+		// Base body for extension
+		Structure Body ()
+		
+		// Basic string body
+		Structure StringBody extends Body (
+			String text
+		)
+		
+		// Basic wrapper for collection responses
+		Structure CollectionBody extends Body (
+			Bodies items
+		)
+		
+		// Any body can be included
+		// If consistent type is needed, a custom subtype shall be defined and used 
+		Collection Bodies of Body
+		// Custom collection data instances can be defined
+		// - inline in the responses 
+		// - predefined as a separate data element
+		
+		// Custom collection data instances can be defined 
+		// to enforce type consistency specific for API 
+		
+		// Basic form body    
+		Structure FormBody extends Body (
+			String field,
+			String content
+		)
+	} 
+    
+    Package Templates {
+		Import all from MessageBased
+		
+		// Generic Request instances
+		Request rGET (
+			method = GET
+		)
+		Request rPOST (
+			method = POST
+		)
+		Request rPUT (
+			method = PUT
+		)
+		Request rPATCH (
+			method = PATCH
+		)
+		Request rDELETE (
+			method = DELETE
+		)
+		
+		// Generic Response instances, name = status code        
+		Response r200 (
+			statusMessage = "OK"
+		)
+		Response r201 (
+			statusMessage = "Created"
+		)
+		Response r204 (
+			statusMessage = "No Content"
+		)
+		Response r400 (
+			statusMessage = "Bad Request"
+		)
+		Response r401 (
+			statusMessage = "Unauthorized"
+		)
+		Response r403 (
+			statusMessage = "Forbidden"
+		)
+		Response r404 (
+			statusMessage = "Not Found"
+		)
+		
+		// Generic Response instances, name = status message        
+		Response OK (
+			status = 200
+		)
+		Response Created (
+			status = 201
+		)
+		Response NoContent (
+			status = 204
+		)
+		Response BadRequest (
+			status = 400
+		)
+		Response NotFound (
+			status = 404
+		)
+		Response NotAuthorized (
+			status = 401
+		)
+		Response Forbidden (
+			status = 403
+		)
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.library/src/org/etsi/mts/tdl/library/HttpJavaMappings.tdltx b/plugins/org.etsi.mts.tdl.library/src/org/etsi/mts/tdl/library/HttpJavaMappings.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..7e460a4ee4de11c3e8e7a375adc84930d3caffa0
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.library/src/org/etsi/mts/tdl/library/HttpJavaMappings.tdltx
@@ -0,0 +1,58 @@
+Package HttpJavaMappings {
+	Import all from Tdl
+	Import all from Java
+	Import all from HTTP.MessageBased
+	
+	@JavaPackage
+    @MappingName : "Java"
+	Use "org.etsi.mts.tdl.execution.java.adapters.http" as HttpAdapter
+	
+    @JavaClass
+	Map Request to "HttpRequestData" in HttpAdapter as Request_Mapping {
+		uri -> "uri",
+		method -> "method",
+		headers -> "headers",
+		parameters -> "parameters",
+		body -> "body"
+    }
+    @JavaClass
+	Map Response to "HttpResponseData" in HttpAdapter as Response_Mapping {
+		status -> "status",
+		statusMessage -> "statusMessage",
+		headers -> "headers",
+		body -> "body"
+    }
+    @JavaClass
+	Map Header to "HttpHeader" in HttpAdapter as Header_Mapping {
+		^name -> "name",
+		^value -> "value"
+    }
+    @JavaClass
+	Map Parameter to "HttpRequestParameter" in HttpAdapter as Parameter_Mapping {
+		location -> "location",
+		^name -> "name",
+		^value -> "value"
+    }
+    @JavaClass
+	Map Location to "HttpParameterLocation" in HttpAdapter as Location_Mapping
+	
+    @JavaClass
+    @MappingName : "Java"
+	Use "org.etsi.mts.tdl.execution.java.adapters.http.HttpParameterLocation" as HttpParameterLocation
+	Map path to "path" in HttpParameterLocation as path_mapping
+	Map query to "query" in HttpParameterLocation as query_mapping
+	Map cookie to "cookie" in HttpParameterLocation as cookie_mapping
+	
+	
+    @JavaClass
+	Map Method to "HttpMethod" in HttpAdapter as Method_Mapping
+	
+    @JavaClass
+    @MappingName : "Java"
+	Use "org.etsi.mts.tdl.execution.java.adapters.http.HttpMethod" as HttpMethod
+	Map GET to "GET" in HttpMethod as GET_mapping
+	Map POST to "POST" in HttpMethod as POST_mapping
+	Map PUT to "PUT" in HttpMethod as PUT_mapping
+	Map PATCH to "PATCH" in HttpMethod as PATCH_mapping
+	Map DELETE to "DELETE" in HttpMethod as DELETE_mapping
+}
diff --git a/plugins/org.etsi.mts.tdl.library/src/org/etsi/mts/tdl/library/Java.tdltx b/plugins/org.etsi.mts.tdl.library/src/org/etsi/mts/tdl/library/Java.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..8ff1e8bcda025612233a2d3e056ccc28e7d9dafa
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.library/src/org/etsi/mts/tdl/library/Java.tdltx
@@ -0,0 +1,56 @@
+Package Java {
+	Import all from Tdl
+	
+	/* Applied to a DataResourceMapping to specify a package  */
+	Annotation JavaPackage
+	/* Applied to a DataElementMapping to specify an instance method  */
+	Annotation JavaMethod
+	/* Applied to a DataElementMapping to specify an class method  */
+	Annotation JavaStaticMethod
+	/* Applied to a DataResourceMapping or DataElementMapping to specify a class  */
+	Annotation JavaClass
+	/* Applied to a DataElementMapping to specify a field (of a class)  */
+	Annotation JavaField
+	/* Applied to a DataElementMapping to specify a static field (of a class)  */
+	Annotation JavaStaticField
+	/* Applied to a ParameterMapping to specify an instance method that returns the value of a field  */
+	Annotation JavaGetter
+	/* Applied to a ParameterMapping to specify an instance method that sets the field value  */
+	Annotation JavaSetter
+	
+	
+    @JavaPackage
+    @MappingName : "Java"
+    Use "java.lang" as JavaLang
+	Map Boolean to "Boolean" in JavaLang as Boolean_mapping
+	Map Integer to "Integer" in JavaLang as Integer_mapping
+	Map String to "String" in JavaLang as String_mapping
+	
+	
+	
+    @JavaPackage
+    @MappingName : "Java"
+    Use "org.etsi.mts.tdl.execution.java.tri" as Tri
+    
+    @JavaClass
+	Map Verdict to "Verdict" in Tri as Verdict_Mapping
+	
+    @JavaClass
+    @MappingName : "Java"
+	Use "org.etsi.mts.tdl.execution.java.tri.Verdict" as VerdictClass
+	Map pass to "pass" in VerdictClass as pass_mapping
+	Map fail to "fail" in VerdictClass as fail_mapping
+	Map inconclusive to "inconclusive" in VerdictClass as inconclusive_mapping
+	
+	
+    @JavaPackage
+    @MappingName : "Java"
+    Use "org.etsi.mts.tdl.execution.java.rt.core" as RuntimeCore
+    
+    @JavaClass
+    @MappingName : "Java"
+	Use "org.etsi.mts.tdl.execution.java.rt.core.TimeUnit" as TimeUnitClass
+	Map second to "Second" in TimeUnitClass as second_mapping
+	
+	
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.tx.ui/templates/Standard.tdltx b/plugins/org.etsi.mts.tdl.library/src/org/etsi/mts/tdl/library/Standard.tdltx
similarity index 94%
rename from plugins/org.etsi.mts.tdl.tx.ui/templates/Standard.tdltx
rename to plugins/org.etsi.mts.tdl.library/src/org/etsi/mts/tdl/library/Standard.tdltx
index 9af8d103a1d6978b245383e27b367805df797040..681efa80a4dfdd8620cb1aa00936ec40042f9ddd 100644
--- a/plugins/org.etsi.mts.tdl.tx.ui/templates/Standard.tdltx
+++ b/plugins/org.etsi.mts.tdl.library/src/org/etsi/mts/tdl/library/Standard.tdltx
@@ -1,4 +1,4 @@
-Package Standard {
+Package TDL {
 	//TODO: extract to standard library
 	Constraint length
 	Constraint minLength
@@ -14,8 +14,8 @@ Package Standard {
 	Type Verdict
 	
 	//TODO: these do not work at present -> literal values take precedence?
-//	Boolean true
-//	Boolean false
+	Boolean ^true
+	Boolean ^false
 	Boolean True
 	Boolean False
 	
@@ -35,6 +35,7 @@ Package Standard {
     Annotation Test Purpose Description
     Annotation when
     Annotation then
+    Annotation PICS
 	
 	Predefined == returns Boolean
 	Predefined != returns Boolean
diff --git a/plugins/org.etsi.mts.tdl.library/src/org/etsi/mts/tdl/library/Tdl.tdltx b/plugins/org.etsi.mts.tdl.library/src/org/etsi/mts/tdl/library/Tdl.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..32260bf95c211407e95321a2f093c812ae241fd8
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.library/src/org/etsi/mts/tdl/library/Tdl.tdltx
@@ -0,0 +1,60 @@
+@Version: "1.8.1"
+Package TDL {
+
+	Constraint length
+	Constraint minLength
+	Constraint maxLength
+	Constraint range
+	Constraint format
+	Constraint union
+	Constraint uniontype
+	
+	Type Boolean
+	Type Integer
+	Type String
+	Type Verdict
+	
+	Boolean ^true
+	Boolean ^false
+	Boolean True
+	Boolean False
+	
+	Verdict pass
+	Verdict fail
+	Verdict inconclusive
+	
+	Time second
+	
+	Annotation Master
+	Annotation MappingName
+	Annotation Version
+	Annotation check
+	Annotation where
+	Annotation PICS
+
+    //standard annotations for STO
+    Annotation Initial conditions
+    Annotation Expected behaviour
+    Annotation Final conditions
+    Annotation Test Purpose Description
+    Annotation when
+    Annotation then
+	
+	Predefined == returns Boolean
+	Predefined != returns Boolean
+	Predefined and returns Boolean
+	Predefined or returns Boolean
+	Predefined xor returns Boolean
+	Predefined not returns Boolean
+	Predefined < returns Boolean
+	Predefined > returns Boolean
+	Predefined <= returns Boolean
+	Predefined >= returns Boolean
+	Predefined +
+	Predefined -
+	Predefined *
+	Predefined /
+	Predefined mod
+	Predefined size returns Integer
+	
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.library/src/org/etsi/mts/tdl/library/TdlRuntime.tdltx b/plugins/org.etsi.mts.tdl.library/src/org/etsi/mts/tdl/library/TdlRuntime.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..07cd10d7322ab592da097e98561c6fa6375010fd
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.library/src/org/etsi/mts/tdl/library/TdlRuntime.tdltx
@@ -0,0 +1,3 @@
+Package TdlRuntime {
+	Annotation Language
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.library/src/org/etsi/mts/tdl/library/YANG.tdltx b/plugins/org.etsi.mts.tdl.library/src/org/etsi/mts/tdl/library/YANG.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..67aa4a7f38564358585510aef293672022abc217
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.library/src/org/etsi/mts/tdl/library/YANG.tdltx
@@ -0,0 +1,3 @@
+Package YANG {
+	Constraint choice
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.model/.project b/plugins/org.etsi.mts.tdl.model/.project
index 16b43bee5312266ce6e198be33367349922d6e44..dc251f152e3f95caede138dc9a5d53ac0458dc84 100644
--- a/plugins/org.etsi.mts.tdl.model/.project
+++ b/plugins/org.etsi.mts.tdl.model/.project
@@ -11,23 +11,12 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.eclipse.ocl.pivot.ui.oclbuilder</name>
+			<name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
+			<triggers>full,incremental,</triggers>
 			<arguments>
 				<dictionary>
-					<key>disabledExtensions</key>
-					<value>*,essentialocl</value>
-				</dictionary>
-				<dictionary>
-					<key>disabledPaths</key>
-					<value>bin/**,target/**</value>
-				</dictionary>
-				<dictionary>
-					<key>enabledExtensions</key>
-					<value>ecore,ocl,oclinecore,oclstdlib,uml</value>
-				</dictionary>
-				<dictionary>
-					<key>enabledPaths</key>
-					<value>**</value>
+					<key>LaunchConfigHandle</key>
+					<value>&lt;project&gt;/.externalToolBuilders/org.eclipse.ocl.pivot.ui.oclbuilder.launch</value>
 				</dictionary>
 			</arguments>
 		</buildCommand>
diff --git a/plugins/org.etsi.mts.tdl.model/META-INF/MANIFEST.MF b/plugins/org.etsi.mts.tdl.model/META-INF/MANIFEST.MF
index 2e217a5430a02b0e28eaa0935d566c2baf5e25a5..b0a68d9dc20ef6d79a6f4108fddbc000e623b414 100644
--- a/plugins/org.etsi.mts.tdl.model/META-INF/MANIFEST.MF
+++ b/plugins/org.etsi.mts.tdl.model/META-INF/MANIFEST.MF
@@ -18,12 +18,15 @@ Export-Package: org.etsi.mts.tdl,
  org.etsi.mts.tdl.structuredobjectives.impl,
  org.etsi.mts.tdl.structuredobjectives.util
 Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.core.resources,
  org.eclipse.emf.ecore;visibility:=reexport,
  org.eclipse.emf.ecore.xmi;visibility:=reexport,
  org.etsi.mts.tdl.model;visibility:=reexport,
  org.eclipse.ocl.pivot;visibility:=reexport,
+ org.eclipse.ocl.examples.codegen;visibility:=reexport,
  org.eclipse.ocl.xtext.essentialocl,
  org.eclipse.ocl.xtext.completeocl,
+ org.eclipse.jdt.annotation,
  org.eclipse.emf.mwe2.launch;resolution:=optional,
  org.eclipse.emf.mwe2.lib;resolution:=optional,
  org.eclipse.emf.codegen.ecore;resolution:=optional,
diff --git a/plugins/org.etsi.mts.tdl.model/library/predefined.tdl b/plugins/org.etsi.mts.tdl.model/library/predefined.tdl
index 586a3d5ed9490d8090814896f3cbf0b4639ef4a9..a8fbf71fb7cf1c8050de895c9dffe6ac4b00282b 100644
--- a/plugins/org.etsi.mts.tdl.model/library/predefined.tdl
+++ b/plugins/org.etsi.mts.tdl.model/library/predefined.tdl
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="ASCII"?>
-<tdl:Package xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tdl="http://www.etsi.org/spec/TDL/1.4.1" name="Standard">
+<tdl:Package xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tdl="http://www.etsi.org/spec/TDL/1.4.1" name="TDL">
   <packagedElement xsi:type="tdl:ConstraintType" name="length"/>
   <packagedElement xsi:type="tdl:ConstraintType" name="range"/>
   <packagedElement xsi:type="tdl:ConstraintType" name="format"/>
diff --git a/plugins/org.etsi.mts.tdl.model/model/tdl-constraints.ocl b/plugins/org.etsi.mts.tdl.model/model/tdl-constraints.ocl
index 246dc6888aa537902ac00f657f5749c19d94e770..5e7ac326cc698212e151994d4b05e37352a3a1f2 100644
--- a/plugins/org.etsi.mts.tdl.model/model/tdl-constraints.ocl
+++ b/plugins/org.etsi.mts.tdl.model/model/tdl-constraints.ocl
@@ -263,32 +263,57 @@ context EnumDataType
 
 context DataUse
   -- Occurrence of 'argument' and 'reduction'
-  inv ArgumentReductionLists ('Only in case of a \'FunctionCall\' both the \'argument\' list and the \'reduction\' list may be provided, otherwise either the \'argument\' list, the \'reduction\' list, or none of them shall be provided.' + self.toString()):
+  inv ArgumentReductionLists ('Only in case of a \'FunctionCall\', or a \'DataElementUse\' which refers to a \'Function\', both the \'argument\' list and the \'reduction\' list may be provided, otherwise either the \'argument\' list, the \'reduction\' list, or none of them shall be provided.' + self.toString()):
         self.argument->isEmpty() or self.reduction->isEmpty() or self.oclIsTypeOf(FunctionCall)
+      or (self.oclIsTypeOf(DataElementUse) 
+           and self.oclAsType(DataElementUse).dataElement.oclIsTypeOf(Function))
   
 
-  -- Structured data types in 'reduction' set
-  inv ReductionMembers ('The \'Member\' referenced by the \'MemberReference\' at index i of a \'reduction\' shall be contained in or inherited by the \'StructuredDataType\' of the \'Member\' referenced by the \'MemberReference\' at index (i - 1) of that \'reduction\'.' + self.toString()):
-        not self.resolveDataType().oclIsKindOf(StructuredDataType)
-      or self.reduction->isEmpty()
-      or self.resolveDataType().oclAsType(StructuredDataType).allMembers()->includes(self.reduction->first().member)
-      and self.reduction->select(m | self.reduction->indexOf(m) > 1)->forAll(m |
-              self.reduction->at(self.reduction->indexOf(m)-1).member.dataType.oclIsKindOf(StructuredDataType)
-          and self.reduction->at(self.reduction->indexOf(m)-1).member.dataType.oclAsType(StructuredDataType).allMembers()
-      ->includes(m.member))
+  -- Members in 'reduction' list
+  inv ReductionMembers ('The \'Member\' referenced by the \'MemberReference\' at index i of a \'reduction\' shall be contained in or inherited by the \'StructuredDataType\' of the \'Member\' referenced by the \'MemberReference\' at index (i - 1) of that \'reduction\' or the \'StructuredDataType\' of this \'DataUse\' if the \'MemberReference\' is the first element of the \'reduction\'.' + self.toString()):
+        self.reduction->isEmpty()
+              or self.reduction->reject(r | self.reduction->indexOf(r) = 1) 
+              ->iterate(r; acc = Sequence{Sequence{self.resolveBaseDataType(), self.reduction->at(1)}} 
+          	    | acc->including(Sequence{self.reduction->at(self.reduction->indexOf(r) - 1)->asSequence()
+          		    ->reject(r|r.member.oclIsUndefined()).member.dataType->including(self.resolveBaseDataType())->at(1), r
+          	    }))
+              ->reject(tr | tr->at(1).oclIsUndefined() or tr->at(2).oclAsType(MemberReference).member.oclIsUndefined())
+              ->iterate(tr; acc = Sequence{} | acc->including(Sequence{tr->at(1)->asSequence()
+          	    ->select(t|t.oclIsKindOf(CollectionDataType)).oclAsType(CollectionDataType).itemType->including(tr->at(1))->at(1), tr->at(2) 
+              }))
+              ->forAll(tr | tr->at(1).oclAsType(StructuredDataType).allMembers()->includes(tr->at(2).oclAsType(MemberReference).member))
   
 
-  -- No member with collection index in the first element in reduction
-  inv FirstReduction ('The first \'MemberReference\' in reduction shall not specify both member and collectionIndex. ' + self.toString()):
-        self.reduction->first().member.oclIsUndefined() or self.reduction->first().collectionIndex.oclIsUndefined()
+  -- Collection index of first 'reduction'
+  inv ReductionMembers ('If the \'member\' is not specified for the first element of the \'reduction\' then the type of this \'DataUse\' shall be \'CollectionDataType\'.' + self.toString()):
+        self.reduction->isEmpty()
+              or not self.reduction->at(1).member.oclIsUndefined()
+              or self. resolveBaseDataType().oclIsKindOf(CollectionDataType)
   
 
 
 
 context ParameterBinding
-  -- Matching data type
-  inv ParameterBindingTypes ('The provided \'DataUse\' shall conform to the \'DataType\' of the referenced \'Parameter\'.' + self.toString()):
-        self.dataUse.resolveDataType().conformsTo(self.parameter.dataType)
+  -- Members in 'reduction' list of parameter
+  inv ReductionMembers ('The \'Member\' referenced by the \'MemberReference\' at index i of a \'reduction\' shall be contained in or inherited by the \'StructuredDataType\' of the \'Member\' referenced by the \'MemberReference\' at index (i - 1) of that \'reduction\' or the \'StructuredDataType\' of the \'parameter\' if the \'MemberReference\' is the first element of the \'reduction\'.' + self.toString()):
+        self.reduction->isEmpty()
+              or self.reduction->reject(r | self.reduction->indexOf(r) = 1) 
+              ->iterate(r; acc = Sequence{Sequence{self.parameter.dataType, self.reduction->at(1)}} 
+          	    | acc->including(Sequence{self.reduction->at(self.reduction->indexOf(r) - 1)->asSequence()
+          		    ->reject(r|r.member.oclIsUndefined()).member.dataType->including(self.parameter.dataType)->at(1), r
+          	    }))
+              ->reject(tr | tr->at(1).oclIsUndefined() or tr->at(2).oclAsType(MemberReference).member.oclIsUndefined())
+              ->iterate(tr; acc = Sequence{} | acc->including(Sequence{tr->at(1)->asSequence()
+          	    ->select(t|t.oclIsKindOf(CollectionDataType)).oclAsType(CollectionDataType).itemType->including(tr->at(1))->at(1), tr->at(2) 
+              }))
+              ->forAll(tr | tr->at(1).oclAsType(StructuredDataType).allMembers()->includes(tr->at(2).oclAsType(MemberReference).member))
+  
+
+  -- Collection index of first 'reduction' of parameter
+  inv ReductionMembers ('If the \'member\' is not specified for the first element of the \'reduction\' then the type of the \'parameter\' shall be \'CollectionDataType\'.' + self.toString()):
+        self.reduction->isEmpty()
+              or not self.reduction->at(1).member.oclIsUndefined()
+              or self.parameter.dataType.oclIsKindOf(CollectionDataType)
   
 
   -- Use of a 'StructuredDataInstance' with non-optional 'Member's
@@ -301,9 +326,10 @@ context ParameterBinding
 
 context MemberReference
   -- Collection index expressions for collections only
-  inv CollectionIndex ('If the type of the related \'DataUse\' is not \'CollectionDataType\' then the collectionIndex shall be undefined. ' + self.toString()):
+  inv CollectionIndex ('If the \'member\' is specified and the type of the \'member\' is not \'CollectionDataType\' then the collectionIndex shall be undefined. ' + self.toString()):
         self.collectionIndex.oclIsUndefined()
-              or self.container().oclAsType(DataUse).resolveDataType().oclIsKindOf(CollectionDataType)
+              or self.member.oclIsUndefined()
+              or self.member.dataType.oclIsKindOf(CollectionDataType)
   
 
   -- Either member or collection index is required
@@ -371,7 +397,7 @@ context PredefinedFunctionCall
 
 context LiteralValueUse
   -- Exactly one value specification
-  inv SpecifiedLiteralValue ('There shall be exactly one value specification, where either the \'value\', or the \'intValue\', or the \'boolValue\' property is be specified, but not more than one of them.' + self.toString()):
+  inv SpecifiedLiteralValue ('There shall be exactly one value specification, where either the \'value\', or the \'intValue\', or the \'boolValue\' property is specified, but not more than one of them.' + self.toString()):
         not self.value.oclIsUndefined() 
           xor not self.intValue.oclIsUndefined() 
           xor not self.boolValue.oclIsUndefined()
@@ -401,8 +427,12 @@ context DataElementUse
   -- 'DataElement' reference or non-empty 'argument' or non-empty 'item'
   inv DataInstanceOrArgumentsOrItemsInDataElementUse ('If a \'dataElement\' is not specified, or if the \'dataElement\' is resolved to a \'StructuredDataType\' or a \'CollectionDataType\', either a non-empty \'argument\' set or a non-empty \'item\' set shall be specified.' + self.toString()):
         not (self.dataElement.oclIsUndefined() and self.argument->isEmpty() and self.item->isEmpty())
-          and not (self.dataElement.oclIsKindOf(StructuredDataType) and self.argument->isEmpty())
-          and not (self.dataElement.oclIsKindOf(CollectionDataType) and self.item->isEmpty())
+                and (self.dataElement.oclIsKindOf(StructuredDataInstance) 
+                      or not (self.resolveDataType().oclIsKindOf(StructuredDataType) 
+                          and self.argument->isEmpty()))
+                and (self.dataElement.oclIsKindOf(CollectionDataInstance) 
+                      or not (self.resolveDataType().oclIsKindOf(CollectionDataType) 
+                          and self.item->isEmpty()))
   
 
   -- Valid 'DataType' for items
@@ -420,14 +450,20 @@ context DataElementUse
 
   -- Matching parameters for 'Function's
   inv FunctionCallParameters ('All \'FormalParameter\'s shall be bound if the \'dataElement\' refers to a \'Function\'.' + self.toString()):
-        self.dataElement.oclIsUndefined()
-        or 
-        not self.dataElement.oclIsKindOf(Function)
+        not self.dataElement.oclIsTypeOf(Function)
       or self.dataElement.oclAsType(Function).formalParameter->forAll(p | self.argument->exists(a | a.parameter = p))
   
 
 
 
+context CastDataUse
+  -- Compatible 'DataType's
+  inv CompatibleDataTypesInCastDataUse ('The specified \'dataType\' shall directly or indirectly extend the resolved \'DataType\' of the specified \'dataUse\'.' + self.toString()):
+        self.dataType.conformsTo(self.dataUse.resolveDataType())
+  
+
+
+
 context TimeLabelUse
   -- Empty 'argument' and 'reduction' sets
   inv TimeLabelArgumentReduction ('The \'argument\' and \'reduction\' sets shall be empty.' + self.toString()):
@@ -584,7 +620,7 @@ context TestConfiguration
 context Block
   -- Guard shall evaluate to Boolean
   inv GuardType ('The type of \'guard\' shall be \'Boolean\'.' + self.toString()):
-        self.guard ->forAll(g | g.expression.resolveDataType().name = 'Boolean')
+        self.guard ->forAll(g | g.expression.resolveDataType().conformsTo('Boolean'))
   
 
   -- No directly contained 'ExceptionalBehaviour's and 'PeriodicBehaviour's.
@@ -637,7 +673,7 @@ context LocalExpression
 context BoundedLoopBehaviour
   -- No guard constraint
   inv BoundedGuard ('The \'Block\' of a \'BoundedLoopBehaviour\' shall not have a \'guard\'.' + self.toString()):
-        self.block->forAll(b | b.guard.oclIsUndefined())
+        self.block.guard->isEmpty()
   
 
   -- Iteration number shall be countable and positive
@@ -695,54 +731,49 @@ context AlternativeBehaviour
 
   -- First behaviour of 'Block's
   inv FirstBlockBehaviour ('Each block of an \'AlternativeBehaviour\' shall start with a tester-input event. ' + self.toString()):
-        self.block->forAll(b | b.behaviour->isEmpty() or b.behaviour->first().isTesterInputEvent())
+        self.block->forAll(b | b.behaviour->first().isTesterInputEvent())
   
 
   -- Same component if locally ordered
   inv AlternativeBlocksComponent ('If the containing \'TestDescription\' is locally ordered then all \'Block\'s shall start with a tester-input event of the same \'ComponentInstance\'. ' + self.toString()):
-        let initials = self.block->reject(b | b.behaviour->first()->isEmpty() or b.behaviour->first().oclIsKindOf(OptionalBehaviour)).behaviour->first()
-          in
+        let initial = self.block.behaviour->first() in
           Set{}
-          ->union(initials->select(oclIsKindOf(Interaction)).oclAsType(Interaction).target.targetGate.component)
-          ->union(initials->select(oclIsKindOf(Quiescence)).oclAsType(Quiescence).componentInstance)
-          ->union(initials->select(oclIsKindOf(TimeOut)).oclAsType(TimeOut).componentInstance)
+          ->including(initial->select(oclIsKindOf(Interaction)).oclAsType(Interaction).target.targetGate.component)
+          ->including(initial->select(oclIsKindOf(Quiescence)).oclAsType(Quiescence).componentInstance)
+          -> including(initial->select(oclIsKindOf(TimeOut)).oclAsType(TimeOut).componentInstance)
           ->size() = 1 or not self.getParentTestDescription().isLocallyOrdered
   
 
   -- Tester participating in locally ordered case
   inv AlternativeBehaviourParticipation ('If the \'AlternativeBehaviour\' is contained in a locally ordered \'TestDescription\' then no other tester \'ComponentInstance\' shall participate in any block than the target of the first tester-input event and \'ComponentInstance\'s participating in blocks of contained \'OptionalBehaviour\'s. ' + self.toString()):
-        let initials = self.block->reject(b | b.behaviour->first()->isEmpty() or b.behaviour->first().oclIsKindOf(OptionalBehaviour)).behaviour->first(),
+        let initial = self.block.behaviour->first(),
           targetComponent = Set{}
-          ->union(initials->select(oclIsKindOf(Interaction)).oclAsType(Interaction).target.targetGate.component)
-          ->union(initials->select(oclIsKindOf(Quiescence)).oclAsType(Quiescence).componentInstance)
-          -> union(initials->select(oclIsKindOf(TimeOut)).oclAsType(TimeOut).componentInstance),
+          ->including(initial->select(oclIsKindOf(Interaction)).oclAsType(Interaction).target.targetGate.component)
+          ->including(initial->select(oclIsKindOf(Quiescence)).oclAsType(Quiescence).componentInstance)
+          -> including(initial->select(oclIsKindOf(TimeOut)).oclAsType(TimeOut).componentInstance),
           nonOptionalBlocks = self.block->closure(
               b | b.behaviour->reject(oclIsKindOf(OptionalBehaviour))
                   ->select(oclIsKindOf(SingleCombinedBehaviour)).oclAsType(SingleCombinedBehaviour).block
-              ->union(b.behaviour
+              ->union(b.behaviour->reject(oclIsKindOf(OptionalBehaviour))
                   ->select(oclIsKindOf(MultipleCombinedBehaviour)).oclAsType(MultipleCombinedBehaviour).block)
           )
           in
-            targetComponent->includesAll(
+          targetComponent->includesAll(
               nonOptionalBlocks.getParticipatingComponents()->reject(c | c.role = ComponentInstanceRole::SUT))
-            or not self.getParentTestDescription().isLocallyOrdered
+          or not self.getParentTestDescription().isLocallyOrdered
   
 
   -- OptionalBehaviour in locally ordered case
   inv OptionalAlternativeBehaviour ('A block of an \'AlternativeBehaviour\' if the containing \'TestDescription\' is locally ordered, shall only contain \'OptionalBehaviour\'(s) whose source \'ComponentInstance\' is the same as the target of the first tester-input event of that \'Block\'. ' + self.toString()):
-        let initials = self.block->reject(b | b.behaviour->first()->isEmpty() or b.behaviour->first().oclIsKindOf(OptionalBehaviour)).behaviour->first(),
+        let initial = self.block.behaviour->first(),
           targetComponent = Set{}
-          ->union(initials->select(oclIsKindOf(Interaction)).oclAsType(Interaction).target.targetGate.component)
-          ->union(initials->select(oclIsKindOf(Quiescence)).oclAsType(Quiescence).componentInstance)
-          -> union(initials->select(oclIsKindOf(TimeOut)).oclAsType(TimeOut).componentInstance),
-          optionalBlocks = self.block->closure(
-            b | b.behaviour->select(oclIsKindOf(SingleCombinedBehaviour)).oclAsType(SingleCombinedBehaviour).block
-            ->union(b.behaviour->select(oclIsKindOf(MultipleCombinedBehaviour)).oclAsType(MultipleCombinedBehaviour).block)
-          )->select(oclIsKindOf(OptionalBehaviour))
+          ->including(initial->select(oclIsKindOf(Interaction)).oclAsType(Interaction).target.targetGate.component)
+          ->including(initial->select(oclIsKindOf(Quiescence)).oclAsType(Quiescence).componentInstance)
+          -> including(initial->select(oclIsKindOf(TimeOut)).oclAsType(TimeOut).componentInstance)
           in
-            optionalBlocks->isEmpty()
-            or optionalBlocks->first().oclAsType(Interaction).sourceGate.component->forAll(c | targetComponent->includes(c))
-            or not self.getParentTestDescription().isLocallyOrdered
+          self.block.behaviour->select(oclIsKindOf(OptionalBehaviour)) .oclAsType(OptionalBehaviour).block
+              ->first().oclAsType(Interaction).sourceGate.component->forAll(c | targetComponent->includes(c))
+          or not self.getParentTestDescription().isLocallyOrdered
   
 
 
@@ -756,7 +787,7 @@ context ConditionalBehaviour
   -- Possible else block for 'ConditionalBehaviour' with multiple blocks
   inv ConditionalLastGuard ('All \'Block\'s specified, except the last one, shall have a \'guard\'.' + self.toString()):
         self.block->size() = 1
-      or self.block->forAll(b | b = self.block->last() or b.guard ->size() > 1)
+      or self.block->forAll(b | b = self.block->last() or b.guard ->size() > 0)
   
 
 
@@ -1091,7 +1122,8 @@ context TestDescriptionReference
 
   -- Compatible test configurations 
   inv CompatibleConfiguration ('The \'TestConfiguration\' of the referenced (invoked) \'TestDescription\' shall be compatible with the \'TestConfiguration\' of the referencing (invoking) \'TestDescription\' under the provided \'ComponentInstanceBinding\'s between the \'ComponentInstance\'s of the \'TestConfiguration\'s of referenced and referencing \'TestDescription\'s. ' + self.toString()):
-        self.testDescription.testConfiguration.compatibleWith(
+        self.componentInstanceBinding->isEmpty()
+      or self.testDescription.testConfiguration.compatibleWith(
               self.getParentTestDescription().testConfiguration, self.componentInstanceBinding)
   
 
diff --git a/plugins/org.etsi.mts.tdl.model/model/tdl.ecore b/plugins/org.etsi.mts.tdl.model/model/tdl.ecore
index 9ddbac7d5e2bd4953399f1c34f0ccb1d17a44175..ccb0a6359658b41da02e971592b1f254571a9892 100644
--- a/plugins/org.etsi.mts.tdl.model/model/tdl.ecore
+++ b/plugins/org.etsi.mts.tdl.model/model/tdl.ecore
@@ -193,6 +193,11 @@
   <eClassifiers xsi:type="ecore:EClass" name="StaticDataUse" abstract="true" eSuperTypes="#//DataUse"/>
   <eClassifiers xsi:type="ecore:EClass" name="DataUse" abstract="true" eSuperTypes="#//Element">
     <eOperations name="resolveDataType" eType="#//DataType">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot">
+        <details key="body" value="&#xA;                    self.resolveBaseDataType()&#xA;                "/>
+      </eAnnotations>
+    </eOperations>
+    <eOperations name="resolveBaseDataType" eType="#//DataType">
       <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot">
         <details key="body" value="null"/>
       </eAnnotations>
@@ -208,10 +213,17 @@
         eType="#//MemberReference" containment="true"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="ParameterBinding" eSuperTypes="#//Element">
+    <eOperations name="resolveParameterType" eType="#//DataType">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot">
+        <details key="body" value="&#x9;&#x9;&#x9;&#xA;&#x9;            &#x9;if (self.reduction->isEmpty()) then&#xA;&#x9;                &#x9;self.parameter.dataType&#xA;&#x9;            &#x9;else &#xA;&#x9;            &#x9;&#x9;if (self.reduction->last().member.oclIsUndefined()) then&#xA;&#x9;            &#x9;&#x9;&#x9;if (self.reduction->last().collectionIndex.oclIsUndefined()) then&#xA;&#x9;                &#x9;&#x9;&#x9;self.parameter.dataType&#xA;&#x9;            &#x9;&#x9;&#x9;else&#xA;&#x9;            &#x9;&#x9;&#x9;&#x9;self.parameter.dataType.oclAsType(CollectionDataType).itemType&#xA;&#x9;            &#x9;&#x9;&#x9;endif &#xA;&#x9;            &#x9;&#x9;else &#xA;&#x9;                &#x9;&#x9;self.reduction->last().member.dataType&#xA;&#x9;            &#x9;&#x9;endif&#xA;&#x9;                endif&#xA;&#x9;                "/>
+      </eAnnotations>
+    </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="dataUse" lowerBound="1"
         eType="#//DataUse" containment="true"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="parameter" lowerBound="1"
         eType="#//Parameter"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="reduction" upperBound="-1"
+        eType="#//MemberReference" containment="true"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EEnum" name="UnassignedMemberTreatment">
     <eLiterals name="undefined"/>
@@ -229,7 +241,7 @@
         eType="#//DataType"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="FormalParameterUse" eSuperTypes="#//DynamicDataUse">
-    <eOperations name="resolveDataType" eType="#//DataType">
+    <eOperations name="resolveBaseDataType" eType="#//DataType">
       <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot">
         <details key="body" value="self.parameter.dataType"/>
       </eAnnotations>
@@ -243,7 +255,7 @@
         eType="#//DataType"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="FunctionCall" eSuperTypes="#//DynamicDataUse">
-    <eOperations name="resolveDataType" eType="#//DataType">
+    <eOperations name="resolveBaseDataType" eType="#//DataType">
       <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot">
         <details key="body" value="self.function.returnType"/>
       </eAnnotations>
@@ -252,7 +264,7 @@
         eType="#//Function"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="VariableUse" eSuperTypes="#//DynamicDataUse">
-    <eOperations name="resolveDataType" eType="#//DataType">
+    <eOperations name="resolveBaseDataType" eType="#//DataType">
       <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot">
         <details key="body" value="self.variable.dataType"/>
       </eAnnotations>
@@ -326,14 +338,14 @@
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="OmitValue" eSuperTypes="#//SpecialValueUse"/>
   <eClassifiers xsi:type="ecore:EClass" name="SpecialValueUse" abstract="true" eSuperTypes="#//StaticDataUse">
-    <eOperations name="resolveDataType" eType="#//DataType">
+    <eOperations name="resolveBaseDataType" eType="#//DataType">
       <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot">
         <details key="body" value="&#xA;                    if (self.container().oclIsTypeOf(MemberAssignment)) then&#xA;                        self.container().oclAsType(MemberAssignment).member.dataType&#xA;                    else &#xA;                        if (self.container().oclIsTypeOf(ParameterBinding)) then&#xA;                            self.container().oclAsType(ParameterBinding).parameter.dataType&#xA;                        else &#xA;                            if (self.container().oclIsTypeOf(Interaction) and &#xA;                                self.oclIsTypeOf(AnyValue)) then&#xA;                                self.oclAsType(AnyValue).dataType&#xA;                            else&#xA;                                null&#xA;                            endif&#xA;                        endif&#xA;                    endif&#xA;                "/>
       </eAnnotations>
     </eOperations>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="AnyValue" eSuperTypes="#//SpecialValueUse">
-    <eOperations name="resolveDataType" eType="#//DataType">
+    <eOperations name="resolveBaseDataType" eType="#//DataType">
       <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot">
         <details key="body" value="&#xA;                    if (not self.dataType.oclIsUndefined()) then&#xA;                        self.dataType&#xA;                    else &#xA;                        if (self.container().oclIsTypeOf(MemberAssignment)) then&#xA;                            self.container().oclAsType(MemberAssignment).member.dataType&#xA;                        else &#xA;                            if (self.container().oclIsTypeOf(ParameterBinding)) then&#xA;                                self.container().oclAsType(ParameterBinding).parameter.dataType&#xA;                            else&#xA;                                if (self.container().oclIsTypeOf(CollectionDataInstance)) then&#xA;                                    self.container().oclAsType(CollectionDataInstance).dataType.oclAsType(CollectionDataType).itemType&#xA;                                else&#xA;                                    if (self.container().oclIsTypeOf(DataElementUse)) then&#xA;                                        self.container().oclAsType(DataElementUse).resolveDataType().oclAsType(CollectionDataType).itemType&#xA;                                    else&#xA;                                        if (self.container().oclIsTypeOf(DataInstanceUse)) then&#xA;                                            self.container().oclAsType(DataInstanceUse).resolveDataType().oclAsType(CollectionDataType).itemType&#xA;                                        else&#xA;                                            null&#xA;                                        endif&#xA;                                    endif&#xA;                                endif&#xA;                            endif&#xA;                        endif&#xA;                    endif&#xA;                "/>
       </eAnnotations>
@@ -342,7 +354,7 @@
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="AnyValueOrOmit" eSuperTypes="#//SpecialValueUse"/>
   <eClassifiers xsi:type="ecore:EClass" name="DataInstanceUse" eSuperTypes="#//StaticDataUse">
-    <eOperations name="resolveDataType" eType="#//DataType">
+    <eOperations name="resolveBaseDataType" eType="#//DataType">
       <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot">
         <details key="body" value="&#xA;                if (not self.dataInstance.oclIsUndefined()) then&#xA;                    self.dataInstance.dataType&#xA;                else &#xA;                    if (not self.dataType.oclIsUndefined()) then&#xA;                        self.dataType&#xA;                    else &#xA;                        if (self.container().oclIsTypeOf(MemberAssignment)) then&#xA;                            self.container().oclAsType(MemberAssignment).member.dataType&#xA;                        else &#xA;                            if (self.container().oclIsTypeOf(ParameterBinding)) then&#xA;                                self.container().oclAsType(ParameterBinding).parameter.dataType&#xA;                            else&#xA;                                if (self.container().oclIsTypeOf(CollectionDataInstance)) then&#xA;                                    self.container().oclAsType(CollectionDataInstance).dataType.oclAsType(CollectionDataType).itemType&#xA;                                else&#xA;                                    if (self.container().oclIsTypeOf(DataElementUse)) then&#xA;                                        self.container().oclAsType(DataElementUse).resolveDataType().oclAsType(CollectionDataType).itemType&#xA;                                    else&#xA;                                        if (self.container().oclIsTypeOf(DataInstanceUse)) then&#xA;                                            self.container().oclAsType(DataInstanceUse).resolveDataType().oclAsType(CollectionDataType).itemType&#xA;                                        else&#xA;                                            null&#xA;                                        endif&#xA;                                    endif&#xA;                                endif&#xA;                            endif&#xA;                        endif&#xA;                    endif&#xA;                endif&#xA;                "/>
       </eAnnotations>
@@ -444,7 +456,7 @@
     <eStructuralFeatures xsi:type="ecore:EReference" name="gate" lowerBound="1" eType="#//GateInstance"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="TimeLabelUse" eSuperTypes="#//DynamicDataUse">
-    <eOperations name="resolveDataType" eType="#//DataType">
+    <eOperations name="resolveBaseDataType" eType="#//DataType">
       <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot">
         <details key="body" value="Time.allInstances()->asOrderedSet()->first()"/>
       </eAnnotations>
@@ -689,9 +701,9 @@
         containment="true"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="PredefinedFunctionCall" eSuperTypes="#//DynamicDataUse">
-    <eOperations name="resolveDataType" eType="#//DataType">
+    <eOperations name="resolveBaseDataType" eType="#//DataType">
       <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot">
-        <details key="body" value="self.function.returnType"/>
+        <details key="body" value="&#xA;&#x9;                if not self.function.returnType.oclIsUndefined() then&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;self.function.returnType&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;else &#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;self.actualParameters.resolveDataType()->asOrderedSet()->first()&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;endif&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;"/>
       </eAnnotations>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="function" lowerBound="1"
@@ -777,7 +789,7 @@
         eType="#//PackageableElement"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="LiteralValueUse" eSuperTypes="#//StaticDataUse">
-    <eOperations name="resolveDataType" eType="#//DataType">
+    <eOperations name="resolveBaseDataType" eType="#//DataType">
       <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot">
         <details key="body" value="&#xA;                if (not self.dataType.oclIsUndefined()) then&#xA;                    self.dataType&#xA;                else &#xA;                    if (self.container().oclIsTypeOf(MemberAssignment)) then&#xA;                        self.container().oclAsType(MemberAssignment).member.dataType&#xA;                    else &#xA;                        if (self.container().oclIsTypeOf(ParameterBinding)) then&#xA;                            self.container().oclAsType(ParameterBinding).parameter.dataType&#xA;                        else&#xA;                            if (not self.intValue.oclIsUndefined()) then&#xA;                                SimpleDataType.allInstances()->select(t | t.name = 'Integer')->asOrderedSet()->first()&#xA;                            else&#xA;                                if (not self.boolValue.oclIsUndefined()) then&#xA;                                    SimpleDataType.allInstances()->select(t | t.name = 'Boolean')->asOrderedSet()->first()&#xA;                                else &#xA;                                    SimpleDataType.allInstances()->select(t | t.name = 'String')->asOrderedSet()->first()&#xA;                                endif&#xA;                            endif&#xA;                        endif&#xA;                    endif&#xA;                endif&#xA;                "/>
       </eAnnotations>
@@ -802,9 +814,9 @@
         eType="#//SimpleDataInstance" containment="true"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="DataElementUse" eSuperTypes="#//DataUse">
-    <eOperations name="resolveDataType" eType="#//DataType">
+    <eOperations name="resolveBaseDataType" eType="#//DataType">
       <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot">
-        <details key="body" value="&#xA;                if (not self.dataElement.oclIsUndefined()) then&#xA;                    if (self.dataElement.oclIsKindOf(DataType)) then&#xA;                        self.dataElement.oclAsType(DataType)&#xA;                    else&#xA;                        if (self.dataElement.oclIsKindOf(DataInstance)) then&#xA;                            self.dataElement.oclAsType(DataInstance).dataType&#xA;                        else &#xA;                            if (self.dataElement.oclIsTypeOf(FormalParameter)) then&#xA;                                self.dataElement.oclAsType(FormalParameter).dataType&#xA;                            else &#xA;                                if (self.dataElement.oclIsTypeOf(Function)) then&#xA;                                    self.dataElement.oclAsType(Function).returnType&#xA;                                else&#xA;                                    null&#xA;                                endif&#xA;                            endif &#xA;                        endif&#xA;                    endif&#xA;                else &#xA;                    if (self.container().oclIsTypeOf(MemberAssignment)) then&#xA;                        self.container().oclAsType(MemberAssignment).member.dataType&#xA;                    else &#xA;                        if (self.container().oclIsTypeOf(ParameterBinding)) then&#xA;                            self.container().oclAsType(ParameterBinding).parameter.dataType&#xA;                        else&#xA;                            if (self.container().oclIsTypeOf(CollectionDataInstance)) then&#xA;                                self.container().oclAsType(CollectionDataInstance).dataType.oclAsType(CollectionDataType).itemType&#xA;                            else&#xA;                                if (self.container().oclIsTypeOf(DataElementUse)) then&#xA;                                    self.container().oclAsType(DataElementUse).resolveDataType().oclAsType(CollectionDataType).itemType&#xA;                                else&#xA;                                    if (self.container().oclIsTypeOf(DataInstanceUse)) then&#xA;                                        self.container().oclAsType(DataInstanceUse).resolveDataType().oclAsType(CollectionDataType).itemType&#xA;                                    else&#xA;                                        null&#xA;                                    endif&#xA;                                endif&#xA;                            endif&#xA;                        endif&#xA;                    endif&#xA;                endif&#xA;                "/>
+        <details key="body" value="&#xA;                if (not self.dataElement.oclIsUndefined()) then&#xA;                    if (self.dataElement.oclIsKindOf(DataType)) then&#xA;                        self.dataElement.oclAsType(DataType)&#xA;                    else&#xA;                        if (self.dataElement.oclIsKindOf(DataInstance)) then&#xA;                            self.dataElement.oclAsType(DataInstance).dataType&#xA;                        else &#xA;                            if (self.dataElement.oclIsTypeOf(FormalParameter)) then&#xA;                                self.dataElement.oclAsType(FormalParameter).dataType&#xA;                            else &#xA;                                if (self.dataElement.oclIsTypeOf(Function)) then&#xA;                                    self.dataElement.oclAsType(Function).returnType&#xA;                                else&#xA;                                    null&#xA;                                endif&#xA;                            endif &#xA;                        endif&#xA;                    endif&#xA;                else &#xA;                    if (self.container().oclIsTypeOf(MemberAssignment)) then&#xA;                        self.container().oclAsType(MemberAssignment).member.dataType&#xA;                    else &#xA;                        if (self.container().oclIsTypeOf(ParameterBinding)) then&#xA;                        &#x9;self.container().oclAsType(ParameterBinding).resolveParameterType()&#xA;                        else&#xA;                            if (self.container().oclIsTypeOf(CollectionDataInstance)) then&#xA;                                self.container().oclAsType(CollectionDataInstance).dataType.oclAsType(CollectionDataType).itemType&#xA;                            else&#xA;                                if (self.container().oclIsTypeOf(DataElementUse)) then&#xA;                                &#x9;if (self.container().oclAsType(DataElementUse).resolveDataType()->isEmpty()) then&#xA;                                &#x9;&#x9;null&#xA;                                &#x9;else&#xA;                                    &#x9;self.container().oclAsType(DataElementUse).resolveDataType().oclAsType(CollectionDataType).itemType&#xA;                                &#x9;endif&#xA;                                else&#xA;                                    if (self.container().oclIsTypeOf(DataInstanceUse)) then&#xA;&#x9;                                &#x9;if (self.container().oclAsType(DataInstanceUse).resolveDataType()->isEmpty()) then&#xA;&#x9;                                &#x9;&#x9;null&#xA;&#x9;                                &#x9;else&#xA;                                        &#x9;self.container().oclAsType(DataInstanceUse).resolveDataType().oclAsType(CollectionDataType).itemType&#xA;&#x9;                                &#x9;endif&#xA;                                    else&#xA;                                        null&#xA;                                    endif&#xA;                                endif&#xA;                            endif&#xA;                        endif&#xA;                    endif&#xA;                endif&#xA;                "/>
       </eAnnotations>
     </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="unassignedMember" eType="#//UnassignedMemberTreatment"/>
@@ -816,4 +828,15 @@
       </eAnnotations>
     </eStructuralFeatures>
   </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="CastDataUse" eSuperTypes="#//StaticDataUse">
+    <eOperations name="resolveBaseDataType" eType="#//DataType">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot">
+        <details key="body" value="self.dataType"/>
+      </eAnnotations>
+    </eOperations>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="dataUse" lowerBound="1"
+        eType="#//DataUse" containment="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="dataType" lowerBound="1"
+        eType="#//DataType"/>
+  </eClassifiers>
 </ecore:EPackage>
diff --git a/plugins/org.etsi.mts.tdl.model/model/tdl.genmodel b/plugins/org.etsi.mts.tdl.model/model/tdl.genmodel
index 0893cc6594df70ae5d16f09a4abd281fda90137a..55738719583b82160268f1ccd4cefbddacec254c 100644
--- a/plugins/org.etsi.mts.tdl.model/model/tdl.genmodel
+++ b/plugins/org.etsi.mts.tdl.model/model/tdl.genmodel
@@ -130,11 +130,14 @@
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference tdl.ecore#//DataUse/argument"/>
       <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference tdl.ecore#//DataUse/reduction"/>
       <genOperations ecoreOperation="tdl.ecore#//DataUse/resolveDataType"/>
+      <genOperations ecoreOperation="tdl.ecore#//DataUse/resolveBaseDataType"/>
       <genOperations ecoreOperation="tdl.ecore#//DataUse/isEffectivelyStatic"/>
     </genClasses>
     <genClasses ecoreClass="tdl.ecore#//ParameterBinding">
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference tdl.ecore#//ParameterBinding/dataUse"/>
       <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference tdl.ecore#//ParameterBinding/parameter"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference tdl.ecore#//ParameterBinding/reduction"/>
+      <genOperations ecoreOperation="tdl.ecore#//ParameterBinding/resolveParameterType"/>
     </genClasses>
     <genClasses ecoreClass="tdl.ecore#//Action">
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute tdl.ecore#//Action/body"/>
@@ -146,7 +149,7 @@
     </genClasses>
     <genClasses ecoreClass="tdl.ecore#//FormalParameterUse">
       <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference tdl.ecore#//FormalParameterUse/parameter"/>
-      <genOperations ecoreOperation="tdl.ecore#//FormalParameterUse/resolveDataType"/>
+      <genOperations ecoreOperation="tdl.ecore#//FormalParameterUse/resolveBaseDataType"/>
     </genClasses>
     <genClasses image="false" ecoreClass="tdl.ecore#//DynamicDataUse"/>
     <genClasses ecoreClass="tdl.ecore#//Variable">
@@ -154,12 +157,12 @@
     </genClasses>
     <genClasses ecoreClass="tdl.ecore#//FunctionCall">
       <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference tdl.ecore#//FunctionCall/function"/>
-      <genOperations ecoreOperation="tdl.ecore#//FunctionCall/resolveDataType"/>
+      <genOperations ecoreOperation="tdl.ecore#//FunctionCall/resolveBaseDataType"/>
     </genClasses>
     <genClasses ecoreClass="tdl.ecore#//VariableUse">
       <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference tdl.ecore#//VariableUse/componentInstance"/>
       <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference tdl.ecore#//VariableUse/variable"/>
-      <genOperations ecoreOperation="tdl.ecore#//VariableUse/resolveDataType"/>
+      <genOperations ecoreOperation="tdl.ecore#//VariableUse/resolveBaseDataType"/>
     </genClasses>
     <genClasses ecoreClass="tdl.ecore#//ComponentInstance">
       <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference tdl.ecore#//ComponentInstance/type"/>
@@ -186,11 +189,11 @@
     <genClasses ecoreClass="tdl.ecore#//Timer"/>
     <genClasses ecoreClass="tdl.ecore#//OmitValue"/>
     <genClasses image="false" ecoreClass="tdl.ecore#//SpecialValueUse">
-      <genOperations ecoreOperation="tdl.ecore#//SpecialValueUse/resolveDataType"/>
+      <genOperations ecoreOperation="tdl.ecore#//SpecialValueUse/resolveBaseDataType"/>
     </genClasses>
     <genClasses ecoreClass="tdl.ecore#//AnyValue">
       <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference tdl.ecore#//AnyValue/dataType"/>
-      <genOperations ecoreOperation="tdl.ecore#//AnyValue/resolveDataType"/>
+      <genOperations ecoreOperation="tdl.ecore#//AnyValue/resolveBaseDataType"/>
     </genClasses>
     <genClasses ecoreClass="tdl.ecore#//AnyValueOrOmit"/>
     <genClasses ecoreClass="tdl.ecore#//DataInstanceUse">
@@ -198,7 +201,7 @@
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute tdl.ecore#//DataInstanceUse/unassignedMember"/>
       <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference tdl.ecore#//DataInstanceUse/dataType"/>
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference tdl.ecore#//DataInstanceUse/item"/>
-      <genOperations ecoreOperation="tdl.ecore#//DataInstanceUse/resolveDataType"/>
+      <genOperations ecoreOperation="tdl.ecore#//DataInstanceUse/resolveBaseDataType"/>
     </genClasses>
     <genClasses ecoreClass="tdl.ecore#//Time"/>
     <genClasses ecoreClass="tdl.ecore#//TimeLabel"/>
@@ -242,7 +245,7 @@
     <genClasses ecoreClass="tdl.ecore#//TimeLabelUse">
       <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference tdl.ecore#//TimeLabelUse/timeLabel"/>
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute tdl.ecore#//TimeLabelUse/kind"/>
-      <genOperations ecoreOperation="tdl.ecore#//TimeLabelUse/resolveDataType"/>
+      <genOperations ecoreOperation="tdl.ecore#//TimeLabelUse/resolveBaseDataType"/>
     </genClasses>
     <genClasses ecoreClass="tdl.ecore#//TestConfiguration">
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference tdl.ecore#//TestConfiguration/componentInstance"/>
@@ -364,7 +367,7 @@
     <genClasses ecoreClass="tdl.ecore#//PredefinedFunctionCall">
       <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference tdl.ecore#//PredefinedFunctionCall/function"/>
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference tdl.ecore#//PredefinedFunctionCall/actualParameters"/>
-      <genOperations ecoreOperation="tdl.ecore#//PredefinedFunctionCall/resolveDataType"/>
+      <genOperations ecoreOperation="tdl.ecore#//PredefinedFunctionCall/resolveBaseDataType"/>
     </genClasses>
     <genClasses ecoreClass="tdl.ecore#//LocalExpression">
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference tdl.ecore#//LocalExpression/expression"/>
@@ -404,7 +407,7 @@
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute tdl.ecore#//LiteralValueUse/intValue"/>
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute tdl.ecore#//LiteralValueUse/boolValue"/>
       <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference tdl.ecore#//LiteralValueUse/dataType"/>
-      <genOperations ecoreOperation="tdl.ecore#//LiteralValueUse/resolveDataType"/>
+      <genOperations ecoreOperation="tdl.ecore#//LiteralValueUse/resolveBaseDataType"/>
     </genClasses>
     <genClasses ecoreClass="tdl.ecore#//ConstraintType"/>
     <genClasses ecoreClass="tdl.ecore#//Constraint">
@@ -418,7 +421,12 @@
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute tdl.ecore#//DataElementUse/unassignedMember"/>
       <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference tdl.ecore#//DataElementUse/dataElement"/>
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference tdl.ecore#//DataElementUse/item"/>
-      <genOperations ecoreOperation="tdl.ecore#//DataElementUse/resolveDataType"/>
+      <genOperations ecoreOperation="tdl.ecore#//DataElementUse/resolveBaseDataType"/>
+    </genClasses>
+    <genClasses ecoreClass="tdl.ecore#//CastDataUse">
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference tdl.ecore#//CastDataUse/dataUse"/>
+      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference tdl.ecore#//CastDataUse/dataType"/>
+      <genOperations ecoreOperation="tdl.ecore#//CastDataUse/resolveBaseDataType"/>
     </genClasses>
   </genPackages>
 </genmodel:GenModel>
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/ComponentInstanceRole.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/ComponentInstanceRole.java
index 58ab4013c9f0a19dc6cd0a297372746bd8f0c988..010eef923ec82bc2b98994f821a93574e636dc65 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/ComponentInstanceRole.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/ComponentInstanceRole.java
@@ -68,8 +68,7 @@ public enum ComponentInstanceRole implements Enumerator
 	 * @generated
 	 */
 	private static final ComponentInstanceRole[] VALUES_ARRAY =
-		new ComponentInstanceRole[]
-		{
+		new ComponentInstanceRole[] {
 			SUT,
 			TESTER,
 		};
@@ -92,11 +91,9 @@ public enum ComponentInstanceRole implements Enumerator
 	 */
 	public static ComponentInstanceRole get(String literal)
 	{
-		for (int i = 0; i < VALUES_ARRAY.length; ++i)
-		{
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
 			ComponentInstanceRole result = VALUES_ARRAY[i];
-			if (result.toString().equals(literal))
-			{
+			if (result.toString().equals(literal)) {
 				return result;
 			}
 		}
@@ -113,11 +110,9 @@ public enum ComponentInstanceRole implements Enumerator
 	 */
 	public static ComponentInstanceRole getByName(String name)
 	{
-		for (int i = 0; i < VALUES_ARRAY.length; ++i)
-		{
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
 			ComponentInstanceRole result = VALUES_ARRAY[i];
-			if (result.getName().equals(name))
-			{
+			if (result.getName().equals(name)) {
 				return result;
 			}
 		}
@@ -134,8 +129,7 @@ public enum ComponentInstanceRole implements Enumerator
 	 */
 	public static ComponentInstanceRole get(int value)
 	{
-		switch (value)
-		{
+		switch (value) {
 			case SUT_VALUE: return SUT;
 			case TESTER_VALUE: return TESTER;
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/DataElementUse.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/DataElementUse.java
index 79e274a36137890de9f1e794f1b818828c659ad3..cb9f86e35c103e4c800820dbe77ca2de9277c4ac 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/DataElementUse.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/DataElementUse.java
@@ -87,7 +87,7 @@ public interface DataElementUse extends DataUse
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @model annotation="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot body='\n                if (not self.dataElement.oclIsUndefined()) then\n                    if (self.dataElement.oclIsKindOf(DataType)) then\n                        self.dataElement.oclAsType(DataType)\n                    else\n                        if (self.dataElement.oclIsKindOf(DataInstance)) then\n                            self.dataElement.oclAsType(DataInstance).dataType\n                        else \n                            if (self.dataElement.oclIsTypeOf(FormalParameter)) then\n                                self.dataElement.oclAsType(FormalParameter).dataType\n                            else \n                                if (self.dataElement.oclIsTypeOf(Function)) then\n                                    self.dataElement.oclAsType(Function).returnType\n                                else\n                                    null\n                                endif\n                            endif \n                        endif\n                    endif\n                else \n                    if (self.container().oclIsTypeOf(MemberAssignment)) then\n                        self.container().oclAsType(MemberAssignment).member.dataType\n                    else \n                        if (self.container().oclIsTypeOf(ParameterBinding)) then\n                            self.container().oclAsType(ParameterBinding).parameter.dataType\n                        else\n                            if (self.container().oclIsTypeOf(CollectionDataInstance)) then\n                                self.container().oclAsType(CollectionDataInstance).dataType.oclAsType(CollectionDataType).itemType\n                            else\n                                if (self.container().oclIsTypeOf(DataElementUse)) then\n                                    self.container().oclAsType(DataElementUse).resolveDataType().oclAsType(CollectionDataType).itemType\n                                else\n                                    if (self.container().oclIsTypeOf(DataInstanceUse)) then\n                                        self.container().oclAsType(DataInstanceUse).resolveDataType().oclAsType(CollectionDataType).itemType\n                                    else\n                                        null\n                                    endif\n                                endif\n                            endif\n                        endif\n                    endif\n                endif\n                '"
+	 * @model annotation="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot body='\n                if (not self.dataElement.oclIsUndefined()) then\n                    if (self.dataElement.oclIsKindOf(DataType)) then\n                        self.dataElement.oclAsType(DataType)\n                    else\n                        if (self.dataElement.oclIsKindOf(DataInstance)) then\n                            self.dataElement.oclAsType(DataInstance).dataType\n                        else \n                            if (self.dataElement.oclIsTypeOf(FormalParameter)) then\n                                self.dataElement.oclAsType(FormalParameter).dataType\n                            else \n                                if (self.dataElement.oclIsTypeOf(Function)) then\n                                    self.dataElement.oclAsType(Function).returnType\n                                else\n                                    null\n                                endif\n                            endif \n                        endif\n                    endif\n                else \n                    if (self.container().oclIsTypeOf(MemberAssignment)) then\n                        self.container().oclAsType(MemberAssignment).member.dataType\n                    else \n                        if (self.container().oclIsTypeOf(ParameterBinding)) then\n                        \tself.container().oclAsType(ParameterBinding).resolveParameterType()\n                        else\n                            if (self.container().oclIsTypeOf(CollectionDataInstance)) then\n                                self.container().oclAsType(CollectionDataInstance).dataType.oclAsType(CollectionDataType).itemType\n                            else\n                                if (self.container().oclIsTypeOf(DataElementUse)) then\n                                    self.container().oclAsType(DataElementUse).resolveDataType().oclAsType(CollectionDataType).itemType\n                                else\n                                    if (self.container().oclIsTypeOf(DataInstanceUse)) then\n                                        self.container().oclAsType(DataInstanceUse).resolveDataType().oclAsType(CollectionDataType).itemType\n                                    else\n                                        null\n                                    endif\n                                endif\n                            endif\n                        endif\n                    endif\n                endif\n                '"
 	 * @generated
 	 */
 	DataType resolveDataType();
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/GateTypeKind.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/GateTypeKind.java
index d4db35e929571fb6b0b21e74cb4caa9f4ed6a053..940fde23d6f7c8bccb5d680bdefe978afba2caca 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/GateTypeKind.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/GateTypeKind.java
@@ -68,8 +68,7 @@ public enum GateTypeKind implements Enumerator
 	 * @generated
 	 */
 	private static final GateTypeKind[] VALUES_ARRAY =
-		new GateTypeKind[]
-		{
+		new GateTypeKind[] {
 			MESSAGE,
 			PROCEDURE,
 		};
@@ -92,11 +91,9 @@ public enum GateTypeKind implements Enumerator
 	 */
 	public static GateTypeKind get(String literal)
 	{
-		for (int i = 0; i < VALUES_ARRAY.length; ++i)
-		{
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
 			GateTypeKind result = VALUES_ARRAY[i];
-			if (result.toString().equals(literal))
-			{
+			if (result.toString().equals(literal)) {
 				return result;
 			}
 		}
@@ -113,11 +110,9 @@ public enum GateTypeKind implements Enumerator
 	 */
 	public static GateTypeKind getByName(String name)
 	{
-		for (int i = 0; i < VALUES_ARRAY.length; ++i)
-		{
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
 			GateTypeKind result = VALUES_ARRAY[i];
-			if (result.getName().equals(name))
-			{
+			if (result.getName().equals(name)) {
 				return result;
 			}
 		}
@@ -134,8 +129,7 @@ public enum GateTypeKind implements Enumerator
 	 */
 	public static GateTypeKind get(int value)
 	{
-		switch (value)
-		{
+		switch (value) {
 			case MESSAGE_VALUE: return MESSAGE;
 			case PROCEDURE_VALUE: return PROCEDURE;
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/NamedElement.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/NamedElement.java
index 5ea0acad3617ecf54ce08fe5b47c052c35c5e3c6..c723977955a6a0ed4c20617b6206bb641186823e 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/NamedElement.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/NamedElement.java
@@ -28,7 +28,6 @@ public interface NamedElement extends Element
 	 * @return the value of the '<em>Qualified Name</em>' attribute.
 	 * @see org.etsi.mts.tdl.tdlPackage#getNamedElement_QualifiedName()
 	 * @model required="true" transient="true" changeable="false" volatile="true" derived="true"
-	 *        annotation="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot derivation='\n            if (self.name.oclIsUndefined()) then\n                \'\'\n            else\n                if (not self.oclContainer().oclIsUndefined()) then\n                    if (self.oclContainer().oclIsKindOf(NamedElement)) then\n                        self.oclContainer().oclAsType(NamedElement).qualifiedName + \'::\' + self.name\n                    else\n                        self.oclContainer().oclAsType(ocl::OclElement)-&gt;closure(oclContainer())\n                        -&gt;select(c | c.oclIsKindOf(NamedElement))\n                        -&gt;asOrderedSet()\n                        -&gt;first().oclAsType(NamedElement).qualifiedName + \'::\' + self.name\n                    endif\n                else\n                    self.name\n                endif\n            endif'"
 	 * @generated
 	 */
 	String getQualifiedName();
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/ParameterBinding.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/ParameterBinding.java
index 1ae1b29984f09e4374e4f2a01e31fae8bb79fad9..ecdaaebfc035a941927816fa2ce0eb407fdd770b 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/ParameterBinding.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/ParameterBinding.java
@@ -2,6 +2,7 @@
  */
 package org.etsi.mts.tdl;
 
+import org.eclipse.emf.common.util.EList;
 
 /**
  * <!-- begin-user-doc -->
@@ -14,6 +15,7 @@ package org.etsi.mts.tdl;
  * <ul>
  *   <li>{@link org.etsi.mts.tdl.ParameterBinding#getDataUse <em>Data Use</em>}</li>
  *   <li>{@link org.etsi.mts.tdl.ParameterBinding#getParameter <em>Parameter</em>}</li>
+ *   <li>{@link org.etsi.mts.tdl.ParameterBinding#getReduction <em>Reduction</em>}</li>
  * </ul>
  *
  * @see org.etsi.mts.tdl.tdlPackage#getParameterBinding()
@@ -66,4 +68,24 @@ public interface ParameterBinding extends Element
 	 */
 	void setParameter(Parameter value);
 
+	/**
+	 * Returns the value of the '<em><b>Reduction</b></em>' containment reference list.
+	 * The list contents are of type {@link org.etsi.mts.tdl.MemberReference}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Reduction</em>' containment reference list.
+	 * @see org.etsi.mts.tdl.tdlPackage#getParameterBinding_Reduction()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<MemberReference> getReduction();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model annotation="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot body='\t\t\t\n\t            \tif (self.reduction-&gt;isEmpty()) then\n\t                \tself.parameter.dataType\n\t            \telse \n\t            \t\tif (self.reduction-&gt;last().member.oclIsUndefined()) then\n\t            \t\t\tif (self.reduction-&gt;last().collectionIndex.oclIsUndefined()) then\n\t                \t\t\tself.parameter.dataType\n\t            \t\t\telse\n\t            \t\t\t\tself.parameter.dataType.oclAsType(CollectionDataType).itemType\n\t            \t\t\tendif \n\t            \t\telse \n\t                \t\tself.reduction-&gt;last().member.dataType\n\t            \t\tendif\n\t                endif\n\t                '"
+	 * @generated
+	 */
+	DataType resolveParameterType();
+
 } // ParameterBinding
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/ParameterKind.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/ParameterKind.java
index f800cf5465a50cb3d6d08ba12b240ed09c6b29de..be93d25a3f1e4231249575343f8988cfa85c3c28 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/ParameterKind.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/ParameterKind.java
@@ -89,8 +89,7 @@ public enum ParameterKind implements Enumerator
 	 * @generated
 	 */
 	private static final ParameterKind[] VALUES_ARRAY =
-		new ParameterKind[]
-		{
+		new ParameterKind[] {
 			IN,
 			OUT,
 			EXCEPTION,
@@ -114,11 +113,9 @@ public enum ParameterKind implements Enumerator
 	 */
 	public static ParameterKind get(String literal)
 	{
-		for (int i = 0; i < VALUES_ARRAY.length; ++i)
-		{
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
 			ParameterKind result = VALUES_ARRAY[i];
-			if (result.toString().equals(literal))
-			{
+			if (result.toString().equals(literal)) {
 				return result;
 			}
 		}
@@ -135,11 +132,9 @@ public enum ParameterKind implements Enumerator
 	 */
 	public static ParameterKind getByName(String name)
 	{
-		for (int i = 0; i < VALUES_ARRAY.length; ++i)
-		{
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
 			ParameterKind result = VALUES_ARRAY[i];
-			if (result.getName().equals(name))
-			{
+			if (result.getName().equals(name)) {
 				return result;
 			}
 		}
@@ -156,8 +151,7 @@ public enum ParameterKind implements Enumerator
 	 */
 	public static ParameterKind get(int value)
 	{
-		switch (value)
-		{
+		switch (value) {
 			case IN_VALUE: return IN;
 			case OUT_VALUE: return OUT;
 			case EXCEPTION_VALUE: return EXCEPTION;
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/PredefinedFunctionCall.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/PredefinedFunctionCall.java
index 2ddea572ab624523cf1f15017d0a935656c08cab..dc956a6fb3feb3df44c6f2999f149fbf5e282f00 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/PredefinedFunctionCall.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/PredefinedFunctionCall.java
@@ -60,7 +60,7 @@ public interface PredefinedFunctionCall extends DynamicDataUse
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @model annotation="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot body='self.function.returnType'"
+	 * @model annotation="http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot body='\n\t                if not self.function.returnType.oclIsUndefined() then\n\t\t\t\t\t\tself.function.returnType\n\t\t\t\t\telse \n\t\t\t\t\t\tself.actualParameters.resolveDataType()-&gt;asOrderedSet()-&gt;first()\n\t\t\t\t\tendif\n\t\t\t\t\t'"
 	 * @generated
 	 */
 	DataType resolveDataType();
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/TimeLabelUseKind.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/TimeLabelUseKind.java
index de8f680af8240638f4951d5c8ab2eb67dd8f2de0..3a38d29003b59c53707ee265a278614967c10f6d 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/TimeLabelUseKind.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/TimeLabelUseKind.java
@@ -89,8 +89,7 @@ public enum TimeLabelUseKind implements Enumerator
 	 * @generated
 	 */
 	private static final TimeLabelUseKind[] VALUES_ARRAY =
-		new TimeLabelUseKind[]
-		{
+		new TimeLabelUseKind[] {
 			LAST,
 			PREVIOUS,
 			FIRST,
@@ -114,11 +113,9 @@ public enum TimeLabelUseKind implements Enumerator
 	 */
 	public static TimeLabelUseKind get(String literal)
 	{
-		for (int i = 0; i < VALUES_ARRAY.length; ++i)
-		{
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
 			TimeLabelUseKind result = VALUES_ARRAY[i];
-			if (result.toString().equals(literal))
-			{
+			if (result.toString().equals(literal)) {
 				return result;
 			}
 		}
@@ -135,11 +132,9 @@ public enum TimeLabelUseKind implements Enumerator
 	 */
 	public static TimeLabelUseKind getByName(String name)
 	{
-		for (int i = 0; i < VALUES_ARRAY.length; ++i)
-		{
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
 			TimeLabelUseKind result = VALUES_ARRAY[i];
-			if (result.getName().equals(name))
-			{
+			if (result.getName().equals(name)) {
 				return result;
 			}
 		}
@@ -156,8 +151,7 @@ public enum TimeLabelUseKind implements Enumerator
 	 */
 	public static TimeLabelUseKind get(int value)
 	{
-		switch (value)
-		{
+		switch (value) {
 			case LAST_VALUE: return LAST;
 			case PREVIOUS_VALUE: return PREVIOUS;
 			case FIRST_VALUE: return FIRST;
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/UnassignedMemberTreatment.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/UnassignedMemberTreatment.java
index a0e61288b2dbc3429d691c4c59910847d09c94c6..f6ce4c73eeb4d36d0447e9407fab04e63a5e849c 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/UnassignedMemberTreatment.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/UnassignedMemberTreatment.java
@@ -89,8 +89,7 @@ public enum UnassignedMemberTreatment implements Enumerator
 	 * @generated
 	 */
 	private static final UnassignedMemberTreatment[] VALUES_ARRAY =
-		new UnassignedMemberTreatment[]
-		{
+		new UnassignedMemberTreatment[] {
 			UNDEFINED,
 			ANY_VALUE,
 			ANY_VALUE_OR_OMIT,
@@ -114,11 +113,9 @@ public enum UnassignedMemberTreatment implements Enumerator
 	 */
 	public static UnassignedMemberTreatment get(String literal)
 	{
-		for (int i = 0; i < VALUES_ARRAY.length; ++i)
-		{
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
 			UnassignedMemberTreatment result = VALUES_ARRAY[i];
-			if (result.toString().equals(literal))
-			{
+			if (result.toString().equals(literal)) {
 				return result;
 			}
 		}
@@ -135,11 +132,9 @@ public enum UnassignedMemberTreatment implements Enumerator
 	 */
 	public static UnassignedMemberTreatment getByName(String name)
 	{
-		for (int i = 0; i < VALUES_ARRAY.length; ++i)
-		{
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
 			UnassignedMemberTreatment result = VALUES_ARRAY[i];
-			if (result.getName().equals(name))
-			{
+			if (result.getName().equals(name)) {
 				return result;
 			}
 		}
@@ -156,8 +151,7 @@ public enum UnassignedMemberTreatment implements Enumerator
 	 */
 	public static UnassignedMemberTreatment get(int value)
 	{
-		switch (value)
-		{
+		switch (value) {
 			case UNDEFINED_VALUE: return UNDEFINED;
 			case ANY_VALUE_VALUE: return ANY_VALUE;
 			case ANY_VALUE_OR_OMIT_VALUE: return ANY_VALUE_OR_OMIT;
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ActionBehaviourImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ActionBehaviourImpl.java
index 225332b1258a018c822702f0c7a254fce231bbdc..8494686ca13e2f55e509614a0e19ef54c64473a5 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ActionBehaviourImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ActionBehaviourImpl.java
@@ -4,22 +4,39 @@ package org.etsi.mts.tdl.impl;
 
 import java.lang.reflect.InvocationTargetException;
 
+import java.util.Iterator;
+import java.util.List;
 import org.eclipse.emf.common.notify.Notification;
 
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.ids.IdResolver.IdResolverExtension;
+import org.eclipse.ocl.pivot.library.collection.CollectionAsOrderedSetOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsSetOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsTypeOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclIsKindOfOperation;
+import org.eclipse.ocl.pivot.messages.PivotMessages;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
+import org.eclipse.ocl.pivot.values.OrderedSetValue;
+import org.eclipse.ocl.pivot.values.SetValue;
 import org.etsi.mts.tdl.ActionBehaviour;
 import org.etsi.mts.tdl.AtomicBehaviour;
 import org.etsi.mts.tdl.Behaviour;
+import org.etsi.mts.tdl.Block;
 import org.etsi.mts.tdl.ComponentInstance;
+import org.etsi.mts.tdl.Element;
+import org.etsi.mts.tdl.TestConfiguration;
+import org.etsi.mts.tdl.TestDescription;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -75,12 +92,10 @@ public abstract class ActionBehaviourImpl extends AtomicBehaviourImpl implements
 	@Override
 	public ComponentInstance getComponentInstance()
 	{
-		if (componentInstance != null && componentInstance.eIsProxy())
-		{
+		if (componentInstance != null && componentInstance.eIsProxy()) {
 			InternalEObject oldComponentInstance = (InternalEObject)componentInstance;
 			componentInstance = (ComponentInstance)eResolveProxy(oldComponentInstance);
-			if (componentInstance != oldComponentInstance)
-			{
+			if (componentInstance != oldComponentInstance) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.ACTION_BEHAVIOUR__COMPONENT_INSTANCE, oldComponentInstance, componentInstance));
 			}
@@ -112,16 +127,6 @@ public abstract class ActionBehaviourImpl extends AtomicBehaviourImpl implements
 			eNotify(new ENotificationImpl(this, Notification.SET, tdlPackage.ACTION_BEHAVIOUR__COMPONENT_INSTANCE, oldComponentInstance, componentInstance));
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #getParticipatingComponents() <em>Get Participating Components</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getParticipatingComponents()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate GET_PARTICIPATING_COMPONENTS__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.ACTION_BEHAVIOUR___GET_PARTICIPATING_COMPONENTS).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -131,14 +136,126 @@ public abstract class ActionBehaviourImpl extends AtomicBehaviourImpl implements
 	@Override
 	public EList<ComponentInstance> getParticipatingComponents()
 	{
-		try
-		{
-			return (EList<ComponentInstance>)GET_PARTICIPATING_COMPONENTS__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if
+		 *   self.getParentTestDescription()
+		 *   ->exists(td | td.isLocallyOrdered) and
+		 *   self.container()
+		 *   .oclIsKindOf(Block)
+		 * then
+		 *   if not self.componentInstance.oclIsUndefined()
+		 *   then OrderedSet{self.componentInstance}
+		 *   else
+		 *     self.container()
+		 *     .oclAsType(Block)
+		 *     .getParticipatingComponentsExcluding(self)
+		 *     ->asOrderedSet()
+		 *   endif
+		 * else
+		 *   self.getParentTestDescription()
+		 *   .testConfiguration.componentInstance->asOrderedSet()
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_Block_0 = idResolver.getClass(tdlTables.CLSSid_Block, null);
+		final /*@NonInvalid*/ Element container = this.container();
+		final /*@NonInvalid*/ TestDescription getParentTestDescription_0 = this.getParentTestDescription();
+		final /*@NonInvalid*/ SetValue oclAsSet = OclAnyOclAsSetOperation.INSTANCE.evaluate(executor, tdlTables.SET_CLSSid_TestDescription, getParentTestDescription_0);
+		/*@Thrown*/ Object accumulator = ValueUtil.FALSE_VALUE;
+		Iterator<Object> ITERATOR_td = oclAsSet.iterator();
+		/*@NonInvalid*/ Boolean exists;
+		while (true) {
+			if (!ITERATOR_td.hasNext()) {
+				if (accumulator == ValueUtil.FALSE_VALUE) {
+					exists = ValueUtil.FALSE_VALUE;
+				}
+				else {
+					throw (InvalidValueException)accumulator;
+				}
+				break;
+			}
+			/*@NonInvalid*/ TestDescription td = (TestDescription)ITERATOR_td.next();
+			/**
+			 * td.isLocallyOrdered
+			 */
+			final /*@NonInvalid*/ boolean isLocallyOrdered = td.isIsLocallyOrdered();
+			//
+			if (isLocallyOrdered) {					// Normal successful body evaluation result
+				exists = ValueUtil.TRUE_VALUE;
+				break;														// Stop immediately
+			}
+			else if (!isLocallyOrdered) {				// Normal unsuccessful body evaluation result
+				;															// Carry on
+			}
+			else {															// Impossible badly typed result
+				accumulator = new InvalidValueException(PivotMessages.NonBooleanBody, "exists");
+			}
+		}
+		final /*@Thrown*/ Boolean and;
+		if (exists == ValueUtil.FALSE_VALUE) {
+			and = ValueUtil.FALSE_VALUE;
+		}
+		else {
+			final /*@NonInvalid*/ boolean oclIsKindOf = OclAnyOclIsKindOfOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_Block_0).booleanValue();
+			if (!oclIsKindOf) {
+				and = ValueUtil.FALSE_VALUE;
+			}
+			else {
+				if (exists == null) {
+					and = null;
+				}
+				else {
+					and = ValueUtil.TRUE_VALUE;
+				}
+			}
+		}
+		if (and == null) {
+			throw new InvalidValueException("Null if condition");
+		}
+		/*@Thrown*/ OrderedSetValue local_1;
+		if (and) {
+			final /*@NonInvalid*/ ComponentInstance componentInstance_0 = this.getComponentInstance();
+			final /*@NonInvalid*/ boolean oclIsUndefined = componentInstance_0 == null;
+			final /*@NonInvalid*/ Boolean not;
+			if (!oclIsUndefined) {
+				not = ValueUtil.TRUE_VALUE;
+			}
+			else {
+				if (oclIsUndefined) {
+					not = ValueUtil.FALSE_VALUE;
+				}
+				else {
+					not = null;
+				}
+			}
+			if (not == null) {
+				throw new InvalidValueException("Null if condition");
+			}
+			/*@Thrown*/ OrderedSetValue local_0;
+			if (not) {
+				final /*@NonInvalid*/ OrderedSetValue OrderedSet = ValueUtil.createOrderedSetOfEach(tdlTables.ORD_CLSSid_ComponentInstance, componentInstance_0);
+				local_0 = OrderedSet;
+			}
+			else {
+				final /*@Thrown*/ Block oclAsType = (Block)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_Block_0);
+				final /*@Thrown*/ List<ComponentInstance> getParticipatingComponentsExcluding = oclAsType.getParticipatingComponentsExcluding(this);
+				final /*@Thrown*/ OrderedSetValue BOXED_getParticipatingComponentsExcluding = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_ComponentInstance, getParticipatingComponentsExcluding);
+				final /*@Thrown*/ OrderedSetValue asOrderedSet = CollectionAsOrderedSetOperation.INSTANCE.evaluate(BOXED_getParticipatingComponentsExcluding);
+				local_0 = asOrderedSet;
+			}
+			local_1 = local_0;
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		else {
+			final /*@NonInvalid*/ TestConfiguration testConfiguration = getParentTestDescription_0.getTestConfiguration();
+			final /*@NonInvalid*/ List<ComponentInstance> componentInstance_1 = testConfiguration.getComponentInstance();
+			final /*@NonInvalid*/ SetValue BOXED_componentInstance_1 = idResolver.createSetOfAll(tdlTables.SET_CLSSid_ComponentInstance, componentInstance_1);
+			final /*@NonInvalid*/ OrderedSetValue asOrderedSet_0 = CollectionAsOrderedSetOperation.INSTANCE.evaluate(BOXED_componentInstance_1);
+			local_1 = asOrderedSet_0;
 		}
+		final /*@Thrown*/ List<ComponentInstance> ECORE_local_1 = ((IdResolverExtension)idResolver).ecoreValueOfAll(ComponentInstance.class, local_1);
+		return (EList<ComponentInstance>)ECORE_local_1;
 	}
 
 	/**
@@ -149,8 +266,7 @@ public abstract class ActionBehaviourImpl extends AtomicBehaviourImpl implements
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ACTION_BEHAVIOUR__COMPONENT_INSTANCE:
 				if (resolve) return getComponentInstance();
 				return basicGetComponentInstance();
@@ -166,8 +282,7 @@ public abstract class ActionBehaviourImpl extends AtomicBehaviourImpl implements
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ACTION_BEHAVIOUR__COMPONENT_INSTANCE:
 				setComponentInstance((ComponentInstance)newValue);
 				return;
@@ -183,8 +298,7 @@ public abstract class ActionBehaviourImpl extends AtomicBehaviourImpl implements
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ACTION_BEHAVIOUR__COMPONENT_INSTANCE:
 				setComponentInstance((ComponentInstance)null);
 				return;
@@ -200,8 +314,7 @@ public abstract class ActionBehaviourImpl extends AtomicBehaviourImpl implements
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ACTION_BEHAVIOUR__COMPONENT_INSTANCE:
 				return componentInstance != null;
 		}
@@ -216,18 +329,14 @@ public abstract class ActionBehaviourImpl extends AtomicBehaviourImpl implements
 	@Override
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass)
 	{
-		if (baseClass == Behaviour.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == Behaviour.class) {
+			switch (baseOperationID) {
 				case tdlPackage.BEHAVIOUR___GET_PARTICIPATING_COMPONENTS: return tdlPackage.ACTION_BEHAVIOUR___GET_PARTICIPATING_COMPONENTS;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
 		}
-		if (baseClass == AtomicBehaviour.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == AtomicBehaviour.class) {
+			switch (baseOperationID) {
 				case tdlPackage.ATOMIC_BEHAVIOUR___GET_PARTICIPATING_COMPONENTS: return tdlPackage.ACTION_BEHAVIOUR___GET_PARTICIPATING_COMPONENTS;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
@@ -243,8 +352,7 @@ public abstract class ActionBehaviourImpl extends AtomicBehaviourImpl implements
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.ACTION_BEHAVIOUR___GET_PARTICIPATING_COMPONENTS:
 				return getParticipatingComponents();
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ActionImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ActionImpl.java
index 3848737618edc749bd11c31f694d4be79b4689cf..1290a4b8b200f101f9b280fed38e6d2c11c5ac63 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ActionImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ActionImpl.java
@@ -121,8 +121,7 @@ public class ActionImpl extends MappableDataElementImpl implements Action
 	@Override
 	public EList<FormalParameter> getFormalParameter()
 	{
-		if (formalParameter == null)
-		{
+		if (formalParameter == null) {
 			formalParameter = new EObjectContainmentEList<FormalParameter>(FormalParameter.class, this, tdlPackage.ACTION__FORMAL_PARAMETER);
 		}
 		return formalParameter;
@@ -136,8 +135,7 @@ public class ActionImpl extends MappableDataElementImpl implements Action
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ACTION__FORMAL_PARAMETER:
 				return ((InternalEList<?>)getFormalParameter()).basicRemove(otherEnd, msgs);
 		}
@@ -152,8 +150,7 @@ public class ActionImpl extends MappableDataElementImpl implements Action
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ACTION__BODY:
 				return getBody();
 			case tdlPackage.ACTION__FORMAL_PARAMETER:
@@ -171,8 +168,7 @@ public class ActionImpl extends MappableDataElementImpl implements Action
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ACTION__BODY:
 				setBody((String)newValue);
 				return;
@@ -192,8 +188,7 @@ public class ActionImpl extends MappableDataElementImpl implements Action
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ACTION__BODY:
 				setBody(BODY_EDEFAULT);
 				return;
@@ -212,8 +207,7 @@ public class ActionImpl extends MappableDataElementImpl implements Action
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ACTION__BODY:
 				return BODY_EDEFAULT == null ? body != null : !BODY_EDEFAULT.equals(body);
 			case tdlPackage.ACTION__FORMAL_PARAMETER:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ActionReferenceImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ActionReferenceImpl.java
index 8afe4f23532d298a3db9dea6889ed3b68b983a85..d00753b8507f5414a87ec3b87902543f6f5ab5d4 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ActionReferenceImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ActionReferenceImpl.java
@@ -87,12 +87,10 @@ public class ActionReferenceImpl extends ActionBehaviourImpl implements ActionRe
 	@Override
 	public Action getAction()
 	{
-		if (action != null && action.eIsProxy())
-		{
+		if (action != null && action.eIsProxy()) {
 			InternalEObject oldAction = (InternalEObject)action;
 			action = (Action)eResolveProxy(oldAction);
-			if (action != oldAction)
-			{
+			if (action != oldAction) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.ACTION_REFERENCE__ACTION, oldAction, action));
 			}
@@ -132,8 +130,7 @@ public class ActionReferenceImpl extends ActionBehaviourImpl implements ActionRe
 	@Override
 	public EList<ParameterBinding> getArgument()
 	{
-		if (argument == null)
-		{
+		if (argument == null) {
 			argument = new EObjectContainmentEList<ParameterBinding>(ParameterBinding.class, this, tdlPackage.ACTION_REFERENCE__ARGUMENT);
 		}
 		return argument;
@@ -147,8 +144,7 @@ public class ActionReferenceImpl extends ActionBehaviourImpl implements ActionRe
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ACTION_REFERENCE__ARGUMENT:
 				return ((InternalEList<?>)getArgument()).basicRemove(otherEnd, msgs);
 		}
@@ -163,8 +159,7 @@ public class ActionReferenceImpl extends ActionBehaviourImpl implements ActionRe
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ACTION_REFERENCE__ACTION:
 				if (resolve) return getAction();
 				return basicGetAction();
@@ -183,8 +178,7 @@ public class ActionReferenceImpl extends ActionBehaviourImpl implements ActionRe
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ACTION_REFERENCE__ACTION:
 				setAction((Action)newValue);
 				return;
@@ -204,8 +198,7 @@ public class ActionReferenceImpl extends ActionBehaviourImpl implements ActionRe
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ACTION_REFERENCE__ACTION:
 				setAction((Action)null);
 				return;
@@ -224,8 +217,7 @@ public class ActionReferenceImpl extends ActionBehaviourImpl implements ActionRe
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ACTION_REFERENCE__ACTION:
 				return action != null;
 			case tdlPackage.ACTION_REFERENCE__ARGUMENT:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/AnnotationImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/AnnotationImpl.java
index 25149c681d91b287379980413d18a3e760b14ddb..2e4e6447fc0c5f6ffa1ee622fe4c088cf404f558 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/AnnotationImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/AnnotationImpl.java
@@ -118,12 +118,10 @@ public class AnnotationImpl extends ElementImpl implements Annotation
 	@Override
 	public AnnotationType getKey()
 	{
-		if (key != null && key.eIsProxy())
-		{
+		if (key != null && key.eIsProxy()) {
 			InternalEObject oldKey = (InternalEObject)key;
 			key = (AnnotationType)eResolveProxy(oldKey);
-			if (key != oldKey)
-			{
+			if (key != oldKey) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.ANNOTATION__KEY, oldKey, key));
 			}
@@ -186,8 +184,7 @@ public class AnnotationImpl extends ElementImpl implements Annotation
 	@Override
 	public void setAnnotatedElement(Element newAnnotatedElement)
 	{
-		if (newAnnotatedElement != eInternalContainer() || (eContainerFeatureID() != tdlPackage.ANNOTATION__ANNOTATED_ELEMENT && newAnnotatedElement != null))
-		{
+		if (newAnnotatedElement != eInternalContainer() || (eContainerFeatureID() != tdlPackage.ANNOTATION__ANNOTATED_ELEMENT && newAnnotatedElement != null)) {
 			if (EcoreUtil.isAncestor(this, newAnnotatedElement))
 				throw new IllegalArgumentException("Recursive containment not allowed for " + toString());
 			NotificationChain msgs = null;
@@ -210,8 +207,7 @@ public class AnnotationImpl extends ElementImpl implements Annotation
 	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ANNOTATION__ANNOTATED_ELEMENT:
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -228,8 +224,7 @@ public class AnnotationImpl extends ElementImpl implements Annotation
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ANNOTATION__ANNOTATED_ELEMENT:
 				return basicSetAnnotatedElement(null, msgs);
 		}
@@ -244,8 +239,7 @@ public class AnnotationImpl extends ElementImpl implements Annotation
 	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(NotificationChain msgs)
 	{
-		switch (eContainerFeatureID())
-		{
+		switch (eContainerFeatureID()) {
 			case tdlPackage.ANNOTATION__ANNOTATED_ELEMENT:
 				return eInternalContainer().eInverseRemove(this, tdlPackage.ELEMENT__ANNOTATION, Element.class, msgs);
 		}
@@ -260,8 +254,7 @@ public class AnnotationImpl extends ElementImpl implements Annotation
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ANNOTATION__VALUE:
 				return getValue();
 			case tdlPackage.ANNOTATION__KEY:
@@ -281,8 +274,7 @@ public class AnnotationImpl extends ElementImpl implements Annotation
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ANNOTATION__VALUE:
 				setValue((String)newValue);
 				return;
@@ -304,8 +296,7 @@ public class AnnotationImpl extends ElementImpl implements Annotation
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ANNOTATION__VALUE:
 				setValue(VALUE_EDEFAULT);
 				return;
@@ -327,8 +318,7 @@ public class AnnotationImpl extends ElementImpl implements Annotation
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ANNOTATION__VALUE:
 				return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
 			case tdlPackage.ANNOTATION__KEY:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/AnnotationTypeImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/AnnotationTypeImpl.java
index 1dedabac3fa0e03701a52ec15db411b129a8203b..4a1fb3ce72269881ebba82223165b1b94c54174c 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/AnnotationTypeImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/AnnotationTypeImpl.java
@@ -80,8 +80,7 @@ public class AnnotationTypeImpl extends PackageableElementImpl implements Annota
 	{
 		Extension oldExtension = extension;
 		extension = newExtension;
-		if (eNotificationRequired())
-		{
+		if (eNotificationRequired()) {
 			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, tdlPackage.ANNOTATION_TYPE__EXTENSION, oldExtension, newExtension);
 			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
@@ -96,8 +95,7 @@ public class AnnotationTypeImpl extends PackageableElementImpl implements Annota
 	@Override
 	public void setExtension(Extension newExtension)
 	{
-		if (newExtension != extension)
-		{
+		if (newExtension != extension) {
 			NotificationChain msgs = null;
 			if (extension != null)
 				msgs = ((InternalEObject)extension).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - tdlPackage.ANNOTATION_TYPE__EXTENSION, null, msgs);
@@ -118,8 +116,7 @@ public class AnnotationTypeImpl extends PackageableElementImpl implements Annota
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ANNOTATION_TYPE__EXTENSION:
 				return basicSetExtension(null, msgs);
 		}
@@ -134,8 +131,7 @@ public class AnnotationTypeImpl extends PackageableElementImpl implements Annota
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ANNOTATION_TYPE__EXTENSION:
 				return getExtension();
 		}
@@ -150,8 +146,7 @@ public class AnnotationTypeImpl extends PackageableElementImpl implements Annota
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ANNOTATION_TYPE__EXTENSION:
 				setExtension((Extension)newValue);
 				return;
@@ -167,8 +162,7 @@ public class AnnotationTypeImpl extends PackageableElementImpl implements Annota
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ANNOTATION_TYPE__EXTENSION:
 				setExtension((Extension)null);
 				return;
@@ -184,8 +178,7 @@ public class AnnotationTypeImpl extends PackageableElementImpl implements Annota
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ANNOTATION_TYPE__EXTENSION:
 				return extension != null;
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/AnyValueImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/AnyValueImpl.java
index 362fd761d6c6cf273b4644d11621aac2f8666acc..0a40ed0bff43a9d697a12c31ac4d76a4cc9cab1f 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/AnyValueImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/AnyValueImpl.java
@@ -7,19 +7,33 @@ import java.lang.reflect.InvocationTargetException;
 import org.eclipse.emf.common.notify.Notification;
 
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsTypeOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclIsTypeOfOperation;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
 import org.etsi.mts.tdl.AnyValue;
+import org.etsi.mts.tdl.CollectionDataInstance;
+import org.etsi.mts.tdl.CollectionDataType;
+import org.etsi.mts.tdl.DataElementUse;
+import org.etsi.mts.tdl.DataInstanceUse;
 import org.etsi.mts.tdl.DataType;
 import org.etsi.mts.tdl.DataUse;
+import org.etsi.mts.tdl.Element;
+import org.etsi.mts.tdl.Member;
+import org.etsi.mts.tdl.MemberAssignment;
+import org.etsi.mts.tdl.Parameter;
+import org.etsi.mts.tdl.ParameterBinding;
 import org.etsi.mts.tdl.SpecialValueUse;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -75,12 +89,10 @@ public class AnyValueImpl extends SpecialValueUseImpl implements AnyValue
 	@Override
 	public DataType getDataType()
 	{
-		if (dataType != null && dataType.eIsProxy())
-		{
+		if (dataType != null && dataType.eIsProxy()) {
 			InternalEObject oldDataType = (InternalEObject)dataType;
 			dataType = (DataType)eResolveProxy(oldDataType);
-			if (dataType != oldDataType)
-			{
+			if (dataType != oldDataType) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.ANY_VALUE__DATA_TYPE, oldDataType, dataType));
 			}
@@ -112,16 +124,6 @@ public class AnyValueImpl extends SpecialValueUseImpl implements AnyValue
 			eNotify(new ENotificationImpl(this, Notification.SET, tdlPackage.ANY_VALUE__DATA_TYPE, oldDataType, dataType));
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #resolveDataType() <em>Resolve Data Type</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #resolveDataType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate RESOLVE_DATA_TYPE__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.ANY_VALUE___RESOLVE_DATA_TYPE).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -130,14 +132,144 @@ public class AnyValueImpl extends SpecialValueUseImpl implements AnyValue
 	@Override
 	public DataType resolveDataType()
 	{
-		try
-		{
-			return (DataType)RESOLVE_DATA_TYPE__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if not self.dataType.oclIsUndefined()
+		 * then self.dataType
+		 * else
+		 *   if self.container().oclIsTypeOf(MemberAssignment)
+		 *   then
+		 *     self.container()
+		 *     .oclAsType(MemberAssignment).member.dataType
+		 *   else
+		 *     if self.container().oclIsTypeOf(ParameterBinding)
+		 *     then
+		 *       self.container()
+		 *       .oclAsType(ParameterBinding).parameter.dataType
+		 *     else
+		 *       if
+		 *         self.container()
+		 *         .oclIsTypeOf(CollectionDataInstance)
+		 *       then
+		 *         self.container()
+		 *         .oclAsType(CollectionDataInstance)
+		 *         .dataType.oclAsType(CollectionDataType).itemType
+		 *       else
+		 *         if self.container().oclIsTypeOf(DataElementUse)
+		 *         then
+		 *           self.container()
+		 *           .oclAsType(DataElementUse)
+		 *           .resolveDataType()
+		 *           .oclAsType(CollectionDataType).itemType
+		 *         else
+		 *           if self.container().oclIsTypeOf(DataInstanceUse)
+		 *           then
+		 *             self.container()
+		 *             .oclAsType(DataInstanceUse)
+		 *             .resolveDataType()
+		 *             .oclAsType(CollectionDataType).itemType
+		 *           else null
+		 *           endif
+		 *         endif
+		 *       endif
+		 *     endif
+		 *   endif
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ DataType dataType_0 = this.getDataType();
+		final /*@NonInvalid*/ boolean oclIsUndefined = dataType_0 == null;
+		final /*@NonInvalid*/ Boolean not;
+		if (!oclIsUndefined) {
+			not = ValueUtil.TRUE_VALUE;
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		else {
+			if (oclIsUndefined) {
+				not = ValueUtil.FALSE_VALUE;
+			}
+			else {
+				not = null;
+			}
+		}
+		if (not == null) {
+			throw new InvalidValueException("Null if condition");
+		}
+		/*@Thrown*/ DataType local_5;
+		if (not) {
+			local_5 = dataType_0;
+		}
+		else {
+			final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_MemberAssignment_0 = idResolver.getClass(tdlTables.CLSSid_MemberAssignment, null);
+			final /*@NonInvalid*/ Element container = this.container();
+			final /*@NonInvalid*/ boolean oclIsTypeOf = OclAnyOclIsTypeOfOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_MemberAssignment_0).booleanValue();
+			/*@Thrown*/ DataType local_4;
+			if (oclIsTypeOf) {
+				final /*@Thrown*/ MemberAssignment oclAsType = (MemberAssignment)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_MemberAssignment_0);
+				final /*@Thrown*/ Member member = oclAsType.getMember();
+				final /*@Thrown*/ DataType dataType_1 = member.getDataType();
+				local_4 = dataType_1;
+			}
+			else {
+				final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_ParameterBinding_0 = idResolver.getClass(tdlTables.CLSSid_ParameterBinding, null);
+				final /*@NonInvalid*/ boolean oclIsTypeOf_0 = OclAnyOclIsTypeOfOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_ParameterBinding_0).booleanValue();
+				/*@Thrown*/ DataType local_3;
+				if (oclIsTypeOf_0) {
+					final /*@Thrown*/ ParameterBinding oclAsType_0 = (ParameterBinding)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_ParameterBinding_0);
+					final /*@Thrown*/ Parameter parameter = oclAsType_0.getParameter();
+					final /*@Thrown*/ DataType dataType_2 = parameter.getDataType();
+					local_3 = dataType_2;
+				}
+				else {
+					final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_CollectionDataInstance_0 = idResolver.getClass(tdlTables.CLSSid_CollectionDataInstance, null);
+					final /*@NonInvalid*/ boolean oclIsTypeOf_1 = OclAnyOclIsTypeOfOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_CollectionDataInstance_0).booleanValue();
+					/*@Thrown*/ DataType local_2;
+					if (oclIsTypeOf_1) {
+						final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_CollectionDataType_0 = idResolver.getClass(tdlTables.CLSSid_CollectionDataType, null);
+						final /*@Thrown*/ CollectionDataInstance oclAsType_1 = (CollectionDataInstance)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_CollectionDataInstance_0);
+						final /*@Thrown*/ DataType dataType_3 = oclAsType_1.getDataType();
+						final /*@Thrown*/ CollectionDataType oclAsType_2 = (CollectionDataType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, dataType_3, TYP_tdl_c_c_CollectionDataType_0);
+						final /*@Thrown*/ DataType itemType = oclAsType_2.getItemType();
+						local_2 = itemType;
+					}
+					else {
+						final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_DataElementUse_0 = idResolver.getClass(tdlTables.CLSSid_DataElementUse, null);
+						final /*@NonInvalid*/ boolean oclIsTypeOf_2 = OclAnyOclIsTypeOfOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_DataElementUse_0).booleanValue();
+						/*@Thrown*/ DataType local_1;
+						if (oclIsTypeOf_2) {
+							final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_CollectionDataType_1 = idResolver.getClass(tdlTables.CLSSid_CollectionDataType, null);
+							final /*@Thrown*/ DataElementUse oclAsType_3 = (DataElementUse)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_DataElementUse_0);
+							final /*@Thrown*/ DataType resolveDataType = oclAsType_3.resolveDataType();
+							final /*@Thrown*/ CollectionDataType oclAsType_4 = (CollectionDataType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, resolveDataType, TYP_tdl_c_c_CollectionDataType_1);
+							final /*@Thrown*/ DataType itemType_0 = oclAsType_4.getItemType();
+							local_1 = itemType_0;
+						}
+						else {
+							final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_DataInstanceUse_0 = idResolver.getClass(tdlTables.CLSSid_DataInstanceUse, null);
+							final /*@NonInvalid*/ boolean oclIsTypeOf_3 = OclAnyOclIsTypeOfOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_DataInstanceUse_0).booleanValue();
+							/*@Thrown*/ DataType local_0;
+							if (oclIsTypeOf_3) {
+								final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_CollectionDataType_2 = idResolver.getClass(tdlTables.CLSSid_CollectionDataType, null);
+								final /*@Thrown*/ DataInstanceUse oclAsType_5 = (DataInstanceUse)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_DataInstanceUse_0);
+								final /*@Thrown*/ DataType resolveDataType_0 = oclAsType_5.resolveDataType();
+								final /*@Thrown*/ CollectionDataType oclAsType_6 = (CollectionDataType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, resolveDataType_0, TYP_tdl_c_c_CollectionDataType_2);
+								final /*@Thrown*/ DataType itemType_1 = oclAsType_6.getItemType();
+								local_0 = itemType_1;
+							}
+							else {
+								local_0 = null;
+							}
+							local_1 = local_0;
+						}
+						local_2 = local_1;
+					}
+					local_3 = local_2;
+				}
+				local_4 = local_3;
+			}
+			local_5 = local_4;
 		}
+		return local_5;
 	}
 
 	/**
@@ -148,8 +280,7 @@ public class AnyValueImpl extends SpecialValueUseImpl implements AnyValue
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ANY_VALUE__DATA_TYPE:
 				if (resolve) return getDataType();
 				return basicGetDataType();
@@ -165,8 +296,7 @@ public class AnyValueImpl extends SpecialValueUseImpl implements AnyValue
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ANY_VALUE__DATA_TYPE:
 				setDataType((DataType)newValue);
 				return;
@@ -182,8 +312,7 @@ public class AnyValueImpl extends SpecialValueUseImpl implements AnyValue
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ANY_VALUE__DATA_TYPE:
 				setDataType((DataType)null);
 				return;
@@ -199,8 +328,7 @@ public class AnyValueImpl extends SpecialValueUseImpl implements AnyValue
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ANY_VALUE__DATA_TYPE:
 				return dataType != null;
 		}
@@ -215,18 +343,14 @@ public class AnyValueImpl extends SpecialValueUseImpl implements AnyValue
 	@Override
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass)
 	{
-		if (baseClass == DataUse.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == DataUse.class) {
+			switch (baseOperationID) {
 				case tdlPackage.DATA_USE___RESOLVE_DATA_TYPE: return tdlPackage.ANY_VALUE___RESOLVE_DATA_TYPE;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
 		}
-		if (baseClass == SpecialValueUse.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == SpecialValueUse.class) {
+			switch (baseOperationID) {
 				case tdlPackage.SPECIAL_VALUE_USE___RESOLVE_DATA_TYPE: return tdlPackage.ANY_VALUE___RESOLVE_DATA_TYPE;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
@@ -242,8 +366,7 @@ public class AnyValueImpl extends SpecialValueUseImpl implements AnyValue
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.ANY_VALUE___RESOLVE_DATA_TYPE:
 				return resolveDataType();
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/AssertionImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/AssertionImpl.java
index 37ba40f932b39375ed8237e43d5be16fa484ed15..5b7910a5a299940a17c20dceef7cec949f89ef39 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/AssertionImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/AssertionImpl.java
@@ -91,8 +91,7 @@ public class AssertionImpl extends ActionBehaviourImpl implements Assertion
 	{
 		DataUse oldOtherwise = otherwise;
 		otherwise = newOtherwise;
-		if (eNotificationRequired())
-		{
+		if (eNotificationRequired()) {
 			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, tdlPackage.ASSERTION__OTHERWISE, oldOtherwise, newOtherwise);
 			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
@@ -107,8 +106,7 @@ public class AssertionImpl extends ActionBehaviourImpl implements Assertion
 	@Override
 	public void setOtherwise(DataUse newOtherwise)
 	{
-		if (newOtherwise != otherwise)
-		{
+		if (newOtherwise != otherwise) {
 			NotificationChain msgs = null;
 			if (otherwise != null)
 				msgs = ((InternalEObject)otherwise).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - tdlPackage.ASSERTION__OTHERWISE, null, msgs);
@@ -141,8 +139,7 @@ public class AssertionImpl extends ActionBehaviourImpl implements Assertion
 	{
 		DataUse oldCondition = condition;
 		condition = newCondition;
-		if (eNotificationRequired())
-		{
+		if (eNotificationRequired()) {
 			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, tdlPackage.ASSERTION__CONDITION, oldCondition, newCondition);
 			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
@@ -157,8 +154,7 @@ public class AssertionImpl extends ActionBehaviourImpl implements Assertion
 	@Override
 	public void setCondition(DataUse newCondition)
 	{
-		if (newCondition != condition)
-		{
+		if (newCondition != condition) {
 			NotificationChain msgs = null;
 			if (condition != null)
 				msgs = ((InternalEObject)condition).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - tdlPackage.ASSERTION__CONDITION, null, msgs);
@@ -179,8 +175,7 @@ public class AssertionImpl extends ActionBehaviourImpl implements Assertion
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ASSERTION__OTHERWISE:
 				return basicSetOtherwise(null, msgs);
 			case tdlPackage.ASSERTION__CONDITION:
@@ -197,8 +192,7 @@ public class AssertionImpl extends ActionBehaviourImpl implements Assertion
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ASSERTION__OTHERWISE:
 				return getOtherwise();
 			case tdlPackage.ASSERTION__CONDITION:
@@ -215,8 +209,7 @@ public class AssertionImpl extends ActionBehaviourImpl implements Assertion
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ASSERTION__OTHERWISE:
 				setOtherwise((DataUse)newValue);
 				return;
@@ -235,8 +228,7 @@ public class AssertionImpl extends ActionBehaviourImpl implements Assertion
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ASSERTION__OTHERWISE:
 				setOtherwise((DataUse)null);
 				return;
@@ -255,8 +247,7 @@ public class AssertionImpl extends ActionBehaviourImpl implements Assertion
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ASSERTION__OTHERWISE:
 				return otherwise != null;
 			case tdlPackage.ASSERTION__CONDITION:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/AssignmentImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/AssignmentImpl.java
index 4d9908183f6522939c95d381681f3459cf00b0b6..ee17f452ebf6cd5b0fb673b44c174f90cb70205d 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/AssignmentImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/AssignmentImpl.java
@@ -4,25 +4,42 @@ package org.etsi.mts.tdl.impl;
 
 import java.lang.reflect.InvocationTargetException;
 
+import java.util.Iterator;
+import java.util.List;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.ids.IdResolver.IdResolverExtension;
+import org.eclipse.ocl.pivot.library.collection.CollectionAsOrderedSetOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsSetOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsTypeOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclIsKindOfOperation;
+import org.eclipse.ocl.pivot.messages.PivotMessages;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
+import org.eclipse.ocl.pivot.values.OrderedSetValue;
+import org.eclipse.ocl.pivot.values.SetValue;
 import org.etsi.mts.tdl.Assignment;
 import org.etsi.mts.tdl.AtomicBehaviour;
 import org.etsi.mts.tdl.Behaviour;
+import org.etsi.mts.tdl.Block;
 import org.etsi.mts.tdl.ComponentInstance;
 import org.etsi.mts.tdl.DataUse;
+import org.etsi.mts.tdl.Element;
+import org.etsi.mts.tdl.TestConfiguration;
+import org.etsi.mts.tdl.TestDescription;
 import org.etsi.mts.tdl.VariableUse;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -101,8 +118,7 @@ public class AssignmentImpl extends AtomicBehaviourImpl implements Assignment
 	{
 		VariableUse oldVariable = variable;
 		variable = newVariable;
-		if (eNotificationRequired())
-		{
+		if (eNotificationRequired()) {
 			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, tdlPackage.ASSIGNMENT__VARIABLE, oldVariable, newVariable);
 			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
@@ -117,8 +133,7 @@ public class AssignmentImpl extends AtomicBehaviourImpl implements Assignment
 	@Override
 	public void setVariable(VariableUse newVariable)
 	{
-		if (newVariable != variable)
-		{
+		if (newVariable != variable) {
 			NotificationChain msgs = null;
 			if (variable != null)
 				msgs = ((InternalEObject)variable).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - tdlPackage.ASSIGNMENT__VARIABLE, null, msgs);
@@ -151,8 +166,7 @@ public class AssignmentImpl extends AtomicBehaviourImpl implements Assignment
 	{
 		DataUse oldExpression = expression;
 		expression = newExpression;
-		if (eNotificationRequired())
-		{
+		if (eNotificationRequired()) {
 			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, tdlPackage.ASSIGNMENT__EXPRESSION, oldExpression, newExpression);
 			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
@@ -167,8 +181,7 @@ public class AssignmentImpl extends AtomicBehaviourImpl implements Assignment
 	@Override
 	public void setExpression(DataUse newExpression)
 	{
-		if (newExpression != expression)
-		{
+		if (newExpression != expression) {
 			NotificationChain msgs = null;
 			if (expression != null)
 				msgs = ((InternalEObject)expression).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - tdlPackage.ASSIGNMENT__EXPRESSION, null, msgs);
@@ -181,16 +194,6 @@ public class AssignmentImpl extends AtomicBehaviourImpl implements Assignment
 			eNotify(new ENotificationImpl(this, Notification.SET, tdlPackage.ASSIGNMENT__EXPRESSION, newExpression, newExpression));
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #getParticipatingComponents() <em>Get Participating Components</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getParticipatingComponents()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate GET_PARTICIPATING_COMPONENTS__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.ASSIGNMENT___GET_PARTICIPATING_COMPONENTS).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -200,14 +203,115 @@ public class AssignmentImpl extends AtomicBehaviourImpl implements Assignment
 	@Override
 	public EList<ComponentInstance> getParticipatingComponents()
 	{
-		try
-		{
-			return (EList<ComponentInstance>)GET_PARTICIPATING_COMPONENTS__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if
+		 *   self.getParentTestDescription()
+		 *   ->exists(td | td.isLocallyOrdered) and
+		 *   self.container()
+		 *   .oclIsKindOf(Block)
+		 * then
+		 *   if not self.variable.componentInstance.oclIsUndefined()
+		 *   then OrderedSet{self.variable.componentInstance}
+		 *   else
+		 *     self.container()
+		 *     .oclAsType(Block)
+		 *     .getParticipatingComponentsExcluding(self)
+		 *     ->asOrderedSet()
+		 *   endif
+		 * else
+		 *   self.getParentTestDescription()
+		 *   .testConfiguration.componentInstance->asOrderedSet()
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_Block_0 = idResolver.getClass(tdlTables.CLSSid_Block, null);
+		final /*@NonInvalid*/ Element container = this.container();
+		final /*@NonInvalid*/ TestDescription getParentTestDescription_0 = this.getParentTestDescription();
+		final /*@NonInvalid*/ SetValue oclAsSet = OclAnyOclAsSetOperation.INSTANCE.evaluate(executor, tdlTables.SET_CLSSid_TestDescription, getParentTestDescription_0);
+		/*@Thrown*/ Object accumulator = ValueUtil.FALSE_VALUE;
+		Iterator<Object> ITERATOR_td = oclAsSet.iterator();
+		/*@NonInvalid*/ Boolean exists;
+		while (true) {
+			if (!ITERATOR_td.hasNext()) {
+				if (accumulator == ValueUtil.FALSE_VALUE) {
+					exists = ValueUtil.FALSE_VALUE;
+				}
+				else {
+					throw (InvalidValueException)accumulator;
+				}
+				break;
+			}
+			/*@NonInvalid*/ TestDescription td = (TestDescription)ITERATOR_td.next();
+			/**
+			 * td.isLocallyOrdered
+			 */
+			final /*@NonInvalid*/ boolean isLocallyOrdered = td.isIsLocallyOrdered();
+			//
+			if (isLocallyOrdered) {					// Normal successful body evaluation result
+				exists = ValueUtil.TRUE_VALUE;
+				break;														// Stop immediately
+			}
+			else if (!isLocallyOrdered) {				// Normal unsuccessful body evaluation result
+				;															// Carry on
+			}
+			else {															// Impossible badly typed result
+				accumulator = new InvalidValueException(PivotMessages.NonBooleanBody, "exists");
+			}
+		}
+		final /*@Thrown*/ Boolean and;
+		if (exists == ValueUtil.FALSE_VALUE) {
+			and = ValueUtil.FALSE_VALUE;
+		}
+		else {
+			final /*@NonInvalid*/ boolean oclIsKindOf = OclAnyOclIsKindOfOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_Block_0).booleanValue();
+			if (!oclIsKindOf) {
+				and = ValueUtil.FALSE_VALUE;
+			}
+			else {
+				if (exists == null) {
+					and = null;
+				}
+				else {
+					and = ValueUtil.TRUE_VALUE;
+				}
+			}
+		}
+		if (and == null) {
+			throw new InvalidValueException("Null if condition");
+		}
+		/*@Thrown*/ OrderedSetValue local_1;
+		if (and) {
+			final /*@NonInvalid*/ Boolean not = ValueUtil.TRUE_VALUE;
+			if (not == null) {
+				throw new InvalidValueException("Null if condition");
+			}
+			/*@Thrown*/ OrderedSetValue local_0;
+			if (not) {
+				final /*@NonInvalid*/ VariableUse variable = this.getVariable();
+				final /*@NonInvalid*/ ComponentInstance componentInstance = variable.getComponentInstance();
+				final /*@NonInvalid*/ OrderedSetValue OrderedSet = ValueUtil.createOrderedSetOfEach(tdlTables.ORD_CLSSid_ComponentInstance, componentInstance);
+				local_0 = OrderedSet;
+			}
+			else {
+				final /*@Thrown*/ Block oclAsType = (Block)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_Block_0);
+				final /*@Thrown*/ List<ComponentInstance> getParticipatingComponentsExcluding = oclAsType.getParticipatingComponentsExcluding(this);
+				final /*@Thrown*/ OrderedSetValue BOXED_getParticipatingComponentsExcluding = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_ComponentInstance, getParticipatingComponentsExcluding);
+				final /*@Thrown*/ OrderedSetValue asOrderedSet = CollectionAsOrderedSetOperation.INSTANCE.evaluate(BOXED_getParticipatingComponentsExcluding);
+				local_0 = asOrderedSet;
+			}
+			local_1 = local_0;
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		else {
+			final /*@NonInvalid*/ TestConfiguration testConfiguration = getParentTestDescription_0.getTestConfiguration();
+			final /*@NonInvalid*/ List<ComponentInstance> componentInstance_0 = testConfiguration.getComponentInstance();
+			final /*@NonInvalid*/ SetValue BOXED_componentInstance_0 = idResolver.createSetOfAll(tdlTables.SET_CLSSid_ComponentInstance, componentInstance_0);
+			final /*@NonInvalid*/ OrderedSetValue asOrderedSet_0 = CollectionAsOrderedSetOperation.INSTANCE.evaluate(BOXED_componentInstance_0);
+			local_1 = asOrderedSet_0;
 		}
+		final /*@Thrown*/ List<ComponentInstance> ECORE_local_1 = ((IdResolverExtension)idResolver).ecoreValueOfAll(ComponentInstance.class, local_1);
+		return (EList<ComponentInstance>)ECORE_local_1;
 	}
 
 	/**
@@ -218,8 +322,7 @@ public class AssignmentImpl extends AtomicBehaviourImpl implements Assignment
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ASSIGNMENT__VARIABLE:
 				return basicSetVariable(null, msgs);
 			case tdlPackage.ASSIGNMENT__EXPRESSION:
@@ -236,8 +339,7 @@ public class AssignmentImpl extends AtomicBehaviourImpl implements Assignment
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ASSIGNMENT__VARIABLE:
 				return getVariable();
 			case tdlPackage.ASSIGNMENT__EXPRESSION:
@@ -254,8 +356,7 @@ public class AssignmentImpl extends AtomicBehaviourImpl implements Assignment
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ASSIGNMENT__VARIABLE:
 				setVariable((VariableUse)newValue);
 				return;
@@ -274,8 +375,7 @@ public class AssignmentImpl extends AtomicBehaviourImpl implements Assignment
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ASSIGNMENT__VARIABLE:
 				setVariable((VariableUse)null);
 				return;
@@ -294,8 +394,7 @@ public class AssignmentImpl extends AtomicBehaviourImpl implements Assignment
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ASSIGNMENT__VARIABLE:
 				return variable != null;
 			case tdlPackage.ASSIGNMENT__EXPRESSION:
@@ -312,18 +411,14 @@ public class AssignmentImpl extends AtomicBehaviourImpl implements Assignment
 	@Override
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass)
 	{
-		if (baseClass == Behaviour.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == Behaviour.class) {
+			switch (baseOperationID) {
 				case tdlPackage.BEHAVIOUR___GET_PARTICIPATING_COMPONENTS: return tdlPackage.ASSIGNMENT___GET_PARTICIPATING_COMPONENTS;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
 		}
-		if (baseClass == AtomicBehaviour.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == AtomicBehaviour.class) {
+			switch (baseOperationID) {
 				case tdlPackage.ATOMIC_BEHAVIOUR___GET_PARTICIPATING_COMPONENTS: return tdlPackage.ASSIGNMENT___GET_PARTICIPATING_COMPONENTS;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
@@ -339,8 +434,7 @@ public class AssignmentImpl extends AtomicBehaviourImpl implements Assignment
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.ASSIGNMENT___GET_PARTICIPATING_COMPONENTS:
 				return getParticipatingComponents();
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/AtomicBehaviourImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/AtomicBehaviourImpl.java
index 661d8d9512d7fd3a7fcc501622ee9c4642b90ba7..e41b9c14b9227d874a899b49b09cbdfa6515a0fe 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/AtomicBehaviourImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/AtomicBehaviourImpl.java
@@ -6,14 +6,13 @@ import java.lang.reflect.InvocationTargetException;
 
 import java.util.Collection;
 
+import java.util.Iterator;
+import java.util.List;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
@@ -21,12 +20,30 @@ import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.ids.IdResolver.IdResolverExtension;
+import org.eclipse.ocl.pivot.library.collection.CollectionAsOrderedSetOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsSetOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsTypeOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclIsKindOfOperation;
+import org.eclipse.ocl.pivot.messages.PivotMessages;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
+import org.eclipse.ocl.pivot.values.OrderedSetValue;
+import org.eclipse.ocl.pivot.values.SetValue;
 import org.etsi.mts.tdl.AtomicBehaviour;
 import org.etsi.mts.tdl.Behaviour;
+import org.etsi.mts.tdl.Block;
 import org.etsi.mts.tdl.ComponentInstance;
+import org.etsi.mts.tdl.Element;
+import org.etsi.mts.tdl.TestConfiguration;
+import org.etsi.mts.tdl.TestDescription;
 import org.etsi.mts.tdl.TimeConstraint;
 import org.etsi.mts.tdl.TimeLabel;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -93,8 +110,7 @@ public abstract class AtomicBehaviourImpl extends BehaviourImpl implements Atomi
 	@Override
 	public EList<TimeConstraint> getTimeConstraint()
 	{
-		if (timeConstraint == null)
-		{
+		if (timeConstraint == null) {
 			timeConstraint = new EObjectContainmentEList<TimeConstraint>(TimeConstraint.class, this, tdlPackage.ATOMIC_BEHAVIOUR__TIME_CONSTRAINT);
 		}
 		return timeConstraint;
@@ -120,8 +136,7 @@ public abstract class AtomicBehaviourImpl extends BehaviourImpl implements Atomi
 	{
 		TimeLabel oldTimeLabel = timeLabel;
 		timeLabel = newTimeLabel;
-		if (eNotificationRequired())
-		{
+		if (eNotificationRequired()) {
 			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, tdlPackage.ATOMIC_BEHAVIOUR__TIME_LABEL, oldTimeLabel, newTimeLabel);
 			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
@@ -136,8 +151,7 @@ public abstract class AtomicBehaviourImpl extends BehaviourImpl implements Atomi
 	@Override
 	public void setTimeLabel(TimeLabel newTimeLabel)
 	{
-		if (newTimeLabel != timeLabel)
-		{
+		if (newTimeLabel != timeLabel) {
 			NotificationChain msgs = null;
 			if (timeLabel != null)
 				msgs = ((InternalEObject)timeLabel).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - tdlPackage.ATOMIC_BEHAVIOUR__TIME_LABEL, null, msgs);
@@ -150,16 +164,6 @@ public abstract class AtomicBehaviourImpl extends BehaviourImpl implements Atomi
 			eNotify(new ENotificationImpl(this, Notification.SET, tdlPackage.ATOMIC_BEHAVIOUR__TIME_LABEL, newTimeLabel, newTimeLabel));
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #getParticipatingComponents() <em>Get Participating Components</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getParticipatingComponents()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate GET_PARTICIPATING_COMPONENTS__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.ATOMIC_BEHAVIOUR___GET_PARTICIPATING_COMPONENTS).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -169,14 +173,97 @@ public abstract class AtomicBehaviourImpl extends BehaviourImpl implements Atomi
 	@Override
 	public EList<ComponentInstance> getParticipatingComponents()
 	{
-		try
-		{
-			return (EList<ComponentInstance>)GET_PARTICIPATING_COMPONENTS__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if
+		 *   self.getParentTestDescription()
+		 *   ->exists(td | td.isLocallyOrdered) and
+		 *   self.container()
+		 *   .oclIsKindOf(Block)
+		 * then
+		 *   self.container()
+		 *   .oclAsType(Block)
+		 *   .getParticipatingComponentsExcluding(self)
+		 *   ->asOrderedSet()
+		 * else
+		 *   self.getParentTestDescription()
+		 *   .testConfiguration.componentInstance->asOrderedSet()
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_Block_0 = idResolver.getClass(tdlTables.CLSSid_Block, null);
+		final /*@NonInvalid*/ Element container = this.container();
+		final /*@NonInvalid*/ TestDescription getParentTestDescription_0 = this.getParentTestDescription();
+		final /*@NonInvalid*/ SetValue oclAsSet = OclAnyOclAsSetOperation.INSTANCE.evaluate(executor, tdlTables.SET_CLSSid_TestDescription, getParentTestDescription_0);
+		/*@Thrown*/ Object accumulator = ValueUtil.FALSE_VALUE;
+		Iterator<Object> ITERATOR_td = oclAsSet.iterator();
+		/*@NonInvalid*/ Boolean exists;
+		while (true) {
+			if (!ITERATOR_td.hasNext()) {
+				if (accumulator == ValueUtil.FALSE_VALUE) {
+					exists = ValueUtil.FALSE_VALUE;
+				}
+				else {
+					throw (InvalidValueException)accumulator;
+				}
+				break;
+			}
+			/*@NonInvalid*/ TestDescription td = (TestDescription)ITERATOR_td.next();
+			/**
+			 * td.isLocallyOrdered
+			 */
+			final /*@NonInvalid*/ boolean isLocallyOrdered = td.isIsLocallyOrdered();
+			//
+			if (isLocallyOrdered) {					// Normal successful body evaluation result
+				exists = ValueUtil.TRUE_VALUE;
+				break;														// Stop immediately
+			}
+			else if (!isLocallyOrdered) {				// Normal unsuccessful body evaluation result
+				;															// Carry on
+			}
+			else {															// Impossible badly typed result
+				accumulator = new InvalidValueException(PivotMessages.NonBooleanBody, "exists");
+			}
+		}
+		final /*@Thrown*/ Boolean and;
+		if (exists == ValueUtil.FALSE_VALUE) {
+			and = ValueUtil.FALSE_VALUE;
+		}
+		else {
+			final /*@NonInvalid*/ boolean oclIsKindOf = OclAnyOclIsKindOfOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_Block_0).booleanValue();
+			if (!oclIsKindOf) {
+				and = ValueUtil.FALSE_VALUE;
+			}
+			else {
+				if (exists == null) {
+					and = null;
+				}
+				else {
+					and = ValueUtil.TRUE_VALUE;
+				}
+			}
+		}
+		if (and == null) {
+			throw new InvalidValueException("Null if condition");
+		}
+		/*@Thrown*/ OrderedSetValue local_0;
+		if (and) {
+			final /*@Thrown*/ Block oclAsType = (Block)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_Block_0);
+			final /*@Thrown*/ List<ComponentInstance> getParticipatingComponentsExcluding = oclAsType.getParticipatingComponentsExcluding(this);
+			final /*@Thrown*/ OrderedSetValue BOXED_getParticipatingComponentsExcluding = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_ComponentInstance, getParticipatingComponentsExcluding);
+			final /*@Thrown*/ OrderedSetValue asOrderedSet = CollectionAsOrderedSetOperation.INSTANCE.evaluate(BOXED_getParticipatingComponentsExcluding);
+			local_0 = asOrderedSet;
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		else {
+			final /*@NonInvalid*/ TestConfiguration testConfiguration = getParentTestDescription_0.getTestConfiguration();
+			final /*@NonInvalid*/ List<ComponentInstance> componentInstance = testConfiguration.getComponentInstance();
+			final /*@NonInvalid*/ SetValue BOXED_componentInstance = idResolver.createSetOfAll(tdlTables.SET_CLSSid_ComponentInstance, componentInstance);
+			final /*@NonInvalid*/ OrderedSetValue asOrderedSet_0 = CollectionAsOrderedSetOperation.INSTANCE.evaluate(BOXED_componentInstance);
+			local_0 = asOrderedSet_0;
 		}
+		final /*@Thrown*/ List<ComponentInstance> ECORE_local_0 = ((IdResolverExtension)idResolver).ecoreValueOfAll(ComponentInstance.class, local_0);
+		return (EList<ComponentInstance>)ECORE_local_0;
 	}
 
 	/**
@@ -187,8 +274,7 @@ public abstract class AtomicBehaviourImpl extends BehaviourImpl implements Atomi
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ATOMIC_BEHAVIOUR__TIME_CONSTRAINT:
 				return ((InternalEList<?>)getTimeConstraint()).basicRemove(otherEnd, msgs);
 			case tdlPackage.ATOMIC_BEHAVIOUR__TIME_LABEL:
@@ -205,8 +291,7 @@ public abstract class AtomicBehaviourImpl extends BehaviourImpl implements Atomi
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ATOMIC_BEHAVIOUR__TIME_CONSTRAINT:
 				return getTimeConstraint();
 			case tdlPackage.ATOMIC_BEHAVIOUR__TIME_LABEL:
@@ -224,8 +309,7 @@ public abstract class AtomicBehaviourImpl extends BehaviourImpl implements Atomi
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ATOMIC_BEHAVIOUR__TIME_CONSTRAINT:
 				getTimeConstraint().clear();
 				getTimeConstraint().addAll((Collection<? extends TimeConstraint>)newValue);
@@ -245,8 +329,7 @@ public abstract class AtomicBehaviourImpl extends BehaviourImpl implements Atomi
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ATOMIC_BEHAVIOUR__TIME_CONSTRAINT:
 				getTimeConstraint().clear();
 				return;
@@ -265,8 +348,7 @@ public abstract class AtomicBehaviourImpl extends BehaviourImpl implements Atomi
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ATOMIC_BEHAVIOUR__TIME_CONSTRAINT:
 				return timeConstraint != null && !timeConstraint.isEmpty();
 			case tdlPackage.ATOMIC_BEHAVIOUR__TIME_LABEL:
@@ -283,10 +365,8 @@ public abstract class AtomicBehaviourImpl extends BehaviourImpl implements Atomi
 	@Override
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass)
 	{
-		if (baseClass == Behaviour.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == Behaviour.class) {
+			switch (baseOperationID) {
 				case tdlPackage.BEHAVIOUR___GET_PARTICIPATING_COMPONENTS: return tdlPackage.ATOMIC_BEHAVIOUR___GET_PARTICIPATING_COMPONENTS;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
@@ -302,8 +382,7 @@ public abstract class AtomicBehaviourImpl extends BehaviourImpl implements Atomi
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.ATOMIC_BEHAVIOUR___GET_PARTICIPATING_COMPONENTS:
 				return getParticipatingComponents();
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/BehaviourDescriptionImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/BehaviourDescriptionImpl.java
index d96be42974a01fa86eb2f90f7610e6b613914497..32bc0bf4c2e7ed72faa7a2df450d990eb0db5c40 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/BehaviourDescriptionImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/BehaviourDescriptionImpl.java
@@ -80,8 +80,7 @@ public class BehaviourDescriptionImpl extends ElementImpl implements BehaviourDe
 	{
 		Behaviour oldBehaviour = behaviour;
 		behaviour = newBehaviour;
-		if (eNotificationRequired())
-		{
+		if (eNotificationRequired()) {
 			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, tdlPackage.BEHAVIOUR_DESCRIPTION__BEHAVIOUR, oldBehaviour, newBehaviour);
 			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
@@ -96,8 +95,7 @@ public class BehaviourDescriptionImpl extends ElementImpl implements BehaviourDe
 	@Override
 	public void setBehaviour(Behaviour newBehaviour)
 	{
-		if (newBehaviour != behaviour)
-		{
+		if (newBehaviour != behaviour) {
 			NotificationChain msgs = null;
 			if (behaviour != null)
 				msgs = ((InternalEObject)behaviour).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - tdlPackage.BEHAVIOUR_DESCRIPTION__BEHAVIOUR, null, msgs);
@@ -118,8 +116,7 @@ public class BehaviourDescriptionImpl extends ElementImpl implements BehaviourDe
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.BEHAVIOUR_DESCRIPTION__BEHAVIOUR:
 				return basicSetBehaviour(null, msgs);
 		}
@@ -134,8 +131,7 @@ public class BehaviourDescriptionImpl extends ElementImpl implements BehaviourDe
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.BEHAVIOUR_DESCRIPTION__BEHAVIOUR:
 				return getBehaviour();
 		}
@@ -150,8 +146,7 @@ public class BehaviourDescriptionImpl extends ElementImpl implements BehaviourDe
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.BEHAVIOUR_DESCRIPTION__BEHAVIOUR:
 				setBehaviour((Behaviour)newValue);
 				return;
@@ -167,8 +162,7 @@ public class BehaviourDescriptionImpl extends ElementImpl implements BehaviourDe
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.BEHAVIOUR_DESCRIPTION__BEHAVIOUR:
 				setBehaviour((Behaviour)null);
 				return;
@@ -184,8 +178,7 @@ public class BehaviourDescriptionImpl extends ElementImpl implements BehaviourDe
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.BEHAVIOUR_DESCRIPTION__BEHAVIOUR:
 				return behaviour != null;
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/BehaviourImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/BehaviourImpl.java
index 6601954f6f4ce98818fd31950c0c6d2e623f597b..e91efb821713a9deca5cc892c6513e0e1c73a4e3 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/BehaviourImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/BehaviourImpl.java
@@ -6,18 +6,38 @@ import java.lang.reflect.InvocationTargetException;
 
 import java.util.Collection;
 
+import java.util.Iterator;
+import java.util.List;
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
-
 import org.eclipse.emf.ecore.util.EObjectResolvingEList;
 
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.EnumerationLiteralId;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.ids.IdResolver.IdResolverExtension;
+import org.eclipse.ocl.pivot.library.collection.CollectionAsOrderedSetOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsSetOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsTypeOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclIsKindOfOperation;
+import org.eclipse.ocl.pivot.messages.PivotMessages;
+import org.eclipse.ocl.pivot.utilities.ClassUtil;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
+import org.eclipse.ocl.pivot.values.OrderedSetValue;
+import org.eclipse.ocl.pivot.values.SetValue;
 import org.etsi.mts.tdl.Behaviour;
 import org.etsi.mts.tdl.ComponentInstance;
+import org.etsi.mts.tdl.ComponentInstanceRole;
+import org.etsi.mts.tdl.GateReference;
+import org.etsi.mts.tdl.Interaction;
+import org.etsi.mts.tdl.Target;
+import org.etsi.mts.tdl.TestConfiguration;
+import org.etsi.mts.tdl.TestDescription;
 import org.etsi.mts.tdl.TestObjective;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -73,23 +93,12 @@ public abstract class BehaviourImpl extends ElementImpl implements Behaviour
 	@Override
 	public EList<TestObjective> getTestObjective()
 	{
-		if (testObjective == null)
-		{
+		if (testObjective == null) {
 			testObjective = new EObjectResolvingEList<TestObjective>(TestObjective.class, this, tdlPackage.BEHAVIOUR__TEST_OBJECTIVE);
 		}
 		return testObjective;
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #isTesterInputEvent() <em>Is Tester Input Event</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isTesterInputEvent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate IS_TESTER_INPUT_EVENT__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.BEHAVIOUR___IS_TESTER_INPUT_EVENT).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -98,26 +107,182 @@ public abstract class BehaviourImpl extends ElementImpl implements Behaviour
 	@Override
 	public Boolean isTesterInputEvent()
 	{
-		try
-		{
-			return (Boolean)IS_TESTER_INPUT_EVENT__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if
+		 *   self.oclIsKindOf(TimeOut) or
+		 *   self.oclIsKindOf(Quiescence) or
+		 *   self.oclIsKindOf(Interaction) and
+		 *   self.oclAsType(Interaction).sourceGate.component.role = ComponentInstanceRole::SUT and
+		 *   self.oclAsType(Interaction)
+		 *   .target->exists(t | t.targetGate.component.role = ComponentInstanceRole::Tester)
+		 * then true
+		 * else false
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_Quiescence_0 = idResolver.getClass(tdlTables.CLSSid_Quiescence, null);
+		final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_TimeOut_0 = idResolver.getClass(tdlTables.CLSSid_TimeOut, null);
+		final /*@NonInvalid*/ boolean oclIsKindOf = OclAnyOclIsKindOfOperation.INSTANCE.evaluate(executor, this, TYP_tdl_c_c_TimeOut_0).booleanValue();
+		final /*@NonInvalid*/ Boolean or;
+		if (oclIsKindOf) {
+			or = ValueUtil.TRUE_VALUE;
+		}
+		else {
+			final /*@NonInvalid*/ boolean oclIsKindOf_0 = OclAnyOclIsKindOfOperation.INSTANCE.evaluate(executor, this, TYP_tdl_c_c_Quiescence_0).booleanValue();
+			if (oclIsKindOf_0) {
+				or = ValueUtil.TRUE_VALUE;
+			}
+			else {
+				or = ValueUtil.FALSE_VALUE;
+			}
+		}
+		final /*@Thrown*/ Boolean or_0;
+		if (or == ValueUtil.TRUE_VALUE) {
+			or_0 = ValueUtil.TRUE_VALUE;
+		}
+		else {
+			/*@Caught*/ Object CAUGHT_and_0;
+			try {
+				/*@Caught*/ Object CAUGHT_and;
+				try {
+					final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_Interaction_0 = idResolver.getClass(tdlTables.CLSSid_Interaction, null);
+					final /*@NonInvalid*/ boolean oclIsKindOf_1 = OclAnyOclIsKindOfOperation.INSTANCE.evaluate(executor, this, TYP_tdl_c_c_Interaction_0).booleanValue();
+					final /*@Thrown*/ Boolean and;
+					if (!oclIsKindOf_1) {
+						and = ValueUtil.FALSE_VALUE;
+					}
+					else {
+						/*@Caught*/ Object CAUGHT_eq;
+						try {
+							final /*@Thrown*/ Interaction oclAsType = (Interaction)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, this, TYP_tdl_c_c_Interaction_0);
+							final /*@Thrown*/ GateReference sourceGate = oclAsType.getSourceGate();
+							final /*@Thrown*/ ComponentInstance component = sourceGate.getComponent();
+							final /*@Thrown*/ ComponentInstanceRole role = component.getRole();
+							final /*@Thrown*/ EnumerationLiteralId BOXED_role = tdlTables.ENUMid_ComponentInstanceRole.getEnumerationLiteralId(ClassUtil.nonNullState(role.getName()));
+							final /*@Thrown*/ boolean eq = BOXED_role == tdlTables.ELITid_SUT;
+							CAUGHT_eq = eq;
+						}
+						catch (Exception e) {
+							CAUGHT_eq = ValueUtil.createInvalidValue(e);
+						}
+						if (CAUGHT_eq == ValueUtil.FALSE_VALUE) {
+							and = ValueUtil.FALSE_VALUE;
+						}
+						else {
+							if (CAUGHT_eq instanceof InvalidValueException) {
+								throw (InvalidValueException)CAUGHT_eq;
+							}
+							and = ValueUtil.TRUE_VALUE;
+						}
+					}
+					CAUGHT_and = and;
+				}
+				catch (Exception e) {
+					CAUGHT_and = ValueUtil.createInvalidValue(e);
+				}
+				final /*@Thrown*/ Boolean and_0;
+				if (CAUGHT_and == ValueUtil.FALSE_VALUE) {
+					and_0 = ValueUtil.FALSE_VALUE;
+				}
+				else {
+					/*@Caught*/ Object CAUGHT_exists;
+					try {
+						final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_Interaction_2 = idResolver.getClass(tdlTables.CLSSid_Interaction, null);
+						final /*@Thrown*/ Interaction oclAsType_0 = (Interaction)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, this, TYP_tdl_c_c_Interaction_2);
+						final /*@Thrown*/ List<Target> target = oclAsType_0.getTarget();
+						final /*@Thrown*/ SetValue BOXED_target = idResolver.createSetOfAll(tdlTables.SET_CLSSid_Target, target);
+						/*@Thrown*/ Object accumulator = ValueUtil.FALSE_VALUE;
+						Iterator<Object> ITERATOR_t = BOXED_target.iterator();
+						/*@Thrown*/ Boolean exists;
+						while (true) {
+							if (!ITERATOR_t.hasNext()) {
+								if (accumulator == ValueUtil.FALSE_VALUE) {
+									exists = ValueUtil.FALSE_VALUE;
+								}
+								else {
+									throw (InvalidValueException)accumulator;
+								}
+								break;
+							}
+							/*@NonInvalid*/ Target t = (Target)ITERATOR_t.next();
+							/**
+							 * t.targetGate.component.role = ComponentInstanceRole::Tester
+							 */
+							final /*@NonInvalid*/ GateReference targetGate = t.getTargetGate();
+							final /*@NonInvalid*/ ComponentInstance component_0 = targetGate.getComponent();
+							final /*@NonInvalid*/ ComponentInstanceRole role_0 = component_0.getRole();
+							final /*@NonInvalid*/ EnumerationLiteralId BOXED_role_0 = tdlTables.ENUMid_ComponentInstanceRole.getEnumerationLiteralId(ClassUtil.nonNullState(role_0.getName()));
+							final /*@NonInvalid*/ boolean eq_0 = BOXED_role_0 == tdlTables.ELITid_Tester;
+							//
+							if (eq_0) {					// Normal successful body evaluation result
+								exists = ValueUtil.TRUE_VALUE;
+								break;														// Stop immediately
+							}
+							else if (!eq_0) {				// Normal unsuccessful body evaluation result
+								;															// Carry on
+							}
+							else {															// Impossible badly typed result
+								accumulator = new InvalidValueException(PivotMessages.NonBooleanBody, "exists");
+							}
+						}
+						CAUGHT_exists = exists;
+					}
+					catch (Exception e) {
+						CAUGHT_exists = ValueUtil.createInvalidValue(e);
+					}
+					if (CAUGHT_exists == ValueUtil.FALSE_VALUE) {
+						and_0 = ValueUtil.FALSE_VALUE;
+					}
+					else {
+						if (CAUGHT_and instanceof InvalidValueException) {
+							throw (InvalidValueException)CAUGHT_and;
+						}
+						if (CAUGHT_exists instanceof InvalidValueException) {
+							throw (InvalidValueException)CAUGHT_exists;
+						}
+						if ((CAUGHT_and == null) || (CAUGHT_exists == null)) {
+							and_0 = null;
+						}
+						else {
+							and_0 = ValueUtil.TRUE_VALUE;
+						}
+					}
+				}
+				CAUGHT_and_0 = and_0;
+			}
+			catch (Exception e) {
+				CAUGHT_and_0 = ValueUtil.createInvalidValue(e);
+			}
+			if (CAUGHT_and_0 == ValueUtil.TRUE_VALUE) {
+				or_0 = ValueUtil.TRUE_VALUE;
+			}
+			else {
+				if (CAUGHT_and_0 instanceof InvalidValueException) {
+					throw (InvalidValueException)CAUGHT_and_0;
+				}
+				if ((or == null) || (CAUGHT_and_0 == null)) {
+					or_0 = null;
+				}
+				else {
+					or_0 = ValueUtil.FALSE_VALUE;
+				}
+			}
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		if (or_0 == null) {
+			throw new InvalidValueException("Null if condition");
 		}
+		/*@NonInvalid*/ boolean local_0;
+		if (or_0) {
+			local_0 = true;
+		}
+		else {
+			local_0 = false;
+		}
+		return local_0;
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #getParticipatingComponents() <em>Get Participating Components</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getParticipatingComponents()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate GET_PARTICIPATING_COMPONENTS__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.BEHAVIOUR___GET_PARTICIPATING_COMPONENTS).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -127,14 +292,67 @@ public abstract class BehaviourImpl extends ElementImpl implements Behaviour
 	@Override
 	public EList<ComponentInstance> getParticipatingComponents()
 	{
-		try
-		{
-			return (EList<ComponentInstance>)GET_PARTICIPATING_COMPONENTS__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if
+		 *   self.getParentTestDescription()
+		 *   ->exists(td | td.isLocallyOrdered)
+		 * then OrderedSet{}
+		 * else
+		 *   self.getParentTestDescription()
+		 *   .testConfiguration.componentInstance->asOrderedSet()
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ TestDescription getParentTestDescription = this.getParentTestDescription();
+		final /*@NonInvalid*/ SetValue oclAsSet = OclAnyOclAsSetOperation.INSTANCE.evaluate(executor, tdlTables.SET_CLSSid_TestDescription, getParentTestDescription);
+		/*@Thrown*/ Object accumulator = ValueUtil.FALSE_VALUE;
+		Iterator<Object> ITERATOR_td = oclAsSet.iterator();
+		/*@NonInvalid*/ Boolean exists;
+		while (true) {
+			if (!ITERATOR_td.hasNext()) {
+				if (accumulator == ValueUtil.FALSE_VALUE) {
+					exists = ValueUtil.FALSE_VALUE;
+				}
+				else {
+					throw (InvalidValueException)accumulator;
+				}
+				break;
+			}
+			/*@NonInvalid*/ TestDescription td = (TestDescription)ITERATOR_td.next();
+			/**
+			 * td.isLocallyOrdered
+			 */
+			final /*@NonInvalid*/ boolean isLocallyOrdered = td.isIsLocallyOrdered();
+			//
+			if (isLocallyOrdered) {					// Normal successful body evaluation result
+				exists = ValueUtil.TRUE_VALUE;
+				break;														// Stop immediately
+			}
+			else if (!isLocallyOrdered) {				// Normal unsuccessful body evaluation result
+				;															// Carry on
+			}
+			else {															// Impossible badly typed result
+				accumulator = new InvalidValueException(PivotMessages.NonBooleanBody, "exists");
+			}
+		}
+		if (exists == null) {
+			throw new InvalidValueException("Null if condition");
+		}
+		/*@NonInvalid*/ OrderedSetValue local_0;
+		if (exists) {
+			local_0 = tdlTables.OrderedSet;
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		else {
+			final /*@NonInvalid*/ TestConfiguration testConfiguration = getParentTestDescription.getTestConfiguration();
+			final /*@NonInvalid*/ List<ComponentInstance> componentInstance = testConfiguration.getComponentInstance();
+			final /*@NonInvalid*/ SetValue BOXED_componentInstance = idResolver.createSetOfAll(tdlTables.SET_CLSSid_ComponentInstance, componentInstance);
+			final /*@NonInvalid*/ OrderedSetValue asOrderedSet = CollectionAsOrderedSetOperation.INSTANCE.evaluate(BOXED_componentInstance);
+			local_0 = asOrderedSet;
 		}
+		final /*@NonInvalid*/ List<ComponentInstance> ECORE_local_0 = ((IdResolverExtension)idResolver).ecoreValueOfAll(ComponentInstance.class, local_0);
+		return (EList<ComponentInstance>)ECORE_local_0;
 	}
 
 	/**
@@ -145,8 +363,7 @@ public abstract class BehaviourImpl extends ElementImpl implements Behaviour
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.BEHAVIOUR__TEST_OBJECTIVE:
 				return getTestObjective();
 		}
@@ -162,8 +379,7 @@ public abstract class BehaviourImpl extends ElementImpl implements Behaviour
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.BEHAVIOUR__TEST_OBJECTIVE:
 				getTestObjective().clear();
 				getTestObjective().addAll((Collection<? extends TestObjective>)newValue);
@@ -180,8 +396,7 @@ public abstract class BehaviourImpl extends ElementImpl implements Behaviour
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.BEHAVIOUR__TEST_OBJECTIVE:
 				getTestObjective().clear();
 				return;
@@ -197,8 +412,7 @@ public abstract class BehaviourImpl extends ElementImpl implements Behaviour
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.BEHAVIOUR__TEST_OBJECTIVE:
 				return testObjective != null && !testObjective.isEmpty();
 		}
@@ -213,8 +427,7 @@ public abstract class BehaviourImpl extends ElementImpl implements Behaviour
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.BEHAVIOUR___IS_TESTER_INPUT_EVENT:
 				return isTesterInputEvent();
 			case tdlPackage.BEHAVIOUR___GET_PARTICIPATING_COMPONENTS:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/BlockImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/BlockImpl.java
index b5f2185ee1e9e23f9661f3e44de551ad02649533..59503b3a1f249945c0d8eab039c215fe07ceb3a0 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/BlockImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/BlockImpl.java
@@ -6,24 +6,38 @@ import java.lang.reflect.InvocationTargetException;
 
 import java.util.Collection;
 
+import java.util.Iterator;
+import java.util.List;
 import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.common.util.BasicEList;
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.ids.IdResolver.IdResolverExtension;
+import org.eclipse.ocl.pivot.library.collection.CollectionAsOrderedSetOperation;
+import org.eclipse.ocl.pivot.library.collection.CollectionExcludingOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsSetOperation;
+import org.eclipse.ocl.pivot.messages.PivotMessages;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
+import org.eclipse.ocl.pivot.values.OrderedSetValue;
+import org.eclipse.ocl.pivot.values.SequenceValue;
+import org.eclipse.ocl.pivot.values.SequenceValue.Accumulator;
+import org.eclipse.ocl.pivot.values.SetValue;
 import org.etsi.mts.tdl.Behaviour;
 import org.etsi.mts.tdl.Block;
 import org.etsi.mts.tdl.ComponentInstance;
 import org.etsi.mts.tdl.LocalExpression;
+import org.etsi.mts.tdl.TestConfiguration;
+import org.etsi.mts.tdl.TestDescription;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -90,8 +104,7 @@ public class BlockImpl extends ElementImpl implements Block
 	@Override
 	public EList<Behaviour> getBehaviour()
 	{
-		if (behaviour == null)
-		{
+		if (behaviour == null) {
 			behaviour = new EObjectContainmentEList<Behaviour>(Behaviour.class, this, tdlPackage.BLOCK__BEHAVIOUR);
 		}
 		return behaviour;
@@ -105,23 +118,12 @@ public class BlockImpl extends ElementImpl implements Block
 	@Override
 	public EList<LocalExpression> getGuard()
 	{
-		if (guard == null)
-		{
+		if (guard == null) {
 			guard = new EObjectContainmentEList<LocalExpression>(LocalExpression.class, this, tdlPackage.BLOCK__GUARD);
 		}
 		return guard;
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #getParticipatingComponents() <em>Get Participating Components</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getParticipatingComponents()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate GET_PARTICIPATING_COMPONENTS__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.BLOCK___GET_PARTICIPATING_COMPONENTS).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -131,26 +133,91 @@ public class BlockImpl extends ElementImpl implements Block
 	@Override
 	public EList<ComponentInstance> getParticipatingComponents()
 	{
-		try
-		{
-			return (EList<ComponentInstance>)GET_PARTICIPATING_COMPONENTS__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if
+		 *   self.getParentTestDescription()
+		 *   ->exists(td | td.isLocallyOrdered)
+		 * then self.behaviour.getParticipatingComponents()->asOrderedSet()
+		 * else
+		 *   self.getParentTestDescription()
+		 *   .testConfiguration.componentInstance->asOrderedSet()
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ TestDescription getParentTestDescription = this.getParentTestDescription();
+		final /*@NonInvalid*/ SetValue oclAsSet = OclAnyOclAsSetOperation.INSTANCE.evaluate(executor, tdlTables.SET_CLSSid_TestDescription, getParentTestDescription);
+		/*@Thrown*/ Object accumulator = ValueUtil.FALSE_VALUE;
+		Iterator<Object> ITERATOR_td = oclAsSet.iterator();
+		/*@NonInvalid*/ Boolean exists;
+		while (true) {
+			if (!ITERATOR_td.hasNext()) {
+				if (accumulator == ValueUtil.FALSE_VALUE) {
+					exists = ValueUtil.FALSE_VALUE;
+				}
+				else {
+					throw (InvalidValueException)accumulator;
+				}
+				break;
+			}
+			/*@NonInvalid*/ TestDescription td = (TestDescription)ITERATOR_td.next();
+			/**
+			 * td.isLocallyOrdered
+			 */
+			final /*@NonInvalid*/ boolean isLocallyOrdered = td.isIsLocallyOrdered();
+			//
+			if (isLocallyOrdered) {					// Normal successful body evaluation result
+				exists = ValueUtil.TRUE_VALUE;
+				break;														// Stop immediately
+			}
+			else if (!isLocallyOrdered) {				// Normal unsuccessful body evaluation result
+				;															// Carry on
+			}
+			else {															// Impossible badly typed result
+				accumulator = new InvalidValueException(PivotMessages.NonBooleanBody, "exists");
+			}
+		}
+		if (exists == null) {
+			throw new InvalidValueException("Null if condition");
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		/*@NonInvalid*/ OrderedSetValue local_0;
+		if (exists) {
+			final /*@NonInvalid*/ List<Behaviour> behaviour = this.getBehaviour();
+			final /*@NonInvalid*/ OrderedSetValue BOXED_behaviour = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_Behaviour, behaviour);
+			/*@Thrown*/ Accumulator accumulator_0 = ValueUtil.createSequenceAccumulatorValue(tdlTables.SEQ_CLSSid_ComponentInstance);
+			Iterator<Object> ITERATOR__1 = BOXED_behaviour.iterator();
+			/*@NonInvalid*/ SequenceValue collect;
+			while (true) {
+				if (!ITERATOR__1.hasNext()) {
+					collect = accumulator_0;
+					break;
+				}
+				/*@NonInvalid*/ Behaviour _1 = (Behaviour)ITERATOR__1.next();
+				/**
+				 * getParticipatingComponents()
+				 */
+				final /*@NonInvalid*/ List<ComponentInstance> getParticipatingComponents = _1.getParticipatingComponents();
+				final /*@NonInvalid*/ OrderedSetValue BOXED_getParticipatingComponents = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_ComponentInstance, getParticipatingComponents);
+				//
+				for (Object value : BOXED_getParticipatingComponents.flatten().getElements()) {
+					accumulator_0.add(value);
+				}
+			}
+			final /*@NonInvalid*/ OrderedSetValue asOrderedSet = CollectionAsOrderedSetOperation.INSTANCE.evaluate(collect);
+			local_0 = asOrderedSet;
 		}
+		else {
+			final /*@NonInvalid*/ TestConfiguration testConfiguration = getParentTestDescription.getTestConfiguration();
+			final /*@NonInvalid*/ List<ComponentInstance> componentInstance = testConfiguration.getComponentInstance();
+			final /*@NonInvalid*/ SetValue BOXED_componentInstance = idResolver.createSetOfAll(tdlTables.SET_CLSSid_ComponentInstance, componentInstance);
+			final /*@NonInvalid*/ OrderedSetValue asOrderedSet_0 = CollectionAsOrderedSetOperation.INSTANCE.evaluate(BOXED_componentInstance);
+			local_0 = asOrderedSet_0;
+		}
+		final /*@NonInvalid*/ List<ComponentInstance> ECORE_local_0 = ((IdResolverExtension)idResolver).ecoreValueOfAll(ComponentInstance.class, local_0);
+		return (EList<ComponentInstance>)ECORE_local_0;
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #getParticipatingComponentsExcluding(org.etsi.mts.tdl.Behaviour) <em>Get Participating Components Excluding</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getParticipatingComponentsExcluding(org.etsi.mts.tdl.Behaviour)
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate GET_PARTICIPATING_COMPONENTS_EXCLUDING_BEHAVIOUR__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.BLOCK___GET_PARTICIPATING_COMPONENTS_EXCLUDING__BEHAVIOUR).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -158,16 +225,95 @@ public class BlockImpl extends ElementImpl implements Block
 	 */
 	@SuppressWarnings("unchecked")
 	@Override
-	public EList<ComponentInstance> getParticipatingComponentsExcluding(Behaviour excluded)
+	public EList<ComponentInstance> getParticipatingComponentsExcluding(final Behaviour excluded)
 	{
-		try
-		{
-			return (EList<ComponentInstance>)GET_PARTICIPATING_COMPONENTS_EXCLUDING_BEHAVIOUR__EINVOCATION_DELEGATE.dynamicInvoke(this, new BasicEList.UnmodifiableEList<Object>(1, new Object[]{excluded}));
+		/**
+		 *
+		 * if
+		 *   self.getParentTestDescription()
+		 *   ->exists(td | td.isLocallyOrdered)
+		 * then
+		 *   self.behaviour->excluding(excluded)
+		 *   .getParticipatingComponents()
+		 *   ->asOrderedSet()
+		 * else
+		 *   self.getParentTestDescription()
+		 *   .testConfiguration.componentInstance->asOrderedSet()
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ TestDescription getParentTestDescription = this.getParentTestDescription();
+		final /*@NonInvalid*/ SetValue oclAsSet = OclAnyOclAsSetOperation.INSTANCE.evaluate(executor, tdlTables.SET_CLSSid_TestDescription, getParentTestDescription);
+		/*@Thrown*/ Object accumulator = ValueUtil.FALSE_VALUE;
+		Iterator<Object> ITERATOR_td = oclAsSet.iterator();
+		/*@NonInvalid*/ Boolean exists;
+		while (true) {
+			if (!ITERATOR_td.hasNext()) {
+				if (accumulator == ValueUtil.FALSE_VALUE) {
+					exists = ValueUtil.FALSE_VALUE;
+				}
+				else {
+					throw (InvalidValueException)accumulator;
+				}
+				break;
+			}
+			/*@NonInvalid*/ TestDescription td = (TestDescription)ITERATOR_td.next();
+			/**
+			 * td.isLocallyOrdered
+			 */
+			final /*@NonInvalid*/ boolean isLocallyOrdered = td.isIsLocallyOrdered();
+			//
+			if (isLocallyOrdered) {					// Normal successful body evaluation result
+				exists = ValueUtil.TRUE_VALUE;
+				break;														// Stop immediately
+			}
+			else if (!isLocallyOrdered) {				// Normal unsuccessful body evaluation result
+				;															// Carry on
+			}
+			else {															// Impossible badly typed result
+				accumulator = new InvalidValueException(PivotMessages.NonBooleanBody, "exists");
+			}
+		}
+		if (exists == null) {
+			throw new InvalidValueException("Null if condition");
+		}
+		/*@Thrown*/ OrderedSetValue local_0;
+		if (exists) {
+			final /*@NonInvalid*/ List<Behaviour> behaviour = this.getBehaviour();
+			final /*@NonInvalid*/ OrderedSetValue BOXED_behaviour = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_Behaviour, behaviour);
+			final /*@Thrown*/ OrderedSetValue excluding = (OrderedSetValue)CollectionExcludingOperation.INSTANCE.evaluate(BOXED_behaviour, excluded);
+			/*@Thrown*/ Accumulator accumulator_0 = ValueUtil.createSequenceAccumulatorValue(tdlTables.SEQ_CLSSid_ComponentInstance);
+			Iterator<Object> ITERATOR__1 = excluding.iterator();
+			/*@Thrown*/ SequenceValue collect;
+			while (true) {
+				if (!ITERATOR__1.hasNext()) {
+					collect = accumulator_0;
+					break;
+				}
+				/*@NonInvalid*/ Behaviour _1 = (Behaviour)ITERATOR__1.next();
+				/**
+				 * getParticipatingComponents()
+				 */
+				final /*@NonInvalid*/ List<ComponentInstance> getParticipatingComponents = _1.getParticipatingComponents();
+				final /*@NonInvalid*/ OrderedSetValue BOXED_getParticipatingComponents = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_ComponentInstance, getParticipatingComponents);
+				//
+				for (Object value : BOXED_getParticipatingComponents.flatten().getElements()) {
+					accumulator_0.add(value);
+				}
+			}
+			final /*@Thrown*/ OrderedSetValue asOrderedSet = CollectionAsOrderedSetOperation.INSTANCE.evaluate(collect);
+			local_0 = asOrderedSet;
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		else {
+			final /*@NonInvalid*/ TestConfiguration testConfiguration = getParentTestDescription.getTestConfiguration();
+			final /*@NonInvalid*/ List<ComponentInstance> componentInstance = testConfiguration.getComponentInstance();
+			final /*@NonInvalid*/ SetValue BOXED_componentInstance = idResolver.createSetOfAll(tdlTables.SET_CLSSid_ComponentInstance, componentInstance);
+			final /*@NonInvalid*/ OrderedSetValue asOrderedSet_0 = CollectionAsOrderedSetOperation.INSTANCE.evaluate(BOXED_componentInstance);
+			local_0 = asOrderedSet_0;
 		}
+		final /*@Thrown*/ List<ComponentInstance> ECORE_local_0 = ((IdResolverExtension)idResolver).ecoreValueOfAll(ComponentInstance.class, local_0);
+		return (EList<ComponentInstance>)ECORE_local_0;
 	}
 
 	/**
@@ -178,8 +324,7 @@ public class BlockImpl extends ElementImpl implements Block
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.BLOCK__BEHAVIOUR:
 				return ((InternalEList<?>)getBehaviour()).basicRemove(otherEnd, msgs);
 			case tdlPackage.BLOCK__GUARD:
@@ -196,8 +341,7 @@ public class BlockImpl extends ElementImpl implements Block
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.BLOCK__BEHAVIOUR:
 				return getBehaviour();
 			case tdlPackage.BLOCK__GUARD:
@@ -215,8 +359,7 @@ public class BlockImpl extends ElementImpl implements Block
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.BLOCK__BEHAVIOUR:
 				getBehaviour().clear();
 				getBehaviour().addAll((Collection<? extends Behaviour>)newValue);
@@ -237,8 +380,7 @@ public class BlockImpl extends ElementImpl implements Block
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.BLOCK__BEHAVIOUR:
 				getBehaviour().clear();
 				return;
@@ -257,8 +399,7 @@ public class BlockImpl extends ElementImpl implements Block
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.BLOCK__BEHAVIOUR:
 				return behaviour != null && !behaviour.isEmpty();
 			case tdlPackage.BLOCK__GUARD:
@@ -275,8 +416,7 @@ public class BlockImpl extends ElementImpl implements Block
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.BLOCK___GET_PARTICIPATING_COMPONENTS:
 				return getParticipatingComponents();
 			case tdlPackage.BLOCK___GET_PARTICIPATING_COMPONENTS_EXCLUDING__BEHAVIOUR:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/BoundedLoopBehaviourImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/BoundedLoopBehaviourImpl.java
index 6b5b18c482980b476e8fbf2deba3cd205774bf4a..94cc82484c9886f02dc4a9aeee468092074f9040 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/BoundedLoopBehaviourImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/BoundedLoopBehaviourImpl.java
@@ -72,8 +72,7 @@ public class BoundedLoopBehaviourImpl extends SingleCombinedBehaviourImpl implem
 	@Override
 	public EList<LocalExpression> getNumIteration()
 	{
-		if (numIteration == null)
-		{
+		if (numIteration == null) {
 			numIteration = new EObjectContainmentEList<LocalExpression>(LocalExpression.class, this, tdlPackage.BOUNDED_LOOP_BEHAVIOUR__NUM_ITERATION);
 		}
 		return numIteration;
@@ -87,8 +86,7 @@ public class BoundedLoopBehaviourImpl extends SingleCombinedBehaviourImpl implem
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.BOUNDED_LOOP_BEHAVIOUR__NUM_ITERATION:
 				return ((InternalEList<?>)getNumIteration()).basicRemove(otherEnd, msgs);
 		}
@@ -103,8 +101,7 @@ public class BoundedLoopBehaviourImpl extends SingleCombinedBehaviourImpl implem
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.BOUNDED_LOOP_BEHAVIOUR__NUM_ITERATION:
 				return getNumIteration();
 		}
@@ -120,8 +117,7 @@ public class BoundedLoopBehaviourImpl extends SingleCombinedBehaviourImpl implem
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.BOUNDED_LOOP_BEHAVIOUR__NUM_ITERATION:
 				getNumIteration().clear();
 				getNumIteration().addAll((Collection<? extends LocalExpression>)newValue);
@@ -138,8 +134,7 @@ public class BoundedLoopBehaviourImpl extends SingleCombinedBehaviourImpl implem
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.BOUNDED_LOOP_BEHAVIOUR__NUM_ITERATION:
 				getNumIteration().clear();
 				return;
@@ -155,8 +150,7 @@ public class BoundedLoopBehaviourImpl extends SingleCombinedBehaviourImpl implem
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.BOUNDED_LOOP_BEHAVIOUR__NUM_ITERATION:
 				return numIteration != null && !numIteration.isEmpty();
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/CollectionDataInstanceImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/CollectionDataInstanceImpl.java
index 2c7a63c1ef97817bc3636912eebade5beb5c4882..8a022830685d08a291db3e10c8b95d7515b299ff 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/CollectionDataInstanceImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/CollectionDataInstanceImpl.java
@@ -97,8 +97,7 @@ public class CollectionDataInstanceImpl extends DataInstanceImpl implements Coll
 	@Override
 	public EList<DataUse> getItem()
 	{
-		if (item == null)
-		{
+		if (item == null) {
 			item = new EObjectContainmentEList<DataUse>(DataUse.class, this, tdlPackage.COLLECTION_DATA_INSTANCE__ITEM);
 		}
 		return item;
@@ -137,8 +136,7 @@ public class CollectionDataInstanceImpl extends DataInstanceImpl implements Coll
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COLLECTION_DATA_INSTANCE__ITEM:
 				return ((InternalEList<?>)getItem()).basicRemove(otherEnd, msgs);
 		}
@@ -153,8 +151,7 @@ public class CollectionDataInstanceImpl extends DataInstanceImpl implements Coll
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COLLECTION_DATA_INSTANCE__ITEM:
 				return getItem();
 			case tdlPackage.COLLECTION_DATA_INSTANCE__UNASSIGNED_MEMBER:
@@ -172,8 +169,7 @@ public class CollectionDataInstanceImpl extends DataInstanceImpl implements Coll
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COLLECTION_DATA_INSTANCE__ITEM:
 				getItem().clear();
 				getItem().addAll((Collection<? extends DataUse>)newValue);
@@ -193,8 +189,7 @@ public class CollectionDataInstanceImpl extends DataInstanceImpl implements Coll
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COLLECTION_DATA_INSTANCE__ITEM:
 				getItem().clear();
 				return;
@@ -213,8 +208,7 @@ public class CollectionDataInstanceImpl extends DataInstanceImpl implements Coll
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COLLECTION_DATA_INSTANCE__ITEM:
 				return item != null && !item.isEmpty();
 			case tdlPackage.COLLECTION_DATA_INSTANCE__UNASSIGNED_MEMBER:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/CollectionDataTypeImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/CollectionDataTypeImpl.java
index c185cdd0d0fa240c5923539f812700ac72029f10..cab089fa383fc7fa2863a405b9fd2eb61ea3eba6 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/CollectionDataTypeImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/CollectionDataTypeImpl.java
@@ -67,12 +67,10 @@ public class CollectionDataTypeImpl extends DataTypeImpl implements CollectionDa
 	@Override
 	public DataType getItemType()
 	{
-		if (itemType != null && itemType.eIsProxy())
-		{
+		if (itemType != null && itemType.eIsProxy()) {
 			InternalEObject oldItemType = (InternalEObject)itemType;
 			itemType = (DataType)eResolveProxy(oldItemType);
-			if (itemType != oldItemType)
-			{
+			if (itemType != oldItemType) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.COLLECTION_DATA_TYPE__ITEM_TYPE, oldItemType, itemType));
 			}
@@ -112,8 +110,7 @@ public class CollectionDataTypeImpl extends DataTypeImpl implements CollectionDa
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COLLECTION_DATA_TYPE__ITEM_TYPE:
 				if (resolve) return getItemType();
 				return basicGetItemType();
@@ -129,8 +126,7 @@ public class CollectionDataTypeImpl extends DataTypeImpl implements CollectionDa
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COLLECTION_DATA_TYPE__ITEM_TYPE:
 				setItemType((DataType)newValue);
 				return;
@@ -146,8 +142,7 @@ public class CollectionDataTypeImpl extends DataTypeImpl implements CollectionDa
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COLLECTION_DATA_TYPE__ITEM_TYPE:
 				setItemType((DataType)null);
 				return;
@@ -163,8 +158,7 @@ public class CollectionDataTypeImpl extends DataTypeImpl implements CollectionDa
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COLLECTION_DATA_TYPE__ITEM_TYPE:
 				return itemType != null;
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/CombinedBehaviourImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/CombinedBehaviourImpl.java
index 4613d154935a1c8402f73416104937613599949a..c280d682b6512b021aa1a0f861ecafbae7e27c6e 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/CombinedBehaviourImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/CombinedBehaviourImpl.java
@@ -84,8 +84,7 @@ public abstract class CombinedBehaviourImpl extends BehaviourImpl implements Com
 	@Override
 	public EList<PeriodicBehaviour> getPeriodic()
 	{
-		if (periodic == null)
-		{
+		if (periodic == null) {
 			periodic = new EObjectContainmentEList<PeriodicBehaviour>(PeriodicBehaviour.class, this, tdlPackage.COMBINED_BEHAVIOUR__PERIODIC);
 		}
 		return periodic;
@@ -99,8 +98,7 @@ public abstract class CombinedBehaviourImpl extends BehaviourImpl implements Com
 	@Override
 	public EList<ExceptionalBehaviour> getExceptional()
 	{
-		if (exceptional == null)
-		{
+		if (exceptional == null) {
 			exceptional = new EObjectContainmentEList<ExceptionalBehaviour>(ExceptionalBehaviour.class, this, tdlPackage.COMBINED_BEHAVIOUR__EXCEPTIONAL);
 		}
 		return exceptional;
@@ -114,8 +112,7 @@ public abstract class CombinedBehaviourImpl extends BehaviourImpl implements Com
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COMBINED_BEHAVIOUR__PERIODIC:
 				return ((InternalEList<?>)getPeriodic()).basicRemove(otherEnd, msgs);
 			case tdlPackage.COMBINED_BEHAVIOUR__EXCEPTIONAL:
@@ -132,8 +129,7 @@ public abstract class CombinedBehaviourImpl extends BehaviourImpl implements Com
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COMBINED_BEHAVIOUR__PERIODIC:
 				return getPeriodic();
 			case tdlPackage.COMBINED_BEHAVIOUR__EXCEPTIONAL:
@@ -151,8 +147,7 @@ public abstract class CombinedBehaviourImpl extends BehaviourImpl implements Com
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COMBINED_BEHAVIOUR__PERIODIC:
 				getPeriodic().clear();
 				getPeriodic().addAll((Collection<? extends PeriodicBehaviour>)newValue);
@@ -173,8 +168,7 @@ public abstract class CombinedBehaviourImpl extends BehaviourImpl implements Com
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COMBINED_BEHAVIOUR__PERIODIC:
 				getPeriodic().clear();
 				return;
@@ -193,8 +187,7 @@ public abstract class CombinedBehaviourImpl extends BehaviourImpl implements Com
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COMBINED_BEHAVIOUR__PERIODIC:
 				return periodic != null && !periodic.isEmpty();
 			case tdlPackage.COMBINED_BEHAVIOUR__EXCEPTIONAL:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/CommentImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/CommentImpl.java
index cad38afabe2535dcdfa0022f755deb1bc1c437fc..5f7cec09039acb77bf992649870987d87e10e27d 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/CommentImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/CommentImpl.java
@@ -129,8 +129,7 @@ public class CommentImpl extends ElementImpl implements Comment
 	@Override
 	public void setCommentedElement(Element newCommentedElement)
 	{
-		if (newCommentedElement != eInternalContainer() || (eContainerFeatureID() != tdlPackage.COMMENT__COMMENTED_ELEMENT && newCommentedElement != null))
-		{
+		if (newCommentedElement != eInternalContainer() || (eContainerFeatureID() != tdlPackage.COMMENT__COMMENTED_ELEMENT && newCommentedElement != null)) {
 			if (EcoreUtil.isAncestor(this, newCommentedElement))
 				throw new IllegalArgumentException("Recursive containment not allowed for " + toString());
 			NotificationChain msgs = null;
@@ -153,8 +152,7 @@ public class CommentImpl extends ElementImpl implements Comment
 	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COMMENT__COMMENTED_ELEMENT:
 				if (eInternalContainer() != null)
 					msgs = eBasicRemoveFromContainer(msgs);
@@ -171,8 +169,7 @@ public class CommentImpl extends ElementImpl implements Comment
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COMMENT__COMMENTED_ELEMENT:
 				return basicSetCommentedElement(null, msgs);
 		}
@@ -187,8 +184,7 @@ public class CommentImpl extends ElementImpl implements Comment
 	@Override
 	public NotificationChain eBasicRemoveFromContainerFeature(NotificationChain msgs)
 	{
-		switch (eContainerFeatureID())
-		{
+		switch (eContainerFeatureID()) {
 			case tdlPackage.COMMENT__COMMENTED_ELEMENT:
 				return eInternalContainer().eInverseRemove(this, tdlPackage.ELEMENT__COMMENT, Element.class, msgs);
 		}
@@ -203,8 +199,7 @@ public class CommentImpl extends ElementImpl implements Comment
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COMMENT__BODY:
 				return getBody();
 			case tdlPackage.COMMENT__COMMENTED_ELEMENT:
@@ -221,8 +216,7 @@ public class CommentImpl extends ElementImpl implements Comment
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COMMENT__BODY:
 				setBody((String)newValue);
 				return;
@@ -241,8 +235,7 @@ public class CommentImpl extends ElementImpl implements Comment
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COMMENT__BODY:
 				setBody(BODY_EDEFAULT);
 				return;
@@ -261,8 +254,7 @@ public class CommentImpl extends ElementImpl implements Comment
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COMMENT__BODY:
 				return BODY_EDEFAULT == null ? body != null : !BODY_EDEFAULT.equals(body);
 			case tdlPackage.COMMENT__COMMENTED_ELEMENT:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ComponentInstanceBindingImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ComponentInstanceBindingImpl.java
index d3534c1b4d6db215b359812e1221660374ba138d..f999473fe17aa3bbc8a42700134ead882032729e 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ComponentInstanceBindingImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ComponentInstanceBindingImpl.java
@@ -78,12 +78,10 @@ public class ComponentInstanceBindingImpl extends ElementImpl implements Compone
 	@Override
 	public ComponentInstance getFormalComponent()
 	{
-		if (formalComponent != null && formalComponent.eIsProxy())
-		{
+		if (formalComponent != null && formalComponent.eIsProxy()) {
 			InternalEObject oldFormalComponent = (InternalEObject)formalComponent;
 			formalComponent = (ComponentInstance)eResolveProxy(oldFormalComponent);
-			if (formalComponent != oldFormalComponent)
-			{
+			if (formalComponent != oldFormalComponent) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.COMPONENT_INSTANCE_BINDING__FORMAL_COMPONENT, oldFormalComponent, formalComponent));
 			}
@@ -123,12 +121,10 @@ public class ComponentInstanceBindingImpl extends ElementImpl implements Compone
 	@Override
 	public ComponentInstance getActualComponent()
 	{
-		if (actualComponent != null && actualComponent.eIsProxy())
-		{
+		if (actualComponent != null && actualComponent.eIsProxy()) {
 			InternalEObject oldActualComponent = (InternalEObject)actualComponent;
 			actualComponent = (ComponentInstance)eResolveProxy(oldActualComponent);
-			if (actualComponent != oldActualComponent)
-			{
+			if (actualComponent != oldActualComponent) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.COMPONENT_INSTANCE_BINDING__ACTUAL_COMPONENT, oldActualComponent, actualComponent));
 			}
@@ -168,8 +164,7 @@ public class ComponentInstanceBindingImpl extends ElementImpl implements Compone
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COMPONENT_INSTANCE_BINDING__FORMAL_COMPONENT:
 				if (resolve) return getFormalComponent();
 				return basicGetFormalComponent();
@@ -188,8 +183,7 @@ public class ComponentInstanceBindingImpl extends ElementImpl implements Compone
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COMPONENT_INSTANCE_BINDING__FORMAL_COMPONENT:
 				setFormalComponent((ComponentInstance)newValue);
 				return;
@@ -208,8 +202,7 @@ public class ComponentInstanceBindingImpl extends ElementImpl implements Compone
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COMPONENT_INSTANCE_BINDING__FORMAL_COMPONENT:
 				setFormalComponent((ComponentInstance)null);
 				return;
@@ -228,8 +221,7 @@ public class ComponentInstanceBindingImpl extends ElementImpl implements Compone
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COMPONENT_INSTANCE_BINDING__FORMAL_COMPONENT:
 				return formalComponent != null;
 			case tdlPackage.COMPONENT_INSTANCE_BINDING__ACTUAL_COMPONENT:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ComponentInstanceImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ComponentInstanceImpl.java
index 38ed65d7c192e4ba3fc3b68b6a631cf19a59dd08..12eec3d0db8263bce1977a04791e91e1cb92574d 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ComponentInstanceImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ComponentInstanceImpl.java
@@ -89,12 +89,10 @@ public class ComponentInstanceImpl extends NamedElementImpl implements Component
 	@Override
 	public ComponentType getType()
 	{
-		if (type != null && type.eIsProxy())
-		{
+		if (type != null && type.eIsProxy()) {
 			InternalEObject oldType = (InternalEObject)type;
 			type = (ComponentType)eResolveProxy(oldType);
-			if (type != oldType)
-			{
+			if (type != oldType) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.COMPONENT_INSTANCE__TYPE, oldType, type));
 			}
@@ -159,8 +157,7 @@ public class ComponentInstanceImpl extends NamedElementImpl implements Component
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COMPONENT_INSTANCE__TYPE:
 				if (resolve) return getType();
 				return basicGetType();
@@ -178,8 +175,7 @@ public class ComponentInstanceImpl extends NamedElementImpl implements Component
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COMPONENT_INSTANCE__TYPE:
 				setType((ComponentType)newValue);
 				return;
@@ -198,8 +194,7 @@ public class ComponentInstanceImpl extends NamedElementImpl implements Component
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COMPONENT_INSTANCE__TYPE:
 				setType((ComponentType)null);
 				return;
@@ -218,8 +213,7 @@ public class ComponentInstanceImpl extends NamedElementImpl implements Component
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COMPONENT_INSTANCE__TYPE:
 				return type != null;
 			case tdlPackage.COMPONENT_INSTANCE__ROLE:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ComponentTypeImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ComponentTypeImpl.java
index fb26e30febcb8918c9d897737942668276f0ecd2..49dbdb2cdadc2b9b2c750eb3c7e0e9aa26185f31 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ComponentTypeImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ComponentTypeImpl.java
@@ -6,14 +6,12 @@ import java.lang.reflect.InvocationTargetException;
 
 import java.util.Collection;
 
+import java.util.List;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
@@ -21,12 +19,25 @@ import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.ids.IdResolver.IdResolverExtension;
+import org.eclipse.ocl.pivot.library.collection.CollectionAsOrderedSetOperation;
+import org.eclipse.ocl.pivot.library.collection.CollectionUnionOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsTypeOperation;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
+import org.eclipse.ocl.pivot.values.OrderedSetValue;
+import org.eclipse.ocl.pivot.values.SetValue;
 import org.etsi.mts.tdl.ComponentType;
 import org.etsi.mts.tdl.Extension;
 import org.etsi.mts.tdl.GateInstance;
+import org.etsi.mts.tdl.PackageableElement;
 import org.etsi.mts.tdl.Timer;
 import org.etsi.mts.tdl.Variable;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -115,8 +126,7 @@ public class ComponentTypeImpl extends PackageableElementImpl implements Compone
 	@Override
 	public EList<GateInstance> getGateInstance()
 	{
-		if (gateInstance == null)
-		{
+		if (gateInstance == null) {
 			gateInstance = new EObjectContainmentEList<GateInstance>(GateInstance.class, this, tdlPackage.COMPONENT_TYPE__GATE_INSTANCE);
 		}
 		return gateInstance;
@@ -130,8 +140,7 @@ public class ComponentTypeImpl extends PackageableElementImpl implements Compone
 	@Override
 	public EList<Timer> getTimer()
 	{
-		if (timer == null)
-		{
+		if (timer == null) {
 			timer = new EObjectContainmentEList<Timer>(Timer.class, this, tdlPackage.COMPONENT_TYPE__TIMER);
 		}
 		return timer;
@@ -145,8 +154,7 @@ public class ComponentTypeImpl extends PackageableElementImpl implements Compone
 	@Override
 	public EList<Variable> getVariable()
 	{
-		if (variable == null)
-		{
+		if (variable == null) {
 			variable = new EObjectContainmentEList<Variable>(Variable.class, this, tdlPackage.COMPONENT_TYPE__VARIABLE);
 		}
 		return variable;
@@ -172,8 +180,7 @@ public class ComponentTypeImpl extends PackageableElementImpl implements Compone
 	{
 		Extension oldExtension = extension;
 		extension = newExtension;
-		if (eNotificationRequired())
-		{
+		if (eNotificationRequired()) {
 			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, tdlPackage.COMPONENT_TYPE__EXTENSION, oldExtension, newExtension);
 			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
@@ -188,8 +195,7 @@ public class ComponentTypeImpl extends PackageableElementImpl implements Compone
 	@Override
 	public void setExtension(Extension newExtension)
 	{
-		if (newExtension != extension)
-		{
+		if (newExtension != extension) {
 			NotificationChain msgs = null;
 			if (extension != null)
 				msgs = ((InternalEObject)extension).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - tdlPackage.COMPONENT_TYPE__EXTENSION, null, msgs);
@@ -202,16 +208,6 @@ public class ComponentTypeImpl extends PackageableElementImpl implements Compone
 			eNotify(new ENotificationImpl(this, Notification.SET, tdlPackage.COMPONENT_TYPE__EXTENSION, newExtension, newExtension));
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #allGates() <em>All Gates</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #allGates()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate ALL_GATES__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.COMPONENT_TYPE___ALL_GATES).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -221,26 +217,59 @@ public class ComponentTypeImpl extends PackageableElementImpl implements Compone
 	@Override
 	public EList<GateInstance> allGates()
 	{
-		try
-		{
-			return (EList<GateInstance>)ALL_GATES__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if not self.extension.oclIsUndefined()
+		 * then
+		 *   self.extension.extending.oclAsType(ComponentType)
+		 *   .allGates()
+		 *   ->union(self.gateInstance)
+		 *   ->asOrderedSet()
+		 * else self.gateInstance
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ Extension extension = this.getExtension();
+		final /*@NonInvalid*/ List<GateInstance> gateInstance_0 = this.getGateInstance();
+		final /*@NonInvalid*/ OrderedSetValue BOXED_gateInstance_0 = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_GateInstance, gateInstance_0);
+		final /*@NonInvalid*/ boolean oclIsUndefined = extension == null;
+		final /*@NonInvalid*/ Boolean not;
+		if (!oclIsUndefined) {
+			not = ValueUtil.TRUE_VALUE;
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		else {
+			if (oclIsUndefined) {
+				not = ValueUtil.FALSE_VALUE;
+			}
+			else {
+				not = null;
+			}
 		}
+		if (not == null) {
+			throw new InvalidValueException("Null if condition");
+		}
+		/*@Thrown*/ OrderedSetValue local_0;
+		if (not) {
+			final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_ComponentType_0 = idResolver.getClass(tdlTables.CLSSid_ComponentType, null);
+			if (extension == null) {
+				throw new InvalidValueException("Null source for \'\'http://www.etsi.org/spec/TDL/1.4.1\'::Extension::extending\'");
+			}
+			final /*@Thrown*/ PackageableElement extending = extension.getExtending();
+			final /*@Thrown*/ ComponentType oclAsType = (ComponentType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, extending, TYP_tdl_c_c_ComponentType_0);
+			final /*@Thrown*/ List<GateInstance> allGates = oclAsType.allGates();
+			final /*@Thrown*/ OrderedSetValue BOXED_allGates = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_GateInstance, allGates);
+			final /*@Thrown*/ SetValue union = (SetValue)CollectionUnionOperation.INSTANCE.evaluate(BOXED_allGates, BOXED_gateInstance_0);
+			final /*@Thrown*/ OrderedSetValue asOrderedSet = CollectionAsOrderedSetOperation.INSTANCE.evaluate(union);
+			local_0 = asOrderedSet;
+		}
+		else {
+			local_0 = BOXED_gateInstance_0;
+		}
+		final /*@Thrown*/ List<GateInstance> ECORE_local_0 = ((IdResolverExtension)idResolver).ecoreValueOfAll(GateInstance.class, local_0);
+		return (EList<GateInstance>)ECORE_local_0;
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #allTimers() <em>All Timers</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #allTimers()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate ALL_TIMERS__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.COMPONENT_TYPE___ALL_TIMERS).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -250,26 +279,59 @@ public class ComponentTypeImpl extends PackageableElementImpl implements Compone
 	@Override
 	public EList<Timer> allTimers()
 	{
-		try
-		{
-			return (EList<Timer>)ALL_TIMERS__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if not self.extension.oclIsUndefined()
+		 * then
+		 *   self.extension.extending.oclAsType(ComponentType)
+		 *   .allTimers()
+		 *   ->union(self.timer)
+		 *   ->asOrderedSet()
+		 * else self.timer
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ Extension extension = this.getExtension();
+		final /*@NonInvalid*/ List<Timer> timer_0 = this.getTimer();
+		final /*@NonInvalid*/ OrderedSetValue BOXED_timer_0 = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_Timer, timer_0);
+		final /*@NonInvalid*/ boolean oclIsUndefined = extension == null;
+		final /*@NonInvalid*/ Boolean not;
+		if (!oclIsUndefined) {
+			not = ValueUtil.TRUE_VALUE;
+		}
+		else {
+			if (oclIsUndefined) {
+				not = ValueUtil.FALSE_VALUE;
+			}
+			else {
+				not = null;
+			}
+		}
+		if (not == null) {
+			throw new InvalidValueException("Null if condition");
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		/*@Thrown*/ OrderedSetValue local_0;
+		if (not) {
+			final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_ComponentType_0 = idResolver.getClass(tdlTables.CLSSid_ComponentType, null);
+			if (extension == null) {
+				throw new InvalidValueException("Null source for \'\'http://www.etsi.org/spec/TDL/1.4.1\'::Extension::extending\'");
+			}
+			final /*@Thrown*/ PackageableElement extending = extension.getExtending();
+			final /*@Thrown*/ ComponentType oclAsType = (ComponentType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, extending, TYP_tdl_c_c_ComponentType_0);
+			final /*@Thrown*/ List<Timer> allTimers = oclAsType.allTimers();
+			final /*@Thrown*/ OrderedSetValue BOXED_allTimers = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_Timer, allTimers);
+			final /*@Thrown*/ SetValue union = (SetValue)CollectionUnionOperation.INSTANCE.evaluate(BOXED_allTimers, BOXED_timer_0);
+			final /*@Thrown*/ OrderedSetValue asOrderedSet = CollectionAsOrderedSetOperation.INSTANCE.evaluate(union);
+			local_0 = asOrderedSet;
 		}
+		else {
+			local_0 = BOXED_timer_0;
+		}
+		final /*@Thrown*/ List<Timer> ECORE_local_0 = ((IdResolverExtension)idResolver).ecoreValueOfAll(Timer.class, local_0);
+		return (EList<Timer>)ECORE_local_0;
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #allVariables() <em>All Variables</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #allVariables()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate ALL_VARIABLES__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.COMPONENT_TYPE___ALL_VARIABLES).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -279,14 +341,57 @@ public class ComponentTypeImpl extends PackageableElementImpl implements Compone
 	@Override
 	public EList<Variable> allVariables()
 	{
-		try
-		{
-			return (EList<Variable>)ALL_VARIABLES__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if not self.extension.oclIsUndefined()
+		 * then
+		 *   self.extension.extending.oclAsType(ComponentType)
+		 *   .allVariables()
+		 *   ->union(self.variable)
+		 *   ->asOrderedSet()
+		 * else self.variable
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ Extension extension = this.getExtension();
+		final /*@NonInvalid*/ List<Variable> variable_0 = this.getVariable();
+		final /*@NonInvalid*/ OrderedSetValue BOXED_variable_0 = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_Variable, variable_0);
+		final /*@NonInvalid*/ boolean oclIsUndefined = extension == null;
+		final /*@NonInvalid*/ Boolean not;
+		if (!oclIsUndefined) {
+			not = ValueUtil.TRUE_VALUE;
+		}
+		else {
+			if (oclIsUndefined) {
+				not = ValueUtil.FALSE_VALUE;
+			}
+			else {
+				not = null;
+			}
+		}
+		if (not == null) {
+			throw new InvalidValueException("Null if condition");
+		}
+		/*@Thrown*/ OrderedSetValue local_0;
+		if (not) {
+			final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_ComponentType_0 = idResolver.getClass(tdlTables.CLSSid_ComponentType, null);
+			if (extension == null) {
+				throw new InvalidValueException("Null source for \'\'http://www.etsi.org/spec/TDL/1.4.1\'::Extension::extending\'");
+			}
+			final /*@Thrown*/ PackageableElement extending = extension.getExtending();
+			final /*@Thrown*/ ComponentType oclAsType = (ComponentType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, extending, TYP_tdl_c_c_ComponentType_0);
+			final /*@Thrown*/ List<Variable> allVariables = oclAsType.allVariables();
+			final /*@Thrown*/ OrderedSetValue BOXED_allVariables = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_Variable, allVariables);
+			final /*@Thrown*/ SetValue union = (SetValue)CollectionUnionOperation.INSTANCE.evaluate(BOXED_allVariables, BOXED_variable_0);
+			final /*@Thrown*/ OrderedSetValue asOrderedSet = CollectionAsOrderedSetOperation.INSTANCE.evaluate(union);
+			local_0 = asOrderedSet;
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		else {
+			local_0 = BOXED_variable_0;
 		}
+		final /*@Thrown*/ List<Variable> ECORE_local_0 = ((IdResolverExtension)idResolver).ecoreValueOfAll(Variable.class, local_0);
+		return (EList<Variable>)ECORE_local_0;
 	}
 
 	/**
@@ -297,8 +402,7 @@ public class ComponentTypeImpl extends PackageableElementImpl implements Compone
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COMPONENT_TYPE__GATE_INSTANCE:
 				return ((InternalEList<?>)getGateInstance()).basicRemove(otherEnd, msgs);
 			case tdlPackage.COMPONENT_TYPE__TIMER:
@@ -319,8 +423,7 @@ public class ComponentTypeImpl extends PackageableElementImpl implements Compone
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COMPONENT_TYPE__GATE_INSTANCE:
 				return getGateInstance();
 			case tdlPackage.COMPONENT_TYPE__TIMER:
@@ -342,8 +445,7 @@ public class ComponentTypeImpl extends PackageableElementImpl implements Compone
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COMPONENT_TYPE__GATE_INSTANCE:
 				getGateInstance().clear();
 				getGateInstance().addAll((Collection<? extends GateInstance>)newValue);
@@ -371,8 +473,7 @@ public class ComponentTypeImpl extends PackageableElementImpl implements Compone
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COMPONENT_TYPE__GATE_INSTANCE:
 				getGateInstance().clear();
 				return;
@@ -397,8 +498,7 @@ public class ComponentTypeImpl extends PackageableElementImpl implements Compone
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.COMPONENT_TYPE__GATE_INSTANCE:
 				return gateInstance != null && !gateInstance.isEmpty();
 			case tdlPackage.COMPONENT_TYPE__TIMER:
@@ -419,8 +519,7 @@ public class ComponentTypeImpl extends PackageableElementImpl implements Compone
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.COMPONENT_TYPE___ALL_GATES:
 				return allGates();
 			case tdlPackage.COMPONENT_TYPE___ALL_TIMERS:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ConnectionImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ConnectionImpl.java
index 96b2710db5543c0d0546bd2a9ad4ee37f20d0d20..959e4ac80b5fc10a8dbb947001e6ec2ea473a00c 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ConnectionImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ConnectionImpl.java
@@ -72,8 +72,7 @@ public class ConnectionImpl extends ElementImpl implements Connection
 	@Override
 	public EList<GateReference> getEndPoint()
 	{
-		if (endPoint == null)
-		{
+		if (endPoint == null) {
 			endPoint = new EObjectContainmentEList<GateReference>(GateReference.class, this, tdlPackage.CONNECTION__END_POINT);
 		}
 		return endPoint;
@@ -87,8 +86,7 @@ public class ConnectionImpl extends ElementImpl implements Connection
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.CONNECTION__END_POINT:
 				return ((InternalEList<?>)getEndPoint()).basicRemove(otherEnd, msgs);
 		}
@@ -103,8 +101,7 @@ public class ConnectionImpl extends ElementImpl implements Connection
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.CONNECTION__END_POINT:
 				return getEndPoint();
 		}
@@ -120,8 +117,7 @@ public class ConnectionImpl extends ElementImpl implements Connection
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.CONNECTION__END_POINT:
 				getEndPoint().clear();
 				getEndPoint().addAll((Collection<? extends GateReference>)newValue);
@@ -138,8 +134,7 @@ public class ConnectionImpl extends ElementImpl implements Connection
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.CONNECTION__END_POINT:
 				getEndPoint().clear();
 				return;
@@ -155,8 +150,7 @@ public class ConnectionImpl extends ElementImpl implements Connection
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.CONNECTION__END_POINT:
 				return endPoint != null && !endPoint.isEmpty();
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ConstraintImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ConstraintImpl.java
index ab4c9fc31008e1b322ef6ae3c2cf02f6acb201bb..ed1c088eb3a9d15a15952186e5566a6a7cb4d818 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ConstraintImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ConstraintImpl.java
@@ -87,12 +87,10 @@ public class ConstraintImpl extends ElementImpl implements Constraint
 	@Override
 	public ConstraintType getType()
 	{
-		if (type != null && type.eIsProxy())
-		{
+		if (type != null && type.eIsProxy()) {
 			InternalEObject oldType = (InternalEObject)type;
 			type = (ConstraintType)eResolveProxy(oldType);
-			if (type != oldType)
-			{
+			if (type != oldType) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.CONSTRAINT__TYPE, oldType, type));
 			}
@@ -132,8 +130,7 @@ public class ConstraintImpl extends ElementImpl implements Constraint
 	@Override
 	public EList<DataUse> getQuantifier()
 	{
-		if (quantifier == null)
-		{
+		if (quantifier == null) {
 			quantifier = new EObjectContainmentEList<DataUse>(DataUse.class, this, tdlPackage.CONSTRAINT__QUANTIFIER);
 		}
 		return quantifier;
@@ -147,8 +144,7 @@ public class ConstraintImpl extends ElementImpl implements Constraint
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.CONSTRAINT__QUANTIFIER:
 				return ((InternalEList<?>)getQuantifier()).basicRemove(otherEnd, msgs);
 		}
@@ -163,8 +159,7 @@ public class ConstraintImpl extends ElementImpl implements Constraint
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.CONSTRAINT__TYPE:
 				if (resolve) return getType();
 				return basicGetType();
@@ -183,8 +178,7 @@ public class ConstraintImpl extends ElementImpl implements Constraint
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.CONSTRAINT__TYPE:
 				setType((ConstraintType)newValue);
 				return;
@@ -204,8 +198,7 @@ public class ConstraintImpl extends ElementImpl implements Constraint
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.CONSTRAINT__TYPE:
 				setType((ConstraintType)null);
 				return;
@@ -224,8 +217,7 @@ public class ConstraintImpl extends ElementImpl implements Constraint
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.CONSTRAINT__TYPE:
 				return type != null;
 			case tdlPackage.CONSTRAINT__QUANTIFIER:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/DataElementMappingImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/DataElementMappingImpl.java
index fc04b9b3c484d0b9c5bcae66372fd3f014fdf6cc..9f725c7f4cdaf79278e9be98417e693d07e34ffc 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/DataElementMappingImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/DataElementMappingImpl.java
@@ -120,12 +120,10 @@ public class DataElementMappingImpl extends PackageableElementImpl implements Da
 	@Override
 	public MappableDataElement getMappableDataElement()
 	{
-		if (mappableDataElement != null && mappableDataElement.eIsProxy())
-		{
+		if (mappableDataElement != null && mappableDataElement.eIsProxy()) {
 			InternalEObject oldMappableDataElement = (InternalEObject)mappableDataElement;
 			mappableDataElement = (MappableDataElement)eResolveProxy(oldMappableDataElement);
-			if (mappableDataElement != oldMappableDataElement)
-			{
+			if (mappableDataElement != oldMappableDataElement) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.DATA_ELEMENT_MAPPING__MAPPABLE_DATA_ELEMENT, oldMappableDataElement, mappableDataElement));
 			}
@@ -190,12 +188,10 @@ public class DataElementMappingImpl extends PackageableElementImpl implements Da
 	@Override
 	public DataResourceMapping getDataResourceMapping()
 	{
-		if (dataResourceMapping != null && dataResourceMapping.eIsProxy())
-		{
+		if (dataResourceMapping != null && dataResourceMapping.eIsProxy()) {
 			InternalEObject oldDataResourceMapping = (InternalEObject)dataResourceMapping;
 			dataResourceMapping = (DataResourceMapping)eResolveProxy(oldDataResourceMapping);
-			if (dataResourceMapping != oldDataResourceMapping)
-			{
+			if (dataResourceMapping != oldDataResourceMapping) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.DATA_ELEMENT_MAPPING__DATA_RESOURCE_MAPPING, oldDataResourceMapping, dataResourceMapping));
 			}
@@ -235,8 +231,7 @@ public class DataElementMappingImpl extends PackageableElementImpl implements Da
 	@Override
 	public EList<ParameterMapping> getParameterMapping()
 	{
-		if (parameterMapping == null)
-		{
+		if (parameterMapping == null) {
 			parameterMapping = new EObjectContainmentEList<ParameterMapping>(ParameterMapping.class, this, tdlPackage.DATA_ELEMENT_MAPPING__PARAMETER_MAPPING);
 		}
 		return parameterMapping;
@@ -250,8 +245,7 @@ public class DataElementMappingImpl extends PackageableElementImpl implements Da
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_ELEMENT_MAPPING__PARAMETER_MAPPING:
 				return ((InternalEList<?>)getParameterMapping()).basicRemove(otherEnd, msgs);
 		}
@@ -266,8 +260,7 @@ public class DataElementMappingImpl extends PackageableElementImpl implements Da
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_ELEMENT_MAPPING__MAPPABLE_DATA_ELEMENT:
 				if (resolve) return getMappableDataElement();
 				return basicGetMappableDataElement();
@@ -291,8 +284,7 @@ public class DataElementMappingImpl extends PackageableElementImpl implements Da
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_ELEMENT_MAPPING__MAPPABLE_DATA_ELEMENT:
 				setMappableDataElement((MappableDataElement)newValue);
 				return;
@@ -318,8 +310,7 @@ public class DataElementMappingImpl extends PackageableElementImpl implements Da
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_ELEMENT_MAPPING__MAPPABLE_DATA_ELEMENT:
 				setMappableDataElement((MappableDataElement)null);
 				return;
@@ -344,8 +335,7 @@ public class DataElementMappingImpl extends PackageableElementImpl implements Da
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_ELEMENT_MAPPING__MAPPABLE_DATA_ELEMENT:
 				return mappableDataElement != null;
 			case tdlPackage.DATA_ELEMENT_MAPPING__ELEMENT_URI:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/DataElementUseImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/DataElementUseImpl.java
index 2ce4388b646d2c1e1f6d69996d5fd8813b028de3..b04aaac5aee352b36002780c79b9c6ef33d58889 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/DataElementUseImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/DataElementUseImpl.java
@@ -10,10 +10,7 @@ import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
@@ -21,12 +18,31 @@ import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsTypeOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclIsKindOfOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclIsTypeOfOperation;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
+import org.etsi.mts.tdl.CollectionDataInstance;
+import org.etsi.mts.tdl.CollectionDataType;
 import org.etsi.mts.tdl.DataElementUse;
+import org.etsi.mts.tdl.DataInstance;
+import org.etsi.mts.tdl.DataInstanceUse;
 import org.etsi.mts.tdl.DataType;
 import org.etsi.mts.tdl.DataUse;
+import org.etsi.mts.tdl.Element;
+import org.etsi.mts.tdl.FormalParameter;
+import org.etsi.mts.tdl.Function;
+import org.etsi.mts.tdl.Member;
+import org.etsi.mts.tdl.MemberAssignment;
 import org.etsi.mts.tdl.NamedElement;
+import org.etsi.mts.tdl.ParameterBinding;
 import org.etsi.mts.tdl.UnassignedMemberTreatment;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -139,12 +155,10 @@ public class DataElementUseImpl extends DataUseImpl implements DataElementUse
 	@Override
 	public NamedElement getDataElement()
 	{
-		if (dataElement != null && dataElement.eIsProxy())
-		{
+		if (dataElement != null && dataElement.eIsProxy()) {
 			InternalEObject oldDataElement = (InternalEObject)dataElement;
 			dataElement = (NamedElement)eResolveProxy(oldDataElement);
-			if (dataElement != oldDataElement)
-			{
+			if (dataElement != oldDataElement) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.DATA_ELEMENT_USE__DATA_ELEMENT, oldDataElement, dataElement));
 			}
@@ -184,23 +198,12 @@ public class DataElementUseImpl extends DataUseImpl implements DataElementUse
 	@Override
 	public EList<DataUse> getItem()
 	{
-		if (item == null)
-		{
+		if (item == null) {
 			item = new EObjectContainmentEList<DataUse>(DataUse.class, this, tdlPackage.DATA_ELEMENT_USE__ITEM);
 		}
 		return item;
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #resolveDataType() <em>Resolve Data Type</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #resolveDataType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate RESOLVE_DATA_TYPE__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.DATA_ELEMENT_USE___RESOLVE_DATA_TYPE).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -209,14 +212,203 @@ public class DataElementUseImpl extends DataUseImpl implements DataElementUse
 	@Override
 	public DataType resolveDataType()
 	{
-		try
-		{
-			return (DataType)RESOLVE_DATA_TYPE__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if not self.dataElement.oclIsUndefined()
+		 * then
+		 *   if self.dataElement.oclIsKindOf(DataType)
+		 *   then self.dataElement.oclAsType(DataType)
+		 *   else
+		 *     if self.dataElement.oclIsKindOf(DataInstance)
+		 *     then self.dataElement.oclAsType(DataInstance).dataType
+		 *     else
+		 *       if self.dataElement.oclIsTypeOf(FormalParameter)
+		 *       then self.dataElement.oclAsType(FormalParameter).dataType
+		 *       else
+		 *         if self.dataElement.oclIsTypeOf(Function)
+		 *         then self.dataElement.oclAsType(Function).returnType
+		 *         else null
+		 *         endif
+		 *       endif
+		 *     endif
+		 *   endif
+		 * else
+		 *   if self.container().oclIsTypeOf(MemberAssignment)
+		 *   then
+		 *     self.container()
+		 *     .oclAsType(MemberAssignment).member.dataType
+		 *   else
+		 *     if self.container().oclIsTypeOf(ParameterBinding)
+		 *     then
+		 *       self.container()
+		 *       .oclAsType(ParameterBinding)
+		 *       .resolveParameterType()
+		 *     else
+		 *       if
+		 *         self.container()
+		 *         .oclIsTypeOf(CollectionDataInstance)
+		 *       then
+		 *         self.container()
+		 *         .oclAsType(CollectionDataInstance)
+		 *         .dataType.oclAsType(CollectionDataType).itemType
+		 *       else
+		 *         if self.container().oclIsTypeOf(DataElementUse)
+		 *         then
+		 *           self.container()
+		 *           .oclAsType(DataElementUse)
+		 *           .resolveDataType()
+		 *           .oclAsType(CollectionDataType).itemType
+		 *         else
+		 *           if self.container().oclIsTypeOf(DataInstanceUse)
+		 *           then
+		 *             self.container()
+		 *             .oclAsType(DataInstanceUse)
+		 *             .resolveDataType()
+		 *             .oclAsType(CollectionDataType).itemType
+		 *           else null
+		 *           endif
+		 *         endif
+		 *       endif
+		 *     endif
+		 *   endif
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ NamedElement dataElement_1 = this.getDataElement();
+		final /*@NonInvalid*/ boolean oclIsUndefined = dataElement_1 == null;
+		final /*@NonInvalid*/ Boolean not;
+		if (!oclIsUndefined) {
+			not = ValueUtil.TRUE_VALUE;
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		else {
+			if (oclIsUndefined) {
+				not = ValueUtil.FALSE_VALUE;
+			}
+			else {
+				not = null;
+			}
+		}
+		if (not == null) {
+			throw new InvalidValueException("Null if condition");
+		}
+		/*@Thrown*/ DataType local_9;
+		if (not) {
+			final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_DataType_1 = idResolver.getClass(tdlTables.CLSSid_DataType, null);
+			final /*@Thrown*/ boolean oclIsKindOf = OclAnyOclIsKindOfOperation.INSTANCE.evaluate(executor, dataElement_1, TYP_tdl_c_c_DataType_1).booleanValue();
+			/*@Thrown*/ DataType local_3;
+			if (oclIsKindOf) {
+				final /*@Thrown*/ DataType oclAsType = (DataType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, dataElement_1, TYP_tdl_c_c_DataType_1);
+				local_3 = oclAsType;
+			}
+			else {
+				final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_DataInstance_0 = idResolver.getClass(tdlTables.CLSSid_DataInstance, null);
+				final /*@Thrown*/ boolean oclIsKindOf_0 = OclAnyOclIsKindOfOperation.INSTANCE.evaluate(executor, dataElement_1, TYP_tdl_c_c_DataInstance_0).booleanValue();
+				/*@Thrown*/ DataType local_2;
+				if (oclIsKindOf_0) {
+					final /*@Thrown*/ DataInstance oclAsType_0 = (DataInstance)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, dataElement_1, TYP_tdl_c_c_DataInstance_0);
+					final /*@Thrown*/ DataType dataType = oclAsType_0.getDataType();
+					local_2 = dataType;
+				}
+				else {
+					final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_FormalParameter_0 = idResolver.getClass(tdlTables.CLSSid_FormalParameter, null);
+					final /*@Thrown*/ boolean oclIsTypeOf = OclAnyOclIsTypeOfOperation.INSTANCE.evaluate(executor, dataElement_1, TYP_tdl_c_c_FormalParameter_0).booleanValue();
+					/*@Thrown*/ DataType local_1;
+					if (oclIsTypeOf) {
+						final /*@Thrown*/ FormalParameter oclAsType_1 = (FormalParameter)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, dataElement_1, TYP_tdl_c_c_FormalParameter_0);
+						final /*@Thrown*/ DataType dataType_0 = oclAsType_1.getDataType();
+						local_1 = dataType_0;
+					}
+					else {
+						final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_Function_0 = idResolver.getClass(tdlTables.CLSSid_Function, null);
+						final /*@Thrown*/ boolean oclIsTypeOf_0 = OclAnyOclIsTypeOfOperation.INSTANCE.evaluate(executor, dataElement_1, TYP_tdl_c_c_Function_0).booleanValue();
+						/*@Thrown*/ DataType local_0;
+						if (oclIsTypeOf_0) {
+							final /*@Thrown*/ Function oclAsType_2 = (Function)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, dataElement_1, TYP_tdl_c_c_Function_0);
+							final /*@Thrown*/ DataType returnType = oclAsType_2.getReturnType();
+							local_0 = returnType;
+						}
+						else {
+							local_0 = null;
+						}
+						local_1 = local_0;
+					}
+					local_2 = local_1;
+				}
+				local_3 = local_2;
+			}
+			local_9 = local_3;
+		}
+		else {
+			final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_MemberAssignment_0 = idResolver.getClass(tdlTables.CLSSid_MemberAssignment, null);
+			final /*@NonInvalid*/ Element container = this.container();
+			final /*@NonInvalid*/ boolean oclIsTypeOf_1 = OclAnyOclIsTypeOfOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_MemberAssignment_0).booleanValue();
+			/*@Thrown*/ DataType local_8;
+			if (oclIsTypeOf_1) {
+				final /*@Thrown*/ MemberAssignment oclAsType_3 = (MemberAssignment)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_MemberAssignment_0);
+				final /*@Thrown*/ Member member = oclAsType_3.getMember();
+				final /*@Thrown*/ DataType dataType_1 = member.getDataType();
+				local_8 = dataType_1;
+			}
+			else {
+				final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_ParameterBinding_0 = idResolver.getClass(tdlTables.CLSSid_ParameterBinding, null);
+				final /*@NonInvalid*/ boolean oclIsTypeOf_2 = OclAnyOclIsTypeOfOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_ParameterBinding_0).booleanValue();
+				/*@Thrown*/ DataType local_7;
+				if (oclIsTypeOf_2) {
+					final /*@Thrown*/ ParameterBinding oclAsType_4 = (ParameterBinding)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_ParameterBinding_0);
+					final /*@Thrown*/ DataType resolveParameterType = oclAsType_4.resolveParameterType();
+					local_7 = resolveParameterType;
+				}
+				else {
+					final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_CollectionDataInstance_0 = idResolver.getClass(tdlTables.CLSSid_CollectionDataInstance, null);
+					final /*@NonInvalid*/ boolean oclIsTypeOf_3 = OclAnyOclIsTypeOfOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_CollectionDataInstance_0).booleanValue();
+					/*@Thrown*/ DataType local_6;
+					if (oclIsTypeOf_3) {
+						final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_CollectionDataType_0 = idResolver.getClass(tdlTables.CLSSid_CollectionDataType, null);
+						final /*@Thrown*/ CollectionDataInstance oclAsType_5 = (CollectionDataInstance)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_CollectionDataInstance_0);
+						final /*@Thrown*/ DataType dataType_2 = oclAsType_5.getDataType();
+						final /*@Thrown*/ CollectionDataType oclAsType_6 = (CollectionDataType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, dataType_2, TYP_tdl_c_c_CollectionDataType_0);
+						final /*@Thrown*/ DataType itemType = oclAsType_6.getItemType();
+						local_6 = itemType;
+					}
+					else {
+						final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_DataElementUse_0 = idResolver.getClass(tdlTables.CLSSid_DataElementUse, null);
+						final /*@NonInvalid*/ boolean oclIsTypeOf_4 = OclAnyOclIsTypeOfOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_DataElementUse_0).booleanValue();
+						/*@Thrown*/ DataType local_5;
+						if (oclIsTypeOf_4) {
+							final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_CollectionDataType_1 = idResolver.getClass(tdlTables.CLSSid_CollectionDataType, null);
+							final /*@Thrown*/ DataElementUse oclAsType_7 = (DataElementUse)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_DataElementUse_0);
+							final /*@Thrown*/ DataType resolveDataType = oclAsType_7.resolveDataType();
+							final /*@Thrown*/ CollectionDataType oclAsType_8 = (CollectionDataType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, resolveDataType, TYP_tdl_c_c_CollectionDataType_1);
+							final /*@Thrown*/ DataType itemType_0 = oclAsType_8.getItemType();
+							local_5 = itemType_0;
+						}
+						else {
+							final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_DataInstanceUse_0 = idResolver.getClass(tdlTables.CLSSid_DataInstanceUse, null);
+							final /*@NonInvalid*/ boolean oclIsTypeOf_5 = OclAnyOclIsTypeOfOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_DataInstanceUse_0).booleanValue();
+							/*@Thrown*/ DataType local_4;
+							if (oclIsTypeOf_5) {
+								final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_CollectionDataType_2 = idResolver.getClass(tdlTables.CLSSid_CollectionDataType, null);
+								final /*@Thrown*/ DataInstanceUse oclAsType_9 = (DataInstanceUse)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_DataInstanceUse_0);
+								final /*@Thrown*/ DataType resolveDataType_0 = oclAsType_9.resolveDataType();
+								final /*@Thrown*/ CollectionDataType oclAsType_10 = (CollectionDataType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, resolveDataType_0, TYP_tdl_c_c_CollectionDataType_2);
+								final /*@Thrown*/ DataType itemType_1 = oclAsType_10.getItemType();
+								local_4 = itemType_1;
+							}
+							else {
+								local_4 = null;
+							}
+							local_5 = local_4;
+						}
+						local_6 = local_5;
+					}
+					local_7 = local_6;
+				}
+				local_8 = local_7;
+			}
+			local_9 = local_8;
 		}
+		return local_9;
 	}
 
 	/**
@@ -227,8 +419,7 @@ public class DataElementUseImpl extends DataUseImpl implements DataElementUse
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_ELEMENT_USE__ITEM:
 				return ((InternalEList<?>)getItem()).basicRemove(otherEnd, msgs);
 		}
@@ -243,8 +434,7 @@ public class DataElementUseImpl extends DataUseImpl implements DataElementUse
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_ELEMENT_USE__UNASSIGNED_MEMBER:
 				return getUnassignedMember();
 			case tdlPackage.DATA_ELEMENT_USE__DATA_ELEMENT:
@@ -265,8 +455,7 @@ public class DataElementUseImpl extends DataUseImpl implements DataElementUse
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_ELEMENT_USE__UNASSIGNED_MEMBER:
 				setUnassignedMember((UnassignedMemberTreatment)newValue);
 				return;
@@ -289,8 +478,7 @@ public class DataElementUseImpl extends DataUseImpl implements DataElementUse
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_ELEMENT_USE__UNASSIGNED_MEMBER:
 				setUnassignedMember(UNASSIGNED_MEMBER_EDEFAULT);
 				return;
@@ -312,8 +500,7 @@ public class DataElementUseImpl extends DataUseImpl implements DataElementUse
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_ELEMENT_USE__UNASSIGNED_MEMBER:
 				return unassignedMember != UNASSIGNED_MEMBER_EDEFAULT;
 			case tdlPackage.DATA_ELEMENT_USE__DATA_ELEMENT:
@@ -332,10 +519,8 @@ public class DataElementUseImpl extends DataUseImpl implements DataElementUse
 	@Override
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass)
 	{
-		if (baseClass == DataUse.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == DataUse.class) {
+			switch (baseOperationID) {
 				case tdlPackage.DATA_USE___RESOLVE_DATA_TYPE: return tdlPackage.DATA_ELEMENT_USE___RESOLVE_DATA_TYPE;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
@@ -351,8 +536,7 @@ public class DataElementUseImpl extends DataUseImpl implements DataElementUse
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.DATA_ELEMENT_USE___RESOLVE_DATA_TYPE:
 				return resolveDataType();
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/DataInstanceImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/DataInstanceImpl.java
index cfdbfe285f6c8a8f27d83ff3e1b998d2e558287f..456422d0fddef60e693dab7b841d6806f2fcfcd7 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/DataInstanceImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/DataInstanceImpl.java
@@ -67,12 +67,10 @@ public abstract class DataInstanceImpl extends MappableDataElementImpl implement
 	@Override
 	public DataType getDataType()
 	{
-		if (dataType != null && dataType.eIsProxy())
-		{
+		if (dataType != null && dataType.eIsProxy()) {
 			InternalEObject oldDataType = (InternalEObject)dataType;
 			dataType = (DataType)eResolveProxy(oldDataType);
-			if (dataType != oldDataType)
-			{
+			if (dataType != oldDataType) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.DATA_INSTANCE__DATA_TYPE, oldDataType, dataType));
 			}
@@ -112,8 +110,7 @@ public abstract class DataInstanceImpl extends MappableDataElementImpl implement
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_INSTANCE__DATA_TYPE:
 				if (resolve) return getDataType();
 				return basicGetDataType();
@@ -129,8 +126,7 @@ public abstract class DataInstanceImpl extends MappableDataElementImpl implement
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_INSTANCE__DATA_TYPE:
 				setDataType((DataType)newValue);
 				return;
@@ -146,8 +142,7 @@ public abstract class DataInstanceImpl extends MappableDataElementImpl implement
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_INSTANCE__DATA_TYPE:
 				setDataType((DataType)null);
 				return;
@@ -163,8 +158,7 @@ public abstract class DataInstanceImpl extends MappableDataElementImpl implement
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_INSTANCE__DATA_TYPE:
 				return dataType != null;
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/DataInstanceUseImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/DataInstanceUseImpl.java
index c4827d9f707bd82888077af46e6e061c12a20770..64fd169d6de6e20b79101dcdf610669f38b72a2f 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/DataInstanceUseImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/DataInstanceUseImpl.java
@@ -10,10 +10,7 @@ import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
@@ -21,12 +18,28 @@ import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsTypeOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclIsTypeOfOperation;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
+import org.etsi.mts.tdl.CollectionDataInstance;
+import org.etsi.mts.tdl.CollectionDataType;
+import org.etsi.mts.tdl.DataElementUse;
 import org.etsi.mts.tdl.DataInstance;
 import org.etsi.mts.tdl.DataInstanceUse;
 import org.etsi.mts.tdl.DataType;
 import org.etsi.mts.tdl.DataUse;
+import org.etsi.mts.tdl.Element;
+import org.etsi.mts.tdl.Member;
+import org.etsi.mts.tdl.MemberAssignment;
+import org.etsi.mts.tdl.Parameter;
+import org.etsi.mts.tdl.ParameterBinding;
 import org.etsi.mts.tdl.UnassignedMemberTreatment;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -125,12 +138,10 @@ public class DataInstanceUseImpl extends StaticDataUseImpl implements DataInstan
 	@Override
 	public DataInstance getDataInstance()
 	{
-		if (dataInstance != null && dataInstance.eIsProxy())
-		{
+		if (dataInstance != null && dataInstance.eIsProxy()) {
 			InternalEObject oldDataInstance = (InternalEObject)dataInstance;
 			dataInstance = (DataInstance)eResolveProxy(oldDataInstance);
-			if (dataInstance != oldDataInstance)
-			{
+			if (dataInstance != oldDataInstance) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.DATA_INSTANCE_USE__DATA_INSTANCE, oldDataInstance, dataInstance));
 			}
@@ -195,12 +206,10 @@ public class DataInstanceUseImpl extends StaticDataUseImpl implements DataInstan
 	@Override
 	public DataType getDataType()
 	{
-		if (dataType != null && dataType.eIsProxy())
-		{
+		if (dataType != null && dataType.eIsProxy()) {
 			InternalEObject oldDataType = (InternalEObject)dataType;
 			dataType = (DataType)eResolveProxy(oldDataType);
-			if (dataType != oldDataType)
-			{
+			if (dataType != oldDataType) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.DATA_INSTANCE_USE__DATA_TYPE, oldDataType, dataType));
 			}
@@ -240,23 +249,12 @@ public class DataInstanceUseImpl extends StaticDataUseImpl implements DataInstan
 	@Override
 	public EList<DataUse> getItem()
 	{
-		if (item == null)
-		{
+		if (item == null) {
 			item = new EObjectContainmentEList<DataUse>(DataUse.class, this, tdlPackage.DATA_INSTANCE_USE__ITEM);
 		}
 		return item;
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #resolveDataType() <em>Resolve Data Type</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #resolveDataType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate RESOLVE_DATA_TYPE__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.DATA_INSTANCE_USE___RESOLVE_DATA_TYPE).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -265,14 +263,176 @@ public class DataInstanceUseImpl extends StaticDataUseImpl implements DataInstan
 	@Override
 	public DataType resolveDataType()
 	{
-		try
-		{
-			return (DataType)RESOLVE_DATA_TYPE__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if not self.dataInstance.oclIsUndefined()
+		 * then self.dataInstance.dataType
+		 * else
+		 *   if not self.dataType.oclIsUndefined()
+		 *   then self.dataType
+		 *   else
+		 *     if self.container().oclIsTypeOf(MemberAssignment)
+		 *     then
+		 *       self.container()
+		 *       .oclAsType(MemberAssignment).member.dataType
+		 *     else
+		 *       if self.container().oclIsTypeOf(ParameterBinding)
+		 *       then
+		 *         self.container()
+		 *         .oclAsType(ParameterBinding).parameter.dataType
+		 *       else
+		 *         if
+		 *           self.container()
+		 *           .oclIsTypeOf(CollectionDataInstance)
+		 *         then
+		 *           self.container()
+		 *           .oclAsType(CollectionDataInstance)
+		 *           .dataType.oclAsType(CollectionDataType).itemType
+		 *         else
+		 *           if self.container().oclIsTypeOf(DataElementUse)
+		 *           then
+		 *             self.container()
+		 *             .oclAsType(DataElementUse)
+		 *             .resolveDataType()
+		 *             .oclAsType(CollectionDataType).itemType
+		 *           else
+		 *             if self.container().oclIsTypeOf(DataInstanceUse)
+		 *             then
+		 *               self.container()
+		 *               .oclAsType(DataInstanceUse)
+		 *               .resolveDataType()
+		 *               .oclAsType(CollectionDataType).itemType
+		 *             else null
+		 *             endif
+		 *           endif
+		 *         endif
+		 *       endif
+		 *     endif
+		 *   endif
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ DataInstance dataInstance_0 = this.getDataInstance();
+		final /*@NonInvalid*/ boolean oclIsUndefined = dataInstance_0 == null;
+		final /*@NonInvalid*/ Boolean not;
+		if (!oclIsUndefined) {
+			not = ValueUtil.TRUE_VALUE;
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		else {
+			if (oclIsUndefined) {
+				not = ValueUtil.FALSE_VALUE;
+			}
+			else {
+				not = null;
+			}
+		}
+		if (not == null) {
+			throw new InvalidValueException("Null if condition");
+		}
+		/*@Thrown*/ DataType local_6;
+		if (not) {
+			if (dataInstance_0 == null) {
+				throw new InvalidValueException("Null source for \'\'http://www.etsi.org/spec/TDL/1.4.1\'::DataInstance::dataType\'");
+			}
+			final /*@Thrown*/ DataType dataType = dataInstance_0.getDataType();
+			local_6 = dataType;
+		}
+		else {
+			final /*@NonInvalid*/ DataType dataType_1 = this.getDataType();
+			final /*@NonInvalid*/ boolean oclIsUndefined_0 = dataType_1 == null;
+			final /*@NonInvalid*/ Boolean not_0;
+			if (!oclIsUndefined_0) {
+				not_0 = ValueUtil.TRUE_VALUE;
+			}
+			else {
+				if (oclIsUndefined_0) {
+					not_0 = ValueUtil.FALSE_VALUE;
+				}
+				else {
+					not_0 = null;
+				}
+			}
+			if (not_0 == null) {
+				throw new InvalidValueException("Null if condition");
+			}
+			/*@Thrown*/ DataType local_5;
+			if (not_0) {
+				local_5 = dataType_1;
+			}
+			else {
+				final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_MemberAssignment_0 = idResolver.getClass(tdlTables.CLSSid_MemberAssignment, null);
+				final /*@NonInvalid*/ Element container = this.container();
+				final /*@NonInvalid*/ boolean oclIsTypeOf = OclAnyOclIsTypeOfOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_MemberAssignment_0).booleanValue();
+				/*@Thrown*/ DataType local_4;
+				if (oclIsTypeOf) {
+					final /*@Thrown*/ MemberAssignment oclAsType = (MemberAssignment)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_MemberAssignment_0);
+					final /*@Thrown*/ Member member = oclAsType.getMember();
+					final /*@Thrown*/ DataType dataType_2 = member.getDataType();
+					local_4 = dataType_2;
+				}
+				else {
+					final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_ParameterBinding_0 = idResolver.getClass(tdlTables.CLSSid_ParameterBinding, null);
+					final /*@NonInvalid*/ boolean oclIsTypeOf_0 = OclAnyOclIsTypeOfOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_ParameterBinding_0).booleanValue();
+					/*@Thrown*/ DataType local_3;
+					if (oclIsTypeOf_0) {
+						final /*@Thrown*/ ParameterBinding oclAsType_0 = (ParameterBinding)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_ParameterBinding_0);
+						final /*@Thrown*/ Parameter parameter = oclAsType_0.getParameter();
+						final /*@Thrown*/ DataType dataType_3 = parameter.getDataType();
+						local_3 = dataType_3;
+					}
+					else {
+						final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_CollectionDataInstance_0 = idResolver.getClass(tdlTables.CLSSid_CollectionDataInstance, null);
+						final /*@NonInvalid*/ boolean oclIsTypeOf_1 = OclAnyOclIsTypeOfOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_CollectionDataInstance_0).booleanValue();
+						/*@Thrown*/ DataType local_2;
+						if (oclIsTypeOf_1) {
+							final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_CollectionDataType_0 = idResolver.getClass(tdlTables.CLSSid_CollectionDataType, null);
+							final /*@Thrown*/ CollectionDataInstance oclAsType_1 = (CollectionDataInstance)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_CollectionDataInstance_0);
+							final /*@Thrown*/ DataType dataType_4 = oclAsType_1.getDataType();
+							final /*@Thrown*/ CollectionDataType oclAsType_2 = (CollectionDataType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, dataType_4, TYP_tdl_c_c_CollectionDataType_0);
+							final /*@Thrown*/ DataType itemType = oclAsType_2.getItemType();
+							local_2 = itemType;
+						}
+						else {
+							final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_DataElementUse_0 = idResolver.getClass(tdlTables.CLSSid_DataElementUse, null);
+							final /*@NonInvalid*/ boolean oclIsTypeOf_2 = OclAnyOclIsTypeOfOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_DataElementUse_0).booleanValue();
+							/*@Thrown*/ DataType local_1;
+							if (oclIsTypeOf_2) {
+								final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_CollectionDataType_1 = idResolver.getClass(tdlTables.CLSSid_CollectionDataType, null);
+								final /*@Thrown*/ DataElementUse oclAsType_3 = (DataElementUse)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_DataElementUse_0);
+								final /*@Thrown*/ DataType resolveDataType = oclAsType_3.resolveDataType();
+								final /*@Thrown*/ CollectionDataType oclAsType_4 = (CollectionDataType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, resolveDataType, TYP_tdl_c_c_CollectionDataType_1);
+								final /*@Thrown*/ DataType itemType_0 = oclAsType_4.getItemType();
+								local_1 = itemType_0;
+							}
+							else {
+								final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_DataInstanceUse_0 = idResolver.getClass(tdlTables.CLSSid_DataInstanceUse, null);
+								final /*@NonInvalid*/ boolean oclIsTypeOf_3 = OclAnyOclIsTypeOfOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_DataInstanceUse_0).booleanValue();
+								/*@Thrown*/ DataType local_0;
+								if (oclIsTypeOf_3) {
+									final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_CollectionDataType_2 = idResolver.getClass(tdlTables.CLSSid_CollectionDataType, null);
+									final /*@Thrown*/ DataInstanceUse oclAsType_5 = (DataInstanceUse)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_DataInstanceUse_0);
+									final /*@Thrown*/ DataType resolveDataType_0 = oclAsType_5.resolveDataType();
+									final /*@Thrown*/ CollectionDataType oclAsType_6 = (CollectionDataType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, resolveDataType_0, TYP_tdl_c_c_CollectionDataType_2);
+									final /*@Thrown*/ DataType itemType_1 = oclAsType_6.getItemType();
+									local_0 = itemType_1;
+								}
+								else {
+									local_0 = null;
+								}
+								local_1 = local_0;
+							}
+							local_2 = local_1;
+						}
+						local_3 = local_2;
+					}
+					local_4 = local_3;
+				}
+				local_5 = local_4;
+			}
+			local_6 = local_5;
 		}
+		return local_6;
 	}
 
 	/**
@@ -283,8 +443,7 @@ public class DataInstanceUseImpl extends StaticDataUseImpl implements DataInstan
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_INSTANCE_USE__ITEM:
 				return ((InternalEList<?>)getItem()).basicRemove(otherEnd, msgs);
 		}
@@ -299,8 +458,7 @@ public class DataInstanceUseImpl extends StaticDataUseImpl implements DataInstan
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_INSTANCE_USE__DATA_INSTANCE:
 				if (resolve) return getDataInstance();
 				return basicGetDataInstance();
@@ -324,8 +482,7 @@ public class DataInstanceUseImpl extends StaticDataUseImpl implements DataInstan
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_INSTANCE_USE__DATA_INSTANCE:
 				setDataInstance((DataInstance)newValue);
 				return;
@@ -351,8 +508,7 @@ public class DataInstanceUseImpl extends StaticDataUseImpl implements DataInstan
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_INSTANCE_USE__DATA_INSTANCE:
 				setDataInstance((DataInstance)null);
 				return;
@@ -377,8 +533,7 @@ public class DataInstanceUseImpl extends StaticDataUseImpl implements DataInstan
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_INSTANCE_USE__DATA_INSTANCE:
 				return dataInstance != null;
 			case tdlPackage.DATA_INSTANCE_USE__UNASSIGNED_MEMBER:
@@ -399,10 +554,8 @@ public class DataInstanceUseImpl extends StaticDataUseImpl implements DataInstan
 	@Override
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass)
 	{
-		if (baseClass == DataUse.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == DataUse.class) {
+			switch (baseOperationID) {
 				case tdlPackage.DATA_USE___RESOLVE_DATA_TYPE: return tdlPackage.DATA_INSTANCE_USE___RESOLVE_DATA_TYPE;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
@@ -418,8 +571,7 @@ public class DataInstanceUseImpl extends StaticDataUseImpl implements DataInstan
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.DATA_INSTANCE_USE___RESOLVE_DATA_TYPE:
 				return resolveDataType();
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/DataResourceMappingImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/DataResourceMappingImpl.java
index 0322d595de92fdc39e3a65313b63c58adc77afb4..ae67a87f89a65c48a4f12cd638f8b051a8c89ac0 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/DataResourceMappingImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/DataResourceMappingImpl.java
@@ -100,8 +100,7 @@ public class DataResourceMappingImpl extends PackageableElementImpl implements D
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_RESOURCE_MAPPING__RESOURCE_URI:
 				return getResourceURI();
 		}
@@ -116,8 +115,7 @@ public class DataResourceMappingImpl extends PackageableElementImpl implements D
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_RESOURCE_MAPPING__RESOURCE_URI:
 				setResourceURI((String)newValue);
 				return;
@@ -133,8 +131,7 @@ public class DataResourceMappingImpl extends PackageableElementImpl implements D
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_RESOURCE_MAPPING__RESOURCE_URI:
 				setResourceURI(RESOURCE_URI_EDEFAULT);
 				return;
@@ -150,8 +147,7 @@ public class DataResourceMappingImpl extends PackageableElementImpl implements D
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_RESOURCE_MAPPING__RESOURCE_URI:
 				return RESOURCE_URI_EDEFAULT == null ? resourceURI != null : !RESOURCE_URI_EDEFAULT.equals(resourceURI);
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/DataTypeImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/DataTypeImpl.java
index 3c211afcfcdf8a1bcc6b49e321673e83a46183f8..d4dce3ac36517d88dd623d22c6492aa0b6608f58 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/DataTypeImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/DataTypeImpl.java
@@ -6,13 +6,11 @@ import java.lang.reflect.InvocationTargetException;
 
 import java.util.Collection;
 
+import java.util.List;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.util.EObjectContainmentEList;
@@ -76,23 +74,12 @@ public abstract class DataTypeImpl extends MappableDataElementImpl implements Da
 	@Override
 	public EList<Constraint> getConstraint()
 	{
-		if (constraint == null)
-		{
+		if (constraint == null) {
 			constraint = new EObjectContainmentEList<Constraint>(Constraint.class, this, tdlPackage.DATA_TYPE__CONSTRAINT);
 		}
 		return constraint;
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #allConstraints() <em>All Constraints</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #allConstraints()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate ALL_CONSTRAINTS__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.DATA_TYPE___ALL_CONSTRAINTS).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -102,14 +89,11 @@ public abstract class DataTypeImpl extends MappableDataElementImpl implements Da
 	@Override
 	public EList<Constraint> allConstraints()
 	{
-		try
-		{
-			return (EList<Constraint>)ALL_CONSTRAINTS__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
-		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
-		}
+		/**
+		 * self.constraint
+		 */
+		final /*@NonInvalid*/ List<Constraint> constraint = this.getConstraint();
+		return (EList<Constraint>)constraint;
 	}
 
 	/**
@@ -120,8 +104,7 @@ public abstract class DataTypeImpl extends MappableDataElementImpl implements Da
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_TYPE__CONSTRAINT:
 				return ((InternalEList<?>)getConstraint()).basicRemove(otherEnd, msgs);
 		}
@@ -136,8 +119,7 @@ public abstract class DataTypeImpl extends MappableDataElementImpl implements Da
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_TYPE__CONSTRAINT:
 				return getConstraint();
 		}
@@ -153,8 +135,7 @@ public abstract class DataTypeImpl extends MappableDataElementImpl implements Da
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_TYPE__CONSTRAINT:
 				getConstraint().clear();
 				getConstraint().addAll((Collection<? extends Constraint>)newValue);
@@ -171,8 +152,7 @@ public abstract class DataTypeImpl extends MappableDataElementImpl implements Da
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_TYPE__CONSTRAINT:
 				getConstraint().clear();
 				return;
@@ -188,8 +168,7 @@ public abstract class DataTypeImpl extends MappableDataElementImpl implements Da
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_TYPE__CONSTRAINT:
 				return constraint != null && !constraint.isEmpty();
 		}
@@ -204,8 +183,7 @@ public abstract class DataTypeImpl extends MappableDataElementImpl implements Da
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.DATA_TYPE___ALL_CONSTRAINTS:
 				return allConstraints();
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/DataUseImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/DataUseImpl.java
index fa8d2398d45b602506c986ab42903a9ffc9e056d..9c277e37f2444ee74c5fd252da1086456ec7c682 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/DataUseImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/DataUseImpl.java
@@ -6,23 +6,34 @@ import java.lang.reflect.InvocationTargetException;
 
 import java.util.Collection;
 
+import java.util.Iterator;
+import java.util.List;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsTypeOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclIsKindOfOperation;
+import org.eclipse.ocl.pivot.messages.PivotMessages;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
+import org.eclipse.ocl.pivot.values.OrderedSetValue;
+import org.etsi.mts.tdl.DataElementUse;
 import org.etsi.mts.tdl.DataType;
 import org.etsi.mts.tdl.DataUse;
 import org.etsi.mts.tdl.MemberReference;
+import org.etsi.mts.tdl.NamedElement;
 import org.etsi.mts.tdl.ParameterBinding;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -89,8 +100,7 @@ public abstract class DataUseImpl extends ElementImpl implements DataUse
 	@Override
 	public EList<ParameterBinding> getArgument()
 	{
-		if (argument == null)
-		{
+		if (argument == null) {
 			argument = new EObjectContainmentEList<ParameterBinding>(ParameterBinding.class, this, tdlPackage.DATA_USE__ARGUMENT);
 		}
 		return argument;
@@ -104,23 +114,12 @@ public abstract class DataUseImpl extends ElementImpl implements DataUse
 	@Override
 	public EList<MemberReference> getReduction()
 	{
-		if (reduction == null)
-		{
+		if (reduction == null) {
 			reduction = new EObjectContainmentEList<MemberReference>(MemberReference.class, this, tdlPackage.DATA_USE__REDUCTION);
 		}
 		return reduction;
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #resolveDataType() <em>Resolve Data Type</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #resolveDataType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate RESOLVE_DATA_TYPE__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.DATA_USE___RESOLVE_DATA_TYPE).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -129,26 +128,12 @@ public abstract class DataUseImpl extends ElementImpl implements DataUse
 	@Override
 	public DataType resolveDataType()
 	{
-		try
-		{
-			return (DataType)RESOLVE_DATA_TYPE__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
-		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
-		}
+		/**
+		 * null
+		 */
+		return null;
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #isEffectivelyStatic() <em>Is Effectively Static</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isEffectivelyStatic()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate IS_EFFECTIVELY_STATIC__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.DATA_USE___IS_EFFECTIVELY_STATIC).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -157,14 +142,223 @@ public abstract class DataUseImpl extends ElementImpl implements DataUse
 	@Override
 	public boolean isEffectivelyStatic()
 	{
-		try
-		{
-			return (Boolean)IS_EFFECTIVELY_STATIC__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * (
+		 *   self.oclIsKindOf(StaticDataUse) or
+		 *   self.oclIsKindOf(DataElementUse) and
+		 *   (
+		 *     self.oclAsType(DataElementUse)
+		 *     .dataElement.oclIsUndefined() or
+		 *     self.oclAsType(DataElementUse)
+		 *     .dataElement.oclIsKindOf(DataInstance) or
+		 *     self.oclAsType(DataElementUse)
+		 *     .dataElement.oclIsKindOf(DataType)
+		 *   )
+		 * ) and
+		 * self.argument->forAll(a | a.dataUse.isEffectivelyStatic())
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		/*@Caught*/ Object CAUGHT_or_1;
+		try {
+			final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_StaticDataUse_0 = idResolver.getClass(tdlTables.CLSSid_StaticDataUse, null);
+			final /*@NonInvalid*/ boolean oclIsKindOf = OclAnyOclIsKindOfOperation.INSTANCE.evaluate(executor, this, TYP_tdl_c_c_StaticDataUse_0).booleanValue();
+			final /*@Thrown*/ Boolean or_1;
+			if (oclIsKindOf) {
+				or_1 = ValueUtil.TRUE_VALUE;
+			}
+			else {
+				/*@Caught*/ Object CAUGHT_and;
+				try {
+					final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_DataElementUse_0 = idResolver.getClass(tdlTables.CLSSid_DataElementUse, null);
+					final /*@NonInvalid*/ boolean oclIsKindOf_0 = OclAnyOclIsKindOfOperation.INSTANCE.evaluate(executor, this, TYP_tdl_c_c_DataElementUse_0).booleanValue();
+					final /*@Thrown*/ Boolean and;
+					if (!oclIsKindOf_0) {
+						and = ValueUtil.FALSE_VALUE;
+					}
+					else {
+						/*@Caught*/ Object CAUGHT_or_0;
+						try {
+							/*@Caught*/ Object CAUGHT_or;
+							try {
+								/*@Caught*/ Object CAUGHT_dataElement;
+								try {
+									final /*@Thrown*/ DataElementUse oclAsType = (DataElementUse)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, this, TYP_tdl_c_c_DataElementUse_0);
+									final /*@Thrown*/ NamedElement dataElement = oclAsType.getDataElement();
+									CAUGHT_dataElement = dataElement;
+								}
+								catch (Exception e) {
+									CAUGHT_dataElement = ValueUtil.createInvalidValue(e);
+								}
+								final /*@NonInvalid*/ boolean oclIsUndefined = (CAUGHT_dataElement == null) || (CAUGHT_dataElement instanceof InvalidValueException);
+								final /*@Thrown*/ Boolean or;
+								if (oclIsUndefined) {
+									or = ValueUtil.TRUE_VALUE;
+								}
+								else {
+									/*@Caught*/ Object CAUGHT_oclIsKindOf_1;
+									try {
+										final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_DataInstance_0 = idResolver.getClass(tdlTables.CLSSid_DataInstance, null);
+										final /*@Thrown*/ DataElementUse oclAsType_0 = (DataElementUse)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, this, TYP_tdl_c_c_DataElementUse_0);
+										final /*@Thrown*/ NamedElement dataElement_0 = oclAsType_0.getDataElement();
+										final /*@Thrown*/ boolean oclIsKindOf_1 = OclAnyOclIsKindOfOperation.INSTANCE.evaluate(executor, dataElement_0, TYP_tdl_c_c_DataInstance_0).booleanValue();
+										CAUGHT_oclIsKindOf_1 = oclIsKindOf_1;
+									}
+									catch (Exception e) {
+										CAUGHT_oclIsKindOf_1 = ValueUtil.createInvalidValue(e);
+									}
+									if (CAUGHT_oclIsKindOf_1 == ValueUtil.TRUE_VALUE) {
+										or = ValueUtil.TRUE_VALUE;
+									}
+									else {
+										if (CAUGHT_oclIsKindOf_1 instanceof InvalidValueException) {
+											throw (InvalidValueException)CAUGHT_oclIsKindOf_1;
+										}
+										or = ValueUtil.FALSE_VALUE;
+									}
+								}
+								CAUGHT_or = or;
+							}
+							catch (Exception e) {
+								CAUGHT_or = ValueUtil.createInvalidValue(e);
+							}
+							final /*@Thrown*/ Boolean or_0;
+							if (CAUGHT_or == ValueUtil.TRUE_VALUE) {
+								or_0 = ValueUtil.TRUE_VALUE;
+							}
+							else {
+								/*@Caught*/ Object CAUGHT_oclIsKindOf_2;
+								try {
+									final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_DataType_0 = idResolver.getClass(tdlTables.CLSSid_DataType, null);
+									final /*@Thrown*/ DataElementUse oclAsType_1 = (DataElementUse)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, this, TYP_tdl_c_c_DataElementUse_0);
+									final /*@Thrown*/ NamedElement dataElement_1 = oclAsType_1.getDataElement();
+									final /*@Thrown*/ boolean oclIsKindOf_2 = OclAnyOclIsKindOfOperation.INSTANCE.evaluate(executor, dataElement_1, TYP_tdl_c_c_DataType_0).booleanValue();
+									CAUGHT_oclIsKindOf_2 = oclIsKindOf_2;
+								}
+								catch (Exception e) {
+									CAUGHT_oclIsKindOf_2 = ValueUtil.createInvalidValue(e);
+								}
+								if (CAUGHT_oclIsKindOf_2 == ValueUtil.TRUE_VALUE) {
+									or_0 = ValueUtil.TRUE_VALUE;
+								}
+								else {
+									if (CAUGHT_or instanceof InvalidValueException) {
+										throw (InvalidValueException)CAUGHT_or;
+									}
+									if (CAUGHT_oclIsKindOf_2 instanceof InvalidValueException) {
+										throw (InvalidValueException)CAUGHT_oclIsKindOf_2;
+									}
+									if (CAUGHT_or == null) {
+										or_0 = null;
+									}
+									else {
+										or_0 = ValueUtil.FALSE_VALUE;
+									}
+								}
+							}
+							CAUGHT_or_0 = or_0;
+						}
+						catch (Exception e) {
+							CAUGHT_or_0 = ValueUtil.createInvalidValue(e);
+						}
+						if (CAUGHT_or_0 == ValueUtil.FALSE_VALUE) {
+							and = ValueUtil.FALSE_VALUE;
+						}
+						else {
+							if (CAUGHT_or_0 instanceof InvalidValueException) {
+								throw (InvalidValueException)CAUGHT_or_0;
+							}
+							if (CAUGHT_or_0 == null) {
+								and = null;
+							}
+							else {
+								and = ValueUtil.TRUE_VALUE;
+							}
+						}
+					}
+					CAUGHT_and = and;
+				}
+				catch (Exception e) {
+					CAUGHT_and = ValueUtil.createInvalidValue(e);
+				}
+				if (CAUGHT_and == ValueUtil.TRUE_VALUE) {
+					or_1 = ValueUtil.TRUE_VALUE;
+				}
+				else {
+					if (CAUGHT_and instanceof InvalidValueException) {
+						throw (InvalidValueException)CAUGHT_and;
+					}
+					if (CAUGHT_and == null) {
+						or_1 = null;
+					}
+					else {
+						or_1 = ValueUtil.FALSE_VALUE;
+					}
+				}
+			}
+			CAUGHT_or_1 = or_1;
+		}
+		catch (Exception e) {
+			CAUGHT_or_1 = ValueUtil.createInvalidValue(e);
+		}
+		final /*@Thrown*/ Boolean and_0;
+		if (CAUGHT_or_1 == ValueUtil.FALSE_VALUE) {
+			and_0 = ValueUtil.FALSE_VALUE;
+		}
+		else {
+			final /*@NonInvalid*/ List<ParameterBinding> argument = this.getArgument();
+			final /*@NonInvalid*/ OrderedSetValue BOXED_argument = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_ParameterBinding, argument);
+			/*@Thrown*/ Object accumulator = ValueUtil.TRUE_VALUE;
+			Iterator<Object> ITERATOR_a = BOXED_argument.iterator();
+			/*@NonInvalid*/ Boolean forAll;
+			while (true) {
+				if (!ITERATOR_a.hasNext()) {
+					if (accumulator == ValueUtil.TRUE_VALUE) {
+						forAll = ValueUtil.TRUE_VALUE;
+					}
+					else {
+						throw (InvalidValueException)accumulator;
+					}
+					break;
+				}
+				/*@NonInvalid*/ ParameterBinding a = (ParameterBinding)ITERATOR_a.next();
+				/**
+				 * a.dataUse.isEffectivelyStatic()
+				 */
+				final /*@NonInvalid*/ DataUse dataUse = a.getDataUse();
+				final /*@NonInvalid*/ boolean isEffectivelyStatic = dataUse.isEffectivelyStatic();
+				//
+				if (!isEffectivelyStatic) {					// Normal unsuccessful body evaluation result
+					forAll = ValueUtil.FALSE_VALUE;
+					break;														// Stop immediately
+				}
+				else if (isEffectivelyStatic) {				// Normal successful body evaluation result
+					;															// Carry on
+				}
+				else {															// Impossible badly typed result
+					accumulator = new InvalidValueException(PivotMessages.NonBooleanBody, "forAll");
+				}
+			}
+			if (forAll == ValueUtil.FALSE_VALUE) {
+				and_0 = ValueUtil.FALSE_VALUE;
+			}
+			else {
+				if (CAUGHT_or_1 instanceof InvalidValueException) {
+					throw (InvalidValueException)CAUGHT_or_1;
+				}
+				if ((CAUGHT_or_1 == null) || (forAll == null)) {
+					and_0 = null;
+				}
+				else {
+					and_0 = ValueUtil.TRUE_VALUE;
+				}
+			}
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		if (and_0 == null) {
+			throw new InvalidValueException("Null body for \'tdl::DataUse::isEffectivelyStatic() : Boolean[1]\'");
 		}
+		return and_0;
 	}
 
 	/**
@@ -175,8 +369,7 @@ public abstract class DataUseImpl extends ElementImpl implements DataUse
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_USE__ARGUMENT:
 				return ((InternalEList<?>)getArgument()).basicRemove(otherEnd, msgs);
 			case tdlPackage.DATA_USE__REDUCTION:
@@ -193,8 +386,7 @@ public abstract class DataUseImpl extends ElementImpl implements DataUse
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_USE__ARGUMENT:
 				return getArgument();
 			case tdlPackage.DATA_USE__REDUCTION:
@@ -212,8 +404,7 @@ public abstract class DataUseImpl extends ElementImpl implements DataUse
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_USE__ARGUMENT:
 				getArgument().clear();
 				getArgument().addAll((Collection<? extends ParameterBinding>)newValue);
@@ -234,8 +425,7 @@ public abstract class DataUseImpl extends ElementImpl implements DataUse
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_USE__ARGUMENT:
 				getArgument().clear();
 				return;
@@ -254,8 +444,7 @@ public abstract class DataUseImpl extends ElementImpl implements DataUse
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.DATA_USE__ARGUMENT:
 				return argument != null && !argument.isEmpty();
 			case tdlPackage.DATA_USE__REDUCTION:
@@ -272,8 +461,7 @@ public abstract class DataUseImpl extends ElementImpl implements DataUse
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.DATA_USE___RESOLVE_DATA_TYPE:
 				return resolveDataType();
 			case tdlPackage.DATA_USE___IS_EFFECTIVELY_STATIC:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ElementImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ElementImpl.java
index 7fc7e9468e41efc136a943e5f60df64f0bc13f1e..8722d63f0bc97aaf87eb33a46c8d32e22c866d47 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ElementImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ElementImpl.java
@@ -10,10 +10,7 @@ import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
@@ -22,11 +19,20 @@ import org.eclipse.emf.ecore.impl.EObjectImpl;
 import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.library.classifier.ClassifierOclContainerOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsTypeOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclIsKindOfOperation;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
 import org.etsi.mts.tdl.Annotation;
 import org.etsi.mts.tdl.Comment;
 import org.etsi.mts.tdl.Element;
 import org.etsi.mts.tdl.TestDescription;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -114,8 +120,7 @@ public abstract class ElementImpl extends EObjectImpl implements Element
 	@Override
 	public EList<Comment> getComment()
 	{
-		if (comment == null)
-		{
+		if (comment == null) {
 			comment = new EObjectContainmentWithInverseEList<Comment>(Comment.class, this, tdlPackage.ELEMENT__COMMENT, tdlPackage.COMMENT__COMMENTED_ELEMENT);
 		}
 		return comment;
@@ -129,8 +134,7 @@ public abstract class ElementImpl extends EObjectImpl implements Element
 	@Override
 	public EList<Annotation> getAnnotation()
 	{
-		if (annotation == null)
-		{
+		if (annotation == null) {
 			annotation = new EObjectContainmentWithInverseEList<Annotation>(Annotation.class, this, tdlPackage.ELEMENT__ANNOTATION, tdlPackage.ANNOTATION__ANNOTATED_ELEMENT);
 		}
 		return annotation;
@@ -161,16 +165,6 @@ public abstract class ElementImpl extends EObjectImpl implements Element
 			eNotify(new ENotificationImpl(this, Notification.SET, tdlPackage.ELEMENT__NAME, oldName, name));
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #container() <em>Container</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #container()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate CONTAINER__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.ELEMENT___CONTAINER).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -179,26 +173,44 @@ public abstract class ElementImpl extends EObjectImpl implements Element
 	@Override
 	public Element container()
 	{
-		try
-		{
-			return (Element)CONTAINER__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if not self.oclContainer().oclIsUndefined()
+		 * then self.oclContainer().oclAsType(Element)
+		 * else null
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ Object oclContainer_0 = ClassifierOclContainerOperation.INSTANCE.evaluate(executor, this);
+		final /*@NonInvalid*/ boolean oclIsUndefined = oclContainer_0 == null;
+		final /*@NonInvalid*/ Boolean not;
+		if (!oclIsUndefined) {
+			not = ValueUtil.TRUE_VALUE;
+		}
+		else {
+			if (oclIsUndefined) {
+				not = ValueUtil.FALSE_VALUE;
+			}
+			else {
+				not = null;
+			}
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		if (not == null) {
+			throw new InvalidValueException("Null if condition");
 		}
+		/*@Thrown*/ Element local_0;
+		if (not) {
+			final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_Element_0 = idResolver.getClass(tdlTables.CLSSid_Element, null);
+			final /*@Thrown*/ Element oclAsType = (Element)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, oclContainer_0, TYP_tdl_c_c_Element_0);
+			local_0 = oclAsType;
+		}
+		else {
+			local_0 = null;
+		}
+		return local_0;
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #getParentTestDescription() <em>Get Parent Test Description</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getParentTestDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate GET_PARENT_TEST_DESCRIPTION__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.ELEMENT___GET_PARENT_TEST_DESCRIPTION).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -207,14 +219,41 @@ public abstract class ElementImpl extends EObjectImpl implements Element
 	@Override
 	public TestDescription getParentTestDescription()
 	{
-		try
-		{
-			return (TestDescription)GET_PARENT_TEST_DESCRIPTION__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if self.oclContainer().oclIsUndefined()
+		 * then null
+		 * else
+		 *   if self.container().oclIsKindOf(TestDescription)
+		 *   then self.container().oclAsType(TestDescription)
+		 *   else self.container().getParentTestDescription()
+		 *   endif
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ Object oclContainer = ClassifierOclContainerOperation.INSTANCE.evaluate(executor, this);
+		final /*@NonInvalid*/ boolean oclIsUndefined = oclContainer == null;
+		/*@Thrown*/ TestDescription local_1;
+		if (oclIsUndefined) {
+			local_1 = null;
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		else {
+			final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_TestDescription_1 = idResolver.getClass(tdlTables.CLSSid_TestDescription, null);
+			final /*@NonInvalid*/ Element container_0 = this.container();
+			final /*@NonInvalid*/ boolean oclIsKindOf = OclAnyOclIsKindOfOperation.INSTANCE.evaluate(executor, container_0, TYP_tdl_c_c_TestDescription_1).booleanValue();
+			/*@Thrown*/ TestDescription local_0;
+			if (oclIsKindOf) {
+				final /*@Thrown*/ TestDescription oclAsType = (TestDescription)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, container_0, TYP_tdl_c_c_TestDescription_1);
+				local_0 = oclAsType;
+			}
+			else {
+				final /*@NonInvalid*/ TestDescription getParentTestDescription = container_0.getParentTestDescription();
+				local_0 = getParentTestDescription;
+			}
+			local_1 = local_0;
 		}
+		return local_1;
 	}
 
 	/**
@@ -226,8 +265,7 @@ public abstract class ElementImpl extends EObjectImpl implements Element
 	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ELEMENT__COMMENT:
 				return ((InternalEList<InternalEObject>)(InternalEList<?>)getComment()).basicAdd(otherEnd, msgs);
 			case tdlPackage.ELEMENT__ANNOTATION:
@@ -244,8 +282,7 @@ public abstract class ElementImpl extends EObjectImpl implements Element
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ELEMENT__COMMENT:
 				return ((InternalEList<?>)getComment()).basicRemove(otherEnd, msgs);
 			case tdlPackage.ELEMENT__ANNOTATION:
@@ -262,8 +299,7 @@ public abstract class ElementImpl extends EObjectImpl implements Element
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ELEMENT__COMMENT:
 				return getComment();
 			case tdlPackage.ELEMENT__ANNOTATION:
@@ -283,8 +319,7 @@ public abstract class ElementImpl extends EObjectImpl implements Element
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ELEMENT__COMMENT:
 				getComment().clear();
 				getComment().addAll((Collection<? extends Comment>)newValue);
@@ -308,8 +343,7 @@ public abstract class ElementImpl extends EObjectImpl implements Element
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ELEMENT__COMMENT:
 				getComment().clear();
 				return;
@@ -331,8 +365,7 @@ public abstract class ElementImpl extends EObjectImpl implements Element
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ELEMENT__COMMENT:
 				return comment != null && !comment.isEmpty();
 			case tdlPackage.ELEMENT__ANNOTATION:
@@ -351,8 +384,7 @@ public abstract class ElementImpl extends EObjectImpl implements Element
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.ELEMENT___CONTAINER:
 				return container();
 			case tdlPackage.ELEMENT___GET_PARENT_TEST_DESCRIPTION:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ElementImportImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ElementImportImpl.java
index a93be675395c160a45ea3cb932469e2c3cb6f928..5e0be94e478b88b229bd25a2bdc62d838ceb0e4b 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ElementImportImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ElementImportImpl.java
@@ -84,8 +84,7 @@ public class ElementImportImpl extends ElementImpl implements ElementImport
 	@Override
 	public EList<PackageableElement> getImportedElement()
 	{
-		if (importedElement == null)
-		{
+		if (importedElement == null) {
 			importedElement = new EObjectResolvingEList<PackageableElement>(PackageableElement.class, this, tdlPackage.ELEMENT_IMPORT__IMPORTED_ELEMENT);
 		}
 		return importedElement;
@@ -99,12 +98,10 @@ public class ElementImportImpl extends ElementImpl implements ElementImport
 	@Override
 	public org.etsi.mts.tdl.Package getImportedPackage()
 	{
-		if (importedPackage != null && importedPackage.eIsProxy())
-		{
+		if (importedPackage != null && importedPackage.eIsProxy()) {
 			InternalEObject oldImportedPackage = (InternalEObject)importedPackage;
 			importedPackage = (org.etsi.mts.tdl.Package)eResolveProxy(oldImportedPackage);
-			if (importedPackage != oldImportedPackage)
-			{
+			if (importedPackage != oldImportedPackage) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.ELEMENT_IMPORT__IMPORTED_PACKAGE, oldImportedPackage, importedPackage));
 			}
@@ -144,8 +141,7 @@ public class ElementImportImpl extends ElementImpl implements ElementImport
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ELEMENT_IMPORT__IMPORTED_ELEMENT:
 				return getImportedElement();
 			case tdlPackage.ELEMENT_IMPORT__IMPORTED_PACKAGE:
@@ -164,8 +160,7 @@ public class ElementImportImpl extends ElementImpl implements ElementImport
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ELEMENT_IMPORT__IMPORTED_ELEMENT:
 				getImportedElement().clear();
 				getImportedElement().addAll((Collection<? extends PackageableElement>)newValue);
@@ -185,8 +180,7 @@ public class ElementImportImpl extends ElementImpl implements ElementImport
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ELEMENT_IMPORT__IMPORTED_ELEMENT:
 				getImportedElement().clear();
 				return;
@@ -205,8 +199,7 @@ public class ElementImportImpl extends ElementImpl implements ElementImport
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ELEMENT_IMPORT__IMPORTED_ELEMENT:
 				return importedElement != null && !importedElement.isEmpty();
 			case tdlPackage.ELEMENT_IMPORT__IMPORTED_PACKAGE:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/EnumDataTypeImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/EnumDataTypeImpl.java
index 8ec7295aad4a3347ee4956a6e8bf278ef036f711..b8731c414b8286854da96b7d0c32e1cc67fcb614 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/EnumDataTypeImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/EnumDataTypeImpl.java
@@ -72,8 +72,7 @@ public class EnumDataTypeImpl extends SimpleDataTypeImpl implements EnumDataType
 	@Override
 	public EList<SimpleDataInstance> getValue()
 	{
-		if (value == null)
-		{
+		if (value == null) {
 			value = new EObjectContainmentEList<SimpleDataInstance>(SimpleDataInstance.class, this, tdlPackage.ENUM_DATA_TYPE__VALUE);
 		}
 		return value;
@@ -87,8 +86,7 @@ public class EnumDataTypeImpl extends SimpleDataTypeImpl implements EnumDataType
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ENUM_DATA_TYPE__VALUE:
 				return ((InternalEList<?>)getValue()).basicRemove(otherEnd, msgs);
 		}
@@ -103,8 +101,7 @@ public class EnumDataTypeImpl extends SimpleDataTypeImpl implements EnumDataType
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ENUM_DATA_TYPE__VALUE:
 				return getValue();
 		}
@@ -120,8 +117,7 @@ public class EnumDataTypeImpl extends SimpleDataTypeImpl implements EnumDataType
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ENUM_DATA_TYPE__VALUE:
 				getValue().clear();
 				getValue().addAll((Collection<? extends SimpleDataInstance>)newValue);
@@ -138,8 +134,7 @@ public class EnumDataTypeImpl extends SimpleDataTypeImpl implements EnumDataType
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ENUM_DATA_TYPE__VALUE:
 				getValue().clear();
 				return;
@@ -155,8 +150,7 @@ public class EnumDataTypeImpl extends SimpleDataTypeImpl implements EnumDataType
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.ENUM_DATA_TYPE__VALUE:
 				return value != null && !value.isEmpty();
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ExceptionalBehaviourImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ExceptionalBehaviourImpl.java
index c4c703c209f503ab123f6066b4b0f04c3f319dc2..c2705794bc50bfd86ffc567873a1b7cf319ebdd9 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ExceptionalBehaviourImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ExceptionalBehaviourImpl.java
@@ -4,23 +4,36 @@ package org.etsi.mts.tdl.impl;
 
 import java.lang.reflect.InvocationTargetException;
 
+import java.util.Iterator;
+import java.util.List;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.ids.IdResolver.IdResolverExtension;
+import org.eclipse.ocl.pivot.library.collection.CollectionAsOrderedSetOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsSetOperation;
+import org.eclipse.ocl.pivot.messages.PivotMessages;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
+import org.eclipse.ocl.pivot.values.OrderedSetValue;
+import org.eclipse.ocl.pivot.values.SetValue;
 import org.etsi.mts.tdl.Behaviour;
 import org.etsi.mts.tdl.Block;
 import org.etsi.mts.tdl.ComponentInstance;
 import org.etsi.mts.tdl.ExceptionalBehaviour;
+import org.etsi.mts.tdl.TestConfiguration;
+import org.etsi.mts.tdl.TestDescription;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -99,8 +112,7 @@ public abstract class ExceptionalBehaviourImpl extends BehaviourImpl implements
 	{
 		Block oldBlock = block;
 		block = newBlock;
-		if (eNotificationRequired())
-		{
+		if (eNotificationRequired()) {
 			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, tdlPackage.EXCEPTIONAL_BEHAVIOUR__BLOCK, oldBlock, newBlock);
 			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
@@ -115,8 +127,7 @@ public abstract class ExceptionalBehaviourImpl extends BehaviourImpl implements
 	@Override
 	public void setBlock(Block newBlock)
 	{
-		if (newBlock != block)
-		{
+		if (newBlock != block) {
 			NotificationChain msgs = null;
 			if (block != null)
 				msgs = ((InternalEObject)block).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - tdlPackage.EXCEPTIONAL_BEHAVIOUR__BLOCK, null, msgs);
@@ -137,12 +148,10 @@ public abstract class ExceptionalBehaviourImpl extends BehaviourImpl implements
 	@Override
 	public ComponentInstance getGuardedComponent()
 	{
-		if (guardedComponent != null && guardedComponent.eIsProxy())
-		{
+		if (guardedComponent != null && guardedComponent.eIsProxy()) {
 			InternalEObject oldGuardedComponent = (InternalEObject)guardedComponent;
 			guardedComponent = (ComponentInstance)eResolveProxy(oldGuardedComponent);
-			if (guardedComponent != oldGuardedComponent)
-			{
+			if (guardedComponent != oldGuardedComponent) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.EXCEPTIONAL_BEHAVIOUR__GUARDED_COMPONENT, oldGuardedComponent, guardedComponent));
 			}
@@ -174,16 +183,6 @@ public abstract class ExceptionalBehaviourImpl extends BehaviourImpl implements
 			eNotify(new ENotificationImpl(this, Notification.SET, tdlPackage.EXCEPTIONAL_BEHAVIOUR__GUARDED_COMPONENT, oldGuardedComponent, guardedComponent));
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #getParticipatingComponents() <em>Get Participating Components</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getParticipatingComponents()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate GET_PARTICIPATING_COMPONENTS__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.EXCEPTIONAL_BEHAVIOUR___GET_PARTICIPATING_COMPONENTS).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -193,14 +192,71 @@ public abstract class ExceptionalBehaviourImpl extends BehaviourImpl implements
 	@Override
 	public EList<ComponentInstance> getParticipatingComponents()
 	{
-		try
-		{
-			return (EList<ComponentInstance>)GET_PARTICIPATING_COMPONENTS__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if
+		 *   self.getParentTestDescription()
+		 *   ->exists(td | td.isLocallyOrdered)
+		 * then self.block.getParticipatingComponents()->asOrderedSet()
+		 * else
+		 *   self.getParentTestDescription()
+		 *   .testConfiguration.componentInstance->asOrderedSet()
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ TestDescription getParentTestDescription = this.getParentTestDescription();
+		final /*@NonInvalid*/ SetValue oclAsSet = OclAnyOclAsSetOperation.INSTANCE.evaluate(executor, tdlTables.SET_CLSSid_TestDescription, getParentTestDescription);
+		/*@Thrown*/ Object accumulator = ValueUtil.FALSE_VALUE;
+		Iterator<Object> ITERATOR_td = oclAsSet.iterator();
+		/*@NonInvalid*/ Boolean exists;
+		while (true) {
+			if (!ITERATOR_td.hasNext()) {
+				if (accumulator == ValueUtil.FALSE_VALUE) {
+					exists = ValueUtil.FALSE_VALUE;
+				}
+				else {
+					throw (InvalidValueException)accumulator;
+				}
+				break;
+			}
+			/*@NonInvalid*/ TestDescription td = (TestDescription)ITERATOR_td.next();
+			/**
+			 * td.isLocallyOrdered
+			 */
+			final /*@NonInvalid*/ boolean isLocallyOrdered = td.isIsLocallyOrdered();
+			//
+			if (isLocallyOrdered) {					// Normal successful body evaluation result
+				exists = ValueUtil.TRUE_VALUE;
+				break;														// Stop immediately
+			}
+			else if (!isLocallyOrdered) {				// Normal unsuccessful body evaluation result
+				;															// Carry on
+			}
+			else {															// Impossible badly typed result
+				accumulator = new InvalidValueException(PivotMessages.NonBooleanBody, "exists");
+			}
+		}
+		if (exists == null) {
+			throw new InvalidValueException("Null if condition");
+		}
+		/*@NonInvalid*/ OrderedSetValue local_0;
+		if (exists) {
+			final /*@NonInvalid*/ Block block = this.getBlock();
+			final /*@NonInvalid*/ List<ComponentInstance> getParticipatingComponents = block.getParticipatingComponents();
+			final /*@NonInvalid*/ OrderedSetValue BOXED_getParticipatingComponents = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_ComponentInstance, getParticipatingComponents);
+			final /*@NonInvalid*/ OrderedSetValue asOrderedSet = CollectionAsOrderedSetOperation.INSTANCE.evaluate(BOXED_getParticipatingComponents);
+			local_0 = asOrderedSet;
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		else {
+			final /*@NonInvalid*/ TestConfiguration testConfiguration = getParentTestDescription.getTestConfiguration();
+			final /*@NonInvalid*/ List<ComponentInstance> componentInstance = testConfiguration.getComponentInstance();
+			final /*@NonInvalid*/ SetValue BOXED_componentInstance = idResolver.createSetOfAll(tdlTables.SET_CLSSid_ComponentInstance, componentInstance);
+			final /*@NonInvalid*/ OrderedSetValue asOrderedSet_0 = CollectionAsOrderedSetOperation.INSTANCE.evaluate(BOXED_componentInstance);
+			local_0 = asOrderedSet_0;
 		}
+		final /*@NonInvalid*/ List<ComponentInstance> ECORE_local_0 = ((IdResolverExtension)idResolver).ecoreValueOfAll(ComponentInstance.class, local_0);
+		return (EList<ComponentInstance>)ECORE_local_0;
 	}
 
 	/**
@@ -211,8 +267,7 @@ public abstract class ExceptionalBehaviourImpl extends BehaviourImpl implements
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.EXCEPTIONAL_BEHAVIOUR__BLOCK:
 				return basicSetBlock(null, msgs);
 		}
@@ -227,8 +282,7 @@ public abstract class ExceptionalBehaviourImpl extends BehaviourImpl implements
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.EXCEPTIONAL_BEHAVIOUR__BLOCK:
 				return getBlock();
 			case tdlPackage.EXCEPTIONAL_BEHAVIOUR__GUARDED_COMPONENT:
@@ -246,8 +300,7 @@ public abstract class ExceptionalBehaviourImpl extends BehaviourImpl implements
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.EXCEPTIONAL_BEHAVIOUR__BLOCK:
 				setBlock((Block)newValue);
 				return;
@@ -266,8 +319,7 @@ public abstract class ExceptionalBehaviourImpl extends BehaviourImpl implements
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.EXCEPTIONAL_BEHAVIOUR__BLOCK:
 				setBlock((Block)null);
 				return;
@@ -286,8 +338,7 @@ public abstract class ExceptionalBehaviourImpl extends BehaviourImpl implements
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.EXCEPTIONAL_BEHAVIOUR__BLOCK:
 				return block != null;
 			case tdlPackage.EXCEPTIONAL_BEHAVIOUR__GUARDED_COMPONENT:
@@ -304,10 +355,8 @@ public abstract class ExceptionalBehaviourImpl extends BehaviourImpl implements
 	@Override
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass)
 	{
-		if (baseClass == Behaviour.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == Behaviour.class) {
+			switch (baseOperationID) {
 				case tdlPackage.BEHAVIOUR___GET_PARTICIPATING_COMPONENTS: return tdlPackage.EXCEPTIONAL_BEHAVIOUR___GET_PARTICIPATING_COMPONENTS;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
@@ -323,8 +372,7 @@ public abstract class ExceptionalBehaviourImpl extends BehaviourImpl implements
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.EXCEPTIONAL_BEHAVIOUR___GET_PARTICIPATING_COMPONENTS:
 				return getParticipatingComponents();
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ExtensionImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ExtensionImpl.java
index 7e957109741dd720caab72da5dfadaf2d8edcb3c..8be8f0ea5665a8d84a1d8fea89f1dbec07102e2e 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ExtensionImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ExtensionImpl.java
@@ -4,21 +4,41 @@ package org.etsi.mts.tdl.impl;
 
 import java.lang.reflect.InvocationTargetException;
 
+import java.util.List;
 import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.BasicEList;
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.ocl.pivot.StandardLibrary;
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.ids.IdResolver.IdResolverExtension;
+import org.eclipse.ocl.pivot.ids.TypeId;
+import org.eclipse.ocl.pivot.internal.library.executor.ExecutorSingleIterationManager;
+import org.eclipse.ocl.pivot.library.AbstractBinaryOperation;
+import org.eclipse.ocl.pivot.library.LibraryIteration.LibraryIterationExtension;
+import org.eclipse.ocl.pivot.library.collection.CollectionIncludesOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsSetOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsTypeOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclIsKindOfOperation;
+import org.eclipse.ocl.pivot.oclstdlib.OCLstdlibTables;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
+import org.eclipse.ocl.pivot.values.OrderedSetValue;
+import org.eclipse.ocl.pivot.values.SetValue;
+import org.etsi.mts.tdl.AnnotationType;
+import org.etsi.mts.tdl.ComponentType;
 import org.etsi.mts.tdl.Extension;
+import org.etsi.mts.tdl.GateType;
 import org.etsi.mts.tdl.PackageableElement;
+import org.etsi.mts.tdl.SimpleDataType;
+import org.etsi.mts.tdl.StructuredDataType;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -74,12 +94,10 @@ public class ExtensionImpl extends ElementImpl implements Extension
 	@Override
 	public PackageableElement getExtending()
 	{
-		if (extending != null && extending.eIsProxy())
-		{
+		if (extending != null && extending.eIsProxy()) {
 			InternalEObject oldExtending = (InternalEObject)extending;
 			extending = (PackageableElement)eResolveProxy(oldExtending);
-			if (extending != oldExtending)
-			{
+			if (extending != oldExtending) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.EXTENSION__EXTENDING, oldExtending, extending));
 			}
@@ -111,16 +129,6 @@ public class ExtensionImpl extends ElementImpl implements Extension
 			eNotify(new ENotificationImpl(this, Notification.SET, tdlPackage.EXTENSION__EXTENDING, oldExtending, extending));
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #transitiveExtending() <em>Transitive Extending</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #transitiveExtending()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate TRANSITIVE_EXTENDING__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.EXTENSION___TRANSITIVE_EXTENDING).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -130,42 +138,170 @@ public class ExtensionImpl extends ElementImpl implements Extension
 	@Override
 	public EList<Extension> transitiveExtending()
 	{
-		try
-		{
-			return (EList<Extension>)TRANSITIVE_EXTENDING__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if self.extending.oclIsKindOf(AnnotationType)
+		 * then
+		 *   OrderedSet{self.extending.oclAsType(AnnotationType).extension
+		 *   }
+		 * else
+		 *   if self.extending.oclIsKindOf(ComponentType)
+		 *   then
+		 *     OrderedSet{self.extending.oclAsType(ComponentType).extension
+		 *     }
+		 *   else
+		 *     if self.extending.oclIsKindOf(GateType)
+		 *     then
+		 *       OrderedSet{self.extending.oclAsType(GateType).extension
+		 *       }
+		 *     else
+		 *       if self.extending.oclIsKindOf(StructuredDataType)
+		 *       then
+		 *         self.extending.oclAsType(StructuredDataType).extension
+		 *       else
+		 *         if self.extending.oclIsKindOf(SimpleDataType)
+		 *         then
+		 *           OrderedSet{
+		 *             self.extending.oclAsType(SimpleDataType).extension
+		 *           }
+		 *         else OrderedSet{}
+		 *         endif
+		 *       endif
+		 *     endif
+		 *   endif
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_AnnotationType_0 = idResolver.getClass(tdlTables.CLSSid_AnnotationType, null);
+		final /*@NonInvalid*/ PackageableElement extending = this.getExtending();
+		final /*@NonInvalid*/ boolean oclIsKindOf = OclAnyOclIsKindOfOperation.INSTANCE.evaluate(executor, extending, TYP_tdl_c_c_AnnotationType_0).booleanValue();
+		/*@Thrown*/ OrderedSetValue local_4;
+		if (oclIsKindOf) {
+			final /*@Thrown*/ AnnotationType oclAsType = (AnnotationType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, extending, TYP_tdl_c_c_AnnotationType_0);
+			final /*@Thrown*/ Extension extension = oclAsType.getExtension();
+			final /*@Thrown*/ OrderedSetValue OrderedSet = ValueUtil.createOrderedSetOfEach(tdlTables.ORD_CLSSid_Extension, extension);
+			local_4 = OrderedSet;
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		else {
+			final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_ComponentType_0 = idResolver.getClass(tdlTables.CLSSid_ComponentType, null);
+			final /*@NonInvalid*/ boolean oclIsKindOf_0 = OclAnyOclIsKindOfOperation.INSTANCE.evaluate(executor, extending, TYP_tdl_c_c_ComponentType_0).booleanValue();
+			/*@Thrown*/ OrderedSetValue local_3;
+			if (oclIsKindOf_0) {
+				final /*@Thrown*/ ComponentType oclAsType_0 = (ComponentType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, extending, TYP_tdl_c_c_ComponentType_0);
+				final /*@Thrown*/ Extension extension_0 = oclAsType_0.getExtension();
+				final /*@Thrown*/ OrderedSetValue OrderedSet_0 = ValueUtil.createOrderedSetOfEach(tdlTables.ORD_CLSSid_Extension, extension_0);
+				local_3 = OrderedSet_0;
+			}
+			else {
+				final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_GateType_0 = idResolver.getClass(tdlTables.CLSSid_GateType, null);
+				final /*@NonInvalid*/ boolean oclIsKindOf_1 = OclAnyOclIsKindOfOperation.INSTANCE.evaluate(executor, extending, TYP_tdl_c_c_GateType_0).booleanValue();
+				/*@Thrown*/ OrderedSetValue local_2;
+				if (oclIsKindOf_1) {
+					final /*@Thrown*/ GateType oclAsType_1 = (GateType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, extending, TYP_tdl_c_c_GateType_0);
+					final /*@Thrown*/ Extension extension_1 = oclAsType_1.getExtension();
+					final /*@Thrown*/ OrderedSetValue OrderedSet_1 = ValueUtil.createOrderedSetOfEach(tdlTables.ORD_CLSSid_Extension, extension_1);
+					local_2 = OrderedSet_1;
+				}
+				else {
+					final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_StructuredDataType_0 = idResolver.getClass(tdlTables.CLSSid_StructuredDataType, null);
+					final /*@NonInvalid*/ boolean oclIsKindOf_2 = OclAnyOclIsKindOfOperation.INSTANCE.evaluate(executor, extending, TYP_tdl_c_c_StructuredDataType_0).booleanValue();
+					/*@Thrown*/ OrderedSetValue local_1;
+					if (oclIsKindOf_2) {
+						final /*@Thrown*/ StructuredDataType oclAsType_2 = (StructuredDataType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, extending, TYP_tdl_c_c_StructuredDataType_0);
+						final /*@Thrown*/ List<Extension> extension_2 = oclAsType_2.getExtension();
+						final /*@Thrown*/ OrderedSetValue BOXED_extension_2 = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_Extension, extension_2);
+						local_1 = BOXED_extension_2;
+					}
+					else {
+						final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_SimpleDataType_0 = idResolver.getClass(tdlTables.CLSSid_SimpleDataType, null);
+						final /*@NonInvalid*/ boolean oclIsKindOf_3 = OclAnyOclIsKindOfOperation.INSTANCE.evaluate(executor, extending, TYP_tdl_c_c_SimpleDataType_0).booleanValue();
+						/*@Thrown*/ OrderedSetValue local_0;
+						if (oclIsKindOf_3) {
+							final /*@Thrown*/ SimpleDataType oclAsType_3 = (SimpleDataType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, extending, TYP_tdl_c_c_SimpleDataType_0);
+							final /*@Thrown*/ Extension extension_3 = oclAsType_3.getExtension();
+							final /*@Thrown*/ OrderedSetValue OrderedSet_2 = ValueUtil.createOrderedSetOfEach(tdlTables.ORD_CLSSid_Extension, extension_3);
+							local_0 = OrderedSet_2;
+						}
+						else {
+							local_0 = tdlTables.OrderedSet;
+						}
+						local_1 = local_0;
+					}
+					local_2 = local_1;
+				}
+				local_3 = local_2;
+			}
+			local_4 = local_3;
 		}
+		final /*@Thrown*/ List<Extension> ECORE_local_4 = ((IdResolverExtension)idResolver).ecoreValueOfAll(Extension.class, local_4);
+		return (EList<Extension>)ECORE_local_4;
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #isExtending(org.etsi.mts.tdl.PackageableElement) <em>Is Extending</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isExtending(org.etsi.mts.tdl.PackageableElement)
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate IS_EXTENDING_PACKAGEABLE_ELEMENT__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.EXTENSION___IS_EXTENDING__PACKAGEABLEELEMENT).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
 	@Override
-	public Boolean isExtending(PackageableElement e)
+	public Boolean isExtending(final PackageableElement e)
 	{
-		try
-		{
-			return (Boolean)IS_EXTENDING_PACKAGEABLE_ELEMENT__EINVOCATION_DELEGATE.dynamicInvoke(this, new BasicEList.UnmodifiableEList<Object>(1, new Object[]{e}));
+		/**
+		 *
+		 * if self.extending = e
+		 * then true
+		 * else
+		 *   if self->closure(transitiveExtending())->includes(e)
+		 *   then true
+		 *   else false
+		 *   endif
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ StandardLibrary standardLibrary = idResolver.getStandardLibrary();
+		final /*@NonInvalid*/ PackageableElement extending = this.getExtending();
+		final /*@NonInvalid*/ boolean eq = extending.equals(e);
+		/*@NonInvalid*/ boolean local_2;
+		if (eq) {
+			local_2 = true;
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		else {
+			final /*@NonInvalid*/ SetValue oclAsSet = OclAnyOclAsSetOperation.INSTANCE.evaluate(executor, tdlTables.SET_CLSSid_Extension, this);
+			final org.eclipse.ocl.pivot.Class TYPE_closure_0 = executor.getStaticTypeOfValue(null, oclAsSet);
+			final LibraryIterationExtension IMPL_closure_0 = (LibraryIterationExtension)TYPE_closure_0.lookupImplementation(standardLibrary, OCLstdlibTables.Operations._Set__closure);
+			final /*@NonNull*/ Object ACC_closure_0 = IMPL_closure_0.createAccumulatorValue(executor, tdlTables.SET_CLSSid_Extension, tdlTables.ORD_CLSSid_Extension);
+			/**
+			 * Implementation of the iterator body.
+			 */
+			final AbstractBinaryOperation BODY_closure_0 = new AbstractBinaryOperation() {
+				/**
+				 * transitiveExtending()
+				 */
+				@Override
+				public /*@Nullable*/ Object evaluate(final Executor executor, final TypeId typeId, final /*@Nullable*/ Object oclAsSet, final /*@NonInvalid*/ Object _1) {
+					final /*@NonInvalid*/ Extension local_0 = (Extension)_1;
+					if (local_0 == null) {
+						throw new InvalidValueException("Null source for \'tdl::Extension::transitiveExtending() : OrderedSet(tdl::Extension[*|?])\'");
+					}
+					final /*@Thrown*/ List<Extension> transitiveExtending = local_0.transitiveExtending();
+					final /*@Thrown*/ OrderedSetValue BOXED_transitiveExtending = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_Extension, transitiveExtending);
+					return BOXED_transitiveExtending;
+				}
+			};
+			final ExecutorSingleIterationManager MGR_closure_0 = new ExecutorSingleIterationManager(executor, tdlTables.SET_CLSSid_Extension, BODY_closure_0, oclAsSet, ACC_closure_0);
+			final /*@Thrown*/ SetValue closure = (SetValue)IMPL_closure_0.evaluateIteration(MGR_closure_0);
+			final /*@Thrown*/ boolean includes = CollectionIncludesOperation.INSTANCE.evaluate(closure, e).booleanValue();
+			/*@NonInvalid*/ boolean local_1;
+			if (includes) {
+				local_1 = true;
+			}
+			else {
+				local_1 = false;
+			}
+			local_2 = local_1;
 		}
+		return local_2;
 	}
 
 	/**
@@ -176,8 +312,7 @@ public class ExtensionImpl extends ElementImpl implements Extension
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.EXTENSION__EXTENDING:
 				if (resolve) return getExtending();
 				return basicGetExtending();
@@ -193,8 +328,7 @@ public class ExtensionImpl extends ElementImpl implements Extension
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.EXTENSION__EXTENDING:
 				setExtending((PackageableElement)newValue);
 				return;
@@ -210,8 +344,7 @@ public class ExtensionImpl extends ElementImpl implements Extension
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.EXTENSION__EXTENDING:
 				setExtending((PackageableElement)null);
 				return;
@@ -227,8 +360,7 @@ public class ExtensionImpl extends ElementImpl implements Extension
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.EXTENSION__EXTENDING:
 				return extending != null;
 		}
@@ -243,8 +375,7 @@ public class ExtensionImpl extends ElementImpl implements Extension
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.EXTENSION___TRANSITIVE_EXTENDING:
 				return transitiveExtending();
 			case tdlPackage.EXTENSION___IS_EXTENDING__PACKAGEABLEELEMENT:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/FormalParameterUseImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/FormalParameterUseImpl.java
index 1b5d0a5a1b88a9413b0098f4eb6850bf511ad317..5c2e8da7a5e200407dfc15930426328b64e9c215 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/FormalParameterUseImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/FormalParameterUseImpl.java
@@ -7,10 +7,7 @@ import java.lang.reflect.InvocationTargetException;
 import org.eclipse.emf.common.notify.Notification;
 
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
@@ -75,12 +72,10 @@ public class FormalParameterUseImpl extends DynamicDataUseImpl implements Formal
 	@Override
 	public FormalParameter getParameter()
 	{
-		if (parameter != null && parameter.eIsProxy())
-		{
+		if (parameter != null && parameter.eIsProxy()) {
 			InternalEObject oldParameter = (InternalEObject)parameter;
 			parameter = (FormalParameter)eResolveProxy(oldParameter);
-			if (parameter != oldParameter)
-			{
+			if (parameter != oldParameter) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.FORMAL_PARAMETER_USE__PARAMETER, oldParameter, parameter));
 			}
@@ -112,16 +107,6 @@ public class FormalParameterUseImpl extends DynamicDataUseImpl implements Formal
 			eNotify(new ENotificationImpl(this, Notification.SET, tdlPackage.FORMAL_PARAMETER_USE__PARAMETER, oldParameter, parameter));
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #resolveDataType() <em>Resolve Data Type</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #resolveDataType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate RESOLVE_DATA_TYPE__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.FORMAL_PARAMETER_USE___RESOLVE_DATA_TYPE).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -130,14 +115,12 @@ public class FormalParameterUseImpl extends DynamicDataUseImpl implements Formal
 	@Override
 	public DataType resolveDataType()
 	{
-		try
-		{
-			return (DataType)RESOLVE_DATA_TYPE__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
-		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
-		}
+		/**
+		 * self.parameter.dataType
+		 */
+		final /*@NonInvalid*/ FormalParameter parameter = this.getParameter();
+		final /*@NonInvalid*/ DataType dataType = parameter.getDataType();
+		return dataType;
 	}
 
 	/**
@@ -148,8 +131,7 @@ public class FormalParameterUseImpl extends DynamicDataUseImpl implements Formal
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.FORMAL_PARAMETER_USE__PARAMETER:
 				if (resolve) return getParameter();
 				return basicGetParameter();
@@ -165,8 +147,7 @@ public class FormalParameterUseImpl extends DynamicDataUseImpl implements Formal
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.FORMAL_PARAMETER_USE__PARAMETER:
 				setParameter((FormalParameter)newValue);
 				return;
@@ -182,8 +163,7 @@ public class FormalParameterUseImpl extends DynamicDataUseImpl implements Formal
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.FORMAL_PARAMETER_USE__PARAMETER:
 				setParameter((FormalParameter)null);
 				return;
@@ -199,8 +179,7 @@ public class FormalParameterUseImpl extends DynamicDataUseImpl implements Formal
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.FORMAL_PARAMETER_USE__PARAMETER:
 				return parameter != null;
 		}
@@ -215,10 +194,8 @@ public class FormalParameterUseImpl extends DynamicDataUseImpl implements Formal
 	@Override
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass)
 	{
-		if (baseClass == DataUse.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == DataUse.class) {
+			switch (baseOperationID) {
 				case tdlPackage.DATA_USE___RESOLVE_DATA_TYPE: return tdlPackage.FORMAL_PARAMETER_USE___RESOLVE_DATA_TYPE;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
@@ -234,8 +211,7 @@ public class FormalParameterUseImpl extends DynamicDataUseImpl implements Formal
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.FORMAL_PARAMETER_USE___RESOLVE_DATA_TYPE:
 				return resolveDataType();
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/FunctionCallImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/FunctionCallImpl.java
index eae8b11c4ed7904be4ed379812036691c5dd9fed..f6b2be2e93c965a73532911419041300b794ef38 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/FunctionCallImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/FunctionCallImpl.java
@@ -7,10 +7,7 @@ import java.lang.reflect.InvocationTargetException;
 import org.eclipse.emf.common.notify.Notification;
 
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
@@ -75,12 +72,10 @@ public class FunctionCallImpl extends DynamicDataUseImpl implements FunctionCall
 	@Override
 	public Function getFunction()
 	{
-		if (function != null && function.eIsProxy())
-		{
+		if (function != null && function.eIsProxy()) {
 			InternalEObject oldFunction = (InternalEObject)function;
 			function = (Function)eResolveProxy(oldFunction);
-			if (function != oldFunction)
-			{
+			if (function != oldFunction) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.FUNCTION_CALL__FUNCTION, oldFunction, function));
 			}
@@ -112,16 +107,6 @@ public class FunctionCallImpl extends DynamicDataUseImpl implements FunctionCall
 			eNotify(new ENotificationImpl(this, Notification.SET, tdlPackage.FUNCTION_CALL__FUNCTION, oldFunction, function));
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #resolveDataType() <em>Resolve Data Type</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #resolveDataType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate RESOLVE_DATA_TYPE__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.FUNCTION_CALL___RESOLVE_DATA_TYPE).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -130,14 +115,12 @@ public class FunctionCallImpl extends DynamicDataUseImpl implements FunctionCall
 	@Override
 	public DataType resolveDataType()
 	{
-		try
-		{
-			return (DataType)RESOLVE_DATA_TYPE__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
-		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
-		}
+		/**
+		 * self.function.returnType
+		 */
+		final /*@NonInvalid*/ Function function = this.getFunction();
+		final /*@NonInvalid*/ DataType returnType = function.getReturnType();
+		return returnType;
 	}
 
 	/**
@@ -148,8 +131,7 @@ public class FunctionCallImpl extends DynamicDataUseImpl implements FunctionCall
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.FUNCTION_CALL__FUNCTION:
 				if (resolve) return getFunction();
 				return basicGetFunction();
@@ -165,8 +147,7 @@ public class FunctionCallImpl extends DynamicDataUseImpl implements FunctionCall
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.FUNCTION_CALL__FUNCTION:
 				setFunction((Function)newValue);
 				return;
@@ -182,8 +163,7 @@ public class FunctionCallImpl extends DynamicDataUseImpl implements FunctionCall
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.FUNCTION_CALL__FUNCTION:
 				setFunction((Function)null);
 				return;
@@ -199,8 +179,7 @@ public class FunctionCallImpl extends DynamicDataUseImpl implements FunctionCall
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.FUNCTION_CALL__FUNCTION:
 				return function != null;
 		}
@@ -215,10 +194,8 @@ public class FunctionCallImpl extends DynamicDataUseImpl implements FunctionCall
 	@Override
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass)
 	{
-		if (baseClass == DataUse.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == DataUse.class) {
+			switch (baseOperationID) {
 				case tdlPackage.DATA_USE___RESOLVE_DATA_TYPE: return tdlPackage.FUNCTION_CALL___RESOLVE_DATA_TYPE;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
@@ -234,8 +211,7 @@ public class FunctionCallImpl extends DynamicDataUseImpl implements FunctionCall
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.FUNCTION_CALL___RESOLVE_DATA_TYPE:
 				return resolveDataType();
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/FunctionImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/FunctionImpl.java
index 1ae3ad34a08321efe9ddfbab69524b0ce80b1303..4f8c01e852b7724c4b0722234dd93df1a230469a 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/FunctionImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/FunctionImpl.java
@@ -67,12 +67,10 @@ public class FunctionImpl extends ActionImpl implements Function
 	@Override
 	public DataType getReturnType()
 	{
-		if (returnType != null && returnType.eIsProxy())
-		{
+		if (returnType != null && returnType.eIsProxy()) {
 			InternalEObject oldReturnType = (InternalEObject)returnType;
 			returnType = (DataType)eResolveProxy(oldReturnType);
-			if (returnType != oldReturnType)
-			{
+			if (returnType != oldReturnType) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.FUNCTION__RETURN_TYPE, oldReturnType, returnType));
 			}
@@ -112,8 +110,7 @@ public class FunctionImpl extends ActionImpl implements Function
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.FUNCTION__RETURN_TYPE:
 				if (resolve) return getReturnType();
 				return basicGetReturnType();
@@ -129,8 +126,7 @@ public class FunctionImpl extends ActionImpl implements Function
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.FUNCTION__RETURN_TYPE:
 				setReturnType((DataType)newValue);
 				return;
@@ -146,8 +142,7 @@ public class FunctionImpl extends ActionImpl implements Function
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.FUNCTION__RETURN_TYPE:
 				setReturnType((DataType)null);
 				return;
@@ -163,8 +158,7 @@ public class FunctionImpl extends ActionImpl implements Function
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.FUNCTION__RETURN_TYPE:
 				return returnType != null;
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/GateInstanceImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/GateInstanceImpl.java
index 62df394f587b2a4dc05a9a349ed359502814ce29..371fb42c376851c2d52cca1661b7e7cad44b4315 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/GateInstanceImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/GateInstanceImpl.java
@@ -67,12 +67,10 @@ public class GateInstanceImpl extends NamedElementImpl implements GateInstance
 	@Override
 	public GateType getType()
 	{
-		if (type != null && type.eIsProxy())
-		{
+		if (type != null && type.eIsProxy()) {
 			InternalEObject oldType = (InternalEObject)type;
 			type = (GateType)eResolveProxy(oldType);
-			if (type != oldType)
-			{
+			if (type != oldType) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.GATE_INSTANCE__TYPE, oldType, type));
 			}
@@ -112,8 +110,7 @@ public class GateInstanceImpl extends NamedElementImpl implements GateInstance
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.GATE_INSTANCE__TYPE:
 				if (resolve) return getType();
 				return basicGetType();
@@ -129,8 +126,7 @@ public class GateInstanceImpl extends NamedElementImpl implements GateInstance
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.GATE_INSTANCE__TYPE:
 				setType((GateType)newValue);
 				return;
@@ -146,8 +142,7 @@ public class GateInstanceImpl extends NamedElementImpl implements GateInstance
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.GATE_INSTANCE__TYPE:
 				setType((GateType)null);
 				return;
@@ -163,8 +158,7 @@ public class GateInstanceImpl extends NamedElementImpl implements GateInstance
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.GATE_INSTANCE__TYPE:
 				return type != null;
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/GateReferenceImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/GateReferenceImpl.java
index 9b994ebfa8eb9899948d38387beb7132a0ffd5d4..af634d104a31ca896c1d950877dcd658954ab921 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/GateReferenceImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/GateReferenceImpl.java
@@ -79,12 +79,10 @@ public class GateReferenceImpl extends ElementImpl implements GateReference
 	@Override
 	public ComponentInstance getComponent()
 	{
-		if (component != null && component.eIsProxy())
-		{
+		if (component != null && component.eIsProxy()) {
 			InternalEObject oldComponent = (InternalEObject)component;
 			component = (ComponentInstance)eResolveProxy(oldComponent);
-			if (component != oldComponent)
-			{
+			if (component != oldComponent) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.GATE_REFERENCE__COMPONENT, oldComponent, component));
 			}
@@ -124,12 +122,10 @@ public class GateReferenceImpl extends ElementImpl implements GateReference
 	@Override
 	public GateInstance getGate()
 	{
-		if (gate != null && gate.eIsProxy())
-		{
+		if (gate != null && gate.eIsProxy()) {
 			InternalEObject oldGate = (InternalEObject)gate;
 			gate = (GateInstance)eResolveProxy(oldGate);
-			if (gate != oldGate)
-			{
+			if (gate != oldGate) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.GATE_REFERENCE__GATE, oldGate, gate));
 			}
@@ -169,8 +165,7 @@ public class GateReferenceImpl extends ElementImpl implements GateReference
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.GATE_REFERENCE__COMPONENT:
 				if (resolve) return getComponent();
 				return basicGetComponent();
@@ -189,8 +184,7 @@ public class GateReferenceImpl extends ElementImpl implements GateReference
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.GATE_REFERENCE__COMPONENT:
 				setComponent((ComponentInstance)newValue);
 				return;
@@ -209,8 +203,7 @@ public class GateReferenceImpl extends ElementImpl implements GateReference
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.GATE_REFERENCE__COMPONENT:
 				setComponent((ComponentInstance)null);
 				return;
@@ -229,8 +222,7 @@ public class GateReferenceImpl extends ElementImpl implements GateReference
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.GATE_REFERENCE__COMPONENT:
 				return component != null;
 			case tdlPackage.GATE_REFERENCE__GATE:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/GateTypeImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/GateTypeImpl.java
index de5c8d9198946350f714762872bc714628cb1819..4303fc1ac407cb26c82d12dcdaeaf5a7e6f95a3b 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/GateTypeImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/GateTypeImpl.java
@@ -6,25 +6,36 @@ import java.lang.reflect.InvocationTargetException;
 
 import java.util.Collection;
 
+import java.util.List;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
 import org.eclipse.emf.ecore.util.EObjectResolvingEList;
 
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.ids.IdResolver.IdResolverExtension;
+import org.eclipse.ocl.pivot.library.collection.CollectionAsOrderedSetOperation;
+import org.eclipse.ocl.pivot.library.collection.CollectionUnionOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsTypeOperation;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
+import org.eclipse.ocl.pivot.values.OrderedSetValue;
+import org.eclipse.ocl.pivot.values.SetValue;
 import org.etsi.mts.tdl.DataType;
 import org.etsi.mts.tdl.Extension;
 import org.etsi.mts.tdl.GateType;
 import org.etsi.mts.tdl.GateTypeKind;
+import org.etsi.mts.tdl.PackageableElement;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -112,8 +123,7 @@ public class GateTypeImpl extends PackageableElementImpl implements GateType
 	@Override
 	public EList<DataType> getDataType()
 	{
-		if (dataType == null)
-		{
+		if (dataType == null) {
 			dataType = new EObjectResolvingEList<DataType>(DataType.class, this, tdlPackage.GATE_TYPE__DATA_TYPE);
 		}
 		return dataType;
@@ -164,8 +174,7 @@ public class GateTypeImpl extends PackageableElementImpl implements GateType
 	{
 		Extension oldExtension = extension;
 		extension = newExtension;
-		if (eNotificationRequired())
-		{
+		if (eNotificationRequired()) {
 			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, tdlPackage.GATE_TYPE__EXTENSION, oldExtension, newExtension);
 			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
@@ -180,8 +189,7 @@ public class GateTypeImpl extends PackageableElementImpl implements GateType
 	@Override
 	public void setExtension(Extension newExtension)
 	{
-		if (newExtension != extension)
-		{
+		if (newExtension != extension) {
 			NotificationChain msgs = null;
 			if (extension != null)
 				msgs = ((InternalEObject)extension).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - tdlPackage.GATE_TYPE__EXTENSION, null, msgs);
@@ -194,16 +202,6 @@ public class GateTypeImpl extends PackageableElementImpl implements GateType
 			eNotify(new ENotificationImpl(this, Notification.SET, tdlPackage.GATE_TYPE__EXTENSION, newExtension, newExtension));
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #allDataTypes() <em>All Data Types</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #allDataTypes()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate ALL_DATA_TYPES__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.GATE_TYPE___ALL_DATA_TYPES).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -213,14 +211,57 @@ public class GateTypeImpl extends PackageableElementImpl implements GateType
 	@Override
 	public EList<DataType> allDataTypes()
 	{
-		try
-		{
-			return (EList<DataType>)ALL_DATA_TYPES__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if not self.extension.oclIsUndefined()
+		 * then
+		 *   self.extension.extending.oclAsType(GateType)
+		 *   .allDataTypes()
+		 *   ->union(self.dataType)
+		 *   ->asOrderedSet()
+		 * else self.dataType
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ List<DataType> dataType_0 = this.getDataType();
+		final /*@NonInvalid*/ Extension extension = this.getExtension();
+		final /*@NonInvalid*/ OrderedSetValue BOXED_dataType_0 = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_DataType, dataType_0);
+		final /*@NonInvalid*/ boolean oclIsUndefined = extension == null;
+		final /*@NonInvalid*/ Boolean not;
+		if (!oclIsUndefined) {
+			not = ValueUtil.TRUE_VALUE;
+		}
+		else {
+			if (oclIsUndefined) {
+				not = ValueUtil.FALSE_VALUE;
+			}
+			else {
+				not = null;
+			}
+		}
+		if (not == null) {
+			throw new InvalidValueException("Null if condition");
+		}
+		/*@Thrown*/ OrderedSetValue local_0;
+		if (not) {
+			final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_GateType_0 = idResolver.getClass(tdlTables.CLSSid_GateType, null);
+			if (extension == null) {
+				throw new InvalidValueException("Null source for \'\'http://www.etsi.org/spec/TDL/1.4.1\'::Extension::extending\'");
+			}
+			final /*@Thrown*/ PackageableElement extending = extension.getExtending();
+			final /*@Thrown*/ GateType oclAsType = (GateType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, extending, TYP_tdl_c_c_GateType_0);
+			final /*@Thrown*/ List<DataType> allDataTypes = oclAsType.allDataTypes();
+			final /*@Thrown*/ OrderedSetValue BOXED_allDataTypes = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_DataType, allDataTypes);
+			final /*@Thrown*/ SetValue union = (SetValue)CollectionUnionOperation.INSTANCE.evaluate(BOXED_allDataTypes, BOXED_dataType_0);
+			final /*@Thrown*/ OrderedSetValue asOrderedSet = CollectionAsOrderedSetOperation.INSTANCE.evaluate(union);
+			local_0 = asOrderedSet;
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		else {
+			local_0 = BOXED_dataType_0;
 		}
+		final /*@Thrown*/ List<DataType> ECORE_local_0 = ((IdResolverExtension)idResolver).ecoreValueOfAll(DataType.class, local_0);
+		return (EList<DataType>)ECORE_local_0;
 	}
 
 	/**
@@ -231,8 +272,7 @@ public class GateTypeImpl extends PackageableElementImpl implements GateType
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.GATE_TYPE__EXTENSION:
 				return basicSetExtension(null, msgs);
 		}
@@ -247,8 +287,7 @@ public class GateTypeImpl extends PackageableElementImpl implements GateType
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.GATE_TYPE__DATA_TYPE:
 				return getDataType();
 			case tdlPackage.GATE_TYPE__KIND:
@@ -268,8 +307,7 @@ public class GateTypeImpl extends PackageableElementImpl implements GateType
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.GATE_TYPE__DATA_TYPE:
 				getDataType().clear();
 				getDataType().addAll((Collection<? extends DataType>)newValue);
@@ -292,8 +330,7 @@ public class GateTypeImpl extends PackageableElementImpl implements GateType
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.GATE_TYPE__DATA_TYPE:
 				getDataType().clear();
 				return;
@@ -315,8 +352,7 @@ public class GateTypeImpl extends PackageableElementImpl implements GateType
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.GATE_TYPE__DATA_TYPE:
 				return dataType != null && !dataType.isEmpty();
 			case tdlPackage.GATE_TYPE__KIND:
@@ -335,8 +371,7 @@ public class GateTypeImpl extends PackageableElementImpl implements GateType
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.GATE_TYPE___ALL_DATA_TYPES:
 				return allDataTypes();
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/InlineActionImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/InlineActionImpl.java
index bcc5ed23f609051608c96db246414cd0a8be72e5..caef55d7215cd91df36f7ba131cb440f05ff327d 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/InlineActionImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/InlineActionImpl.java
@@ -100,8 +100,7 @@ public class InlineActionImpl extends ActionBehaviourImpl implements InlineActio
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.INLINE_ACTION__BODY:
 				return getBody();
 		}
@@ -116,8 +115,7 @@ public class InlineActionImpl extends ActionBehaviourImpl implements InlineActio
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.INLINE_ACTION__BODY:
 				setBody((String)newValue);
 				return;
@@ -133,8 +131,7 @@ public class InlineActionImpl extends ActionBehaviourImpl implements InlineActio
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.INLINE_ACTION__BODY:
 				setBody(BODY_EDEFAULT);
 				return;
@@ -150,8 +147,7 @@ public class InlineActionImpl extends ActionBehaviourImpl implements InlineActio
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.INLINE_ACTION__BODY:
 				return BODY_EDEFAULT == null ? body != null : !BODY_EDEFAULT.equals(body);
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/InteractionImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/InteractionImpl.java
index b3daddeb1eea5e78bfeaeb1e29bbf3ab2eb0e20f..a2a3694d4d6c04755f768edcc7c933dba9a4dd63 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/InteractionImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/InteractionImpl.java
@@ -6,14 +6,13 @@ import java.lang.reflect.InvocationTargetException;
 
 import java.util.Collection;
 
+import java.util.Iterator;
+import java.util.List;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
@@ -21,13 +20,30 @@ import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.ids.IdResolver.IdResolverExtension;
+import org.eclipse.ocl.pivot.library.collection.CollectionAsOrderedSetOperation;
+import org.eclipse.ocl.pivot.library.collection.CollectionIncludingOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsSetOperation;
+import org.eclipse.ocl.pivot.messages.PivotMessages;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.BagValue;
+import org.eclipse.ocl.pivot.values.BagValue.Accumulator;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
+import org.eclipse.ocl.pivot.values.OrderedSetValue;
+import org.eclipse.ocl.pivot.values.SetValue;
 import org.etsi.mts.tdl.AtomicBehaviour;
 import org.etsi.mts.tdl.Behaviour;
 import org.etsi.mts.tdl.ComponentInstance;
 import org.etsi.mts.tdl.GateReference;
 import org.etsi.mts.tdl.Interaction;
 import org.etsi.mts.tdl.Target;
+import org.etsi.mts.tdl.TestConfiguration;
+import org.etsi.mts.tdl.TestDescription;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -94,12 +110,10 @@ public class InteractionImpl extends AtomicBehaviourImpl implements Interaction
 	@Override
 	public GateReference getSourceGate()
 	{
-		if (sourceGate != null && sourceGate.eIsProxy())
-		{
+		if (sourceGate != null && sourceGate.eIsProxy()) {
 			InternalEObject oldSourceGate = (InternalEObject)sourceGate;
 			sourceGate = (GateReference)eResolveProxy(oldSourceGate);
-			if (sourceGate != oldSourceGate)
-			{
+			if (sourceGate != oldSourceGate) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.INTERACTION__SOURCE_GATE, oldSourceGate, sourceGate));
 			}
@@ -139,23 +153,12 @@ public class InteractionImpl extends AtomicBehaviourImpl implements Interaction
 	@Override
 	public EList<Target> getTarget()
 	{
-		if (target == null)
-		{
+		if (target == null) {
 			target = new EObjectContainmentEList<Target>(Target.class, this, tdlPackage.INTERACTION__TARGET);
 		}
 		return target;
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #getParticipatingComponents() <em>Get Participating Components</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getParticipatingComponents()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate GET_PARTICIPATING_COMPONENTS__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.INTERACTION___GET_PARTICIPATING_COMPONENTS).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -165,14 +168,93 @@ public class InteractionImpl extends AtomicBehaviourImpl implements Interaction
 	@Override
 	public EList<ComponentInstance> getParticipatingComponents()
 	{
-		try
-		{
-			return (EList<ComponentInstance>)GET_PARTICIPATING_COMPONENTS__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if
+		 *   self.getParentTestDescription()
+		 *   ->exists(td | td.isLocallyOrdered)
+		 * then
+		 *   self.target->collect(targetGate.component)
+		 *   ->including(sourceGate.component)
+		 *   ->asOrderedSet()
+		 * else
+		 *   self.getParentTestDescription()
+		 *   .testConfiguration.componentInstance->asOrderedSet()
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ TestDescription getParentTestDescription = this.getParentTestDescription();
+		final /*@NonInvalid*/ SetValue oclAsSet = OclAnyOclAsSetOperation.INSTANCE.evaluate(executor, tdlTables.SET_CLSSid_TestDescription, getParentTestDescription);
+		/*@Thrown*/ Object accumulator = ValueUtil.FALSE_VALUE;
+		Iterator<Object> ITERATOR_td = oclAsSet.iterator();
+		/*@NonInvalid*/ Boolean exists;
+		while (true) {
+			if (!ITERATOR_td.hasNext()) {
+				if (accumulator == ValueUtil.FALSE_VALUE) {
+					exists = ValueUtil.FALSE_VALUE;
+				}
+				else {
+					throw (InvalidValueException)accumulator;
+				}
+				break;
+			}
+			/*@NonInvalid*/ TestDescription td = (TestDescription)ITERATOR_td.next();
+			/**
+			 * td.isLocallyOrdered
+			 */
+			final /*@NonInvalid*/ boolean isLocallyOrdered = td.isIsLocallyOrdered();
+			//
+			if (isLocallyOrdered) {					// Normal successful body evaluation result
+				exists = ValueUtil.TRUE_VALUE;
+				break;														// Stop immediately
+			}
+			else if (!isLocallyOrdered) {				// Normal unsuccessful body evaluation result
+				;															// Carry on
+			}
+			else {															// Impossible badly typed result
+				accumulator = new InvalidValueException(PivotMessages.NonBooleanBody, "exists");
+			}
+		}
+		if (exists == null) {
+			throw new InvalidValueException("Null if condition");
+		}
+		/*@NonInvalid*/ OrderedSetValue local_0;
+		if (exists) {
+			final /*@NonInvalid*/ List<Target> target = this.getTarget();
+			final /*@NonInvalid*/ SetValue BOXED_target = idResolver.createSetOfAll(tdlTables.SET_CLSSid_Target, target);
+			/*@Thrown*/ Accumulator accumulator_0 = ValueUtil.createBagAccumulatorValue(tdlTables.BAG_CLSSid_ComponentInstance);
+			Iterator<Object> ITERATOR__1 = BOXED_target.iterator();
+			/*@NonInvalid*/ BagValue collect;
+			while (true) {
+				if (!ITERATOR__1.hasNext()) {
+					collect = accumulator_0;
+					break;
+				}
+				/*@NonInvalid*/ Target _1 = (Target)ITERATOR__1.next();
+				/**
+				 * targetGate.component
+				 */
+				final /*@NonInvalid*/ GateReference targetGate = _1.getTargetGate();
+				final /*@NonInvalid*/ ComponentInstance component = targetGate.getComponent();
+				//
+				accumulator_0.add(component);
+			}
+			final /*@NonInvalid*/ GateReference sourceGate = this.getSourceGate();
+			final /*@NonInvalid*/ ComponentInstance component_0 = sourceGate.getComponent();
+			final /*@NonInvalid*/ BagValue including = (BagValue)CollectionIncludingOperation.INSTANCE.evaluate(collect, component_0);
+			final /*@NonInvalid*/ OrderedSetValue asOrderedSet = CollectionAsOrderedSetOperation.INSTANCE.evaluate(including);
+			local_0 = asOrderedSet;
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		else {
+			final /*@NonInvalid*/ TestConfiguration testConfiguration = getParentTestDescription.getTestConfiguration();
+			final /*@NonInvalid*/ List<ComponentInstance> componentInstance = testConfiguration.getComponentInstance();
+			final /*@NonInvalid*/ SetValue BOXED_componentInstance = idResolver.createSetOfAll(tdlTables.SET_CLSSid_ComponentInstance, componentInstance);
+			final /*@NonInvalid*/ OrderedSetValue asOrderedSet_0 = CollectionAsOrderedSetOperation.INSTANCE.evaluate(BOXED_componentInstance);
+			local_0 = asOrderedSet_0;
 		}
+		final /*@NonInvalid*/ List<ComponentInstance> ECORE_local_0 = ((IdResolverExtension)idResolver).ecoreValueOfAll(ComponentInstance.class, local_0);
+		return (EList<ComponentInstance>)ECORE_local_0;
 	}
 
 	/**
@@ -183,8 +265,7 @@ public class InteractionImpl extends AtomicBehaviourImpl implements Interaction
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.INTERACTION__TARGET:
 				return ((InternalEList<?>)getTarget()).basicRemove(otherEnd, msgs);
 		}
@@ -199,8 +280,7 @@ public class InteractionImpl extends AtomicBehaviourImpl implements Interaction
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.INTERACTION__SOURCE_GATE:
 				if (resolve) return getSourceGate();
 				return basicGetSourceGate();
@@ -219,8 +299,7 @@ public class InteractionImpl extends AtomicBehaviourImpl implements Interaction
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.INTERACTION__SOURCE_GATE:
 				setSourceGate((GateReference)newValue);
 				return;
@@ -240,8 +319,7 @@ public class InteractionImpl extends AtomicBehaviourImpl implements Interaction
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.INTERACTION__SOURCE_GATE:
 				setSourceGate((GateReference)null);
 				return;
@@ -260,8 +338,7 @@ public class InteractionImpl extends AtomicBehaviourImpl implements Interaction
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.INTERACTION__SOURCE_GATE:
 				return sourceGate != null;
 			case tdlPackage.INTERACTION__TARGET:
@@ -278,18 +355,14 @@ public class InteractionImpl extends AtomicBehaviourImpl implements Interaction
 	@Override
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass)
 	{
-		if (baseClass == Behaviour.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == Behaviour.class) {
+			switch (baseOperationID) {
 				case tdlPackage.BEHAVIOUR___GET_PARTICIPATING_COMPONENTS: return tdlPackage.INTERACTION___GET_PARTICIPATING_COMPONENTS;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
 		}
-		if (baseClass == AtomicBehaviour.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == AtomicBehaviour.class) {
+			switch (baseOperationID) {
 				case tdlPackage.ATOMIC_BEHAVIOUR___GET_PARTICIPATING_COMPONENTS: return tdlPackage.INTERACTION___GET_PARTICIPATING_COMPONENTS;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
@@ -305,8 +378,7 @@ public class InteractionImpl extends AtomicBehaviourImpl implements Interaction
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.INTERACTION___GET_PARTICIPATING_COMPONENTS:
 				return getParticipatingComponents();
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/LiteralValueUseImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/LiteralValueUseImpl.java
index b232b009b82037578335b60a15b662d90e229180..0f708c06afe69088ee861edea7062bf273f7000b 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/LiteralValueUseImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/LiteralValueUseImpl.java
@@ -6,21 +6,39 @@ import java.lang.reflect.InvocationTargetException;
 
 import java.math.BigInteger;
 
+import java.util.Iterator;
 import org.eclipse.emf.common.notify.Notification;
 
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.library.classifier.ClassifierAllInstancesOperation;
+import org.eclipse.ocl.pivot.library.collection.CollectionAsOrderedSetOperation;
+import org.eclipse.ocl.pivot.library.collection.OrderedCollectionFirstOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsTypeOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclIsTypeOfOperation;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
+import org.eclipse.ocl.pivot.values.OrderedSetValue;
+import org.eclipse.ocl.pivot.values.SetValue;
+import org.eclipse.ocl.pivot.values.SetValue.Accumulator;
 import org.etsi.mts.tdl.DataType;
 import org.etsi.mts.tdl.DataUse;
+import org.etsi.mts.tdl.Element;
 import org.etsi.mts.tdl.LiteralValueUse;
+import org.etsi.mts.tdl.Member;
+import org.etsi.mts.tdl.MemberAssignment;
+import org.etsi.mts.tdl.Parameter;
+import org.etsi.mts.tdl.ParameterBinding;
+import org.etsi.mts.tdl.SimpleDataType;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -214,12 +232,10 @@ public class LiteralValueUseImpl extends StaticDataUseImpl implements LiteralVal
 	@Override
 	public DataType getDataType()
 	{
-		if (dataType != null && dataType.eIsProxy())
-		{
+		if (dataType != null && dataType.eIsProxy()) {
 			InternalEObject oldDataType = (InternalEObject)dataType;
 			dataType = (DataType)eResolveProxy(oldDataType);
-			if (dataType != oldDataType)
-			{
+			if (dataType != oldDataType) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.LITERAL_VALUE_USE__DATA_TYPE, oldDataType, dataType));
 			}
@@ -251,16 +267,6 @@ public class LiteralValueUseImpl extends StaticDataUseImpl implements LiteralVal
 			eNotify(new ENotificationImpl(this, Notification.SET, tdlPackage.LITERAL_VALUE_USE__DATA_TYPE, oldDataType, dataType));
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #resolveDataType() <em>Resolve Data Type</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #resolveDataType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate RESOLVE_DATA_TYPE__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.LITERAL_VALUE_USE___RESOLVE_DATA_TYPE).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -269,14 +275,210 @@ public class LiteralValueUseImpl extends StaticDataUseImpl implements LiteralVal
 	@Override
 	public DataType resolveDataType()
 	{
-		try
-		{
-			return (DataType)RESOLVE_DATA_TYPE__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if not self.dataType.oclIsUndefined()
+		 * then self.dataType
+		 * else
+		 *   if self.container().oclIsTypeOf(MemberAssignment)
+		 *   then
+		 *     self.container()
+		 *     .oclAsType(MemberAssignment).member.dataType
+		 *   else
+		 *     if self.container().oclIsTypeOf(ParameterBinding)
+		 *     then
+		 *       self.container()
+		 *       .oclAsType(ParameterBinding).parameter.dataType
+		 *     else
+		 *       if not self.intValue.oclIsUndefined()
+		 *       then
+		 *         SimpleDataType.allInstances()
+		 *         ->select(t | t.name = 'Integer')
+		 *         ->asOrderedSet()
+		 *         ->first()
+		 *       else
+		 *         if not self.boolValue.oclIsUndefined()
+		 *         then
+		 *           SimpleDataType.allInstances()
+		 *           ->select(t | t.name = 'Boolean')
+		 *           ->asOrderedSet()
+		 *           ->first()
+		 *         else
+		 *           SimpleDataType.allInstances()
+		 *           ->select(t | t.name = 'String')
+		 *           ->asOrderedSet()
+		 *           ->first()
+		 *         endif
+		 *       endif
+		 *     endif
+		 *   endif
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ DataType dataType_0 = this.getDataType();
+		final /*@NonInvalid*/ boolean oclIsUndefined = dataType_0 == null;
+		final /*@NonInvalid*/ Boolean not;
+		if (!oclIsUndefined) {
+			not = ValueUtil.TRUE_VALUE;
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		else {
+			if (oclIsUndefined) {
+				not = ValueUtil.FALSE_VALUE;
+			}
+			else {
+				not = null;
+			}
+		}
+		if (not == null) {
+			throw new InvalidValueException("Null if condition");
+		}
+		/*@Thrown*/ DataType local_4;
+		if (not) {
+			local_4 = dataType_0;
+		}
+		else {
+			final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_MemberAssignment_0 = idResolver.getClass(tdlTables.CLSSid_MemberAssignment, null);
+			final /*@NonInvalid*/ Element container = this.container();
+			final /*@NonInvalid*/ boolean oclIsTypeOf = OclAnyOclIsTypeOfOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_MemberAssignment_0).booleanValue();
+			/*@Thrown*/ DataType local_3;
+			if (oclIsTypeOf) {
+				final /*@Thrown*/ MemberAssignment oclAsType = (MemberAssignment)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_MemberAssignment_0);
+				final /*@Thrown*/ Member member = oclAsType.getMember();
+				final /*@Thrown*/ DataType dataType_1 = member.getDataType();
+				local_3 = dataType_1;
+			}
+			else {
+				final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_ParameterBinding_0 = idResolver.getClass(tdlTables.CLSSid_ParameterBinding, null);
+				final /*@NonInvalid*/ boolean oclIsTypeOf_0 = OclAnyOclIsTypeOfOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_ParameterBinding_0).booleanValue();
+				/*@Thrown*/ DataType local_2;
+				if (oclIsTypeOf_0) {
+					final /*@Thrown*/ ParameterBinding oclAsType_0 = (ParameterBinding)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_ParameterBinding_0);
+					final /*@Thrown*/ Parameter parameter = oclAsType_0.getParameter();
+					final /*@Thrown*/ DataType dataType_2 = parameter.getDataType();
+					local_2 = dataType_2;
+				}
+				else {
+					final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_SimpleDataType_0 = idResolver.getClass(tdlTables.CLSSid_SimpleDataType, null);
+					final /*@NonInvalid*/ SetValue allInstances = ClassifierAllInstancesOperation.INSTANCE.evaluate(executor, tdlTables.SET_CLSSid_SimpleDataType, TYP_tdl_c_c_SimpleDataType_0);
+					final /*@NonInvalid*/ BigInteger intValue = this.getIntValue();
+					final /*@NonInvalid*/ boolean oclIsUndefined_0 = intValue == null;
+					final /*@NonInvalid*/ Boolean not_0;
+					if (!oclIsUndefined_0) {
+						not_0 = ValueUtil.TRUE_VALUE;
+					}
+					else {
+						if (oclIsUndefined_0) {
+							not_0 = ValueUtil.FALSE_VALUE;
+						}
+						else {
+							not_0 = null;
+						}
+					}
+					if (not_0 == null) {
+						throw new InvalidValueException("Null if condition");
+					}
+					/*@Thrown*/ SimpleDataType local_1;
+					if (not_0) {
+						/*@Thrown*/ Accumulator accumulator = ValueUtil.createSetAccumulatorValue(tdlTables.SET_CLSSid_SimpleDataType);
+						Iterator<Object> ITERATOR_t = allInstances.iterator();
+						/*@NonInvalid*/ SetValue select;
+						while (true) {
+							if (!ITERATOR_t.hasNext()) {
+								select = accumulator;
+								break;
+							}
+							/*@NonInvalid*/ SimpleDataType t = (SimpleDataType)ITERATOR_t.next();
+							/**
+							 * t.name = 'Integer'
+							 */
+							final /*@NonInvalid*/ String name = t.getName();
+							final /*@NonInvalid*/ boolean eq = tdlTables.STR_Integer.equals(name);
+							//
+							if (eq) {
+								accumulator.add(t);
+							}
+						}
+						final /*@NonInvalid*/ OrderedSetValue asOrderedSet = CollectionAsOrderedSetOperation.INSTANCE.evaluate(select);
+						final /*@Thrown*/ SimpleDataType first = (SimpleDataType)OrderedCollectionFirstOperation.INSTANCE.evaluate(asOrderedSet);
+						local_1 = first;
+					}
+					else {
+						final /*@NonInvalid*/ Boolean boolValue = this.getBoolValue();
+						final /*@NonInvalid*/ boolean oclIsUndefined_1 = boolValue == null;
+						final /*@NonInvalid*/ Boolean not_1;
+						if (!oclIsUndefined_1) {
+							not_1 = ValueUtil.TRUE_VALUE;
+						}
+						else {
+							if (oclIsUndefined_1) {
+								not_1 = ValueUtil.FALSE_VALUE;
+							}
+							else {
+								not_1 = null;
+							}
+						}
+						if (not_1 == null) {
+							throw new InvalidValueException("Null if condition");
+						}
+						/*@Thrown*/ SimpleDataType local_0;
+						if (not_1) {
+							/*@Thrown*/ Accumulator accumulator_0 = ValueUtil.createSetAccumulatorValue(tdlTables.SET_CLSSid_SimpleDataType);
+							Iterator<Object> ITERATOR_t_0 = allInstances.iterator();
+							/*@NonInvalid*/ SetValue select_0;
+							while (true) {
+								if (!ITERATOR_t_0.hasNext()) {
+									select_0 = accumulator_0;
+									break;
+								}
+								/*@NonInvalid*/ SimpleDataType t_0 = (SimpleDataType)ITERATOR_t_0.next();
+								/**
+								 * t.name = 'Boolean'
+								 */
+								final /*@NonInvalid*/ String name_0 = t_0.getName();
+								final /*@NonInvalid*/ boolean eq_0 = tdlTables.STR_Boolean.equals(name_0);
+								//
+								if (eq_0) {
+									accumulator_0.add(t_0);
+								}
+							}
+							final /*@NonInvalid*/ OrderedSetValue asOrderedSet_0 = CollectionAsOrderedSetOperation.INSTANCE.evaluate(select_0);
+							final /*@Thrown*/ SimpleDataType first_0 = (SimpleDataType)OrderedCollectionFirstOperation.INSTANCE.evaluate(asOrderedSet_0);
+							local_0 = first_0;
+						}
+						else {
+							/*@Thrown*/ Accumulator accumulator_1 = ValueUtil.createSetAccumulatorValue(tdlTables.SET_CLSSid_SimpleDataType);
+							Iterator<Object> ITERATOR_t_1 = allInstances.iterator();
+							/*@NonInvalid*/ SetValue select_1;
+							while (true) {
+								if (!ITERATOR_t_1.hasNext()) {
+									select_1 = accumulator_1;
+									break;
+								}
+								/*@NonInvalid*/ SimpleDataType t_1 = (SimpleDataType)ITERATOR_t_1.next();
+								/**
+								 * t.name = 'String'
+								 */
+								final /*@NonInvalid*/ String name_1 = t_1.getName();
+								final /*@NonInvalid*/ boolean eq_1 = tdlTables.STR_String.equals(name_1);
+								//
+								if (eq_1) {
+									accumulator_1.add(t_1);
+								}
+							}
+							final /*@NonInvalid*/ OrderedSetValue asOrderedSet_1 = CollectionAsOrderedSetOperation.INSTANCE.evaluate(select_1);
+							final /*@Thrown*/ SimpleDataType first_1 = (SimpleDataType)OrderedCollectionFirstOperation.INSTANCE.evaluate(asOrderedSet_1);
+							local_0 = first_1;
+						}
+						local_1 = local_0;
+					}
+					local_2 = local_1;
+				}
+				local_3 = local_2;
+			}
+			local_4 = local_3;
 		}
+		return local_4;
 	}
 
 	/**
@@ -287,8 +489,7 @@ public class LiteralValueUseImpl extends StaticDataUseImpl implements LiteralVal
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.LITERAL_VALUE_USE__VALUE:
 				return getValue();
 			case tdlPackage.LITERAL_VALUE_USE__INT_VALUE:
@@ -310,8 +511,7 @@ public class LiteralValueUseImpl extends StaticDataUseImpl implements LiteralVal
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.LITERAL_VALUE_USE__VALUE:
 				setValue((String)newValue);
 				return;
@@ -336,8 +536,7 @@ public class LiteralValueUseImpl extends StaticDataUseImpl implements LiteralVal
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.LITERAL_VALUE_USE__VALUE:
 				setValue(VALUE_EDEFAULT);
 				return;
@@ -362,8 +561,7 @@ public class LiteralValueUseImpl extends StaticDataUseImpl implements LiteralVal
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.LITERAL_VALUE_USE__VALUE:
 				return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
 			case tdlPackage.LITERAL_VALUE_USE__INT_VALUE:
@@ -384,10 +582,8 @@ public class LiteralValueUseImpl extends StaticDataUseImpl implements LiteralVal
 	@Override
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass)
 	{
-		if (baseClass == DataUse.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == DataUse.class) {
+			switch (baseOperationID) {
 				case tdlPackage.DATA_USE___RESOLVE_DATA_TYPE: return tdlPackage.LITERAL_VALUE_USE___RESOLVE_DATA_TYPE;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
@@ -403,8 +599,7 @@ public class LiteralValueUseImpl extends StaticDataUseImpl implements LiteralVal
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.LITERAL_VALUE_USE___RESOLVE_DATA_TYPE:
 				return resolveDataType();
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/LocalExpressionImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/LocalExpressionImpl.java
index 3db1568e55c16cf422bb001ee3e1eb630bbc95bf..166f9f75163441a052292f2e9b08665d8a0294d4 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/LocalExpressionImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/LocalExpressionImpl.java
@@ -92,8 +92,7 @@ public class LocalExpressionImpl extends ElementImpl implements LocalExpression
 	{
 		DataUse oldExpression = expression;
 		expression = newExpression;
-		if (eNotificationRequired())
-		{
+		if (eNotificationRequired()) {
 			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, tdlPackage.LOCAL_EXPRESSION__EXPRESSION, oldExpression, newExpression);
 			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
@@ -108,8 +107,7 @@ public class LocalExpressionImpl extends ElementImpl implements LocalExpression
 	@Override
 	public void setExpression(DataUse newExpression)
 	{
-		if (newExpression != expression)
-		{
+		if (newExpression != expression) {
 			NotificationChain msgs = null;
 			if (expression != null)
 				msgs = ((InternalEObject)expression).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - tdlPackage.LOCAL_EXPRESSION__EXPRESSION, null, msgs);
@@ -130,12 +128,10 @@ public class LocalExpressionImpl extends ElementImpl implements LocalExpression
 	@Override
 	public ComponentInstance getComponentInstance()
 	{
-		if (componentInstance != null && componentInstance.eIsProxy())
-		{
+		if (componentInstance != null && componentInstance.eIsProxy()) {
 			InternalEObject oldComponentInstance = (InternalEObject)componentInstance;
 			componentInstance = (ComponentInstance)eResolveProxy(oldComponentInstance);
-			if (componentInstance != oldComponentInstance)
-			{
+			if (componentInstance != oldComponentInstance) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.LOCAL_EXPRESSION__COMPONENT_INSTANCE, oldComponentInstance, componentInstance));
 			}
@@ -175,8 +171,7 @@ public class LocalExpressionImpl extends ElementImpl implements LocalExpression
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.LOCAL_EXPRESSION__EXPRESSION:
 				return basicSetExpression(null, msgs);
 		}
@@ -191,8 +186,7 @@ public class LocalExpressionImpl extends ElementImpl implements LocalExpression
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.LOCAL_EXPRESSION__EXPRESSION:
 				return getExpression();
 			case tdlPackage.LOCAL_EXPRESSION__COMPONENT_INSTANCE:
@@ -210,8 +204,7 @@ public class LocalExpressionImpl extends ElementImpl implements LocalExpression
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.LOCAL_EXPRESSION__EXPRESSION:
 				setExpression((DataUse)newValue);
 				return;
@@ -230,8 +223,7 @@ public class LocalExpressionImpl extends ElementImpl implements LocalExpression
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.LOCAL_EXPRESSION__EXPRESSION:
 				setExpression((DataUse)null);
 				return;
@@ -250,8 +242,7 @@ public class LocalExpressionImpl extends ElementImpl implements LocalExpression
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.LOCAL_EXPRESSION__EXPRESSION:
 				return expression != null;
 			case tdlPackage.LOCAL_EXPRESSION__COMPONENT_INSTANCE:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/MemberAssignmentImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/MemberAssignmentImpl.java
index 0fcfe77e4434e8f2cd0d8fe3f90983eef3b6ee19..2db541522ad3364ef3a7263c4295e54e6d87c717 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/MemberAssignmentImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/MemberAssignmentImpl.java
@@ -80,12 +80,10 @@ public class MemberAssignmentImpl extends ElementImpl implements MemberAssignmen
 	@Override
 	public Member getMember()
 	{
-		if (member != null && member.eIsProxy())
-		{
+		if (member != null && member.eIsProxy()) {
 			InternalEObject oldMember = (InternalEObject)member;
 			member = (Member)eResolveProxy(oldMember);
-			if (member != oldMember)
-			{
+			if (member != oldMember) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.MEMBER_ASSIGNMENT__MEMBER, oldMember, member));
 			}
@@ -137,8 +135,7 @@ public class MemberAssignmentImpl extends ElementImpl implements MemberAssignmen
 	{
 		DataUse oldMemberSpec = memberSpec;
 		memberSpec = newMemberSpec;
-		if (eNotificationRequired())
-		{
+		if (eNotificationRequired()) {
 			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, tdlPackage.MEMBER_ASSIGNMENT__MEMBER_SPEC, oldMemberSpec, newMemberSpec);
 			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
@@ -153,8 +150,7 @@ public class MemberAssignmentImpl extends ElementImpl implements MemberAssignmen
 	@Override
 	public void setMemberSpec(DataUse newMemberSpec)
 	{
-		if (newMemberSpec != memberSpec)
-		{
+		if (newMemberSpec != memberSpec) {
 			NotificationChain msgs = null;
 			if (memberSpec != null)
 				msgs = ((InternalEObject)memberSpec).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - tdlPackage.MEMBER_ASSIGNMENT__MEMBER_SPEC, null, msgs);
@@ -175,8 +171,7 @@ public class MemberAssignmentImpl extends ElementImpl implements MemberAssignmen
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.MEMBER_ASSIGNMENT__MEMBER_SPEC:
 				return basicSetMemberSpec(null, msgs);
 		}
@@ -191,8 +186,7 @@ public class MemberAssignmentImpl extends ElementImpl implements MemberAssignmen
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.MEMBER_ASSIGNMENT__MEMBER:
 				if (resolve) return getMember();
 				return basicGetMember();
@@ -210,8 +204,7 @@ public class MemberAssignmentImpl extends ElementImpl implements MemberAssignmen
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.MEMBER_ASSIGNMENT__MEMBER:
 				setMember((Member)newValue);
 				return;
@@ -230,8 +223,7 @@ public class MemberAssignmentImpl extends ElementImpl implements MemberAssignmen
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.MEMBER_ASSIGNMENT__MEMBER:
 				setMember((Member)null);
 				return;
@@ -250,8 +242,7 @@ public class MemberAssignmentImpl extends ElementImpl implements MemberAssignmen
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.MEMBER_ASSIGNMENT__MEMBER:
 				return member != null;
 			case tdlPackage.MEMBER_ASSIGNMENT__MEMBER_SPEC:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/MemberImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/MemberImpl.java
index 006918931aa8107edaac75bae90e6b2c923a9ae7..5032ffd2ac2c523d615c34abaee457bd31a0e6cd 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/MemberImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/MemberImpl.java
@@ -121,8 +121,7 @@ public class MemberImpl extends ParameterImpl implements Member
 	@Override
 	public EList<Constraint> getConstraint()
 	{
-		if (constraint == null)
-		{
+		if (constraint == null) {
 			constraint = new EObjectContainmentEList<Constraint>(Constraint.class, this, tdlPackage.MEMBER__CONSTRAINT);
 		}
 		return constraint;
@@ -136,8 +135,7 @@ public class MemberImpl extends ParameterImpl implements Member
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.MEMBER__CONSTRAINT:
 				return ((InternalEList<?>)getConstraint()).basicRemove(otherEnd, msgs);
 		}
@@ -152,8 +150,7 @@ public class MemberImpl extends ParameterImpl implements Member
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.MEMBER__IS_OPTIONAL:
 				return isIsOptional();
 			case tdlPackage.MEMBER__CONSTRAINT:
@@ -171,8 +168,7 @@ public class MemberImpl extends ParameterImpl implements Member
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.MEMBER__IS_OPTIONAL:
 				setIsOptional((Boolean)newValue);
 				return;
@@ -192,8 +188,7 @@ public class MemberImpl extends ParameterImpl implements Member
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.MEMBER__IS_OPTIONAL:
 				setIsOptional(IS_OPTIONAL_EDEFAULT);
 				return;
@@ -212,8 +207,7 @@ public class MemberImpl extends ParameterImpl implements Member
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.MEMBER__IS_OPTIONAL:
 				return isOptional != IS_OPTIONAL_EDEFAULT;
 			case tdlPackage.MEMBER__CONSTRAINT:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/MemberReferenceImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/MemberReferenceImpl.java
index 4424ce92151918e70008e3be78d2fcb85dfac25a..32cd7b1b79738399c58bbfe9c92e8033518aaf49 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/MemberReferenceImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/MemberReferenceImpl.java
@@ -80,12 +80,10 @@ public class MemberReferenceImpl extends ElementImpl implements MemberReference
 	@Override
 	public Member getMember()
 	{
-		if (member != null && member.eIsProxy())
-		{
+		if (member != null && member.eIsProxy()) {
 			InternalEObject oldMember = (InternalEObject)member;
 			member = (Member)eResolveProxy(oldMember);
-			if (member != oldMember)
-			{
+			if (member != oldMember) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.MEMBER_REFERENCE__MEMBER, oldMember, member));
 			}
@@ -137,8 +135,7 @@ public class MemberReferenceImpl extends ElementImpl implements MemberReference
 	{
 		DataUse oldCollectionIndex = collectionIndex;
 		collectionIndex = newCollectionIndex;
-		if (eNotificationRequired())
-		{
+		if (eNotificationRequired()) {
 			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, tdlPackage.MEMBER_REFERENCE__COLLECTION_INDEX, oldCollectionIndex, newCollectionIndex);
 			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
@@ -153,8 +150,7 @@ public class MemberReferenceImpl extends ElementImpl implements MemberReference
 	@Override
 	public void setCollectionIndex(DataUse newCollectionIndex)
 	{
-		if (newCollectionIndex != collectionIndex)
-		{
+		if (newCollectionIndex != collectionIndex) {
 			NotificationChain msgs = null;
 			if (collectionIndex != null)
 				msgs = ((InternalEObject)collectionIndex).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - tdlPackage.MEMBER_REFERENCE__COLLECTION_INDEX, null, msgs);
@@ -175,8 +171,7 @@ public class MemberReferenceImpl extends ElementImpl implements MemberReference
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.MEMBER_REFERENCE__COLLECTION_INDEX:
 				return basicSetCollectionIndex(null, msgs);
 		}
@@ -191,8 +186,7 @@ public class MemberReferenceImpl extends ElementImpl implements MemberReference
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.MEMBER_REFERENCE__MEMBER:
 				if (resolve) return getMember();
 				return basicGetMember();
@@ -210,8 +204,7 @@ public class MemberReferenceImpl extends ElementImpl implements MemberReference
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.MEMBER_REFERENCE__MEMBER:
 				setMember((Member)newValue);
 				return;
@@ -230,8 +223,7 @@ public class MemberReferenceImpl extends ElementImpl implements MemberReference
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.MEMBER_REFERENCE__MEMBER:
 				setMember((Member)null);
 				return;
@@ -250,8 +242,7 @@ public class MemberReferenceImpl extends ElementImpl implements MemberReference
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.MEMBER_REFERENCE__MEMBER:
 				return member != null;
 			case tdlPackage.MEMBER_REFERENCE__COLLECTION_INDEX:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/MessageImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/MessageImpl.java
index 4a38283252ce144307e84b9aaa359f18f1b6b98d..24faf735c7dc09333c9893fa1dda8cb98bc3aaed 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/MessageImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/MessageImpl.java
@@ -126,8 +126,7 @@ public class MessageImpl extends InteractionImpl implements Message
 	{
 		DataUse oldArgument = argument;
 		argument = newArgument;
-		if (eNotificationRequired())
-		{
+		if (eNotificationRequired()) {
 			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, tdlPackage.MESSAGE__ARGUMENT, oldArgument, newArgument);
 			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
@@ -142,8 +141,7 @@ public class MessageImpl extends InteractionImpl implements Message
 	@Override
 	public void setArgument(DataUse newArgument)
 	{
-		if (newArgument != argument)
-		{
+		if (newArgument != argument) {
 			NotificationChain msgs = null;
 			if (argument != null)
 				msgs = ((InternalEObject)argument).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - tdlPackage.MESSAGE__ARGUMENT, null, msgs);
@@ -164,8 +162,7 @@ public class MessageImpl extends InteractionImpl implements Message
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.MESSAGE__ARGUMENT:
 				return basicSetArgument(null, msgs);
 		}
@@ -180,8 +177,7 @@ public class MessageImpl extends InteractionImpl implements Message
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.MESSAGE__IS_TRIGGER:
 				return isIsTrigger();
 			case tdlPackage.MESSAGE__ARGUMENT:
@@ -198,8 +194,7 @@ public class MessageImpl extends InteractionImpl implements Message
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.MESSAGE__IS_TRIGGER:
 				setIsTrigger((Boolean)newValue);
 				return;
@@ -218,8 +213,7 @@ public class MessageImpl extends InteractionImpl implements Message
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.MESSAGE__IS_TRIGGER:
 				setIsTrigger(IS_TRIGGER_EDEFAULT);
 				return;
@@ -238,8 +232,7 @@ public class MessageImpl extends InteractionImpl implements Message
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.MESSAGE__IS_TRIGGER:
 				return isTrigger != IS_TRIGGER_EDEFAULT;
 			case tdlPackage.MESSAGE__ARGUMENT:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/MultipleCombinedBehaviourImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/MultipleCombinedBehaviourImpl.java
index d0bbd7f8f4fa57f50be9c61334fe3e11a1b20472..63f23ca7bb1cf85d667168fbc61fc0eb6f1f9b1a 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/MultipleCombinedBehaviourImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/MultipleCombinedBehaviourImpl.java
@@ -6,23 +6,42 @@ import java.lang.reflect.InvocationTargetException;
 
 import java.util.Collection;
 
+import java.util.Iterator;
+import java.util.List;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.ids.IdResolver.IdResolverExtension;
+import org.eclipse.ocl.pivot.library.collection.CollectionAsOrderedSetOperation;
+import org.eclipse.ocl.pivot.library.collection.CollectionUnionOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsSetOperation;
+import org.eclipse.ocl.pivot.messages.PivotMessages;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.BagValue;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
+import org.eclipse.ocl.pivot.values.OrderedSetValue;
+import org.eclipse.ocl.pivot.values.SequenceValue;
+import org.eclipse.ocl.pivot.values.SequenceValue.Accumulator;
+import org.eclipse.ocl.pivot.values.SetValue;
 import org.etsi.mts.tdl.Behaviour;
 import org.etsi.mts.tdl.Block;
 import org.etsi.mts.tdl.ComponentInstance;
+import org.etsi.mts.tdl.ExceptionalBehaviour;
 import org.etsi.mts.tdl.MultipleCombinedBehaviour;
+import org.etsi.mts.tdl.PeriodicBehaviour;
+import org.etsi.mts.tdl.TestConfiguration;
+import org.etsi.mts.tdl.TestDescription;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -78,23 +97,12 @@ public abstract class MultipleCombinedBehaviourImpl extends CombinedBehaviourImp
 	@Override
 	public EList<Block> getBlock()
 	{
-		if (block == null)
-		{
+		if (block == null) {
 			block = new EObjectContainmentEList<Block>(Block.class, this, tdlPackage.MULTIPLE_COMBINED_BEHAVIOUR__BLOCK);
 		}
 		return block;
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #getParticipatingComponents() <em>Get Participating Components</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getParticipatingComponents()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate GET_PARTICIPATING_COMPONENTS__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.MULTIPLE_COMBINED_BEHAVIOUR___GET_PARTICIPATING_COMPONENTS).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -104,14 +112,137 @@ public abstract class MultipleCombinedBehaviourImpl extends CombinedBehaviourImp
 	@Override
 	public EList<ComponentInstance> getParticipatingComponents()
 	{
-		try
-		{
-			return (EList<ComponentInstance>)GET_PARTICIPATING_COMPONENTS__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if
+		 *   self.getParentTestDescription()
+		 *   ->exists(td | td.isLocallyOrdered)
+		 * then
+		 *   self.periodic.getParticipatingComponents()
+		 *   ->union(self.exceptional.getParticipatingComponents())
+		 *   ->union(self.block.getParticipatingComponents())
+		 *   ->asOrderedSet()
+		 * else
+		 *   self.getParentTestDescription()
+		 *   .testConfiguration.componentInstance->asOrderedSet()
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ TestDescription getParentTestDescription = this.getParentTestDescription();
+		final /*@NonInvalid*/ SetValue oclAsSet = OclAnyOclAsSetOperation.INSTANCE.evaluate(executor, tdlTables.SET_CLSSid_TestDescription, getParentTestDescription);
+		/*@Thrown*/ Object accumulator = ValueUtil.FALSE_VALUE;
+		Iterator<Object> ITERATOR_td = oclAsSet.iterator();
+		/*@NonInvalid*/ Boolean exists;
+		while (true) {
+			if (!ITERATOR_td.hasNext()) {
+				if (accumulator == ValueUtil.FALSE_VALUE) {
+					exists = ValueUtil.FALSE_VALUE;
+				}
+				else {
+					throw (InvalidValueException)accumulator;
+				}
+				break;
+			}
+			/*@NonInvalid*/ TestDescription td = (TestDescription)ITERATOR_td.next();
+			/**
+			 * td.isLocallyOrdered
+			 */
+			final /*@NonInvalid*/ boolean isLocallyOrdered = td.isIsLocallyOrdered();
+			//
+			if (isLocallyOrdered) {					// Normal successful body evaluation result
+				exists = ValueUtil.TRUE_VALUE;
+				break;														// Stop immediately
+			}
+			else if (!isLocallyOrdered) {				// Normal unsuccessful body evaluation result
+				;															// Carry on
+			}
+			else {															// Impossible badly typed result
+				accumulator = new InvalidValueException(PivotMessages.NonBooleanBody, "exists");
+			}
+		}
+		if (exists == null) {
+			throw new InvalidValueException("Null if condition");
+		}
+		/*@NonInvalid*/ OrderedSetValue local_0;
+		if (exists) {
+			final /*@NonInvalid*/ List<PeriodicBehaviour> periodic = this.getPeriodic();
+			final /*@NonInvalid*/ OrderedSetValue BOXED_periodic = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_PeriodicBehaviour, periodic);
+			/*@Thrown*/ Accumulator accumulator_0 = ValueUtil.createSequenceAccumulatorValue(tdlTables.SEQ_CLSSid_ComponentInstance);
+			Iterator<Object> ITERATOR__1 = BOXED_periodic.iterator();
+			/*@NonInvalid*/ SequenceValue collect;
+			while (true) {
+				if (!ITERATOR__1.hasNext()) {
+					collect = accumulator_0;
+					break;
+				}
+				/*@NonInvalid*/ PeriodicBehaviour _1 = (PeriodicBehaviour)ITERATOR__1.next();
+				/**
+				 * getParticipatingComponents()
+				 */
+				final /*@NonInvalid*/ List<ComponentInstance> getParticipatingComponents = _1.getParticipatingComponents();
+				final /*@NonInvalid*/ OrderedSetValue BOXED_getParticipatingComponents = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_ComponentInstance, getParticipatingComponents);
+				//
+				for (Object value : BOXED_getParticipatingComponents.flatten().getElements()) {
+					accumulator_0.add(value);
+				}
+			}
+			final /*@NonInvalid*/ List<ExceptionalBehaviour> exceptional = this.getExceptional();
+			final /*@NonInvalid*/ OrderedSetValue BOXED_exceptional = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_ExceptionalBehaviour, exceptional);
+			/*@Thrown*/ Accumulator accumulator_1 = ValueUtil.createSequenceAccumulatorValue(tdlTables.SEQ_CLSSid_ComponentInstance);
+			Iterator<Object> ITERATOR__1_0 = BOXED_exceptional.iterator();
+			/*@NonInvalid*/ SequenceValue collect_0;
+			while (true) {
+				if (!ITERATOR__1_0.hasNext()) {
+					collect_0 = accumulator_1;
+					break;
+				}
+				/*@NonInvalid*/ ExceptionalBehaviour _1_0 = (ExceptionalBehaviour)ITERATOR__1_0.next();
+				/**
+				 * getParticipatingComponents()
+				 */
+				final /*@NonInvalid*/ List<ComponentInstance> getParticipatingComponents_0 = _1_0.getParticipatingComponents();
+				final /*@NonInvalid*/ OrderedSetValue BOXED_getParticipatingComponents_0 = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_ComponentInstance, getParticipatingComponents_0);
+				//
+				for (Object value : BOXED_getParticipatingComponents_0.flatten().getElements()) {
+					accumulator_1.add(value);
+				}
+			}
+			final /*@NonInvalid*/ BagValue union = (BagValue)CollectionUnionOperation.INSTANCE.evaluate(collect, collect_0);
+			final /*@NonInvalid*/ List<Block> block = this.getBlock();
+			final /*@NonInvalid*/ OrderedSetValue BOXED_block = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_Block, block);
+			/*@Thrown*/ Accumulator accumulator_2 = ValueUtil.createSequenceAccumulatorValue(tdlTables.SEQ_CLSSid_ComponentInstance);
+			Iterator<Object> ITERATOR__1_1 = BOXED_block.iterator();
+			/*@NonInvalid*/ SequenceValue collect_1;
+			while (true) {
+				if (!ITERATOR__1_1.hasNext()) {
+					collect_1 = accumulator_2;
+					break;
+				}
+				/*@NonInvalid*/ Block _1_1 = (Block)ITERATOR__1_1.next();
+				/**
+				 * getParticipatingComponents()
+				 */
+				final /*@NonInvalid*/ List<ComponentInstance> getParticipatingComponents_1 = _1_1.getParticipatingComponents();
+				final /*@NonInvalid*/ OrderedSetValue BOXED_getParticipatingComponents_1 = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_ComponentInstance, getParticipatingComponents_1);
+				//
+				for (Object value : BOXED_getParticipatingComponents_1.flatten().getElements()) {
+					accumulator_2.add(value);
+				}
+			}
+			final /*@NonInvalid*/ BagValue union_0 = (BagValue)CollectionUnionOperation.INSTANCE.evaluate(union, collect_1);
+			final /*@NonInvalid*/ OrderedSetValue asOrderedSet = CollectionAsOrderedSetOperation.INSTANCE.evaluate(union_0);
+			local_0 = asOrderedSet;
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		else {
+			final /*@NonInvalid*/ TestConfiguration testConfiguration = getParentTestDescription.getTestConfiguration();
+			final /*@NonInvalid*/ List<ComponentInstance> componentInstance = testConfiguration.getComponentInstance();
+			final /*@NonInvalid*/ SetValue BOXED_componentInstance = idResolver.createSetOfAll(tdlTables.SET_CLSSid_ComponentInstance, componentInstance);
+			final /*@NonInvalid*/ OrderedSetValue asOrderedSet_0 = CollectionAsOrderedSetOperation.INSTANCE.evaluate(BOXED_componentInstance);
+			local_0 = asOrderedSet_0;
 		}
+		final /*@NonInvalid*/ List<ComponentInstance> ECORE_local_0 = ((IdResolverExtension)idResolver).ecoreValueOfAll(ComponentInstance.class, local_0);
+		return (EList<ComponentInstance>)ECORE_local_0;
 	}
 
 	/**
@@ -122,8 +253,7 @@ public abstract class MultipleCombinedBehaviourImpl extends CombinedBehaviourImp
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.MULTIPLE_COMBINED_BEHAVIOUR__BLOCK:
 				return ((InternalEList<?>)getBlock()).basicRemove(otherEnd, msgs);
 		}
@@ -138,8 +268,7 @@ public abstract class MultipleCombinedBehaviourImpl extends CombinedBehaviourImp
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.MULTIPLE_COMBINED_BEHAVIOUR__BLOCK:
 				return getBlock();
 		}
@@ -155,8 +284,7 @@ public abstract class MultipleCombinedBehaviourImpl extends CombinedBehaviourImp
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.MULTIPLE_COMBINED_BEHAVIOUR__BLOCK:
 				getBlock().clear();
 				getBlock().addAll((Collection<? extends Block>)newValue);
@@ -173,8 +301,7 @@ public abstract class MultipleCombinedBehaviourImpl extends CombinedBehaviourImp
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.MULTIPLE_COMBINED_BEHAVIOUR__BLOCK:
 				getBlock().clear();
 				return;
@@ -190,8 +317,7 @@ public abstract class MultipleCombinedBehaviourImpl extends CombinedBehaviourImp
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.MULTIPLE_COMBINED_BEHAVIOUR__BLOCK:
 				return block != null && !block.isEmpty();
 		}
@@ -206,10 +332,8 @@ public abstract class MultipleCombinedBehaviourImpl extends CombinedBehaviourImp
 	@Override
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass)
 	{
-		if (baseClass == Behaviour.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == Behaviour.class) {
+			switch (baseOperationID) {
 				case tdlPackage.BEHAVIOUR___GET_PARTICIPATING_COMPONENTS: return tdlPackage.MULTIPLE_COMBINED_BEHAVIOUR___GET_PARTICIPATING_COMPONENTS;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
@@ -225,8 +349,7 @@ public abstract class MultipleCombinedBehaviourImpl extends CombinedBehaviourImp
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.MULTIPLE_COMBINED_BEHAVIOUR___GET_PARTICIPATING_COMPONENTS:
 				return getParticipatingComponents();
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/NamedElementImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/NamedElementImpl.java
index 41de9af22eb0690df88c77e7c68826cf887fb325..3be4bd0115d6a3d0f85e7c8a3de45175867f266e 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/NamedElementImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/NamedElementImpl.java
@@ -2,11 +2,32 @@
  */
 package org.etsi.mts.tdl.impl;
 
+import java.util.Iterator;
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-
+import org.eclipse.ocl.pivot.StandardLibrary;
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.ids.TypeId;
+import org.eclipse.ocl.pivot.internal.library.executor.ExecutorSingleIterationManager;
+import org.eclipse.ocl.pivot.library.AbstractBinaryOperation;
+import org.eclipse.ocl.pivot.library.LibraryIteration.LibraryIterationExtension;
+import org.eclipse.ocl.pivot.library.classifier.ClassifierOclContainerOperation;
+import org.eclipse.ocl.pivot.library.collection.CollectionAsOrderedSetOperation;
+import org.eclipse.ocl.pivot.library.collection.OrderedCollectionFirstOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsSetOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsTypeOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclIsKindOfOperation;
+import org.eclipse.ocl.pivot.library.string.StringConcatOperation;
+import org.eclipse.ocl.pivot.oclstdlib.OCLstdlibTables;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
+import org.eclipse.ocl.pivot.values.OrderedSetValue;
+import org.eclipse.ocl.pivot.values.SetValue;
+import org.eclipse.ocl.pivot.values.SetValue.Accumulator;
 import org.etsi.mts.tdl.NamedElement;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -24,15 +45,14 @@ import org.etsi.mts.tdl.tdlPackage;
 public abstract class NamedElementImpl extends ElementImpl implements NamedElement
 {
 	/**
-	 * The cached setting delegate for the '{@link #getQualifiedName() <em>Qualified Name</em>}' attribute.
+	 * The default value of the '{@link #getQualifiedName() <em>Qualified Name</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @see #getQualifiedName()
 	 * @generated
 	 * @ordered
 	 */
-	protected EStructuralFeature.Internal.SettingDelegate QUALIFIED_NAME__ESETTING_DELEGATE = ((EStructuralFeature.Internal)tdlPackage.Literals.NAMED_ELEMENT__QUALIFIED_NAME).getSettingDelegate();
-
+	protected static final String QUALIFIED_NAME_EDEFAULT = null;
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -62,7 +82,131 @@ public abstract class NamedElementImpl extends ElementImpl implements NamedEleme
 	@Override
 	public String getQualifiedName()
 	{
-		return (String)QUALIFIED_NAME__ESETTING_DELEGATE.dynamicGet(this, null, 0, true, false);
+		/**
+		 *
+		 * if self.name.oclIsUndefined()
+		 * then ''
+		 * else
+		 *   if not self.oclContainer().oclIsUndefined()
+		 *   then
+		 *     if self.oclContainer().oclIsKindOf(NamedElement)
+		 *     then
+		 *       self.oclContainer()
+		 *       .oclAsType(NamedElement).qualifiedName + '::' + self.name
+		 *     else
+		 *       self.oclContainer()
+		 *       .oclAsType(OclElement)
+		 *       ->closure(oclContainer())
+		 *       ->select(c | c.oclIsKindOf(NamedElement))
+		 *       ->asOrderedSet()
+		 *       ->first()
+		 *       .oclAsType(NamedElement).qualifiedName + '::' + self.name
+		 *     endif
+		 *   else self.name
+		 *   endif
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ String name_2 = this.getName();
+		final /*@NonInvalid*/ StandardLibrary standardLibrary = idResolver.getStandardLibrary();
+		final /*@NonInvalid*/ boolean oclIsUndefined = name_2 == null;
+		/*@Thrown*/ String local_2;
+		if (oclIsUndefined) {
+			local_2 = tdlTables.STR_;
+		}
+		else {
+			final /*@NonInvalid*/ Object oclContainer_0 = ClassifierOclContainerOperation.INSTANCE.evaluate(executor, this);
+			final /*@NonInvalid*/ boolean oclIsUndefined_0 = oclContainer_0 == null;
+			final /*@NonInvalid*/ Boolean not;
+			if (!oclIsUndefined_0) {
+				not = ValueUtil.TRUE_VALUE;
+			}
+			else {
+				if (oclIsUndefined_0) {
+					not = ValueUtil.FALSE_VALUE;
+				}
+				else {
+					not = null;
+				}
+			}
+			if (not == null) {
+				throw new InvalidValueException("Null if condition");
+			}
+			/*@Thrown*/ String local_1;
+			if (not) {
+				final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_NamedElement_0 = idResolver.getClass(tdlTables.CLSSid_NamedElement, null);
+				final /*@Thrown*/ boolean oclIsKindOf = OclAnyOclIsKindOfOperation.INSTANCE.evaluate(executor, oclContainer_0, TYP_tdl_c_c_NamedElement_0).booleanValue();
+				/*@Thrown*/ String local_0;
+				if (oclIsKindOf) {
+					final /*@Thrown*/ NamedElement oclAsType = (NamedElement)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, oclContainer_0, TYP_tdl_c_c_NamedElement_0);
+					final /*@Thrown*/ String qualifiedName = oclAsType.getQualifiedName();
+					final /*@Thrown*/ String sum = StringConcatOperation.INSTANCE.evaluate(qualifiedName, tdlTables.STR__c_c);
+					final /*@Thrown*/ String sum_0 = StringConcatOperation.INSTANCE.evaluate(sum, name_2);
+					local_0 = sum_0;
+				}
+				else {
+					final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_OclElement_0 = idResolver.getClass(tdlTables.CLSSid_OclElement, null);
+					final /*@Thrown*/ Object oclAsType_0 = OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, oclContainer_0, TYP_OclElement_0);
+					final /*@Thrown*/ SetValue oclAsSet = OclAnyOclAsSetOperation.INSTANCE.evaluate(executor, tdlTables.SET_CLSSid_OclElement, oclAsType_0);
+					final org.eclipse.ocl.pivot.Class TYPE_closure_0 = executor.getStaticTypeOfValue(null, oclAsSet);
+					final LibraryIterationExtension IMPL_closure_0 = (LibraryIterationExtension)TYPE_closure_0.lookupImplementation(standardLibrary, OCLstdlibTables.Operations._Set__closure);
+					final /*@NonNull*/ Object ACC_closure_0 = IMPL_closure_0.createAccumulatorValue(executor, tdlTables.SET_CLSSid_OclElement, tdlTables.CLSSid_OclElement);
+					/**
+					 * Implementation of the iterator body.
+					 */
+					final AbstractBinaryOperation BODY_closure_0 = new AbstractBinaryOperation() {
+						/**
+						 * oclContainer()
+						 */
+						@Override
+						public /*@Nullable*/ Object evaluate(final Executor executor, final TypeId typeId, final /*@Nullable*/ Object oclAsSet, final /*@NonInvalid*/ Object _1) {
+							if (_1 == null) {
+								throw new InvalidValueException("Null \'\'OclElement\'\' rather than \'\'OclVoid\'\' value required");
+							}
+							final /*@Thrown*/ Object oclContainer_3 = ClassifierOclContainerOperation.INSTANCE.evaluate(executor, _1);
+							return oclContainer_3;
+						}
+					};
+					final ExecutorSingleIterationManager MGR_closure_0 = new ExecutorSingleIterationManager(executor, tdlTables.SET_CLSSid_OclElement, BODY_closure_0, oclAsSet, ACC_closure_0);
+					final /*@Thrown*/ SetValue closure = (SetValue)IMPL_closure_0.evaluateIteration(MGR_closure_0);
+					/*@Thrown*/ Accumulator accumulator = ValueUtil.createSetAccumulatorValue(tdlTables.SET_CLSSid_OclElement);
+					Iterator<Object> ITERATOR_c = closure.iterator();
+					/*@Thrown*/ SetValue select;
+					while (true) {
+						if (!ITERATOR_c.hasNext()) {
+							select = accumulator;
+							break;
+						}
+						/*@NonInvalid*/ Object c = (Object)ITERATOR_c.next();
+						/**
+						 * c.oclIsKindOf(NamedElement)
+						 */
+						final /*@Thrown*/ boolean oclIsKindOf_0 = OclAnyOclIsKindOfOperation.INSTANCE.evaluate(executor, c, TYP_tdl_c_c_NamedElement_0).booleanValue();
+						//
+						if (oclIsKindOf_0 == ValueUtil.TRUE_VALUE) {
+							accumulator.add(c);
+						}
+					}
+					final /*@Thrown*/ OrderedSetValue asOrderedSet = CollectionAsOrderedSetOperation.INSTANCE.evaluate(select);
+					final /*@Thrown*/ Object first = OrderedCollectionFirstOperation.INSTANCE.evaluate(asOrderedSet);
+					final /*@Thrown*/ NamedElement oclAsType_1 = (NamedElement)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, first, TYP_tdl_c_c_NamedElement_0);
+					final /*@Thrown*/ String qualifiedName_0 = oclAsType_1.getQualifiedName();
+					final /*@Thrown*/ String sum_1 = StringConcatOperation.INSTANCE.evaluate(qualifiedName_0, tdlTables.STR__c_c);
+					final /*@Thrown*/ String sum_2 = StringConcatOperation.INSTANCE.evaluate(sum_1, name_2);
+					local_0 = sum_2;
+				}
+				local_1 = local_0;
+			}
+			else {
+				local_1 = name_2;
+			}
+			local_2 = local_1;
+		}
+		if (local_2 == null) {
+			throw new InvalidValueException("Null body for \'tdl::NamedElement::qualifiedName\'");
+		}
+		return local_2;
 	}
 
 	/**
@@ -73,8 +217,7 @@ public abstract class NamedElementImpl extends ElementImpl implements NamedEleme
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.NAMED_ELEMENT__QUALIFIED_NAME:
 				return getQualifiedName();
 		}
@@ -89,10 +232,9 @@ public abstract class NamedElementImpl extends ElementImpl implements NamedEleme
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.NAMED_ELEMENT__QUALIFIED_NAME:
-				return QUALIFIED_NAME__ESETTING_DELEGATE.dynamicIsSet(this, null, 0);
+				return QUALIFIED_NAME_EDEFAULT == null ? getQualifiedName() != null : !QUALIFIED_NAME_EDEFAULT.equals(getQualifiedName());
 		}
 		return super.eIsSet(featureID);
 	}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/PackageImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/PackageImpl.java
index 7686ed484494ff9001a45c083de75fec0744de7b..49b7eeb2e7f17e40589512b9488ec376ee669089 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/PackageImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/PackageImpl.java
@@ -94,8 +94,7 @@ public class PackageImpl extends NamedElementImpl implements org.etsi.mts.tdl.Pa
 	@Override
 	public EList<PackageableElement> getPackagedElement()
 	{
-		if (packagedElement == null)
-		{
+		if (packagedElement == null) {
 			packagedElement = new EObjectContainmentEList<PackageableElement>(PackageableElement.class, this, tdlPackage.PACKAGE__PACKAGED_ELEMENT);
 		}
 		return packagedElement;
@@ -109,8 +108,7 @@ public class PackageImpl extends NamedElementImpl implements org.etsi.mts.tdl.Pa
 	@Override
 	public EList<ElementImport> getImport()
 	{
-		if (import_ == null)
-		{
+		if (import_ == null) {
 			import_ = new EObjectContainmentEList<ElementImport>(ElementImport.class, this, tdlPackage.PACKAGE__IMPORT);
 		}
 		return import_;
@@ -124,8 +122,7 @@ public class PackageImpl extends NamedElementImpl implements org.etsi.mts.tdl.Pa
 	@Override
 	public EList<org.etsi.mts.tdl.Package> getNestedPackage()
 	{
-		if (nestedPackage == null)
-		{
+		if (nestedPackage == null) {
 			nestedPackage = new EObjectContainmentEList<org.etsi.mts.tdl.Package>(org.etsi.mts.tdl.Package.class, this, tdlPackage.PACKAGE__NESTED_PACKAGE);
 		}
 		return nestedPackage;
@@ -139,8 +136,7 @@ public class PackageImpl extends NamedElementImpl implements org.etsi.mts.tdl.Pa
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PACKAGE__PACKAGED_ELEMENT:
 				return ((InternalEList<?>)getPackagedElement()).basicRemove(otherEnd, msgs);
 			case tdlPackage.PACKAGE__IMPORT:
@@ -159,8 +155,7 @@ public class PackageImpl extends NamedElementImpl implements org.etsi.mts.tdl.Pa
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PACKAGE__PACKAGED_ELEMENT:
 				return getPackagedElement();
 			case tdlPackage.PACKAGE__IMPORT:
@@ -180,8 +175,7 @@ public class PackageImpl extends NamedElementImpl implements org.etsi.mts.tdl.Pa
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PACKAGE__PACKAGED_ELEMENT:
 				getPackagedElement().clear();
 				getPackagedElement().addAll((Collection<? extends PackageableElement>)newValue);
@@ -206,8 +200,7 @@ public class PackageImpl extends NamedElementImpl implements org.etsi.mts.tdl.Pa
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PACKAGE__PACKAGED_ELEMENT:
 				getPackagedElement().clear();
 				return;
@@ -229,8 +222,7 @@ public class PackageImpl extends NamedElementImpl implements org.etsi.mts.tdl.Pa
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PACKAGE__PACKAGED_ELEMENT:
 				return packagedElement != null && !packagedElement.isEmpty();
 			case tdlPackage.PACKAGE__IMPORT:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/PackageableElementImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/PackageableElementImpl.java
index 3b96ccc2fefe0d759f9dc2b6bc9c8626cdfb3275..6132df86f50bb1eb0525b673b8261f1fad1c9780 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/PackageableElementImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/PackageableElementImpl.java
@@ -4,15 +4,34 @@ package org.etsi.mts.tdl.impl;
 
 import java.lang.reflect.InvocationTargetException;
 
-import org.eclipse.emf.common.util.BasicEList;
+import java.util.Iterator;
+import java.util.List;
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
-
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.library.classifier.ClassifierAllInstancesOperation;
+import org.eclipse.ocl.pivot.library.collection.CollectionAsOrderedSetOperation;
+import org.eclipse.ocl.pivot.library.collection.OrderedCollectionFirstOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsTypeOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclIsKindOfOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclTypeOperation;
+import org.eclipse.ocl.pivot.messages.PivotMessages;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
+import org.eclipse.ocl.pivot.values.OrderedSetValue;
+import org.eclipse.ocl.pivot.values.SetValue;
+import org.eclipse.ocl.pivot.values.SetValue.Accumulator;
+import org.etsi.mts.tdl.AnnotationType;
+import org.etsi.mts.tdl.ComponentType;
+import org.etsi.mts.tdl.Extension;
+import org.etsi.mts.tdl.GateType;
 import org.etsi.mts.tdl.PackageableElement;
+import org.etsi.mts.tdl.SimpleDataType;
+import org.etsi.mts.tdl.StructuredDataType;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -44,88 +63,430 @@ public abstract class PackageableElementImpl extends NamedElementImpl implements
 		return tdlPackage.Literals.PACKAGEABLE_ELEMENT;
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #conformsTo(java.lang.String) <em>Conforms To</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #conformsTo(java.lang.String)
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate CONFORMS_TO_STRING__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.PACKAGEABLE_ELEMENT___CONFORMS_TO__STRING).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
 	@Override
-	public Boolean conformsTo(String n)
+	public Boolean conformsTo(final String n)
 	{
-		try
-		{
-			return (Boolean)CONFORMS_TO_STRING__EINVOCATION_DELEGATE.dynamicInvoke(this, new BasicEList.UnmodifiableEList<Object>(1, new Object[]{n}));
+		/**
+		 *
+		 * if self.getElementNamed(n).oclIsUndefined()
+		 * then false
+		 * else self.conformsTo(self.getElementNamed(n))
+		 * endif
+		 */
+		/*@Caught*/ Object CAUGHT_getElementNamed;
+		try {
+			final /*@Thrown*/ PackageableElement getElementNamed = this.getElementNamed(n);
+			CAUGHT_getElementNamed = getElementNamed;
+		}
+		catch (Exception e) {
+			CAUGHT_getElementNamed = ValueUtil.createInvalidValue(e);
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		final /*@NonInvalid*/ boolean oclIsUndefined = CAUGHT_getElementNamed instanceof InvalidValueException;
+		/*@Thrown*/ boolean local_0;
+		if (oclIsUndefined) {
+			local_0 = false;
 		}
+		else {
+			final /*@Thrown*/ PackageableElement getElementNamed_0 = this.getElementNamed(n);
+			final /*@Thrown*/ boolean conformsTo = this.conformsTo(getElementNamed_0);
+			local_0 = conformsTo;
+		}
+		return local_0;
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #getElementNamed(java.lang.String) <em>Get Element Named</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getElementNamed(java.lang.String)
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate GET_ELEMENT_NAMED_STRING__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.PACKAGEABLE_ELEMENT___GET_ELEMENT_NAMED__STRING).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
 	@Override
-	public PackageableElement getElementNamed(String n)
+	public PackageableElement getElementNamed(final String n)
 	{
-		try
-		{
-			return (PackageableElement)GET_ELEMENT_NAMED_STRING__EINVOCATION_DELEGATE.dynamicInvoke(this, new BasicEList.UnmodifiableEList<Object>(1, new Object[]{n}));
-		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		/**
+		 *
+		 * self.oclType()
+		 * .allInstances()
+		 * ->select(e | e.name = n)
+		 * ->asOrderedSet()
+		 * ->first()
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class oclType = (org.eclipse.ocl.pivot.Class)OclAnyOclTypeOperation.INSTANCE.evaluate(executor, this);
+		final /*@NonInvalid*/ SetValue allInstances = ClassifierAllInstancesOperation.INSTANCE.evaluate(executor, tdlTables.SET_CLSSid_PackageableElement, oclType);
+		/*@Thrown*/ Accumulator accumulator = ValueUtil.createSetAccumulatorValue(tdlTables.SET_CLSSid_PackageableElement);
+		Iterator<Object> ITERATOR_e_1 = allInstances.iterator();
+		/*@NonInvalid*/ SetValue select;
+		while (true) {
+			if (!ITERATOR_e_1.hasNext()) {
+				select = accumulator;
+				break;
+			}
+			/*@NonInvalid*/ PackageableElement e_1 = (PackageableElement)ITERATOR_e_1.next();
+			/**
+			 * e.name = n
+			 */
+			final /*@NonInvalid*/ String name = e_1.getName();
+			final /*@NonInvalid*/ boolean eq = (name != null) ? name.equals(n) : (n == null);
+			//
+			if (eq) {
+				accumulator.add(e_1);
+			}
 		}
+		final /*@NonInvalid*/ OrderedSetValue asOrderedSet = CollectionAsOrderedSetOperation.INSTANCE.evaluate(select);
+		final /*@Thrown*/ PackageableElement first = (PackageableElement)OrderedCollectionFirstOperation.INSTANCE.evaluate(asOrderedSet);
+		return first;
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #conformsTo(org.etsi.mts.tdl.PackageableElement) <em>Conforms To</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #conformsTo(org.etsi.mts.tdl.PackageableElement)
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate CONFORMS_TO_PACKAGEABLE_ELEMENT__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.PACKAGEABLE_ELEMENT___CONFORMS_TO__PACKAGEABLEELEMENT).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
 	@Override
-	public Boolean conformsTo(PackageableElement n)
+	public Boolean conformsTo(final PackageableElement n)
 	{
-		try
-		{
-			return (Boolean)CONFORMS_TO_PACKAGEABLE_ELEMENT__EINVOCATION_DELEGATE.dynamicInvoke(this, new BasicEList.UnmodifiableEList<Object>(1, new Object[]{n}));
+		/**
+		 *
+		 * if self = n
+		 * then true
+		 * else
+		 *   if
+		 *     self.oclIsKindOf(AnnotationType) and
+		 *     not self.oclAsType(AnnotationType)
+		 *     .extension.oclIsUndefined()
+		 *   then self.oclAsType(AnnotationType).extension.isExtending(n)
+		 *   else
+		 *     if
+		 *       self.oclIsKindOf(ComponentType) and
+		 *       not self.oclAsType(ComponentType)
+		 *       .extension.oclIsUndefined()
+		 *     then self.oclAsType(ComponentType).extension.isExtending(n)
+		 *     else
+		 *       if
+		 *         self.oclIsKindOf(GateType) and
+		 *         not self.oclAsType(GateType)
+		 *         .extension.oclIsUndefined()
+		 *       then self.oclAsType(GateType).extension.isExtending(n)
+		 *       else
+		 *         if self.oclIsKindOf(StructuredDataType)
+		 *         then
+		 *           self.oclAsType(StructuredDataType)
+		 *           .extension->exists(ex | ex.isExtending(n))
+		 *         else
+		 *           if
+		 *             self.oclIsKindOf(SimpleDataType) and
+		 *             not self.oclAsType(SimpleDataType)
+		 *             .extension.oclIsUndefined()
+		 *           then
+		 *             self.oclAsType(SimpleDataType)
+		 *             .extension.isExtending(n)
+		 *           else false
+		 *           endif
+		 *         endif
+		 *       endif
+		 *     endif
+		 *   endif
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ boolean eq = this.equals(n);
+		/*@Thrown*/ Boolean local_5;
+		if (eq) {
+			local_5 = ValueUtil.TRUE_VALUE;
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		else {
+			final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_AnnotationType_0 = idResolver.getClass(tdlTables.CLSSid_AnnotationType, null);
+			final /*@NonInvalid*/ boolean oclIsKindOf = OclAnyOclIsKindOfOperation.INSTANCE.evaluate(executor, this, TYP_tdl_c_c_AnnotationType_0).booleanValue();
+			final /*@Thrown*/ Boolean and;
+			if (!oclIsKindOf) {
+				and = ValueUtil.FALSE_VALUE;
+			}
+			else {
+				/*@Caught*/ Object CAUGHT_extension;
+				try {
+					final /*@Thrown*/ AnnotationType oclAsType = (AnnotationType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, this, TYP_tdl_c_c_AnnotationType_0);
+					final /*@Thrown*/ Extension extension = oclAsType.getExtension();
+					CAUGHT_extension = extension;
+				}
+				catch (Exception e) {
+					CAUGHT_extension = ValueUtil.createInvalidValue(e);
+				}
+				final /*@NonInvalid*/ boolean oclIsUndefined = (CAUGHT_extension == null) || (CAUGHT_extension instanceof InvalidValueException);
+				final /*@NonInvalid*/ Boolean not;
+				if (!oclIsUndefined) {
+					not = ValueUtil.TRUE_VALUE;
+				}
+				else {
+					if (oclIsUndefined) {
+						not = ValueUtil.FALSE_VALUE;
+					}
+					else {
+						not = null;
+					}
+				}
+				if (not == ValueUtil.FALSE_VALUE) {
+					and = ValueUtil.FALSE_VALUE;
+				}
+				else {
+					if (not == null) {
+						and = null;
+					}
+					else {
+						and = ValueUtil.TRUE_VALUE;
+					}
+				}
+			}
+			if (and == null) {
+				throw new InvalidValueException("Null if condition");
+			}
+			/*@Thrown*/ Boolean local_4;
+			if (and) {
+				final /*@Thrown*/ AnnotationType oclAsType_0 = (AnnotationType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, this, TYP_tdl_c_c_AnnotationType_0);
+				final /*@Thrown*/ Extension extension_0 = oclAsType_0.getExtension();
+				if (extension_0 == null) {
+					throw new InvalidValueException("Null source for \'tdl::Extension::isExtending(tdl::PackageableElement[?]) : Boolean[?]\'");
+				}
+				final /*@Thrown*/ boolean isExtending = extension_0.isExtending(n);
+				local_4 = isExtending;
+			}
+			else {
+				final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_ComponentType_0 = idResolver.getClass(tdlTables.CLSSid_ComponentType, null);
+				final /*@NonInvalid*/ boolean oclIsKindOf_0 = OclAnyOclIsKindOfOperation.INSTANCE.evaluate(executor, this, TYP_tdl_c_c_ComponentType_0).booleanValue();
+				final /*@Thrown*/ Boolean and_0;
+				if (!oclIsKindOf_0) {
+					and_0 = ValueUtil.FALSE_VALUE;
+				}
+				else {
+					/*@Caught*/ Object CAUGHT_extension_1;
+					try {
+						final /*@Thrown*/ ComponentType oclAsType_1 = (ComponentType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, this, TYP_tdl_c_c_ComponentType_0);
+						final /*@Thrown*/ Extension extension_1 = oclAsType_1.getExtension();
+						CAUGHT_extension_1 = extension_1;
+					}
+					catch (Exception e) {
+						CAUGHT_extension_1 = ValueUtil.createInvalidValue(e);
+					}
+					final /*@NonInvalid*/ boolean oclIsUndefined_0 = (CAUGHT_extension_1 == null) || (CAUGHT_extension_1 instanceof InvalidValueException);
+					final /*@NonInvalid*/ Boolean not_0;
+					if (!oclIsUndefined_0) {
+						not_0 = ValueUtil.TRUE_VALUE;
+					}
+					else {
+						if (oclIsUndefined_0) {
+							not_0 = ValueUtil.FALSE_VALUE;
+						}
+						else {
+							not_0 = null;
+						}
+					}
+					if (not_0 == ValueUtil.FALSE_VALUE) {
+						and_0 = ValueUtil.FALSE_VALUE;
+					}
+					else {
+						if (not_0 == null) {
+							and_0 = null;
+						}
+						else {
+							and_0 = ValueUtil.TRUE_VALUE;
+						}
+					}
+				}
+				if (and_0 == null) {
+					throw new InvalidValueException("Null if condition");
+				}
+				/*@Thrown*/ Boolean local_3;
+				if (and_0) {
+					final /*@Thrown*/ ComponentType oclAsType_2 = (ComponentType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, this, TYP_tdl_c_c_ComponentType_0);
+					final /*@Thrown*/ Extension extension_2 = oclAsType_2.getExtension();
+					if (extension_2 == null) {
+						throw new InvalidValueException("Null source for \'tdl::Extension::isExtending(tdl::PackageableElement[?]) : Boolean[?]\'");
+					}
+					final /*@Thrown*/ boolean isExtending_0 = extension_2.isExtending(n);
+					local_3 = isExtending_0;
+				}
+				else {
+					final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_GateType_0 = idResolver.getClass(tdlTables.CLSSid_GateType, null);
+					final /*@NonInvalid*/ boolean oclIsKindOf_1 = OclAnyOclIsKindOfOperation.INSTANCE.evaluate(executor, this, TYP_tdl_c_c_GateType_0).booleanValue();
+					final /*@Thrown*/ Boolean and_1;
+					if (!oclIsKindOf_1) {
+						and_1 = ValueUtil.FALSE_VALUE;
+					}
+					else {
+						/*@Caught*/ Object CAUGHT_extension_3;
+						try {
+							final /*@Thrown*/ GateType oclAsType_3 = (GateType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, this, TYP_tdl_c_c_GateType_0);
+							final /*@Thrown*/ Extension extension_3 = oclAsType_3.getExtension();
+							CAUGHT_extension_3 = extension_3;
+						}
+						catch (Exception e) {
+							CAUGHT_extension_3 = ValueUtil.createInvalidValue(e);
+						}
+						final /*@NonInvalid*/ boolean oclIsUndefined_1 = (CAUGHT_extension_3 == null) || (CAUGHT_extension_3 instanceof InvalidValueException);
+						final /*@NonInvalid*/ Boolean not_1;
+						if (!oclIsUndefined_1) {
+							not_1 = ValueUtil.TRUE_VALUE;
+						}
+						else {
+							if (oclIsUndefined_1) {
+								not_1 = ValueUtil.FALSE_VALUE;
+							}
+							else {
+								not_1 = null;
+							}
+						}
+						if (not_1 == ValueUtil.FALSE_VALUE) {
+							and_1 = ValueUtil.FALSE_VALUE;
+						}
+						else {
+							if (not_1 == null) {
+								and_1 = null;
+							}
+							else {
+								and_1 = ValueUtil.TRUE_VALUE;
+							}
+						}
+					}
+					if (and_1 == null) {
+						throw new InvalidValueException("Null if condition");
+					}
+					/*@Thrown*/ Boolean local_2;
+					if (and_1) {
+						final /*@Thrown*/ GateType oclAsType_4 = (GateType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, this, TYP_tdl_c_c_GateType_0);
+						final /*@Thrown*/ Extension extension_4 = oclAsType_4.getExtension();
+						if (extension_4 == null) {
+							throw new InvalidValueException("Null source for \'tdl::Extension::isExtending(tdl::PackageableElement[?]) : Boolean[?]\'");
+						}
+						final /*@Thrown*/ boolean isExtending_1 = extension_4.isExtending(n);
+						local_2 = isExtending_1;
+					}
+					else {
+						final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_StructuredDataType_0 = idResolver.getClass(tdlTables.CLSSid_StructuredDataType, null);
+						final /*@NonInvalid*/ boolean oclIsKindOf_2 = OclAnyOclIsKindOfOperation.INSTANCE.evaluate(executor, this, TYP_tdl_c_c_StructuredDataType_0).booleanValue();
+						/*@Thrown*/ Boolean local_1;
+						if (oclIsKindOf_2) {
+							final /*@Thrown*/ StructuredDataType oclAsType_5 = (StructuredDataType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, this, TYP_tdl_c_c_StructuredDataType_0);
+							final /*@Thrown*/ List<Extension> extension_5 = oclAsType_5.getExtension();
+							final /*@Thrown*/ OrderedSetValue BOXED_extension_5 = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_Extension, extension_5);
+							/*@Thrown*/ Object accumulator = ValueUtil.FALSE_VALUE;
+							Iterator<Object> ITERATOR_ex = BOXED_extension_5.iterator();
+							/*@Thrown*/ Boolean exists;
+							while (true) {
+								if (!ITERATOR_ex.hasNext()) {
+									if (accumulator == ValueUtil.FALSE_VALUE) {
+										exists = ValueUtil.FALSE_VALUE;
+									}
+									else {
+										throw (InvalidValueException)accumulator;
+									}
+									break;
+								}
+								/*@NonInvalid*/ Extension ex = (Extension)ITERATOR_ex.next();
+								/**
+								 * ex.isExtending(n)
+								 */
+								/*@Caught*/ Object CAUGHT_isExtending_2;
+								try {
+									if (ex == null) {
+										throw new InvalidValueException("Null source for \'tdl::Extension::isExtending(tdl::PackageableElement[?]) : Boolean[?]\'");
+									}
+									final /*@Thrown*/ boolean isExtending_2 = ex.isExtending(n);
+									CAUGHT_isExtending_2 = isExtending_2;
+								}
+								catch (Exception e) {
+									CAUGHT_isExtending_2 = ValueUtil.createInvalidValue(e);
+								}
+								//
+								if (CAUGHT_isExtending_2 == ValueUtil.TRUE_VALUE) {					// Normal successful body evaluation result
+									exists = ValueUtil.TRUE_VALUE;
+									break;														// Stop immediately
+								}
+								else if (CAUGHT_isExtending_2 == ValueUtil.FALSE_VALUE) {				// Normal unsuccessful body evaluation result
+									;															// Carry on
+								}
+								else if (CAUGHT_isExtending_2 instanceof InvalidValueException) {		// Abnormal exception evaluation result
+									accumulator = CAUGHT_isExtending_2;									// Cache an exception failure
+								}
+								else {															// Impossible badly typed result
+									accumulator = new InvalidValueException(PivotMessages.NonBooleanBody, "exists");
+								}
+							}
+							local_1 = exists;
+						}
+						else {
+							final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_SimpleDataType_0 = idResolver.getClass(tdlTables.CLSSid_SimpleDataType, null);
+							final /*@NonInvalid*/ boolean oclIsKindOf_3 = OclAnyOclIsKindOfOperation.INSTANCE.evaluate(executor, this, TYP_tdl_c_c_SimpleDataType_0).booleanValue();
+							final /*@Thrown*/ Boolean and_2;
+							if (!oclIsKindOf_3) {
+								and_2 = ValueUtil.FALSE_VALUE;
+							}
+							else {
+								/*@Caught*/ Object CAUGHT_extension_6;
+								try {
+									final /*@Thrown*/ SimpleDataType oclAsType_6 = (SimpleDataType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, this, TYP_tdl_c_c_SimpleDataType_0);
+									final /*@Thrown*/ Extension extension_6 = oclAsType_6.getExtension();
+									CAUGHT_extension_6 = extension_6;
+								}
+								catch (Exception e) {
+									CAUGHT_extension_6 = ValueUtil.createInvalidValue(e);
+								}
+								final /*@NonInvalid*/ boolean oclIsUndefined_2 = (CAUGHT_extension_6 == null) || (CAUGHT_extension_6 instanceof InvalidValueException);
+								final /*@NonInvalid*/ Boolean not_2;
+								if (!oclIsUndefined_2) {
+									not_2 = ValueUtil.TRUE_VALUE;
+								}
+								else {
+									if (oclIsUndefined_2) {
+										not_2 = ValueUtil.FALSE_VALUE;
+									}
+									else {
+										not_2 = null;
+									}
+								}
+								if (not_2 == ValueUtil.FALSE_VALUE) {
+									and_2 = ValueUtil.FALSE_VALUE;
+								}
+								else {
+									if (not_2 == null) {
+										and_2 = null;
+									}
+									else {
+										and_2 = ValueUtil.TRUE_VALUE;
+									}
+								}
+							}
+							if (and_2 == null) {
+								throw new InvalidValueException("Null if condition");
+							}
+							/*@Thrown*/ boolean local_0;
+							if (and_2) {
+								final /*@Thrown*/ SimpleDataType oclAsType_7 = (SimpleDataType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, this, TYP_tdl_c_c_SimpleDataType_0);
+								final /*@Thrown*/ Extension extension_7 = oclAsType_7.getExtension();
+								if (extension_7 == null) {
+									throw new InvalidValueException("Null source for \'tdl::Extension::isExtending(tdl::PackageableElement[?]) : Boolean[?]\'");
+								}
+								final /*@Thrown*/ boolean isExtending_3 = extension_7.isExtending(n);
+								local_0 = isExtending_3;
+							}
+							else {
+								local_0 = false;
+							}
+							local_1 = local_0;
+						}
+						local_2 = local_1;
+					}
+					local_3 = local_2;
+				}
+				local_4 = local_3;
+			}
+			local_5 = local_4;
 		}
+		return local_5;
 	}
 
 	/**
@@ -136,8 +497,7 @@ public abstract class PackageableElementImpl extends NamedElementImpl implements
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.PACKAGEABLE_ELEMENT___CONFORMS_TO__STRING:
 				return conformsTo((String)arguments.get(0));
 			case tdlPackage.PACKAGEABLE_ELEMENT___GET_ELEMENT_NAMED__STRING:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ParameterBindingImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ParameterBindingImpl.java
index f16354426351d290c6ac7bcd86dd0388be704ca4..6d48bab44767b5e0c9ac7c18683664e6dd94094f 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ParameterBindingImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ParameterBindingImpl.java
@@ -2,18 +2,41 @@
  */
 package org.etsi.mts.tdl.impl;
 
+import java.lang.reflect.InvocationTargetException;
+
+import java.util.Collection;
+
+import java.util.List;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
+import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.library.collection.CollectionIsEmptyOperation;
+import org.eclipse.ocl.pivot.library.collection.OrderedCollectionLastOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsTypeOperation;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
+import org.eclipse.ocl.pivot.values.OrderedSetValue;
+import org.etsi.mts.tdl.CollectionDataType;
+import org.etsi.mts.tdl.DataType;
 import org.etsi.mts.tdl.DataUse;
+import org.etsi.mts.tdl.Member;
+import org.etsi.mts.tdl.MemberReference;
 import org.etsi.mts.tdl.Parameter;
 import org.etsi.mts.tdl.ParameterBinding;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -25,6 +48,7 @@ import org.etsi.mts.tdl.tdlPackage;
  * <ul>
  *   <li>{@link org.etsi.mts.tdl.impl.ParameterBindingImpl#getDataUse <em>Data Use</em>}</li>
  *   <li>{@link org.etsi.mts.tdl.impl.ParameterBindingImpl#getParameter <em>Parameter</em>}</li>
+ *   <li>{@link org.etsi.mts.tdl.impl.ParameterBindingImpl#getReduction <em>Reduction</em>}</li>
  * </ul>
  *
  * @generated
@@ -51,6 +75,16 @@ public class ParameterBindingImpl extends ElementImpl implements ParameterBindin
 	 */
 	protected Parameter parameter;
 
+	/**
+	 * The cached value of the '{@link #getReduction() <em>Reduction</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getReduction()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<MemberReference> reduction;
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -92,8 +126,7 @@ public class ParameterBindingImpl extends ElementImpl implements ParameterBindin
 	{
 		DataUse oldDataUse = dataUse;
 		dataUse = newDataUse;
-		if (eNotificationRequired())
-		{
+		if (eNotificationRequired()) {
 			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, tdlPackage.PARAMETER_BINDING__DATA_USE, oldDataUse, newDataUse);
 			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
@@ -108,8 +141,7 @@ public class ParameterBindingImpl extends ElementImpl implements ParameterBindin
 	@Override
 	public void setDataUse(DataUse newDataUse)
 	{
-		if (newDataUse != dataUse)
-		{
+		if (newDataUse != dataUse) {
 			NotificationChain msgs = null;
 			if (dataUse != null)
 				msgs = ((InternalEObject)dataUse).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - tdlPackage.PARAMETER_BINDING__DATA_USE, null, msgs);
@@ -130,12 +162,10 @@ public class ParameterBindingImpl extends ElementImpl implements ParameterBindin
 	@Override
 	public Parameter getParameter()
 	{
-		if (parameter != null && parameter.eIsProxy())
-		{
+		if (parameter != null && parameter.eIsProxy()) {
 			InternalEObject oldParameter = (InternalEObject)parameter;
 			parameter = (Parameter)eResolveProxy(oldParameter);
-			if (parameter != oldParameter)
-			{
+			if (parameter != oldParameter) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.PARAMETER_BINDING__PARAMETER, oldParameter, parameter));
 			}
@@ -167,6 +197,115 @@ public class ParameterBindingImpl extends ElementImpl implements ParameterBindin
 			eNotify(new ENotificationImpl(this, Notification.SET, tdlPackage.PARAMETER_BINDING__PARAMETER, oldParameter, parameter));
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EList<MemberReference> getReduction()
+	{
+		if (reduction == null) {
+			reduction = new EObjectContainmentEList<MemberReference>(MemberReference.class, this, tdlPackage.PARAMETER_BINDING__REDUCTION);
+		}
+		return reduction;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public DataType resolveParameterType()
+	{
+		/**
+		 *
+		 * if self.reduction->isEmpty()
+		 * then self.parameter.dataType
+		 * else
+		 *   if self.reduction->last().member.oclIsUndefined()
+		 *   then
+		 *     if self.reduction->last().collectionIndex.oclIsUndefined()
+		 *     then self.parameter.dataType
+		 *     else
+		 *       self.parameter.dataType.oclAsType(CollectionDataType).itemType
+		 *     endif
+		 *   else self.reduction->last().member.dataType
+		 *   endif
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ List<MemberReference> reduction = this.getReduction();
+		final /*@NonInvalid*/ OrderedSetValue BOXED_reduction = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_MemberReference, reduction);
+		final /*@NonInvalid*/ boolean isEmpty = CollectionIsEmptyOperation.INSTANCE.evaluate(BOXED_reduction).booleanValue();
+		/*@Thrown*/ DataType local_2;
+		if (isEmpty) {
+			final /*@NonInvalid*/ Parameter parameter = this.getParameter();
+			final /*@NonInvalid*/ DataType dataType = parameter.getDataType();
+			local_2 = dataType;
+		}
+		else {
+			/*@Caught*/ Object CAUGHT_member;
+			try {
+				final /*@Thrown*/ MemberReference last = (MemberReference)OrderedCollectionLastOperation.INSTANCE.evaluate(BOXED_reduction);
+				if (last == null) {
+					throw new InvalidValueException("Null source for \'\'http://www.etsi.org/spec/TDL/1.4.1\'::MemberReference::member\'");
+				}
+				final /*@Thrown*/ Member member = last.getMember();
+				CAUGHT_member = member;
+			}
+			catch (Exception e) {
+				CAUGHT_member = ValueUtil.createInvalidValue(e);
+			}
+			final /*@NonInvalid*/ boolean oclIsUndefined = (CAUGHT_member == null) || (CAUGHT_member instanceof InvalidValueException);
+			/*@Thrown*/ DataType local_1;
+			if (oclIsUndefined) {
+				final /*@NonInvalid*/ Parameter parameter_0 = this.getParameter();
+				final /*@NonInvalid*/ DataType dataType_0 = parameter_0.getDataType();
+				/*@Caught*/ Object CAUGHT_collectionIndex;
+				try {
+					final /*@Thrown*/ MemberReference last_0 = (MemberReference)OrderedCollectionLastOperation.INSTANCE.evaluate(BOXED_reduction);
+					if (last_0 == null) {
+						throw new InvalidValueException("Null source for \'\'http://www.etsi.org/spec/TDL/1.4.1\'::MemberReference::collectionIndex\'");
+					}
+					final /*@Thrown*/ DataUse collectionIndex = last_0.getCollectionIndex();
+					CAUGHT_collectionIndex = collectionIndex;
+				}
+				catch (Exception e) {
+					CAUGHT_collectionIndex = ValueUtil.createInvalidValue(e);
+				}
+				final /*@NonInvalid*/ boolean oclIsUndefined_0 = (CAUGHT_collectionIndex == null) || (CAUGHT_collectionIndex instanceof InvalidValueException);
+				/*@Thrown*/ DataType local_0;
+				if (oclIsUndefined_0) {
+					local_0 = dataType_0;
+				}
+				else {
+					final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_CollectionDataType_0 = idResolver.getClass(tdlTables.CLSSid_CollectionDataType, null);
+					final /*@Thrown*/ CollectionDataType oclAsType = (CollectionDataType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, dataType_0, TYP_tdl_c_c_CollectionDataType_0);
+					final /*@Thrown*/ DataType itemType = oclAsType.getItemType();
+					local_0 = itemType;
+				}
+				local_1 = local_0;
+			}
+			else {
+				final /*@Thrown*/ MemberReference last_1 = (MemberReference)OrderedCollectionLastOperation.INSTANCE.evaluate(BOXED_reduction);
+				if (last_1 == null) {
+					throw new InvalidValueException("Null source for \'\'http://www.etsi.org/spec/TDL/1.4.1\'::MemberReference::member\'");
+				}
+				final /*@Thrown*/ Member member_0 = last_1.getMember();
+				if (member_0 == null) {
+					throw new InvalidValueException("Null source for \'\'http://www.etsi.org/spec/TDL/1.4.1\'::Parameter::dataType\'");
+				}
+				final /*@Thrown*/ DataType dataType_2 = member_0.getDataType();
+				local_1 = dataType_2;
+			}
+			local_2 = local_1;
+		}
+		return local_2;
+	}
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -175,10 +314,11 @@ public class ParameterBindingImpl extends ElementImpl implements ParameterBindin
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PARAMETER_BINDING__DATA_USE:
 				return basicSetDataUse(null, msgs);
+			case tdlPackage.PARAMETER_BINDING__REDUCTION:
+				return ((InternalEList<?>)getReduction()).basicRemove(otherEnd, msgs);
 		}
 		return super.eInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -191,13 +331,14 @@ public class ParameterBindingImpl extends ElementImpl implements ParameterBindin
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PARAMETER_BINDING__DATA_USE:
 				return getDataUse();
 			case tdlPackage.PARAMETER_BINDING__PARAMETER:
 				if (resolve) return getParameter();
 				return basicGetParameter();
+			case tdlPackage.PARAMETER_BINDING__REDUCTION:
+				return getReduction();
 		}
 		return super.eGet(featureID, resolve, coreType);
 	}
@@ -207,17 +348,21 @@ public class ParameterBindingImpl extends ElementImpl implements ParameterBindin
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("unchecked")
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PARAMETER_BINDING__DATA_USE:
 				setDataUse((DataUse)newValue);
 				return;
 			case tdlPackage.PARAMETER_BINDING__PARAMETER:
 				setParameter((Parameter)newValue);
 				return;
+			case tdlPackage.PARAMETER_BINDING__REDUCTION:
+				getReduction().clear();
+				getReduction().addAll((Collection<? extends MemberReference>)newValue);
+				return;
 		}
 		super.eSet(featureID, newValue);
 	}
@@ -230,14 +375,16 @@ public class ParameterBindingImpl extends ElementImpl implements ParameterBindin
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PARAMETER_BINDING__DATA_USE:
 				setDataUse((DataUse)null);
 				return;
 			case tdlPackage.PARAMETER_BINDING__PARAMETER:
 				setParameter((Parameter)null);
 				return;
+			case tdlPackage.PARAMETER_BINDING__REDUCTION:
+				getReduction().clear();
+				return;
 		}
 		super.eUnset(featureID);
 	}
@@ -250,14 +397,30 @@ public class ParameterBindingImpl extends ElementImpl implements ParameterBindin
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PARAMETER_BINDING__DATA_USE:
 				return dataUse != null;
 			case tdlPackage.PARAMETER_BINDING__PARAMETER:
 				return parameter != null;
+			case tdlPackage.PARAMETER_BINDING__REDUCTION:
+				return reduction != null && !reduction.isEmpty();
 		}
 		return super.eIsSet(featureID);
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
+	{
+		switch (operationID) {
+			case tdlPackage.PARAMETER_BINDING___RESOLVE_PARAMETER_TYPE:
+				return resolveParameterType();
+		}
+		return super.eInvoke(operationID, arguments);
+	}
+
 } //ParameterBindingImpl
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ParameterImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ParameterImpl.java
index 860f947fb91735104c408009f3f137e2489a40fe..35e9b03e7cbefb1b6c0fe360f622a42eea6171dc 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ParameterImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ParameterImpl.java
@@ -67,12 +67,10 @@ public abstract class ParameterImpl extends NamedElementImpl implements Paramete
 	@Override
 	public DataType getDataType()
 	{
-		if (dataType != null && dataType.eIsProxy())
-		{
+		if (dataType != null && dataType.eIsProxy()) {
 			InternalEObject oldDataType = (InternalEObject)dataType;
 			dataType = (DataType)eResolveProxy(oldDataType);
-			if (dataType != oldDataType)
-			{
+			if (dataType != oldDataType) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.PARAMETER__DATA_TYPE, oldDataType, dataType));
 			}
@@ -112,8 +110,7 @@ public abstract class ParameterImpl extends NamedElementImpl implements Paramete
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PARAMETER__DATA_TYPE:
 				if (resolve) return getDataType();
 				return basicGetDataType();
@@ -129,8 +126,7 @@ public abstract class ParameterImpl extends NamedElementImpl implements Paramete
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PARAMETER__DATA_TYPE:
 				setDataType((DataType)newValue);
 				return;
@@ -146,8 +142,7 @@ public abstract class ParameterImpl extends NamedElementImpl implements Paramete
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PARAMETER__DATA_TYPE:
 				setDataType((DataType)null);
 				return;
@@ -163,8 +158,7 @@ public abstract class ParameterImpl extends NamedElementImpl implements Paramete
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PARAMETER__DATA_TYPE:
 				return dataType != null;
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ParameterMappingImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ParameterMappingImpl.java
index 1b5caebedd2996597d583c79411ea6c34d427f97..8541400717f264b81da0c1b91cc87947f74336c8 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ParameterMappingImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ParameterMappingImpl.java
@@ -113,12 +113,10 @@ public class ParameterMappingImpl extends ElementImpl implements ParameterMappin
 	@Override
 	public Parameter getParameter()
 	{
-		if (parameter != null && parameter.eIsProxy())
-		{
+		if (parameter != null && parameter.eIsProxy()) {
 			InternalEObject oldParameter = (InternalEObject)parameter;
 			parameter = (Parameter)eResolveProxy(oldParameter);
-			if (parameter != oldParameter)
-			{
+			if (parameter != oldParameter) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.PARAMETER_MAPPING__PARAMETER, oldParameter, parameter));
 			}
@@ -158,8 +156,7 @@ public class ParameterMappingImpl extends ElementImpl implements ParameterMappin
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PARAMETER_MAPPING__PARAMETER_URI:
 				return getParameterURI();
 			case tdlPackage.PARAMETER_MAPPING__PARAMETER:
@@ -177,8 +174,7 @@ public class ParameterMappingImpl extends ElementImpl implements ParameterMappin
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PARAMETER_MAPPING__PARAMETER_URI:
 				setParameterURI((String)newValue);
 				return;
@@ -197,8 +193,7 @@ public class ParameterMappingImpl extends ElementImpl implements ParameterMappin
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PARAMETER_MAPPING__PARAMETER_URI:
 				setParameterURI(PARAMETER_URI_EDEFAULT);
 				return;
@@ -217,8 +212,7 @@ public class ParameterMappingImpl extends ElementImpl implements ParameterMappin
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PARAMETER_MAPPING__PARAMETER_URI:
 				return PARAMETER_URI_EDEFAULT == null ? parameterURI != null : !PARAMETER_URI_EDEFAULT.equals(parameterURI);
 			case tdlPackage.PARAMETER_MAPPING__PARAMETER:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/PeriodicBehaviourImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/PeriodicBehaviourImpl.java
index d3b8472ca67a95ac714135c71a6e6d8d99326d6f..73586a0b1daed664d039d942be8aec9aaba79962 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/PeriodicBehaviourImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/PeriodicBehaviourImpl.java
@@ -6,14 +6,13 @@ import java.lang.reflect.InvocationTargetException;
 
 import java.util.Collection;
 
+import java.util.Iterator;
+import java.util.List;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
@@ -21,12 +20,26 @@ import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.ids.IdResolver.IdResolverExtension;
+import org.eclipse.ocl.pivot.library.collection.CollectionAsOrderedSetOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsSetOperation;
+import org.eclipse.ocl.pivot.messages.PivotMessages;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
+import org.eclipse.ocl.pivot.values.OrderedSetValue;
+import org.eclipse.ocl.pivot.values.SetValue;
 import org.etsi.mts.tdl.Behaviour;
 import org.etsi.mts.tdl.Block;
 import org.etsi.mts.tdl.ComponentInstance;
 import org.etsi.mts.tdl.LocalExpression;
 import org.etsi.mts.tdl.PeriodicBehaviour;
+import org.etsi.mts.tdl.TestConfiguration;
+import org.etsi.mts.tdl.TestDescription;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -105,8 +118,7 @@ public class PeriodicBehaviourImpl extends BehaviourImpl implements PeriodicBeha
 	{
 		Block oldBlock = block;
 		block = newBlock;
-		if (eNotificationRequired())
-		{
+		if (eNotificationRequired()) {
 			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, tdlPackage.PERIODIC_BEHAVIOUR__BLOCK, oldBlock, newBlock);
 			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
@@ -121,8 +133,7 @@ public class PeriodicBehaviourImpl extends BehaviourImpl implements PeriodicBeha
 	@Override
 	public void setBlock(Block newBlock)
 	{
-		if (newBlock != block)
-		{
+		if (newBlock != block) {
 			NotificationChain msgs = null;
 			if (block != null)
 				msgs = ((InternalEObject)block).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - tdlPackage.PERIODIC_BEHAVIOUR__BLOCK, null, msgs);
@@ -143,23 +154,12 @@ public class PeriodicBehaviourImpl extends BehaviourImpl implements PeriodicBeha
 	@Override
 	public EList<LocalExpression> getPeriod()
 	{
-		if (period == null)
-		{
+		if (period == null) {
 			period = new EObjectContainmentEList<LocalExpression>(LocalExpression.class, this, tdlPackage.PERIODIC_BEHAVIOUR__PERIOD);
 		}
 		return period;
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #getParticipatingComponents() <em>Get Participating Components</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getParticipatingComponents()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate GET_PARTICIPATING_COMPONENTS__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.PERIODIC_BEHAVIOUR___GET_PARTICIPATING_COMPONENTS).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -169,14 +169,71 @@ public class PeriodicBehaviourImpl extends BehaviourImpl implements PeriodicBeha
 	@Override
 	public EList<ComponentInstance> getParticipatingComponents()
 	{
-		try
-		{
-			return (EList<ComponentInstance>)GET_PARTICIPATING_COMPONENTS__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if
+		 *   self.getParentTestDescription()
+		 *   ->exists(td | td.isLocallyOrdered)
+		 * then self.block.getParticipatingComponents()->asOrderedSet()
+		 * else
+		 *   self.getParentTestDescription()
+		 *   .testConfiguration.componentInstance->asOrderedSet()
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ TestDescription getParentTestDescription = this.getParentTestDescription();
+		final /*@NonInvalid*/ SetValue oclAsSet = OclAnyOclAsSetOperation.INSTANCE.evaluate(executor, tdlTables.SET_CLSSid_TestDescription, getParentTestDescription);
+		/*@Thrown*/ Object accumulator = ValueUtil.FALSE_VALUE;
+		Iterator<Object> ITERATOR_td = oclAsSet.iterator();
+		/*@NonInvalid*/ Boolean exists;
+		while (true) {
+			if (!ITERATOR_td.hasNext()) {
+				if (accumulator == ValueUtil.FALSE_VALUE) {
+					exists = ValueUtil.FALSE_VALUE;
+				}
+				else {
+					throw (InvalidValueException)accumulator;
+				}
+				break;
+			}
+			/*@NonInvalid*/ TestDescription td = (TestDescription)ITERATOR_td.next();
+			/**
+			 * td.isLocallyOrdered
+			 */
+			final /*@NonInvalid*/ boolean isLocallyOrdered = td.isIsLocallyOrdered();
+			//
+			if (isLocallyOrdered) {					// Normal successful body evaluation result
+				exists = ValueUtil.TRUE_VALUE;
+				break;														// Stop immediately
+			}
+			else if (!isLocallyOrdered) {				// Normal unsuccessful body evaluation result
+				;															// Carry on
+			}
+			else {															// Impossible badly typed result
+				accumulator = new InvalidValueException(PivotMessages.NonBooleanBody, "exists");
+			}
+		}
+		if (exists == null) {
+			throw new InvalidValueException("Null if condition");
+		}
+		/*@NonInvalid*/ OrderedSetValue local_0;
+		if (exists) {
+			final /*@NonInvalid*/ Block block = this.getBlock();
+			final /*@NonInvalid*/ List<ComponentInstance> getParticipatingComponents = block.getParticipatingComponents();
+			final /*@NonInvalid*/ OrderedSetValue BOXED_getParticipatingComponents = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_ComponentInstance, getParticipatingComponents);
+			final /*@NonInvalid*/ OrderedSetValue asOrderedSet = CollectionAsOrderedSetOperation.INSTANCE.evaluate(BOXED_getParticipatingComponents);
+			local_0 = asOrderedSet;
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		else {
+			final /*@NonInvalid*/ TestConfiguration testConfiguration = getParentTestDescription.getTestConfiguration();
+			final /*@NonInvalid*/ List<ComponentInstance> componentInstance = testConfiguration.getComponentInstance();
+			final /*@NonInvalid*/ SetValue BOXED_componentInstance = idResolver.createSetOfAll(tdlTables.SET_CLSSid_ComponentInstance, componentInstance);
+			final /*@NonInvalid*/ OrderedSetValue asOrderedSet_0 = CollectionAsOrderedSetOperation.INSTANCE.evaluate(BOXED_componentInstance);
+			local_0 = asOrderedSet_0;
 		}
+		final /*@NonInvalid*/ List<ComponentInstance> ECORE_local_0 = ((IdResolverExtension)idResolver).ecoreValueOfAll(ComponentInstance.class, local_0);
+		return (EList<ComponentInstance>)ECORE_local_0;
 	}
 
 	/**
@@ -187,8 +244,7 @@ public class PeriodicBehaviourImpl extends BehaviourImpl implements PeriodicBeha
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PERIODIC_BEHAVIOUR__BLOCK:
 				return basicSetBlock(null, msgs);
 			case tdlPackage.PERIODIC_BEHAVIOUR__PERIOD:
@@ -205,8 +261,7 @@ public class PeriodicBehaviourImpl extends BehaviourImpl implements PeriodicBeha
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PERIODIC_BEHAVIOUR__BLOCK:
 				return getBlock();
 			case tdlPackage.PERIODIC_BEHAVIOUR__PERIOD:
@@ -224,8 +279,7 @@ public class PeriodicBehaviourImpl extends BehaviourImpl implements PeriodicBeha
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PERIODIC_BEHAVIOUR__BLOCK:
 				setBlock((Block)newValue);
 				return;
@@ -245,8 +299,7 @@ public class PeriodicBehaviourImpl extends BehaviourImpl implements PeriodicBeha
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PERIODIC_BEHAVIOUR__BLOCK:
 				setBlock((Block)null);
 				return;
@@ -265,8 +318,7 @@ public class PeriodicBehaviourImpl extends BehaviourImpl implements PeriodicBeha
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PERIODIC_BEHAVIOUR__BLOCK:
 				return block != null;
 			case tdlPackage.PERIODIC_BEHAVIOUR__PERIOD:
@@ -283,10 +335,8 @@ public class PeriodicBehaviourImpl extends BehaviourImpl implements PeriodicBeha
 	@Override
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass)
 	{
-		if (baseClass == Behaviour.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == Behaviour.class) {
+			switch (baseOperationID) {
 				case tdlPackage.BEHAVIOUR___GET_PARTICIPATING_COMPONENTS: return tdlPackage.PERIODIC_BEHAVIOUR___GET_PARTICIPATING_COMPONENTS;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
@@ -302,8 +352,7 @@ public class PeriodicBehaviourImpl extends BehaviourImpl implements PeriodicBeha
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.PERIODIC_BEHAVIOUR___GET_PARTICIPATING_COMPONENTS:
 				return getParticipatingComponents();
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/PredefinedFunctionCallImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/PredefinedFunctionCallImpl.java
index c87fcacbb616f8cdb6c99c34f536dfbd9c3f9db1..45601afb2c785803be7d82167fa164368d196c30 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/PredefinedFunctionCallImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/PredefinedFunctionCallImpl.java
@@ -6,14 +6,13 @@ import java.lang.reflect.InvocationTargetException;
 
 import java.util.Collection;
 
+import java.util.Iterator;
+import java.util.List;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
@@ -21,11 +20,22 @@ import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.library.collection.CollectionAsOrderedSetOperation;
+import org.eclipse.ocl.pivot.library.collection.OrderedCollectionFirstOperation;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
+import org.eclipse.ocl.pivot.values.OrderedSetValue;
+import org.eclipse.ocl.pivot.values.SequenceValue;
+import org.eclipse.ocl.pivot.values.SequenceValue.Accumulator;
 import org.etsi.mts.tdl.DataType;
 import org.etsi.mts.tdl.DataUse;
 import org.etsi.mts.tdl.PredefinedFunction;
 import org.etsi.mts.tdl.PredefinedFunctionCall;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -92,12 +102,10 @@ public class PredefinedFunctionCallImpl extends DynamicDataUseImpl implements Pr
 	@Override
 	public PredefinedFunction getFunction()
 	{
-		if (function != null && function.eIsProxy())
-		{
+		if (function != null && function.eIsProxy()) {
 			InternalEObject oldFunction = (InternalEObject)function;
 			function = (PredefinedFunction)eResolveProxy(oldFunction);
-			if (function != oldFunction)
-			{
+			if (function != oldFunction) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.PREDEFINED_FUNCTION_CALL__FUNCTION, oldFunction, function));
 			}
@@ -137,23 +145,12 @@ public class PredefinedFunctionCallImpl extends DynamicDataUseImpl implements Pr
 	@Override
 	public EList<DataUse> getActualParameters()
 	{
-		if (actualParameters == null)
-		{
+		if (actualParameters == null) {
 			actualParameters = new EObjectContainmentEList<DataUse>(DataUse.class, this, tdlPackage.PREDEFINED_FUNCTION_CALL__ACTUAL_PARAMETERS);
 		}
 		return actualParameters;
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #resolveDataType() <em>Resolve Data Type</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #resolveDataType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate RESOLVE_DATA_TYPE__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.PREDEFINED_FUNCTION_CALL___RESOLVE_DATA_TYPE).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -162,14 +159,61 @@ public class PredefinedFunctionCallImpl extends DynamicDataUseImpl implements Pr
 	@Override
 	public DataType resolveDataType()
 	{
-		try
-		{
-			return (DataType)RESOLVE_DATA_TYPE__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if not self.function.returnType.oclIsUndefined()
+		 * then self.function.returnType
+		 * else self.actualParameters.resolveDataType()->asOrderedSet()->first()
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ PredefinedFunction function_0 = this.getFunction();
+		final /*@NonInvalid*/ DataType returnType_0 = function_0.getReturnType();
+		final /*@NonInvalid*/ boolean oclIsUndefined = returnType_0 == null;
+		final /*@NonInvalid*/ Boolean not;
+		if (!oclIsUndefined) {
+			not = ValueUtil.TRUE_VALUE;
+		}
+		else {
+			if (oclIsUndefined) {
+				not = ValueUtil.FALSE_VALUE;
+			}
+			else {
+				not = null;
+			}
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		if (not == null) {
+			throw new InvalidValueException("Null if condition");
+		}
+		/*@Thrown*/ DataType local_0;
+		if (not) {
+			local_0 = returnType_0;
+		}
+		else {
+			final /*@NonInvalid*/ List<DataUse> actualParameters = this.getActualParameters();
+			final /*@NonInvalid*/ OrderedSetValue BOXED_actualParameters = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_DataUse, actualParameters);
+			/*@Thrown*/ Accumulator accumulator = ValueUtil.createSequenceAccumulatorValue(tdlTables.SEQ_CLSSid_DataType);
+			Iterator<Object> ITERATOR__1 = BOXED_actualParameters.iterator();
+			/*@NonInvalid*/ SequenceValue collect;
+			while (true) {
+				if (!ITERATOR__1.hasNext()) {
+					collect = accumulator;
+					break;
+				}
+				/*@NonInvalid*/ DataUse _1 = (DataUse)ITERATOR__1.next();
+				/**
+				 * resolveDataType()
+				 */
+				final /*@NonInvalid*/ DataType resolveDataType = _1.resolveDataType();
+				//
+				accumulator.add(resolveDataType);
+			}
+			final /*@NonInvalid*/ OrderedSetValue asOrderedSet = CollectionAsOrderedSetOperation.INSTANCE.evaluate(collect);
+			final /*@Thrown*/ DataType first = (DataType)OrderedCollectionFirstOperation.INSTANCE.evaluate(asOrderedSet);
+			local_0 = first;
 		}
+		return local_0;
 	}
 
 	/**
@@ -180,8 +224,7 @@ public class PredefinedFunctionCallImpl extends DynamicDataUseImpl implements Pr
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PREDEFINED_FUNCTION_CALL__ACTUAL_PARAMETERS:
 				return ((InternalEList<?>)getActualParameters()).basicRemove(otherEnd, msgs);
 		}
@@ -196,8 +239,7 @@ public class PredefinedFunctionCallImpl extends DynamicDataUseImpl implements Pr
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PREDEFINED_FUNCTION_CALL__FUNCTION:
 				if (resolve) return getFunction();
 				return basicGetFunction();
@@ -216,8 +258,7 @@ public class PredefinedFunctionCallImpl extends DynamicDataUseImpl implements Pr
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PREDEFINED_FUNCTION_CALL__FUNCTION:
 				setFunction((PredefinedFunction)newValue);
 				return;
@@ -237,8 +278,7 @@ public class PredefinedFunctionCallImpl extends DynamicDataUseImpl implements Pr
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PREDEFINED_FUNCTION_CALL__FUNCTION:
 				setFunction((PredefinedFunction)null);
 				return;
@@ -257,8 +297,7 @@ public class PredefinedFunctionCallImpl extends DynamicDataUseImpl implements Pr
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PREDEFINED_FUNCTION_CALL__FUNCTION:
 				return function != null;
 			case tdlPackage.PREDEFINED_FUNCTION_CALL__ACTUAL_PARAMETERS:
@@ -275,10 +314,8 @@ public class PredefinedFunctionCallImpl extends DynamicDataUseImpl implements Pr
 	@Override
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass)
 	{
-		if (baseClass == DataUse.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == DataUse.class) {
+			switch (baseOperationID) {
 				case tdlPackage.DATA_USE___RESOLVE_DATA_TYPE: return tdlPackage.PREDEFINED_FUNCTION_CALL___RESOLVE_DATA_TYPE;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
@@ -294,8 +331,7 @@ public class PredefinedFunctionCallImpl extends DynamicDataUseImpl implements Pr
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.PREDEFINED_FUNCTION_CALL___RESOLVE_DATA_TYPE:
 				return resolveDataType();
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/PredefinedFunctionImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/PredefinedFunctionImpl.java
index ad22cf5221104ef9f87637a430fffccc9b8e49fb..22ff49218e5b81db219bf63094a7a0c1b76fb023 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/PredefinedFunctionImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/PredefinedFunctionImpl.java
@@ -67,12 +67,10 @@ public class PredefinedFunctionImpl extends PackageableElementImpl implements Pr
 	@Override
 	public DataType getReturnType()
 	{
-		if (returnType != null && returnType.eIsProxy())
-		{
+		if (returnType != null && returnType.eIsProxy()) {
 			InternalEObject oldReturnType = (InternalEObject)returnType;
 			returnType = (DataType)eResolveProxy(oldReturnType);
-			if (returnType != oldReturnType)
-			{
+			if (returnType != oldReturnType) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.PREDEFINED_FUNCTION__RETURN_TYPE, oldReturnType, returnType));
 			}
@@ -112,8 +110,7 @@ public class PredefinedFunctionImpl extends PackageableElementImpl implements Pr
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PREDEFINED_FUNCTION__RETURN_TYPE:
 				if (resolve) return getReturnType();
 				return basicGetReturnType();
@@ -129,8 +126,7 @@ public class PredefinedFunctionImpl extends PackageableElementImpl implements Pr
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PREDEFINED_FUNCTION__RETURN_TYPE:
 				setReturnType((DataType)newValue);
 				return;
@@ -146,8 +142,7 @@ public class PredefinedFunctionImpl extends PackageableElementImpl implements Pr
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PREDEFINED_FUNCTION__RETURN_TYPE:
 				setReturnType((DataType)null);
 				return;
@@ -163,8 +158,7 @@ public class PredefinedFunctionImpl extends PackageableElementImpl implements Pr
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PREDEFINED_FUNCTION__RETURN_TYPE:
 				return returnType != null;
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ProcedureCallImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ProcedureCallImpl.java
index 46187798db12c21093bd738b125cf80019f9d25b..d100ea96ac4733a85f6fda8ee96df6d0dd8e1b50 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ProcedureCallImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ProcedureCallImpl.java
@@ -98,12 +98,10 @@ public class ProcedureCallImpl extends InteractionImpl implements ProcedureCall
 	@Override
 	public ProcedureSignature getSignature()
 	{
-		if (signature != null && signature.eIsProxy())
-		{
+		if (signature != null && signature.eIsProxy()) {
 			InternalEObject oldSignature = (InternalEObject)signature;
 			signature = (ProcedureSignature)eResolveProxy(oldSignature);
-			if (signature != oldSignature)
-			{
+			if (signature != oldSignature) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.PROCEDURE_CALL__SIGNATURE, oldSignature, signature));
 			}
@@ -143,8 +141,7 @@ public class ProcedureCallImpl extends InteractionImpl implements ProcedureCall
 	@Override
 	public EList<ParameterBinding> getArgument()
 	{
-		if (argument == null)
-		{
+		if (argument == null) {
 			argument = new EObjectContainmentEList<ParameterBinding>(ParameterBinding.class, this, tdlPackage.PROCEDURE_CALL__ARGUMENT);
 		}
 		return argument;
@@ -158,12 +155,10 @@ public class ProcedureCallImpl extends InteractionImpl implements ProcedureCall
 	@Override
 	public ProcedureCall getReplyTo()
 	{
-		if (replyTo != null && replyTo.eIsProxy())
-		{
+		if (replyTo != null && replyTo.eIsProxy()) {
 			InternalEObject oldReplyTo = (InternalEObject)replyTo;
 			replyTo = (ProcedureCall)eResolveProxy(oldReplyTo);
-			if (replyTo != oldReplyTo)
-			{
+			if (replyTo != oldReplyTo) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.PROCEDURE_CALL__REPLY_TO, oldReplyTo, replyTo));
 			}
@@ -203,8 +198,7 @@ public class ProcedureCallImpl extends InteractionImpl implements ProcedureCall
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PROCEDURE_CALL__ARGUMENT:
 				return ((InternalEList<?>)getArgument()).basicRemove(otherEnd, msgs);
 		}
@@ -219,8 +213,7 @@ public class ProcedureCallImpl extends InteractionImpl implements ProcedureCall
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PROCEDURE_CALL__SIGNATURE:
 				if (resolve) return getSignature();
 				return basicGetSignature();
@@ -242,8 +235,7 @@ public class ProcedureCallImpl extends InteractionImpl implements ProcedureCall
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PROCEDURE_CALL__SIGNATURE:
 				setSignature((ProcedureSignature)newValue);
 				return;
@@ -266,8 +258,7 @@ public class ProcedureCallImpl extends InteractionImpl implements ProcedureCall
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PROCEDURE_CALL__SIGNATURE:
 				setSignature((ProcedureSignature)null);
 				return;
@@ -289,8 +280,7 @@ public class ProcedureCallImpl extends InteractionImpl implements ProcedureCall
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PROCEDURE_CALL__SIGNATURE:
 				return signature != null;
 			case tdlPackage.PROCEDURE_CALL__ARGUMENT:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ProcedureParameterImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ProcedureParameterImpl.java
index d4743bc3fc54bfb41a8bb87c593843fe49377340..7cdccb95ae3333404397cddaed18de13c846f01f 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ProcedureParameterImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ProcedureParameterImpl.java
@@ -101,8 +101,7 @@ public class ProcedureParameterImpl extends ParameterImpl implements ProcedurePa
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PROCEDURE_PARAMETER__KIND:
 				return getKind();
 		}
@@ -117,8 +116,7 @@ public class ProcedureParameterImpl extends ParameterImpl implements ProcedurePa
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PROCEDURE_PARAMETER__KIND:
 				setKind((ParameterKind)newValue);
 				return;
@@ -134,8 +132,7 @@ public class ProcedureParameterImpl extends ParameterImpl implements ProcedurePa
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PROCEDURE_PARAMETER__KIND:
 				setKind(KIND_EDEFAULT);
 				return;
@@ -151,8 +148,7 @@ public class ProcedureParameterImpl extends ParameterImpl implements ProcedurePa
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PROCEDURE_PARAMETER__KIND:
 				return kind != KIND_EDEFAULT;
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ProcedureSignatureImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ProcedureSignatureImpl.java
index 9737c1d96f9d217a7437086eda9594472b9c0491..d87658514e0526be306a26b0867917290f8ca698 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ProcedureSignatureImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ProcedureSignatureImpl.java
@@ -72,8 +72,7 @@ public class ProcedureSignatureImpl extends DataTypeImpl implements ProcedureSig
 	@Override
 	public EList<ProcedureParameter> getParameter()
 	{
-		if (parameter == null)
-		{
+		if (parameter == null) {
 			parameter = new EObjectContainmentEList<ProcedureParameter>(ProcedureParameter.class, this, tdlPackage.PROCEDURE_SIGNATURE__PARAMETER);
 		}
 		return parameter;
@@ -87,8 +86,7 @@ public class ProcedureSignatureImpl extends DataTypeImpl implements ProcedureSig
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PROCEDURE_SIGNATURE__PARAMETER:
 				return ((InternalEList<?>)getParameter()).basicRemove(otherEnd, msgs);
 		}
@@ -103,8 +101,7 @@ public class ProcedureSignatureImpl extends DataTypeImpl implements ProcedureSig
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PROCEDURE_SIGNATURE__PARAMETER:
 				return getParameter();
 		}
@@ -120,8 +117,7 @@ public class ProcedureSignatureImpl extends DataTypeImpl implements ProcedureSig
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PROCEDURE_SIGNATURE__PARAMETER:
 				getParameter().clear();
 				getParameter().addAll((Collection<? extends ProcedureParameter>)newValue);
@@ -138,8 +134,7 @@ public class ProcedureSignatureImpl extends DataTypeImpl implements ProcedureSig
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PROCEDURE_SIGNATURE__PARAMETER:
 				getParameter().clear();
 				return;
@@ -155,8 +150,7 @@ public class ProcedureSignatureImpl extends DataTypeImpl implements ProcedureSig
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.PROCEDURE_SIGNATURE__PARAMETER:
 				return parameter != null && !parameter.isEmpty();
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/QuiescenceImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/QuiescenceImpl.java
index b4995de2156bd41635eda11867cc0e3bd581637c..c54db99c60ffe9a595f6dbfe54b1a1e8e89896fb 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/QuiescenceImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/QuiescenceImpl.java
@@ -4,24 +4,42 @@ package org.etsi.mts.tdl.impl;
 
 import java.lang.reflect.InvocationTargetException;
 
+import java.util.Iterator;
+import java.util.List;
 import org.eclipse.emf.common.notify.Notification;
 
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.ids.IdResolver.IdResolverExtension;
+import org.eclipse.ocl.pivot.library.collection.CollectionAsOrderedSetOperation;
+import org.eclipse.ocl.pivot.library.collection.CollectionIncludingOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsSetOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsTypeOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclIsKindOfOperation;
+import org.eclipse.ocl.pivot.messages.PivotMessages;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
+import org.eclipse.ocl.pivot.values.OrderedSetValue;
+import org.eclipse.ocl.pivot.values.SetValue;
 import org.etsi.mts.tdl.AtomicBehaviour;
 import org.etsi.mts.tdl.Behaviour;
+import org.etsi.mts.tdl.Block;
 import org.etsi.mts.tdl.ComponentInstance;
+import org.etsi.mts.tdl.Element;
 import org.etsi.mts.tdl.GateReference;
 import org.etsi.mts.tdl.Quiescence;
+import org.etsi.mts.tdl.TestConfiguration;
+import org.etsi.mts.tdl.TestDescription;
 import org.etsi.mts.tdl.TimeOperation;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -77,12 +95,10 @@ public class QuiescenceImpl extends TimeOperationImpl implements Quiescence
 	@Override
 	public GateReference getGateReference()
 	{
-		if (gateReference != null && gateReference.eIsProxy())
-		{
+		if (gateReference != null && gateReference.eIsProxy()) {
 			InternalEObject oldGateReference = (InternalEObject)gateReference;
 			gateReference = (GateReference)eResolveProxy(oldGateReference);
-			if (gateReference != oldGateReference)
-			{
+			if (gateReference != oldGateReference) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.QUIESCENCE__GATE_REFERENCE, oldGateReference, gateReference));
 			}
@@ -114,16 +130,6 @@ public class QuiescenceImpl extends TimeOperationImpl implements Quiescence
 			eNotify(new ENotificationImpl(this, Notification.SET, tdlPackage.QUIESCENCE__GATE_REFERENCE, oldGateReference, gateReference));
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #getParticipatingComponents() <em>Get Participating Components</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getParticipatingComponents()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate GET_PARTICIPATING_COMPONENTS__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.QUIESCENCE___GET_PARTICIPATING_COMPONENTS).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -133,14 +139,167 @@ public class QuiescenceImpl extends TimeOperationImpl implements Quiescence
 	@Override
 	public EList<ComponentInstance> getParticipatingComponents()
 	{
-		try
-		{
-			return (EList<ComponentInstance>)GET_PARTICIPATING_COMPONENTS__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if
+		 *   self.getParentTestDescription()
+		 *   ->exists(td | td.isLocallyOrdered) and
+		 *   self.container()
+		 *   .oclIsKindOf(Block)
+		 * then
+		 *   if
+		 *     not self.componentInstance.oclIsUndefined() or
+		 *     not self.gateReference.oclIsUndefined()
+		 *   then
+		 *     self.componentInstance->including(self.gateReference.component)
+		 *     ->asOrderedSet()
+		 *   else
+		 *     self.container()
+		 *     .oclAsType(Block)
+		 *     .getParticipatingComponentsExcluding(self)
+		 *     ->asOrderedSet()
+		 *   endif
+		 * else
+		 *   self.getParentTestDescription()
+		 *   .testConfiguration.componentInstance->asOrderedSet()
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_Block_0 = idResolver.getClass(tdlTables.CLSSid_Block, null);
+		final /*@NonInvalid*/ Element container = this.container();
+		final /*@NonInvalid*/ TestDescription getParentTestDescription_0 = this.getParentTestDescription();
+		final /*@NonInvalid*/ SetValue oclAsSet = OclAnyOclAsSetOperation.INSTANCE.evaluate(executor, tdlTables.SET_CLSSid_TestDescription, getParentTestDescription_0);
+		/*@Thrown*/ Object accumulator = ValueUtil.FALSE_VALUE;
+		Iterator<Object> ITERATOR_td = oclAsSet.iterator();
+		/*@NonInvalid*/ Boolean exists;
+		while (true) {
+			if (!ITERATOR_td.hasNext()) {
+				if (accumulator == ValueUtil.FALSE_VALUE) {
+					exists = ValueUtil.FALSE_VALUE;
+				}
+				else {
+					throw (InvalidValueException)accumulator;
+				}
+				break;
+			}
+			/*@NonInvalid*/ TestDescription td = (TestDescription)ITERATOR_td.next();
+			/**
+			 * td.isLocallyOrdered
+			 */
+			final /*@NonInvalid*/ boolean isLocallyOrdered = td.isIsLocallyOrdered();
+			//
+			if (isLocallyOrdered) {					// Normal successful body evaluation result
+				exists = ValueUtil.TRUE_VALUE;
+				break;														// Stop immediately
+			}
+			else if (!isLocallyOrdered) {				// Normal unsuccessful body evaluation result
+				;															// Carry on
+			}
+			else {															// Impossible badly typed result
+				accumulator = new InvalidValueException(PivotMessages.NonBooleanBody, "exists");
+			}
+		}
+		final /*@Thrown*/ Boolean and;
+		if (exists == ValueUtil.FALSE_VALUE) {
+			and = ValueUtil.FALSE_VALUE;
+		}
+		else {
+			final /*@NonInvalid*/ boolean oclIsKindOf = OclAnyOclIsKindOfOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_Block_0).booleanValue();
+			if (!oclIsKindOf) {
+				and = ValueUtil.FALSE_VALUE;
+			}
+			else {
+				if (exists == null) {
+					and = null;
+				}
+				else {
+					and = ValueUtil.TRUE_VALUE;
+				}
+			}
+		}
+		if (and == null) {
+			throw new InvalidValueException("Null if condition");
+		}
+		/*@Thrown*/ OrderedSetValue local_1;
+		if (and) {
+			final /*@NonInvalid*/ ComponentInstance componentInstance_0 = this.getComponentInstance();
+			final /*@NonInvalid*/ GateReference gateReference_0 = this.getGateReference();
+			final /*@NonInvalid*/ boolean oclIsUndefined = componentInstance_0 == null;
+			final /*@NonInvalid*/ Boolean not;
+			if (!oclIsUndefined) {
+				not = ValueUtil.TRUE_VALUE;
+			}
+			else {
+				if (oclIsUndefined) {
+					not = ValueUtil.FALSE_VALUE;
+				}
+				else {
+					not = null;
+				}
+			}
+			final /*@Thrown*/ Boolean or;
+			if (not == ValueUtil.TRUE_VALUE) {
+				or = ValueUtil.TRUE_VALUE;
+			}
+			else {
+				final /*@NonInvalid*/ boolean oclIsUndefined_0 = gateReference_0 == null;
+				final /*@NonInvalid*/ Boolean not_0;
+				if (!oclIsUndefined_0) {
+					not_0 = ValueUtil.TRUE_VALUE;
+				}
+				else {
+					if (oclIsUndefined_0) {
+						not_0 = ValueUtil.FALSE_VALUE;
+					}
+					else {
+						not_0 = null;
+					}
+				}
+				if (not_0 == ValueUtil.TRUE_VALUE) {
+					or = ValueUtil.TRUE_VALUE;
+				}
+				else {
+					if ((not == null) || (not_0 == null)) {
+						or = null;
+					}
+					else {
+						or = ValueUtil.FALSE_VALUE;
+					}
+				}
+			}
+			if (or == null) {
+				throw new InvalidValueException("Null if condition");
+			}
+			/*@Thrown*/ OrderedSetValue local_0;
+			if (or) {
+				final /*@Thrown*/ SetValue oclAsSet_0 = OclAnyOclAsSetOperation.INSTANCE.evaluate(executor, tdlTables.SET_CLSSid_ComponentInstance, componentInstance_0);
+				if (gateReference_0 == null) {
+					throw new InvalidValueException("Null source for \'\'http://www.etsi.org/spec/TDL/1.4.1\'::GateReference::component\'");
+				}
+				final /*@Thrown*/ ComponentInstance component = gateReference_0.getComponent();
+				final /*@Thrown*/ SetValue including = (SetValue)CollectionIncludingOperation.INSTANCE.evaluate(oclAsSet_0, component);
+				final /*@Thrown*/ OrderedSetValue asOrderedSet = CollectionAsOrderedSetOperation.INSTANCE.evaluate(including);
+				local_0 = asOrderedSet;
+			}
+			else {
+				final /*@Thrown*/ Block oclAsType = (Block)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_Block_0);
+				final /*@Thrown*/ List<ComponentInstance> getParticipatingComponentsExcluding = oclAsType.getParticipatingComponentsExcluding(this);
+				final /*@Thrown*/ OrderedSetValue BOXED_getParticipatingComponentsExcluding = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_ComponentInstance, getParticipatingComponentsExcluding);
+				final /*@Thrown*/ OrderedSetValue asOrderedSet_0 = CollectionAsOrderedSetOperation.INSTANCE.evaluate(BOXED_getParticipatingComponentsExcluding);
+				local_0 = asOrderedSet_0;
+			}
+			local_1 = local_0;
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		else {
+			final /*@NonInvalid*/ TestConfiguration testConfiguration = getParentTestDescription_0.getTestConfiguration();
+			final /*@NonInvalid*/ List<ComponentInstance> componentInstance_1 = testConfiguration.getComponentInstance();
+			final /*@NonInvalid*/ SetValue BOXED_componentInstance_1 = idResolver.createSetOfAll(tdlTables.SET_CLSSid_ComponentInstance, componentInstance_1);
+			final /*@NonInvalid*/ OrderedSetValue asOrderedSet_1 = CollectionAsOrderedSetOperation.INSTANCE.evaluate(BOXED_componentInstance_1);
+			local_1 = asOrderedSet_1;
 		}
+		final /*@Thrown*/ List<ComponentInstance> ECORE_local_1 = ((IdResolverExtension)idResolver).ecoreValueOfAll(ComponentInstance.class, local_1);
+		return (EList<ComponentInstance>)ECORE_local_1;
 	}
 
 	/**
@@ -151,8 +310,7 @@ public class QuiescenceImpl extends TimeOperationImpl implements Quiescence
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.QUIESCENCE__GATE_REFERENCE:
 				if (resolve) return getGateReference();
 				return basicGetGateReference();
@@ -168,8 +326,7 @@ public class QuiescenceImpl extends TimeOperationImpl implements Quiescence
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.QUIESCENCE__GATE_REFERENCE:
 				setGateReference((GateReference)newValue);
 				return;
@@ -185,8 +342,7 @@ public class QuiescenceImpl extends TimeOperationImpl implements Quiescence
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.QUIESCENCE__GATE_REFERENCE:
 				setGateReference((GateReference)null);
 				return;
@@ -202,8 +358,7 @@ public class QuiescenceImpl extends TimeOperationImpl implements Quiescence
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.QUIESCENCE__GATE_REFERENCE:
 				return gateReference != null;
 		}
@@ -218,26 +373,20 @@ public class QuiescenceImpl extends TimeOperationImpl implements Quiescence
 	@Override
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass)
 	{
-		if (baseClass == Behaviour.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == Behaviour.class) {
+			switch (baseOperationID) {
 				case tdlPackage.BEHAVIOUR___GET_PARTICIPATING_COMPONENTS: return tdlPackage.QUIESCENCE___GET_PARTICIPATING_COMPONENTS;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
 		}
-		if (baseClass == AtomicBehaviour.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == AtomicBehaviour.class) {
+			switch (baseOperationID) {
 				case tdlPackage.ATOMIC_BEHAVIOUR___GET_PARTICIPATING_COMPONENTS: return tdlPackage.QUIESCENCE___GET_PARTICIPATING_COMPONENTS;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
 		}
-		if (baseClass == TimeOperation.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == TimeOperation.class) {
+			switch (baseOperationID) {
 				case tdlPackage.TIME_OPERATION___GET_PARTICIPATING_COMPONENTS: return tdlPackage.QUIESCENCE___GET_PARTICIPATING_COMPONENTS;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
@@ -253,8 +402,7 @@ public class QuiescenceImpl extends TimeOperationImpl implements Quiescence
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.QUIESCENCE___GET_PARTICIPATING_COMPONENTS:
 				return getParticipatingComponents();
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/SimpleDataTypeImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/SimpleDataTypeImpl.java
index 3303f808f62fc38670474971cf4d7bb4a966b7e5..f57ea7f88d6f00801a771062d7542e09f0447181 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/SimpleDataTypeImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/SimpleDataTypeImpl.java
@@ -4,23 +4,34 @@ package org.etsi.mts.tdl.impl;
 
 import java.lang.reflect.InvocationTargetException;
 
+import java.util.List;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.ids.IdResolver.IdResolverExtension;
+import org.eclipse.ocl.pivot.library.collection.CollectionAsOrderedSetOperation;
+import org.eclipse.ocl.pivot.library.collection.CollectionUnionOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsTypeOperation;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
+import org.eclipse.ocl.pivot.values.OrderedSetValue;
+import org.eclipse.ocl.pivot.values.SetValue;
 import org.etsi.mts.tdl.Constraint;
 import org.etsi.mts.tdl.DataType;
 import org.etsi.mts.tdl.Extension;
+import org.etsi.mts.tdl.PackageableElement;
 import org.etsi.mts.tdl.SimpleDataType;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -88,8 +99,7 @@ public class SimpleDataTypeImpl extends DataTypeImpl implements SimpleDataType
 	{
 		Extension oldExtension = extension;
 		extension = newExtension;
-		if (eNotificationRequired())
-		{
+		if (eNotificationRequired()) {
 			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, tdlPackage.SIMPLE_DATA_TYPE__EXTENSION, oldExtension, newExtension);
 			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
@@ -104,8 +114,7 @@ public class SimpleDataTypeImpl extends DataTypeImpl implements SimpleDataType
 	@Override
 	public void setExtension(Extension newExtension)
 	{
-		if (newExtension != extension)
-		{
+		if (newExtension != extension) {
 			NotificationChain msgs = null;
 			if (extension != null)
 				msgs = ((InternalEObject)extension).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - tdlPackage.SIMPLE_DATA_TYPE__EXTENSION, null, msgs);
@@ -118,16 +127,6 @@ public class SimpleDataTypeImpl extends DataTypeImpl implements SimpleDataType
 			eNotify(new ENotificationImpl(this, Notification.SET, tdlPackage.SIMPLE_DATA_TYPE__EXTENSION, newExtension, newExtension));
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #allConstraints() <em>All Constraints</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #allConstraints()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate ALL_CONSTRAINTS__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.SIMPLE_DATA_TYPE___ALL_CONSTRAINTS).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -137,14 +136,57 @@ public class SimpleDataTypeImpl extends DataTypeImpl implements SimpleDataType
 	@Override
 	public EList<Constraint> allConstraints()
 	{
-		try
-		{
-			return (EList<Constraint>)ALL_CONSTRAINTS__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if not self.extension.oclIsUndefined()
+		 * then
+		 *   self.extension.extending.oclAsType(SimpleDataType)
+		 *   .allConstraints()
+		 *   ->union(self.constraint)
+		 *   ->asOrderedSet()
+		 * else self.constraint
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ List<Constraint> constraint_0 = this.getConstraint();
+		final /*@NonInvalid*/ Extension extension = this.getExtension();
+		final /*@NonInvalid*/ OrderedSetValue BOXED_constraint_0 = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_Constraint, constraint_0);
+		final /*@NonInvalid*/ boolean oclIsUndefined = extension == null;
+		final /*@NonInvalid*/ Boolean not;
+		if (!oclIsUndefined) {
+			not = ValueUtil.TRUE_VALUE;
+		}
+		else {
+			if (oclIsUndefined) {
+				not = ValueUtil.FALSE_VALUE;
+			}
+			else {
+				not = null;
+			}
+		}
+		if (not == null) {
+			throw new InvalidValueException("Null if condition");
+		}
+		/*@Thrown*/ OrderedSetValue local_0;
+		if (not) {
+			final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_SimpleDataType_0 = idResolver.getClass(tdlTables.CLSSid_SimpleDataType, null);
+			if (extension == null) {
+				throw new InvalidValueException("Null source for \'\'http://www.etsi.org/spec/TDL/1.4.1\'::Extension::extending\'");
+			}
+			final /*@Thrown*/ PackageableElement extending = extension.getExtending();
+			final /*@Thrown*/ SimpleDataType oclAsType = (SimpleDataType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, extending, TYP_tdl_c_c_SimpleDataType_0);
+			final /*@Thrown*/ List<Constraint> allConstraints = oclAsType.allConstraints();
+			final /*@Thrown*/ OrderedSetValue BOXED_allConstraints = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_Constraint, allConstraints);
+			final /*@Thrown*/ SetValue union = (SetValue)CollectionUnionOperation.INSTANCE.evaluate(BOXED_allConstraints, BOXED_constraint_0);
+			final /*@Thrown*/ OrderedSetValue asOrderedSet = CollectionAsOrderedSetOperation.INSTANCE.evaluate(union);
+			local_0 = asOrderedSet;
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		else {
+			local_0 = BOXED_constraint_0;
 		}
+		final /*@Thrown*/ List<Constraint> ECORE_local_0 = ((IdResolverExtension)idResolver).ecoreValueOfAll(Constraint.class, local_0);
+		return (EList<Constraint>)ECORE_local_0;
 	}
 
 	/**
@@ -155,8 +197,7 @@ public class SimpleDataTypeImpl extends DataTypeImpl implements SimpleDataType
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.SIMPLE_DATA_TYPE__EXTENSION:
 				return basicSetExtension(null, msgs);
 		}
@@ -171,8 +212,7 @@ public class SimpleDataTypeImpl extends DataTypeImpl implements SimpleDataType
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.SIMPLE_DATA_TYPE__EXTENSION:
 				return getExtension();
 		}
@@ -187,8 +227,7 @@ public class SimpleDataTypeImpl extends DataTypeImpl implements SimpleDataType
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.SIMPLE_DATA_TYPE__EXTENSION:
 				setExtension((Extension)newValue);
 				return;
@@ -204,8 +243,7 @@ public class SimpleDataTypeImpl extends DataTypeImpl implements SimpleDataType
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.SIMPLE_DATA_TYPE__EXTENSION:
 				setExtension((Extension)null);
 				return;
@@ -221,8 +259,7 @@ public class SimpleDataTypeImpl extends DataTypeImpl implements SimpleDataType
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.SIMPLE_DATA_TYPE__EXTENSION:
 				return extension != null;
 		}
@@ -237,10 +274,8 @@ public class SimpleDataTypeImpl extends DataTypeImpl implements SimpleDataType
 	@Override
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass)
 	{
-		if (baseClass == DataType.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == DataType.class) {
+			switch (baseOperationID) {
 				case tdlPackage.DATA_TYPE___ALL_CONSTRAINTS: return tdlPackage.SIMPLE_DATA_TYPE___ALL_CONSTRAINTS;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
@@ -256,8 +291,7 @@ public class SimpleDataTypeImpl extends DataTypeImpl implements SimpleDataType
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.SIMPLE_DATA_TYPE___ALL_CONSTRAINTS:
 				return allConstraints();
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/SingleCombinedBehaviourImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/SingleCombinedBehaviourImpl.java
index 6700330a609349a635007ab5ec4a658f50d0701f..2cbccbb94c4b9b889c97524eef6dd1e2c8de0ae0 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/SingleCombinedBehaviourImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/SingleCombinedBehaviourImpl.java
@@ -4,23 +4,42 @@ package org.etsi.mts.tdl.impl;
 
 import java.lang.reflect.InvocationTargetException;
 
+import java.util.Iterator;
+import java.util.List;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.ids.IdResolver.IdResolverExtension;
+import org.eclipse.ocl.pivot.library.collection.CollectionAsOrderedSetOperation;
+import org.eclipse.ocl.pivot.library.collection.CollectionUnionOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsSetOperation;
+import org.eclipse.ocl.pivot.messages.PivotMessages;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.BagValue;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
+import org.eclipse.ocl.pivot.values.OrderedSetValue;
+import org.eclipse.ocl.pivot.values.SequenceValue;
+import org.eclipse.ocl.pivot.values.SequenceValue.Accumulator;
+import org.eclipse.ocl.pivot.values.SetValue;
 import org.etsi.mts.tdl.Behaviour;
 import org.etsi.mts.tdl.Block;
 import org.etsi.mts.tdl.ComponentInstance;
+import org.etsi.mts.tdl.ExceptionalBehaviour;
+import org.etsi.mts.tdl.PeriodicBehaviour;
 import org.etsi.mts.tdl.SingleCombinedBehaviour;
+import org.etsi.mts.tdl.TestConfiguration;
+import org.etsi.mts.tdl.TestDescription;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -88,8 +107,7 @@ public abstract class SingleCombinedBehaviourImpl extends CombinedBehaviourImpl
 	{
 		Block oldBlock = block;
 		block = newBlock;
-		if (eNotificationRequired())
-		{
+		if (eNotificationRequired()) {
 			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, tdlPackage.SINGLE_COMBINED_BEHAVIOUR__BLOCK, oldBlock, newBlock);
 			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
@@ -104,8 +122,7 @@ public abstract class SingleCombinedBehaviourImpl extends CombinedBehaviourImpl
 	@Override
 	public void setBlock(Block newBlock)
 	{
-		if (newBlock != block)
-		{
+		if (newBlock != block) {
 			NotificationChain msgs = null;
 			if (block != null)
 				msgs = ((InternalEObject)block).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - tdlPackage.SINGLE_COMBINED_BEHAVIOUR__BLOCK, null, msgs);
@@ -118,16 +135,6 @@ public abstract class SingleCombinedBehaviourImpl extends CombinedBehaviourImpl
 			eNotify(new ENotificationImpl(this, Notification.SET, tdlPackage.SINGLE_COMBINED_BEHAVIOUR__BLOCK, newBlock, newBlock));
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #getParticipatingComponents() <em>Get Participating Components</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getParticipatingComponents()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate GET_PARTICIPATING_COMPONENTS__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.SINGLE_COMBINED_BEHAVIOUR___GET_PARTICIPATING_COMPONENTS).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -137,14 +144,119 @@ public abstract class SingleCombinedBehaviourImpl extends CombinedBehaviourImpl
 	@Override
 	public EList<ComponentInstance> getParticipatingComponents()
 	{
-		try
-		{
-			return (EList<ComponentInstance>)GET_PARTICIPATING_COMPONENTS__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if
+		 *   self.getParentTestDescription()
+		 *   ->exists(td | td.isLocallyOrdered)
+		 * then
+		 *   self.periodic.getParticipatingComponents()
+		 *   ->union(self.exceptional.getParticipatingComponents())
+		 *   ->union(self.block.getParticipatingComponents())
+		 *   ->asOrderedSet()
+		 * else
+		 *   self.getParentTestDescription()
+		 *   .testConfiguration.componentInstance->asOrderedSet()
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ TestDescription getParentTestDescription = this.getParentTestDescription();
+		final /*@NonInvalid*/ SetValue oclAsSet = OclAnyOclAsSetOperation.INSTANCE.evaluate(executor, tdlTables.SET_CLSSid_TestDescription, getParentTestDescription);
+		/*@Thrown*/ Object accumulator = ValueUtil.FALSE_VALUE;
+		Iterator<Object> ITERATOR_td = oclAsSet.iterator();
+		/*@NonInvalid*/ Boolean exists;
+		while (true) {
+			if (!ITERATOR_td.hasNext()) {
+				if (accumulator == ValueUtil.FALSE_VALUE) {
+					exists = ValueUtil.FALSE_VALUE;
+				}
+				else {
+					throw (InvalidValueException)accumulator;
+				}
+				break;
+			}
+			/*@NonInvalid*/ TestDescription td = (TestDescription)ITERATOR_td.next();
+			/**
+			 * td.isLocallyOrdered
+			 */
+			final /*@NonInvalid*/ boolean isLocallyOrdered = td.isIsLocallyOrdered();
+			//
+			if (isLocallyOrdered) {					// Normal successful body evaluation result
+				exists = ValueUtil.TRUE_VALUE;
+				break;														// Stop immediately
+			}
+			else if (!isLocallyOrdered) {				// Normal unsuccessful body evaluation result
+				;															// Carry on
+			}
+			else {															// Impossible badly typed result
+				accumulator = new InvalidValueException(PivotMessages.NonBooleanBody, "exists");
+			}
+		}
+		if (exists == null) {
+			throw new InvalidValueException("Null if condition");
+		}
+		/*@NonInvalid*/ OrderedSetValue local_0;
+		if (exists) {
+			final /*@NonInvalid*/ List<PeriodicBehaviour> periodic = this.getPeriodic();
+			final /*@NonInvalid*/ OrderedSetValue BOXED_periodic = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_PeriodicBehaviour, periodic);
+			/*@Thrown*/ Accumulator accumulator_0 = ValueUtil.createSequenceAccumulatorValue(tdlTables.SEQ_CLSSid_ComponentInstance);
+			Iterator<Object> ITERATOR__1 = BOXED_periodic.iterator();
+			/*@NonInvalid*/ SequenceValue collect;
+			while (true) {
+				if (!ITERATOR__1.hasNext()) {
+					collect = accumulator_0;
+					break;
+				}
+				/*@NonInvalid*/ PeriodicBehaviour _1 = (PeriodicBehaviour)ITERATOR__1.next();
+				/**
+				 * getParticipatingComponents()
+				 */
+				final /*@NonInvalid*/ List<ComponentInstance> getParticipatingComponents = _1.getParticipatingComponents();
+				final /*@NonInvalid*/ OrderedSetValue BOXED_getParticipatingComponents = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_ComponentInstance, getParticipatingComponents);
+				//
+				for (Object value : BOXED_getParticipatingComponents.flatten().getElements()) {
+					accumulator_0.add(value);
+				}
+			}
+			final /*@NonInvalid*/ List<ExceptionalBehaviour> exceptional = this.getExceptional();
+			final /*@NonInvalid*/ OrderedSetValue BOXED_exceptional = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_ExceptionalBehaviour, exceptional);
+			/*@Thrown*/ Accumulator accumulator_1 = ValueUtil.createSequenceAccumulatorValue(tdlTables.SEQ_CLSSid_ComponentInstance);
+			Iterator<Object> ITERATOR__1_0 = BOXED_exceptional.iterator();
+			/*@NonInvalid*/ SequenceValue collect_0;
+			while (true) {
+				if (!ITERATOR__1_0.hasNext()) {
+					collect_0 = accumulator_1;
+					break;
+				}
+				/*@NonInvalid*/ ExceptionalBehaviour _1_0 = (ExceptionalBehaviour)ITERATOR__1_0.next();
+				/**
+				 * getParticipatingComponents()
+				 */
+				final /*@NonInvalid*/ List<ComponentInstance> getParticipatingComponents_0 = _1_0.getParticipatingComponents();
+				final /*@NonInvalid*/ OrderedSetValue BOXED_getParticipatingComponents_0 = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_ComponentInstance, getParticipatingComponents_0);
+				//
+				for (Object value : BOXED_getParticipatingComponents_0.flatten().getElements()) {
+					accumulator_1.add(value);
+				}
+			}
+			final /*@NonInvalid*/ BagValue union = (BagValue)CollectionUnionOperation.INSTANCE.evaluate(collect, collect_0);
+			final /*@NonInvalid*/ Block block = this.getBlock();
+			final /*@NonInvalid*/ List<ComponentInstance> getParticipatingComponents_1 = block.getParticipatingComponents();
+			final /*@NonInvalid*/ OrderedSetValue BOXED_getParticipatingComponents_1 = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_ComponentInstance, getParticipatingComponents_1);
+			final /*@NonInvalid*/ BagValue union_0 = (BagValue)CollectionUnionOperation.INSTANCE.evaluate(union, BOXED_getParticipatingComponents_1);
+			final /*@NonInvalid*/ OrderedSetValue asOrderedSet = CollectionAsOrderedSetOperation.INSTANCE.evaluate(union_0);
+			local_0 = asOrderedSet;
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		else {
+			final /*@NonInvalid*/ TestConfiguration testConfiguration = getParentTestDescription.getTestConfiguration();
+			final /*@NonInvalid*/ List<ComponentInstance> componentInstance = testConfiguration.getComponentInstance();
+			final /*@NonInvalid*/ SetValue BOXED_componentInstance = idResolver.createSetOfAll(tdlTables.SET_CLSSid_ComponentInstance, componentInstance);
+			final /*@NonInvalid*/ OrderedSetValue asOrderedSet_0 = CollectionAsOrderedSetOperation.INSTANCE.evaluate(BOXED_componentInstance);
+			local_0 = asOrderedSet_0;
 		}
+		final /*@NonInvalid*/ List<ComponentInstance> ECORE_local_0 = ((IdResolverExtension)idResolver).ecoreValueOfAll(ComponentInstance.class, local_0);
+		return (EList<ComponentInstance>)ECORE_local_0;
 	}
 
 	/**
@@ -155,8 +267,7 @@ public abstract class SingleCombinedBehaviourImpl extends CombinedBehaviourImpl
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.SINGLE_COMBINED_BEHAVIOUR__BLOCK:
 				return basicSetBlock(null, msgs);
 		}
@@ -171,8 +282,7 @@ public abstract class SingleCombinedBehaviourImpl extends CombinedBehaviourImpl
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.SINGLE_COMBINED_BEHAVIOUR__BLOCK:
 				return getBlock();
 		}
@@ -187,8 +297,7 @@ public abstract class SingleCombinedBehaviourImpl extends CombinedBehaviourImpl
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.SINGLE_COMBINED_BEHAVIOUR__BLOCK:
 				setBlock((Block)newValue);
 				return;
@@ -204,8 +313,7 @@ public abstract class SingleCombinedBehaviourImpl extends CombinedBehaviourImpl
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.SINGLE_COMBINED_BEHAVIOUR__BLOCK:
 				setBlock((Block)null);
 				return;
@@ -221,8 +329,7 @@ public abstract class SingleCombinedBehaviourImpl extends CombinedBehaviourImpl
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.SINGLE_COMBINED_BEHAVIOUR__BLOCK:
 				return block != null;
 		}
@@ -237,10 +344,8 @@ public abstract class SingleCombinedBehaviourImpl extends CombinedBehaviourImpl
 	@Override
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass)
 	{
-		if (baseClass == Behaviour.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == Behaviour.class) {
+			switch (baseOperationID) {
 				case tdlPackage.BEHAVIOUR___GET_PARTICIPATING_COMPONENTS: return tdlPackage.SINGLE_COMBINED_BEHAVIOUR___GET_PARTICIPATING_COMPONENTS;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
@@ -256,8 +361,7 @@ public abstract class SingleCombinedBehaviourImpl extends CombinedBehaviourImpl
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.SINGLE_COMBINED_BEHAVIOUR___GET_PARTICIPATING_COMPONENTS:
 				return getParticipatingComponents();
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/SpecialValueUseImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/SpecialValueUseImpl.java
index 7d706546bce0288b671f2450f11ce3b6d78ab150..327064a0f1c15a18c51803e0f36a2cf010205c79 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/SpecialValueUseImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/SpecialValueUseImpl.java
@@ -5,15 +5,25 @@ package org.etsi.mts.tdl.impl;
 import java.lang.reflect.InvocationTargetException;
 
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
-
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsTypeOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclIsTypeOfOperation;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
+import org.etsi.mts.tdl.AnyValue;
 import org.etsi.mts.tdl.DataType;
 import org.etsi.mts.tdl.DataUse;
+import org.etsi.mts.tdl.Element;
+import org.etsi.mts.tdl.Member;
+import org.etsi.mts.tdl.MemberAssignment;
+import org.etsi.mts.tdl.Parameter;
+import org.etsi.mts.tdl.ParameterBinding;
 import org.etsi.mts.tdl.SpecialValueUse;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -45,16 +55,6 @@ public abstract class SpecialValueUseImpl extends StaticDataUseImpl implements S
 		return tdlPackage.Literals.SPECIAL_VALUE_USE;
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #resolveDataType() <em>Resolve Data Type</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #resolveDataType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate RESOLVE_DATA_TYPE__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.SPECIAL_VALUE_USE___RESOLVE_DATA_TYPE).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -63,14 +63,84 @@ public abstract class SpecialValueUseImpl extends StaticDataUseImpl implements S
 	@Override
 	public DataType resolveDataType()
 	{
-		try
-		{
-			return (DataType)RESOLVE_DATA_TYPE__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if self.container().oclIsTypeOf(MemberAssignment)
+		 * then
+		 *   self.container()
+		 *   .oclAsType(MemberAssignment).member.dataType
+		 * else
+		 *   if self.container().oclIsTypeOf(ParameterBinding)
+		 *   then
+		 *     self.container()
+		 *     .oclAsType(ParameterBinding).parameter.dataType
+		 *   else
+		 *     if
+		 *       self.container()
+		 *       .oclIsTypeOf(Interaction) and
+		 *       self.oclIsTypeOf(AnyValue)
+		 *     then self.oclAsType(AnyValue).dataType
+		 *     else null
+		 *     endif
+		 *   endif
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_MemberAssignment_0 = idResolver.getClass(tdlTables.CLSSid_MemberAssignment, null);
+		final /*@NonInvalid*/ Element container = this.container();
+		final /*@NonInvalid*/ boolean oclIsTypeOf = OclAnyOclIsTypeOfOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_MemberAssignment_0).booleanValue();
+		/*@Thrown*/ DataType local_2;
+		if (oclIsTypeOf) {
+			final /*@Thrown*/ MemberAssignment oclAsType = (MemberAssignment)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_MemberAssignment_0);
+			final /*@Thrown*/ Member member = oclAsType.getMember();
+			final /*@Thrown*/ DataType dataType = member.getDataType();
+			local_2 = dataType;
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		else {
+			final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_ParameterBinding_0 = idResolver.getClass(tdlTables.CLSSid_ParameterBinding, null);
+			final /*@NonInvalid*/ boolean oclIsTypeOf_0 = OclAnyOclIsTypeOfOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_ParameterBinding_0).booleanValue();
+			/*@Thrown*/ DataType local_1;
+			if (oclIsTypeOf_0) {
+				final /*@Thrown*/ ParameterBinding oclAsType_0 = (ParameterBinding)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_ParameterBinding_0);
+				final /*@Thrown*/ Parameter parameter = oclAsType_0.getParameter();
+				final /*@Thrown*/ DataType dataType_0 = parameter.getDataType();
+				local_1 = dataType_0;
+			}
+			else {
+				final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_AnyValue_1 = idResolver.getClass(tdlTables.CLSSid_AnyValue, null);
+				final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_Interaction_0 = idResolver.getClass(tdlTables.CLSSid_Interaction, null);
+				final /*@NonInvalid*/ boolean oclIsTypeOf_1 = OclAnyOclIsTypeOfOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_Interaction_0).booleanValue();
+				final /*@NonInvalid*/ Boolean and;
+				if (!oclIsTypeOf_1) {
+					and = ValueUtil.FALSE_VALUE;
+				}
+				else {
+					final /*@NonInvalid*/ boolean oclIsTypeOf_2 = OclAnyOclIsTypeOfOperation.INSTANCE.evaluate(executor, this, TYP_tdl_c_c_AnyValue_1).booleanValue();
+					if (!oclIsTypeOf_2) {
+						and = ValueUtil.FALSE_VALUE;
+					}
+					else {
+						and = ValueUtil.TRUE_VALUE;
+					}
+				}
+				if (and == null) {
+					throw new InvalidValueException("Null if condition");
+				}
+				/*@Thrown*/ DataType local_0;
+				if (and) {
+					final /*@Thrown*/ AnyValue oclAsType_1 = (AnyValue)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, this, TYP_tdl_c_c_AnyValue_1);
+					final /*@Thrown*/ DataType dataType_1 = oclAsType_1.getDataType();
+					local_0 = dataType_1;
+				}
+				else {
+					local_0 = null;
+				}
+				local_1 = local_0;
+			}
+			local_2 = local_1;
 		}
+		return local_2;
 	}
 
 	/**
@@ -81,10 +151,8 @@ public abstract class SpecialValueUseImpl extends StaticDataUseImpl implements S
 	@Override
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass)
 	{
-		if (baseClass == DataUse.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == DataUse.class) {
+			switch (baseOperationID) {
 				case tdlPackage.DATA_USE___RESOLVE_DATA_TYPE: return tdlPackage.SPECIAL_VALUE_USE___RESOLVE_DATA_TYPE;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
@@ -100,8 +168,7 @@ public abstract class SpecialValueUseImpl extends StaticDataUseImpl implements S
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.SPECIAL_VALUE_USE___RESOLVE_DATA_TYPE:
 				return resolveDataType();
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/StructuredDataInstanceImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/StructuredDataInstanceImpl.java
index 891c97f0c6b671dd19c7e1a9561e6b6432cb1103..fdfc41755336601834b00f551f58761a2d151753 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/StructuredDataInstanceImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/StructuredDataInstanceImpl.java
@@ -97,8 +97,7 @@ public class StructuredDataInstanceImpl extends DataInstanceImpl implements Stru
 	@Override
 	public EList<MemberAssignment> getMemberAssignment()
 	{
-		if (memberAssignment == null)
-		{
+		if (memberAssignment == null) {
 			memberAssignment = new EObjectContainmentEList<MemberAssignment>(MemberAssignment.class, this, tdlPackage.STRUCTURED_DATA_INSTANCE__MEMBER_ASSIGNMENT);
 		}
 		return memberAssignment;
@@ -137,8 +136,7 @@ public class StructuredDataInstanceImpl extends DataInstanceImpl implements Stru
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.STRUCTURED_DATA_INSTANCE__MEMBER_ASSIGNMENT:
 				return ((InternalEList<?>)getMemberAssignment()).basicRemove(otherEnd, msgs);
 		}
@@ -153,8 +151,7 @@ public class StructuredDataInstanceImpl extends DataInstanceImpl implements Stru
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.STRUCTURED_DATA_INSTANCE__MEMBER_ASSIGNMENT:
 				return getMemberAssignment();
 			case tdlPackage.STRUCTURED_DATA_INSTANCE__UNASSIGNED_MEMBER:
@@ -172,8 +169,7 @@ public class StructuredDataInstanceImpl extends DataInstanceImpl implements Stru
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.STRUCTURED_DATA_INSTANCE__MEMBER_ASSIGNMENT:
 				getMemberAssignment().clear();
 				getMemberAssignment().addAll((Collection<? extends MemberAssignment>)newValue);
@@ -193,8 +189,7 @@ public class StructuredDataInstanceImpl extends DataInstanceImpl implements Stru
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.STRUCTURED_DATA_INSTANCE__MEMBER_ASSIGNMENT:
 				getMemberAssignment().clear();
 				return;
@@ -213,8 +208,7 @@ public class StructuredDataInstanceImpl extends DataInstanceImpl implements Stru
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.STRUCTURED_DATA_INSTANCE__MEMBER_ASSIGNMENT:
 				return memberAssignment != null && !memberAssignment.isEmpty();
 			case tdlPackage.STRUCTURED_DATA_INSTANCE__UNASSIGNED_MEMBER:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/StructuredDataTypeImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/StructuredDataTypeImpl.java
index 97bf22cbe89140d9ad6744150e259f4a0e6bb057..3b35097329d671b01c871ebf72147ec8dc5daa65 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/StructuredDataTypeImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/StructuredDataTypeImpl.java
@@ -6,24 +6,39 @@ import java.lang.reflect.InvocationTargetException;
 
 import java.util.Collection;
 
+import java.util.Iterator;
+import java.util.List;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.ids.IdResolver.IdResolverExtension;
+import org.eclipse.ocl.pivot.library.collection.CollectionAsOrderedSetOperation;
+import org.eclipse.ocl.pivot.library.collection.CollectionIsEmptyOperation;
+import org.eclipse.ocl.pivot.library.collection.CollectionUnionOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsTypeOperation;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.BagValue;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
+import org.eclipse.ocl.pivot.values.OrderedSetValue;
+import org.eclipse.ocl.pivot.values.SequenceValue;
+import org.eclipse.ocl.pivot.values.SequenceValue.Accumulator;
 import org.etsi.mts.tdl.Constraint;
 import org.etsi.mts.tdl.DataType;
 import org.etsi.mts.tdl.Extension;
 import org.etsi.mts.tdl.Member;
+import org.etsi.mts.tdl.PackageableElement;
 import org.etsi.mts.tdl.StructuredDataType;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -90,8 +105,7 @@ public class StructuredDataTypeImpl extends DataTypeImpl implements StructuredDa
 	@Override
 	public EList<Extension> getExtension()
 	{
-		if (extension == null)
-		{
+		if (extension == null) {
 			extension = new EObjectContainmentEList<Extension>(Extension.class, this, tdlPackage.STRUCTURED_DATA_TYPE__EXTENSION);
 		}
 		return extension;
@@ -105,23 +119,12 @@ public class StructuredDataTypeImpl extends DataTypeImpl implements StructuredDa
 	@Override
 	public EList<Member> getMember()
 	{
-		if (member == null)
-		{
+		if (member == null) {
 			member = new EObjectContainmentEList<Member>(Member.class, this, tdlPackage.STRUCTURED_DATA_TYPE__MEMBER);
 		}
 		return member;
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #allMembers() <em>All Members</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #allMembers()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate ALL_MEMBERS__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.STRUCTURED_DATA_TYPE___ALL_MEMBERS).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -131,26 +134,78 @@ public class StructuredDataTypeImpl extends DataTypeImpl implements StructuredDa
 	@Override
 	public EList<Member> allMembers()
 	{
-		try
-		{
-			return (EList<Member>)ALL_MEMBERS__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if not self.extension->isEmpty()
+		 * then
+		 *   self.extension->collect(e |
+		 *     e.extending.oclAsType(StructuredDataType)
+		 *     .allMembers())
+		 *   ->union(self.member)
+		 *   ->asOrderedSet()
+		 * else self.member
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ List<Extension> extension_0 = this.getExtension();
+		final /*@NonInvalid*/ List<Member> member_0 = this.getMember();
+		final /*@NonInvalid*/ OrderedSetValue BOXED_extension_0 = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_Extension, extension_0);
+		final /*@NonInvalid*/ OrderedSetValue BOXED_member_0 = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_Member, member_0);
+		final /*@NonInvalid*/ boolean isEmpty = CollectionIsEmptyOperation.INSTANCE.evaluate(BOXED_extension_0).booleanValue();
+		final /*@NonInvalid*/ Boolean not;
+		if (!isEmpty) {
+			not = ValueUtil.TRUE_VALUE;
+		}
+		else {
+			if (isEmpty) {
+				not = ValueUtil.FALSE_VALUE;
+			}
+			else {
+				not = null;
+			}
+		}
+		if (not == null) {
+			throw new InvalidValueException("Null if condition");
+		}
+		/*@Thrown*/ OrderedSetValue local_0;
+		if (not) {
+			/*@Thrown*/ Accumulator accumulator = ValueUtil.createSequenceAccumulatorValue(tdlTables.SEQ_CLSSid_Member);
+			Iterator<Object> ITERATOR_e_1 = BOXED_extension_0.iterator();
+			/*@Thrown*/ SequenceValue collect;
+			while (true) {
+				if (!ITERATOR_e_1.hasNext()) {
+					collect = accumulator;
+					break;
+				}
+				/*@NonInvalid*/ Extension e_1 = (Extension)ITERATOR_e_1.next();
+				/**
+				 * e.extending.oclAsType(StructuredDataType).allMembers()
+				 */
+				final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_StructuredDataType_0 = idResolver.getClass(tdlTables.CLSSid_StructuredDataType, null);
+				if (e_1 == null) {
+					throw new InvalidValueException("Null source for \'\'http://www.etsi.org/spec/TDL/1.4.1\'::Extension::extending\'");
+				}
+				final /*@Thrown*/ PackageableElement extending = e_1.getExtending();
+				final /*@Thrown*/ StructuredDataType oclAsType = (StructuredDataType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, extending, TYP_tdl_c_c_StructuredDataType_0);
+				final /*@Thrown*/ List<Member> allMembers = oclAsType.allMembers();
+				final /*@Thrown*/ OrderedSetValue BOXED_allMembers = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_Member, allMembers);
+				//
+				for (Object value : BOXED_allMembers.flatten().getElements()) {
+					accumulator.add(value);
+				}
+			}
+			final /*@Thrown*/ BagValue union = (BagValue)CollectionUnionOperation.INSTANCE.evaluate(collect, BOXED_member_0);
+			final /*@Thrown*/ OrderedSetValue asOrderedSet = CollectionAsOrderedSetOperation.INSTANCE.evaluate(union);
+			local_0 = asOrderedSet;
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		else {
+			local_0 = BOXED_member_0;
 		}
+		final /*@Thrown*/ List<Member> ECORE_local_0 = ((IdResolverExtension)idResolver).ecoreValueOfAll(Member.class, local_0);
+		return (EList<Member>)ECORE_local_0;
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #allConstraints() <em>All Constraints</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #allConstraints()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate ALL_CONSTRAINTS__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.STRUCTURED_DATA_TYPE___ALL_CONSTRAINTS).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -160,14 +215,76 @@ public class StructuredDataTypeImpl extends DataTypeImpl implements StructuredDa
 	@Override
 	public EList<Constraint> allConstraints()
 	{
-		try
-		{
-			return (EList<Constraint>)ALL_CONSTRAINTS__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if not self.extension->isEmpty()
+		 * then
+		 *   self.extension->collect(e |
+		 *     e.extending.oclAsType(StructuredDataType)
+		 *     .allConstraints())
+		 *   ->union(self.constraint)
+		 *   ->asOrderedSet()
+		 * else self.constraint
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ List<Constraint> constraint_0 = this.getConstraint();
+		final /*@NonInvalid*/ List<Extension> extension_0 = this.getExtension();
+		final /*@NonInvalid*/ OrderedSetValue BOXED_constraint_0 = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_Constraint, constraint_0);
+		final /*@NonInvalid*/ OrderedSetValue BOXED_extension_0 = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_Extension, extension_0);
+		final /*@NonInvalid*/ boolean isEmpty = CollectionIsEmptyOperation.INSTANCE.evaluate(BOXED_extension_0).booleanValue();
+		final /*@NonInvalid*/ Boolean not;
+		if (!isEmpty) {
+			not = ValueUtil.TRUE_VALUE;
+		}
+		else {
+			if (isEmpty) {
+				not = ValueUtil.FALSE_VALUE;
+			}
+			else {
+				not = null;
+			}
+		}
+		if (not == null) {
+			throw new InvalidValueException("Null if condition");
+		}
+		/*@Thrown*/ OrderedSetValue local_0;
+		if (not) {
+			/*@Thrown*/ Accumulator accumulator = ValueUtil.createSequenceAccumulatorValue(tdlTables.SEQ_CLSSid_Constraint);
+			Iterator<Object> ITERATOR_e_1 = BOXED_extension_0.iterator();
+			/*@Thrown*/ SequenceValue collect;
+			while (true) {
+				if (!ITERATOR_e_1.hasNext()) {
+					collect = accumulator;
+					break;
+				}
+				/*@NonInvalid*/ Extension e_1 = (Extension)ITERATOR_e_1.next();
+				/**
+				 * e.extending.oclAsType(StructuredDataType).allConstraints()
+				 */
+				final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_StructuredDataType_0 = idResolver.getClass(tdlTables.CLSSid_StructuredDataType, null);
+				if (e_1 == null) {
+					throw new InvalidValueException("Null source for \'\'http://www.etsi.org/spec/TDL/1.4.1\'::Extension::extending\'");
+				}
+				final /*@Thrown*/ PackageableElement extending = e_1.getExtending();
+				final /*@Thrown*/ StructuredDataType oclAsType = (StructuredDataType)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, extending, TYP_tdl_c_c_StructuredDataType_0);
+				final /*@Thrown*/ List<Constraint> allConstraints = oclAsType.allConstraints();
+				final /*@Thrown*/ OrderedSetValue BOXED_allConstraints = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_Constraint, allConstraints);
+				//
+				for (Object value : BOXED_allConstraints.flatten().getElements()) {
+					accumulator.add(value);
+				}
+			}
+			final /*@Thrown*/ BagValue union = (BagValue)CollectionUnionOperation.INSTANCE.evaluate(collect, BOXED_constraint_0);
+			final /*@Thrown*/ OrderedSetValue asOrderedSet = CollectionAsOrderedSetOperation.INSTANCE.evaluate(union);
+			local_0 = asOrderedSet;
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		else {
+			local_0 = BOXED_constraint_0;
 		}
+		final /*@Thrown*/ List<Constraint> ECORE_local_0 = ((IdResolverExtension)idResolver).ecoreValueOfAll(Constraint.class, local_0);
+		return (EList<Constraint>)ECORE_local_0;
 	}
 
 	/**
@@ -178,8 +295,7 @@ public class StructuredDataTypeImpl extends DataTypeImpl implements StructuredDa
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.STRUCTURED_DATA_TYPE__EXTENSION:
 				return ((InternalEList<?>)getExtension()).basicRemove(otherEnd, msgs);
 			case tdlPackage.STRUCTURED_DATA_TYPE__MEMBER:
@@ -196,8 +312,7 @@ public class StructuredDataTypeImpl extends DataTypeImpl implements StructuredDa
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.STRUCTURED_DATA_TYPE__EXTENSION:
 				return getExtension();
 			case tdlPackage.STRUCTURED_DATA_TYPE__MEMBER:
@@ -215,8 +330,7 @@ public class StructuredDataTypeImpl extends DataTypeImpl implements StructuredDa
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.STRUCTURED_DATA_TYPE__EXTENSION:
 				getExtension().clear();
 				getExtension().addAll((Collection<? extends Extension>)newValue);
@@ -237,8 +351,7 @@ public class StructuredDataTypeImpl extends DataTypeImpl implements StructuredDa
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.STRUCTURED_DATA_TYPE__EXTENSION:
 				getExtension().clear();
 				return;
@@ -257,8 +370,7 @@ public class StructuredDataTypeImpl extends DataTypeImpl implements StructuredDa
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.STRUCTURED_DATA_TYPE__EXTENSION:
 				return extension != null && !extension.isEmpty();
 			case tdlPackage.STRUCTURED_DATA_TYPE__MEMBER:
@@ -275,10 +387,8 @@ public class StructuredDataTypeImpl extends DataTypeImpl implements StructuredDa
 	@Override
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass)
 	{
-		if (baseClass == DataType.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == DataType.class) {
+			switch (baseOperationID) {
 				case tdlPackage.DATA_TYPE___ALL_CONSTRAINTS: return tdlPackage.STRUCTURED_DATA_TYPE___ALL_CONSTRAINTS;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
@@ -294,8 +404,7 @@ public class StructuredDataTypeImpl extends DataTypeImpl implements StructuredDa
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.STRUCTURED_DATA_TYPE___ALL_MEMBERS:
 				return allMembers();
 			case tdlPackage.STRUCTURED_DATA_TYPE___ALL_CONSTRAINTS:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TargetImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TargetImpl.java
index cc8e475b4e5fdad71a0e5395b8cdf710beaefe8e..e3203ee85ffcd68b9d2b2fdc20fb9425861db70f 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TargetImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TargetImpl.java
@@ -87,12 +87,10 @@ public class TargetImpl extends ElementImpl implements Target
 	@Override
 	public GateReference getTargetGate()
 	{
-		if (targetGate != null && targetGate.eIsProxy())
-		{
+		if (targetGate != null && targetGate.eIsProxy()) {
 			InternalEObject oldTargetGate = (InternalEObject)targetGate;
 			targetGate = (GateReference)eResolveProxy(oldTargetGate);
-			if (targetGate != oldTargetGate)
-			{
+			if (targetGate != oldTargetGate) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.TARGET__TARGET_GATE, oldTargetGate, targetGate));
 			}
@@ -132,8 +130,7 @@ public class TargetImpl extends ElementImpl implements Target
 	@Override
 	public EList<ValueAssignment> getValueAssignment()
 	{
-		if (valueAssignment == null)
-		{
+		if (valueAssignment == null) {
 			valueAssignment = new EObjectContainmentEList<ValueAssignment>(ValueAssignment.class, this, tdlPackage.TARGET__VALUE_ASSIGNMENT);
 		}
 		return valueAssignment;
@@ -147,8 +144,7 @@ public class TargetImpl extends ElementImpl implements Target
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TARGET__VALUE_ASSIGNMENT:
 				return ((InternalEList<?>)getValueAssignment()).basicRemove(otherEnd, msgs);
 		}
@@ -163,8 +159,7 @@ public class TargetImpl extends ElementImpl implements Target
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TARGET__TARGET_GATE:
 				if (resolve) return getTargetGate();
 				return basicGetTargetGate();
@@ -183,8 +178,7 @@ public class TargetImpl extends ElementImpl implements Target
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TARGET__TARGET_GATE:
 				setTargetGate((GateReference)newValue);
 				return;
@@ -204,8 +198,7 @@ public class TargetImpl extends ElementImpl implements Target
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TARGET__TARGET_GATE:
 				setTargetGate((GateReference)null);
 				return;
@@ -224,8 +217,7 @@ public class TargetImpl extends ElementImpl implements Target
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TARGET__TARGET_GATE:
 				return targetGate != null;
 			case tdlPackage.TARGET__VALUE_ASSIGNMENT:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TestConfigurationImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TestConfigurationImpl.java
index 63c04bc7a54bd7271a0fe6dd963a6fde2b8e615f..490a301f73ddcde707da625e846f60585291b472 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TestConfigurationImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TestConfigurationImpl.java
@@ -6,24 +6,33 @@ import java.lang.reflect.InvocationTargetException;
 
 import java.util.Collection;
 
+import java.util.Iterator;
+import java.util.List;
 import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.common.util.BasicEList;
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.library.collection.CollectionIsEmptyOperation;
+import org.eclipse.ocl.pivot.messages.PivotMessages;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
+import org.eclipse.ocl.pivot.values.SetValue;
+import org.eclipse.ocl.pivot.values.SetValue.Accumulator;
 import org.etsi.mts.tdl.ComponentInstance;
 import org.etsi.mts.tdl.ComponentInstanceBinding;
 import org.etsi.mts.tdl.Connection;
+import org.etsi.mts.tdl.GateInstance;
+import org.etsi.mts.tdl.GateReference;
 import org.etsi.mts.tdl.TestConfiguration;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -90,8 +99,7 @@ public class TestConfigurationImpl extends PackageableElementImpl implements Tes
 	@Override
 	public EList<ComponentInstance> getComponentInstance()
 	{
-		if (componentInstance == null)
-		{
+		if (componentInstance == null) {
 			componentInstance = new EObjectContainmentEList<ComponentInstance>(ComponentInstance.class, this, tdlPackage.TEST_CONFIGURATION__COMPONENT_INSTANCE);
 		}
 		return componentInstance;
@@ -105,39 +113,348 @@ public class TestConfigurationImpl extends PackageableElementImpl implements Tes
 	@Override
 	public EList<Connection> getConnection()
 	{
-		if (connection == null)
-		{
+		if (connection == null) {
 			connection = new EObjectContainmentEList<Connection>(Connection.class, this, tdlPackage.TEST_CONFIGURATION__CONNECTION);
 		}
 		return connection;
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #compatibleWith(org.etsi.mts.tdl.TestConfiguration, org.eclipse.emf.common.util.EList) <em>Compatible With</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #compatibleWith(org.etsi.mts.tdl.TestConfiguration, org.eclipse.emf.common.util.EList)
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate COMPATIBLE_WITH_TEST_CONFIGURATION_ELIST__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.TEST_CONFIGURATION___COMPATIBLE_WITH__TESTCONFIGURATION_ELIST).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
 	@Override
-	public boolean compatibleWith(TestConfiguration tc, EList<ComponentInstanceBinding> cb)
+	public boolean compatibleWith(final TestConfiguration tc, final EList<ComponentInstanceBinding> cb)
 	{
-		try
-		{
-			return (Boolean)COMPATIBLE_WITH_TEST_CONFIGURATION_ELIST__EINVOCATION_DELEGATE.dynamicInvoke(this, new BasicEList.UnmodifiableEList<Object>(2, new Object[]{tc, cb}));
+		/**
+		 *
+		 * self.componentInstance->forAll(c |
+		 *   cb->exists(formalComponent = c)) and
+		 * self.connection->forAll(c1 |
+		 *   tc.connection->exists(c2 |
+		 *     c1.endPoint->reject(ep1 |
+		 *       c2.endPoint->exists(ep2 |
+		 *         cb->any(formalComponent = ep1.component).actualComponent = ep2.component and ep1.gate = ep2.gate))
+		 *     ->isEmpty()))
+		 */
+		assert cb != null;
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		/*@Caught*/ Object CAUGHT_forAll;
+		try {
+			final /*@NonInvalid*/ List<ComponentInstance> componentInstance = this.getComponentInstance();
+			final /*@NonInvalid*/ SetValue BOXED_componentInstance = idResolver.createSetOfAll(tdlTables.SET_CLSSid_ComponentInstance, componentInstance);
+			/*@Thrown*/ Object accumulator = ValueUtil.TRUE_VALUE;
+			Iterator<Object> ITERATOR_c = BOXED_componentInstance.iterator();
+			/*@Thrown*/ Boolean forAll;
+			while (true) {
+				if (!ITERATOR_c.hasNext()) {
+					if (accumulator == null) {
+						forAll = null;
+					}
+					else if (accumulator == ValueUtil.TRUE_VALUE) {
+						forAll = ValueUtil.TRUE_VALUE;
+					}
+					else {
+						throw (InvalidValueException)accumulator;
+					}
+					break;
+				}
+				/*@NonInvalid*/ ComponentInstance c = (ComponentInstance)ITERATOR_c.next();
+				/**
+				 * cb->exists(formalComponent = c)
+				 */
+				final /*@NonInvalid*/ SetValue BOXED_cb = idResolver.createSetOfAll(tdlTables.SET_CLSSid_ComponentInstanceBinding, cb);
+				/*@Thrown*/ Object accumulator_0 = ValueUtil.FALSE_VALUE;
+				Iterator<Object> ITERATOR__1 = BOXED_cb.iterator();
+				/*@NonInvalid*/ Boolean exists;
+				while (true) {
+					if (!ITERATOR__1.hasNext()) {
+						if (accumulator_0 == ValueUtil.FALSE_VALUE) {
+							exists = ValueUtil.FALSE_VALUE;
+						}
+						else {
+							throw (InvalidValueException)accumulator_0;
+						}
+						break;
+					}
+					/*@NonInvalid*/ ComponentInstanceBinding _1 = (ComponentInstanceBinding)ITERATOR__1.next();
+					/**
+					 * formalComponent = c
+					 */
+					final /*@NonInvalid*/ ComponentInstance formalComponent = _1.getFormalComponent();
+					final /*@NonInvalid*/ boolean eq = formalComponent.equals(c);
+					//
+					if (eq) {					// Normal successful body evaluation result
+						exists = ValueUtil.TRUE_VALUE;
+						break;														// Stop immediately
+					}
+					else if (!eq) {				// Normal unsuccessful body evaluation result
+						;															// Carry on
+					}
+					else {															// Impossible badly typed result
+						accumulator_0 = new InvalidValueException(PivotMessages.NonBooleanBody, "exists");
+					}
+				}
+				//
+				if (exists == ValueUtil.FALSE_VALUE) {					// Normal unsuccessful body evaluation result
+					forAll = ValueUtil.FALSE_VALUE;
+					break;														// Stop immediately
+				}
+				else if (exists == ValueUtil.TRUE_VALUE) {				// Normal successful body evaluation result
+					;															// Carry on
+				}
+				else if (exists == null) {								// Abnormal null body evaluation result
+					if (accumulator == ValueUtil.TRUE_VALUE) {
+						accumulator = null;										// Cache a null failure
+					}
+				}
+				else {															// Impossible badly typed result
+					accumulator = new InvalidValueException(PivotMessages.NonBooleanBody, "forAll");
+				}
+			}
+			CAUGHT_forAll = forAll;
+		}
+		catch (Exception e) {
+			CAUGHT_forAll = ValueUtil.createInvalidValue(e);
+		}
+		final /*@Thrown*/ Boolean and_0;
+		if (CAUGHT_forAll == ValueUtil.FALSE_VALUE) {
+			and_0 = ValueUtil.FALSE_VALUE;
+		}
+		else {
+			/*@Caught*/ Object CAUGHT_forAll_0;
+			try {
+				final /*@NonInvalid*/ List<Connection> connection = this.getConnection();
+				final /*@NonInvalid*/ SetValue BOXED_connection = idResolver.createSetOfAll(tdlTables.SET_CLSSid_Connection, connection);
+				/*@Thrown*/ Object accumulator_1 = ValueUtil.TRUE_VALUE;
+				Iterator<Object> ITERATOR_c1 = BOXED_connection.iterator();
+				/*@Thrown*/ Boolean forAll_0;
+				while (true) {
+					if (!ITERATOR_c1.hasNext()) {
+						if (accumulator_1 == null) {
+							forAll_0 = null;
+						}
+						else if (accumulator_1 == ValueUtil.TRUE_VALUE) {
+							forAll_0 = ValueUtil.TRUE_VALUE;
+						}
+						else {
+							throw (InvalidValueException)accumulator_1;
+						}
+						break;
+					}
+					/*@NonInvalid*/ Connection c1 = (Connection)ITERATOR_c1.next();
+					/**
+					 *
+					 * tc.connection->exists(c2 |
+					 *   c1.endPoint->reject(ep1 |
+					 *     c2.endPoint->exists(ep2 |
+					 *       cb->any(formalComponent = ep1.component).actualComponent = ep2.component and ep1.gate = ep2.gate))
+					 *   ->isEmpty())
+					 */
+					/*@Caught*/ Object CAUGHT_exists_0;
+					try {
+						final /*@NonInvalid*/ List<Connection> connection_0 = tc.getConnection();
+						final /*@NonInvalid*/ SetValue BOXED_connection_0 = idResolver.createSetOfAll(tdlTables.SET_CLSSid_Connection, connection_0);
+						/*@Thrown*/ Object accumulator_2 = ValueUtil.FALSE_VALUE;
+						Iterator<Object> ITERATOR_c2 = BOXED_connection_0.iterator();
+						/*@Thrown*/ Boolean exists_0;
+						while (true) {
+							if (!ITERATOR_c2.hasNext()) {
+								if (accumulator_2 == ValueUtil.FALSE_VALUE) {
+									exists_0 = ValueUtil.FALSE_VALUE;
+								}
+								else {
+									throw (InvalidValueException)accumulator_2;
+								}
+								break;
+							}
+							/*@NonInvalid*/ Connection c2 = (Connection)ITERATOR_c2.next();
+							/**
+							 *
+							 * c1.endPoint->reject(ep1 |
+							 *   c2.endPoint->exists(ep2 |
+							 *     cb->any(formalComponent = ep1.component).actualComponent = ep2.component and ep1.gate = ep2.gate))
+							 * ->isEmpty()
+							 */
+							/*@Caught*/ Object CAUGHT_isEmpty;
+							try {
+								final /*@NonInvalid*/ List<GateReference> endPoint = c1.getEndPoint();
+								final /*@NonInvalid*/ SetValue BOXED_endPoint = idResolver.createSetOfAll(tdlTables.SET_CLSSid_GateReference, endPoint);
+								/*@Thrown*/ Accumulator accumulator_3 = ValueUtil.createSetAccumulatorValue(tdlTables.SET_CLSSid_GateReference);
+								Iterator<Object> ITERATOR_ep1 = BOXED_endPoint.iterator();
+								/*@Thrown*/ SetValue reject;
+								while (true) {
+									if (!ITERATOR_ep1.hasNext()) {
+										reject = accumulator_3;
+										break;
+									}
+									/*@NonInvalid*/ GateReference ep1 = (GateReference)ITERATOR_ep1.next();
+									/**
+									 *
+									 * c2.endPoint->exists(ep2 |
+									 *   cb->any(formalComponent = ep1.component).actualComponent = ep2.component and ep1.gate = ep2.gate)
+									 */
+									final /*@NonInvalid*/ List<GateReference> endPoint_0 = c2.getEndPoint();
+									final /*@NonInvalid*/ SetValue BOXED_endPoint_0 = idResolver.createSetOfAll(tdlTables.SET_CLSSid_GateReference, endPoint_0);
+									/*@Thrown*/ Object accumulator_4 = ValueUtil.FALSE_VALUE;
+									Iterator<Object> ITERATOR_ep2 = BOXED_endPoint_0.iterator();
+									/*@Thrown*/ Boolean exists_1;
+									while (true) {
+										if (!ITERATOR_ep2.hasNext()) {
+											if (accumulator_4 == null) {
+												exists_1 = null;
+											}
+											else if (accumulator_4 == ValueUtil.FALSE_VALUE) {
+												exists_1 = ValueUtil.FALSE_VALUE;
+											}
+											else {
+												throw (InvalidValueException)accumulator_4;
+											}
+											break;
+										}
+										/*@NonInvalid*/ GateReference ep2 = (GateReference)ITERATOR_ep2.next();
+										/**
+										 *
+										 * cb->any(formalComponent = ep1.component).actualComponent = ep2.component and ep1.gate = ep2.gate
+										 */
+										final /*@NonInvalid*/ SetValue BOXED_cb_0 = idResolver.createSetOfAll(tdlTables.SET_CLSSid_ComponentInstanceBinding, cb);
+										Iterator<Object> ITERATOR__1_0 = BOXED_cb_0.iterator();
+										/*@NonInvalid*/ ComponentInstanceBinding any;
+										while (true) {
+											if (!ITERATOR__1_0.hasNext()) {
+												throw new InvalidValueException("Nothing to return for ''any''");
+											}
+											/*@NonInvalid*/ ComponentInstanceBinding _1_0 = (ComponentInstanceBinding)ITERATOR__1_0.next();
+											/**
+											 * formalComponent = ep1.component
+											 */
+											final /*@NonInvalid*/ ComponentInstance formalComponent_0 = _1_0.getFormalComponent();
+											final /*@NonInvalid*/ ComponentInstance component = ep1.getComponent();
+											final /*@NonInvalid*/ boolean eq_0 = formalComponent_0.equals(component);
+											//
+											if (eq_0) {			// Carry on till something found
+												any = _1_0;
+												break;
+											}
+										}
+										final /*@NonInvalid*/ ComponentInstance actualComponent = any.getActualComponent();
+										final /*@NonInvalid*/ ComponentInstance component_0 = ep2.getComponent();
+										final /*@NonInvalid*/ boolean eq_1 = actualComponent.equals(component_0);
+										final /*@NonInvalid*/ Boolean and;
+										if (!eq_1) {
+											and = ValueUtil.FALSE_VALUE;
+										}
+										else {
+											final /*@NonInvalid*/ GateInstance gate = ep1.getGate();
+											final /*@NonInvalid*/ GateInstance gate_0 = ep2.getGate();
+											final /*@NonInvalid*/ boolean eq_2 = gate.equals(gate_0);
+											if (!eq_2) {
+												and = ValueUtil.FALSE_VALUE;
+											}
+											else {
+												and = ValueUtil.TRUE_VALUE;
+											}
+										}
+										//
+										if (and == ValueUtil.TRUE_VALUE) {					// Normal successful body evaluation result
+											exists_1 = ValueUtil.TRUE_VALUE;
+											break;														// Stop immediately
+										}
+										else if (and == ValueUtil.FALSE_VALUE) {				// Normal unsuccessful body evaluation result
+											;															// Carry on
+										}
+										else if (and == null) {								// Abnormal null body evaluation result
+											if (accumulator_4 == ValueUtil.FALSE_VALUE) {
+												accumulator_4 = null;										// Cache a null failure
+											}
+										}
+										else {															// Impossible badly typed result
+											accumulator_4 = new InvalidValueException(PivotMessages.NonBooleanBody, "exists");
+										}
+									}
+									if (exists_1 == null) {
+										throw new InvalidValueException("Null body for \'Set(T).reject(Set.T[?] | Lambda T() : Boolean[1]) : Set(T)\'");
+									}
+									//
+									if (exists_1 == ValueUtil.FALSE_VALUE) {
+										accumulator_3.add(ep1);
+									}
+								}
+								final /*@Thrown*/ boolean isEmpty = CollectionIsEmptyOperation.INSTANCE.evaluate(reject).booleanValue();
+								CAUGHT_isEmpty = isEmpty;
+							}
+							catch (Exception e) {
+								CAUGHT_isEmpty = ValueUtil.createInvalidValue(e);
+							}
+							//
+							if (CAUGHT_isEmpty == ValueUtil.TRUE_VALUE) {					// Normal successful body evaluation result
+								exists_0 = ValueUtil.TRUE_VALUE;
+								break;														// Stop immediately
+							}
+							else if (CAUGHT_isEmpty == ValueUtil.FALSE_VALUE) {				// Normal unsuccessful body evaluation result
+								;															// Carry on
+							}
+							else if (CAUGHT_isEmpty instanceof InvalidValueException) {		// Abnormal exception evaluation result
+								accumulator_2 = CAUGHT_isEmpty;									// Cache an exception failure
+							}
+							else {															// Impossible badly typed result
+								accumulator_2 = new InvalidValueException(PivotMessages.NonBooleanBody, "exists");
+							}
+						}
+						CAUGHT_exists_0 = exists_0;
+					}
+					catch (Exception e) {
+						CAUGHT_exists_0 = ValueUtil.createInvalidValue(e);
+					}
+					//
+					if (CAUGHT_exists_0 == ValueUtil.FALSE_VALUE) {					// Normal unsuccessful body evaluation result
+						forAll_0 = ValueUtil.FALSE_VALUE;
+						break;														// Stop immediately
+					}
+					else if (CAUGHT_exists_0 == ValueUtil.TRUE_VALUE) {				// Normal successful body evaluation result
+						;															// Carry on
+					}
+					else if (CAUGHT_exists_0 == null) {								// Abnormal null body evaluation result
+						if (accumulator_1 == ValueUtil.TRUE_VALUE) {
+							accumulator_1 = null;										// Cache a null failure
+						}
+					}
+					else if (CAUGHT_exists_0 instanceof InvalidValueException) {		// Abnormal exception evaluation result
+						accumulator_1 = CAUGHT_exists_0;									// Cache an exception failure
+					}
+					else {															// Impossible badly typed result
+						accumulator_1 = new InvalidValueException(PivotMessages.NonBooleanBody, "forAll");
+					}
+				}
+				CAUGHT_forAll_0 = forAll_0;
+			}
+			catch (Exception e) {
+				CAUGHT_forAll_0 = ValueUtil.createInvalidValue(e);
+			}
+			if (CAUGHT_forAll_0 == ValueUtil.FALSE_VALUE) {
+				and_0 = ValueUtil.FALSE_VALUE;
+			}
+			else {
+				if (CAUGHT_forAll instanceof InvalidValueException) {
+					throw (InvalidValueException)CAUGHT_forAll;
+				}
+				if (CAUGHT_forAll_0 instanceof InvalidValueException) {
+					throw (InvalidValueException)CAUGHT_forAll_0;
+				}
+				if ((CAUGHT_forAll == null) || (CAUGHT_forAll_0 == null)) {
+					and_0 = null;
+				}
+				else {
+					and_0 = ValueUtil.TRUE_VALUE;
+				}
+			}
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		if (and_0 == null) {
+			throw new InvalidValueException("Null body for \'tdl::TestConfiguration::compatibleWith(tdl::TestConfiguration[1],Set(tdl::ComponentInstanceBinding)) : Boolean[1]\'");
 		}
+		return and_0;
 	}
 
 	/**
@@ -148,8 +465,7 @@ public class TestConfigurationImpl extends PackageableElementImpl implements Tes
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TEST_CONFIGURATION__COMPONENT_INSTANCE:
 				return ((InternalEList<?>)getComponentInstance()).basicRemove(otherEnd, msgs);
 			case tdlPackage.TEST_CONFIGURATION__CONNECTION:
@@ -166,8 +482,7 @@ public class TestConfigurationImpl extends PackageableElementImpl implements Tes
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TEST_CONFIGURATION__COMPONENT_INSTANCE:
 				return getComponentInstance();
 			case tdlPackage.TEST_CONFIGURATION__CONNECTION:
@@ -185,8 +500,7 @@ public class TestConfigurationImpl extends PackageableElementImpl implements Tes
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TEST_CONFIGURATION__COMPONENT_INSTANCE:
 				getComponentInstance().clear();
 				getComponentInstance().addAll((Collection<? extends ComponentInstance>)newValue);
@@ -207,8 +521,7 @@ public class TestConfigurationImpl extends PackageableElementImpl implements Tes
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TEST_CONFIGURATION__COMPONENT_INSTANCE:
 				getComponentInstance().clear();
 				return;
@@ -227,8 +540,7 @@ public class TestConfigurationImpl extends PackageableElementImpl implements Tes
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TEST_CONFIGURATION__COMPONENT_INSTANCE:
 				return componentInstance != null && !componentInstance.isEmpty();
 			case tdlPackage.TEST_CONFIGURATION__CONNECTION:
@@ -246,8 +558,7 @@ public class TestConfigurationImpl extends PackageableElementImpl implements Tes
 	@SuppressWarnings("unchecked")
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.TEST_CONFIGURATION___COMPATIBLE_WITH__TESTCONFIGURATION_ELIST:
 				return compatibleWith((TestConfiguration)arguments.get(0), (EList<ComponentInstanceBinding>)arguments.get(1));
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TestDescriptionImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TestDescriptionImpl.java
index 1290fc89dfd211c9b9aa114cfd0b47d83a1e3c83..9a7c2a41253e326734513d3a28a71aa54f22041f 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TestDescriptionImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TestDescriptionImpl.java
@@ -133,12 +133,10 @@ public class TestDescriptionImpl extends PackageableElementImpl implements TestD
 	@Override
 	public TestConfiguration getTestConfiguration()
 	{
-		if (testConfiguration != null && testConfiguration.eIsProxy())
-		{
+		if (testConfiguration != null && testConfiguration.eIsProxy()) {
 			InternalEObject oldTestConfiguration = (InternalEObject)testConfiguration;
 			testConfiguration = (TestConfiguration)eResolveProxy(oldTestConfiguration);
-			if (testConfiguration != oldTestConfiguration)
-			{
+			if (testConfiguration != oldTestConfiguration) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.TEST_DESCRIPTION__TEST_CONFIGURATION, oldTestConfiguration, testConfiguration));
 			}
@@ -178,8 +176,7 @@ public class TestDescriptionImpl extends PackageableElementImpl implements TestD
 	@Override
 	public EList<FormalParameter> getFormalParameter()
 	{
-		if (formalParameter == null)
-		{
+		if (formalParameter == null) {
 			formalParameter = new EObjectContainmentEList<FormalParameter>(FormalParameter.class, this, tdlPackage.TEST_DESCRIPTION__FORMAL_PARAMETER);
 		}
 		return formalParameter;
@@ -205,8 +202,7 @@ public class TestDescriptionImpl extends PackageableElementImpl implements TestD
 	{
 		BehaviourDescription oldBehaviourDescription = behaviourDescription;
 		behaviourDescription = newBehaviourDescription;
-		if (eNotificationRequired())
-		{
+		if (eNotificationRequired()) {
 			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, tdlPackage.TEST_DESCRIPTION__BEHAVIOUR_DESCRIPTION, oldBehaviourDescription, newBehaviourDescription);
 			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
@@ -221,8 +217,7 @@ public class TestDescriptionImpl extends PackageableElementImpl implements TestD
 	@Override
 	public void setBehaviourDescription(BehaviourDescription newBehaviourDescription)
 	{
-		if (newBehaviourDescription != behaviourDescription)
-		{
+		if (newBehaviourDescription != behaviourDescription) {
 			NotificationChain msgs = null;
 			if (behaviourDescription != null)
 				msgs = ((InternalEObject)behaviourDescription).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - tdlPackage.TEST_DESCRIPTION__BEHAVIOUR_DESCRIPTION, null, msgs);
@@ -243,8 +238,7 @@ public class TestDescriptionImpl extends PackageableElementImpl implements TestD
 	@Override
 	public EList<TestObjective> getTestObjective()
 	{
-		if (testObjective == null)
-		{
+		if (testObjective == null) {
 			testObjective = new EObjectResolvingEList<TestObjective>(TestObjective.class, this, tdlPackage.TEST_DESCRIPTION__TEST_OBJECTIVE);
 		}
 		return testObjective;
@@ -283,8 +277,7 @@ public class TestDescriptionImpl extends PackageableElementImpl implements TestD
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TEST_DESCRIPTION__FORMAL_PARAMETER:
 				return ((InternalEList<?>)getFormalParameter()).basicRemove(otherEnd, msgs);
 			case tdlPackage.TEST_DESCRIPTION__BEHAVIOUR_DESCRIPTION:
@@ -301,8 +294,7 @@ public class TestDescriptionImpl extends PackageableElementImpl implements TestD
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TEST_DESCRIPTION__TEST_CONFIGURATION:
 				if (resolve) return getTestConfiguration();
 				return basicGetTestConfiguration();
@@ -327,8 +319,7 @@ public class TestDescriptionImpl extends PackageableElementImpl implements TestD
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TEST_DESCRIPTION__TEST_CONFIGURATION:
 				setTestConfiguration((TestConfiguration)newValue);
 				return;
@@ -358,8 +349,7 @@ public class TestDescriptionImpl extends PackageableElementImpl implements TestD
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TEST_DESCRIPTION__TEST_CONFIGURATION:
 				setTestConfiguration((TestConfiguration)null);
 				return;
@@ -387,8 +377,7 @@ public class TestDescriptionImpl extends PackageableElementImpl implements TestD
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TEST_DESCRIPTION__TEST_CONFIGURATION:
 				return testConfiguration != null;
 			case tdlPackage.TEST_DESCRIPTION__FORMAL_PARAMETER:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TestDescriptionReferenceImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TestDescriptionReferenceImpl.java
index df35bddec9b59ad8bbad0445e28af040f1733959..786f093eb1d6120be86f7482e2306fe0b2f383a1 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TestDescriptionReferenceImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TestDescriptionReferenceImpl.java
@@ -6,14 +6,13 @@ import java.lang.reflect.InvocationTargetException;
 
 import java.util.Collection;
 
+import java.util.Iterator;
+import java.util.List;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
@@ -21,14 +20,30 @@ import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
 
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.ids.IdResolver.IdResolverExtension;
+import org.eclipse.ocl.pivot.library.collection.CollectionAsOrderedSetOperation;
+import org.eclipse.ocl.pivot.library.collection.CollectionIsEmptyOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsSetOperation;
+import org.eclipse.ocl.pivot.messages.PivotMessages;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.BagValue;
+import org.eclipse.ocl.pivot.values.BagValue.Accumulator;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
+import org.eclipse.ocl.pivot.values.OrderedSetValue;
+import org.eclipse.ocl.pivot.values.SetValue;
 import org.etsi.mts.tdl.AtomicBehaviour;
 import org.etsi.mts.tdl.Behaviour;
 import org.etsi.mts.tdl.ComponentInstance;
 import org.etsi.mts.tdl.ComponentInstanceBinding;
 import org.etsi.mts.tdl.ParameterBinding;
+import org.etsi.mts.tdl.TestConfiguration;
 import org.etsi.mts.tdl.TestDescription;
 import org.etsi.mts.tdl.TestDescriptionReference;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -106,12 +121,10 @@ public class TestDescriptionReferenceImpl extends AtomicBehaviourImpl implements
 	@Override
 	public TestDescription getTestDescription()
 	{
-		if (testDescription != null && testDescription.eIsProxy())
-		{
+		if (testDescription != null && testDescription.eIsProxy()) {
 			InternalEObject oldTestDescription = (InternalEObject)testDescription;
 			testDescription = (TestDescription)eResolveProxy(oldTestDescription);
-			if (testDescription != oldTestDescription)
-			{
+			if (testDescription != oldTestDescription) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.TEST_DESCRIPTION_REFERENCE__TEST_DESCRIPTION, oldTestDescription, testDescription));
 			}
@@ -151,8 +164,7 @@ public class TestDescriptionReferenceImpl extends AtomicBehaviourImpl implements
 	@Override
 	public EList<ComponentInstanceBinding> getComponentInstanceBinding()
 	{
-		if (componentInstanceBinding == null)
-		{
+		if (componentInstanceBinding == null) {
 			componentInstanceBinding = new EObjectContainmentEList<ComponentInstanceBinding>(ComponentInstanceBinding.class, this, tdlPackage.TEST_DESCRIPTION_REFERENCE__COMPONENT_INSTANCE_BINDING);
 		}
 		return componentInstanceBinding;
@@ -166,23 +178,12 @@ public class TestDescriptionReferenceImpl extends AtomicBehaviourImpl implements
 	@Override
 	public EList<ParameterBinding> getArgument()
 	{
-		if (argument == null)
-		{
+		if (argument == null) {
 			argument = new EObjectContainmentEList<ParameterBinding>(ParameterBinding.class, this, tdlPackage.TEST_DESCRIPTION_REFERENCE__ARGUMENT);
 		}
 		return argument;
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #getParticipatingComponents() <em>Get Participating Components</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getParticipatingComponents()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate GET_PARTICIPATING_COMPONENTS__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.TEST_DESCRIPTION_REFERENCE___GET_PARTICIPATING_COMPONENTS).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -192,14 +193,117 @@ public class TestDescriptionReferenceImpl extends AtomicBehaviourImpl implements
 	@Override
 	public EList<ComponentInstance> getParticipatingComponents()
 	{
-		try
-		{
-			return (EList<ComponentInstance>)GET_PARTICIPATING_COMPONENTS__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if
+		 *   self.getParentTestDescription()
+		 *   ->exists(td | td.isLocallyOrdered) and
+		 *   not self.componentInstanceBinding->isEmpty()
+		 * then self.componentInstanceBinding.actualComponent->asOrderedSet()
+		 * else
+		 *   self.getParentTestDescription()
+		 *   .testConfiguration.componentInstance->asOrderedSet()
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ List<ComponentInstanceBinding> componentInstanceBinding_0 = this.getComponentInstanceBinding();
+		final /*@NonInvalid*/ TestDescription getParentTestDescription_0 = this.getParentTestDescription();
+		final /*@NonInvalid*/ SetValue BOXED_componentInstanceBinding_0 = idResolver.createSetOfAll(tdlTables.SET_CLSSid_ComponentInstanceBinding, componentInstanceBinding_0);
+		final /*@NonInvalid*/ SetValue oclAsSet = OclAnyOclAsSetOperation.INSTANCE.evaluate(executor, tdlTables.SET_CLSSid_TestDescription, getParentTestDescription_0);
+		/*@Thrown*/ Object accumulator = ValueUtil.FALSE_VALUE;
+		Iterator<Object> ITERATOR_td = oclAsSet.iterator();
+		/*@NonInvalid*/ Boolean exists;
+		while (true) {
+			if (!ITERATOR_td.hasNext()) {
+				if (accumulator == ValueUtil.FALSE_VALUE) {
+					exists = ValueUtil.FALSE_VALUE;
+				}
+				else {
+					throw (InvalidValueException)accumulator;
+				}
+				break;
+			}
+			/*@NonInvalid*/ TestDescription td = (TestDescription)ITERATOR_td.next();
+			/**
+			 * td.isLocallyOrdered
+			 */
+			final /*@NonInvalid*/ boolean isLocallyOrdered = td.isIsLocallyOrdered();
+			//
+			if (isLocallyOrdered) {					// Normal successful body evaluation result
+				exists = ValueUtil.TRUE_VALUE;
+				break;														// Stop immediately
+			}
+			else if (!isLocallyOrdered) {				// Normal unsuccessful body evaluation result
+				;															// Carry on
+			}
+			else {															// Impossible badly typed result
+				accumulator = new InvalidValueException(PivotMessages.NonBooleanBody, "exists");
+			}
+		}
+		final /*@Thrown*/ Boolean and;
+		if (exists == ValueUtil.FALSE_VALUE) {
+			and = ValueUtil.FALSE_VALUE;
+		}
+		else {
+			final /*@NonInvalid*/ boolean isEmpty = CollectionIsEmptyOperation.INSTANCE.evaluate(BOXED_componentInstanceBinding_0).booleanValue();
+			final /*@NonInvalid*/ Boolean not;
+			if (!isEmpty) {
+				not = ValueUtil.TRUE_VALUE;
+			}
+			else {
+				if (isEmpty) {
+					not = ValueUtil.FALSE_VALUE;
+				}
+				else {
+					not = null;
+				}
+			}
+			if (not == ValueUtil.FALSE_VALUE) {
+				and = ValueUtil.FALSE_VALUE;
+			}
+			else {
+				if ((exists == null) || (not == null)) {
+					and = null;
+				}
+				else {
+					and = ValueUtil.TRUE_VALUE;
+				}
+			}
+		}
+		if (and == null) {
+			throw new InvalidValueException("Null if condition");
+		}
+		/*@NonInvalid*/ OrderedSetValue local_0;
+		if (and) {
+			/*@Thrown*/ Accumulator accumulator_0 = ValueUtil.createBagAccumulatorValue(tdlTables.BAG_CLSSid_ComponentInstance);
+			Iterator<Object> ITERATOR__1 = BOXED_componentInstanceBinding_0.iterator();
+			/*@NonInvalid*/ BagValue collect;
+			while (true) {
+				if (!ITERATOR__1.hasNext()) {
+					collect = accumulator_0;
+					break;
+				}
+				/*@NonInvalid*/ ComponentInstanceBinding _1 = (ComponentInstanceBinding)ITERATOR__1.next();
+				/**
+				 * actualComponent
+				 */
+				final /*@NonInvalid*/ ComponentInstance actualComponent = _1.getActualComponent();
+				//
+				accumulator_0.add(actualComponent);
+			}
+			final /*@NonInvalid*/ OrderedSetValue asOrderedSet = CollectionAsOrderedSetOperation.INSTANCE.evaluate(collect);
+			local_0 = asOrderedSet;
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		else {
+			final /*@NonInvalid*/ TestConfiguration testConfiguration = getParentTestDescription_0.getTestConfiguration();
+			final /*@NonInvalid*/ List<ComponentInstance> componentInstance = testConfiguration.getComponentInstance();
+			final /*@NonInvalid*/ SetValue BOXED_componentInstance = idResolver.createSetOfAll(tdlTables.SET_CLSSid_ComponentInstance, componentInstance);
+			final /*@NonInvalid*/ OrderedSetValue asOrderedSet_0 = CollectionAsOrderedSetOperation.INSTANCE.evaluate(BOXED_componentInstance);
+			local_0 = asOrderedSet_0;
 		}
+		final /*@NonInvalid*/ List<ComponentInstance> ECORE_local_0 = ((IdResolverExtension)idResolver).ecoreValueOfAll(ComponentInstance.class, local_0);
+		return (EList<ComponentInstance>)ECORE_local_0;
 	}
 
 	/**
@@ -210,8 +314,7 @@ public class TestDescriptionReferenceImpl extends AtomicBehaviourImpl implements
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TEST_DESCRIPTION_REFERENCE__COMPONENT_INSTANCE_BINDING:
 				return ((InternalEList<?>)getComponentInstanceBinding()).basicRemove(otherEnd, msgs);
 			case tdlPackage.TEST_DESCRIPTION_REFERENCE__ARGUMENT:
@@ -228,8 +331,7 @@ public class TestDescriptionReferenceImpl extends AtomicBehaviourImpl implements
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TEST_DESCRIPTION_REFERENCE__TEST_DESCRIPTION:
 				if (resolve) return getTestDescription();
 				return basicGetTestDescription();
@@ -250,8 +352,7 @@ public class TestDescriptionReferenceImpl extends AtomicBehaviourImpl implements
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TEST_DESCRIPTION_REFERENCE__TEST_DESCRIPTION:
 				setTestDescription((TestDescription)newValue);
 				return;
@@ -275,8 +376,7 @@ public class TestDescriptionReferenceImpl extends AtomicBehaviourImpl implements
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TEST_DESCRIPTION_REFERENCE__TEST_DESCRIPTION:
 				setTestDescription((TestDescription)null);
 				return;
@@ -298,8 +398,7 @@ public class TestDescriptionReferenceImpl extends AtomicBehaviourImpl implements
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TEST_DESCRIPTION_REFERENCE__TEST_DESCRIPTION:
 				return testDescription != null;
 			case tdlPackage.TEST_DESCRIPTION_REFERENCE__COMPONENT_INSTANCE_BINDING:
@@ -318,18 +417,14 @@ public class TestDescriptionReferenceImpl extends AtomicBehaviourImpl implements
 	@Override
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass)
 	{
-		if (baseClass == Behaviour.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == Behaviour.class) {
+			switch (baseOperationID) {
 				case tdlPackage.BEHAVIOUR___GET_PARTICIPATING_COMPONENTS: return tdlPackage.TEST_DESCRIPTION_REFERENCE___GET_PARTICIPATING_COMPONENTS;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
 		}
-		if (baseClass == AtomicBehaviour.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == AtomicBehaviour.class) {
+			switch (baseOperationID) {
 				case tdlPackage.ATOMIC_BEHAVIOUR___GET_PARTICIPATING_COMPONENTS: return tdlPackage.TEST_DESCRIPTION_REFERENCE___GET_PARTICIPATING_COMPONENTS;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
@@ -345,8 +440,7 @@ public class TestDescriptionReferenceImpl extends AtomicBehaviourImpl implements
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.TEST_DESCRIPTION_REFERENCE___GET_PARTICIPATING_COMPONENTS:
 				return getParticipatingComponents();
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TestObjectiveImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TestObjectiveImpl.java
index 39065b539eec6ac1b8fe70cd3c14e862cff604f1..bbf2a029a07b74849c6243e6a4ab6a00fc489e03 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TestObjectiveImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TestObjectiveImpl.java
@@ -92,8 +92,7 @@ public class TestObjectiveImpl extends PackageableElementImpl implements TestObj
 	@Override
 	public EList<String> getObjectiveURI()
 	{
-		if (objectiveURI == null)
-		{
+		if (objectiveURI == null) {
 			objectiveURI = new EDataTypeEList<String>(String.class, this, tdlPackage.TEST_OBJECTIVE__OBJECTIVE_URI);
 		}
 		return objectiveURI;
@@ -132,8 +131,7 @@ public class TestObjectiveImpl extends PackageableElementImpl implements TestObj
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TEST_OBJECTIVE__OBJECTIVE_URI:
 				return getObjectiveURI();
 			case tdlPackage.TEST_OBJECTIVE__DESCRIPTION:
@@ -151,8 +149,7 @@ public class TestObjectiveImpl extends PackageableElementImpl implements TestObj
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TEST_OBJECTIVE__OBJECTIVE_URI:
 				getObjectiveURI().clear();
 				getObjectiveURI().addAll((Collection<? extends String>)newValue);
@@ -172,8 +169,7 @@ public class TestObjectiveImpl extends PackageableElementImpl implements TestObj
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TEST_OBJECTIVE__OBJECTIVE_URI:
 				getObjectiveURI().clear();
 				return;
@@ -192,8 +188,7 @@ public class TestObjectiveImpl extends PackageableElementImpl implements TestObj
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TEST_OBJECTIVE__OBJECTIVE_URI:
 				return objectiveURI != null && !objectiveURI.isEmpty();
 			case tdlPackage.TEST_OBJECTIVE__DESCRIPTION:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TimeConstraintImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TimeConstraintImpl.java
index fd080e5ebf5c8c50d57ec4a0848d1dc276b9a8f0..1bced9fa4c4aec575f6ec82d76aee7a85bcb77bc 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TimeConstraintImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TimeConstraintImpl.java
@@ -80,8 +80,7 @@ public class TimeConstraintImpl extends ElementImpl implements TimeConstraint
 	{
 		DataUse oldTimeConstraintExpression = timeConstraintExpression;
 		timeConstraintExpression = newTimeConstraintExpression;
-		if (eNotificationRequired())
-		{
+		if (eNotificationRequired()) {
 			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, tdlPackage.TIME_CONSTRAINT__TIME_CONSTRAINT_EXPRESSION, oldTimeConstraintExpression, newTimeConstraintExpression);
 			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
@@ -96,8 +95,7 @@ public class TimeConstraintImpl extends ElementImpl implements TimeConstraint
 	@Override
 	public void setTimeConstraintExpression(DataUse newTimeConstraintExpression)
 	{
-		if (newTimeConstraintExpression != timeConstraintExpression)
-		{
+		if (newTimeConstraintExpression != timeConstraintExpression) {
 			NotificationChain msgs = null;
 			if (timeConstraintExpression != null)
 				msgs = ((InternalEObject)timeConstraintExpression).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - tdlPackage.TIME_CONSTRAINT__TIME_CONSTRAINT_EXPRESSION, null, msgs);
@@ -118,8 +116,7 @@ public class TimeConstraintImpl extends ElementImpl implements TimeConstraint
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TIME_CONSTRAINT__TIME_CONSTRAINT_EXPRESSION:
 				return basicSetTimeConstraintExpression(null, msgs);
 		}
@@ -134,8 +131,7 @@ public class TimeConstraintImpl extends ElementImpl implements TimeConstraint
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TIME_CONSTRAINT__TIME_CONSTRAINT_EXPRESSION:
 				return getTimeConstraintExpression();
 		}
@@ -150,8 +146,7 @@ public class TimeConstraintImpl extends ElementImpl implements TimeConstraint
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TIME_CONSTRAINT__TIME_CONSTRAINT_EXPRESSION:
 				setTimeConstraintExpression((DataUse)newValue);
 				return;
@@ -167,8 +162,7 @@ public class TimeConstraintImpl extends ElementImpl implements TimeConstraint
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TIME_CONSTRAINT__TIME_CONSTRAINT_EXPRESSION:
 				setTimeConstraintExpression((DataUse)null);
 				return;
@@ -184,8 +178,7 @@ public class TimeConstraintImpl extends ElementImpl implements TimeConstraint
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TIME_CONSTRAINT__TIME_CONSTRAINT_EXPRESSION:
 				return timeConstraintExpression != null;
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TimeLabelUseImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TimeLabelUseImpl.java
index 0645626246faa71e855ddf6ed62632d390e840f2..9b439bd0689e0e43f8a7e1fce125b8856b87cf06 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TimeLabelUseImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TimeLabelUseImpl.java
@@ -7,20 +7,27 @@ import java.lang.reflect.InvocationTargetException;
 import org.eclipse.emf.common.notify.Notification;
 
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.library.classifier.ClassifierAllInstancesOperation;
+import org.eclipse.ocl.pivot.library.collection.CollectionAsOrderedSetOperation;
+import org.eclipse.ocl.pivot.library.collection.OrderedCollectionFirstOperation;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.values.OrderedSetValue;
+import org.eclipse.ocl.pivot.values.SetValue;
 import org.etsi.mts.tdl.DataType;
 import org.etsi.mts.tdl.DataUse;
+import org.etsi.mts.tdl.Time;
 import org.etsi.mts.tdl.TimeLabel;
 import org.etsi.mts.tdl.TimeLabelUse;
 import org.etsi.mts.tdl.TimeLabelUseKind;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -97,12 +104,10 @@ public class TimeLabelUseImpl extends DynamicDataUseImpl implements TimeLabelUse
 	@Override
 	public TimeLabel getTimeLabel()
 	{
-		if (timeLabel != null && timeLabel.eIsProxy())
-		{
+		if (timeLabel != null && timeLabel.eIsProxy()) {
 			InternalEObject oldTimeLabel = (InternalEObject)timeLabel;
 			timeLabel = (TimeLabel)eResolveProxy(oldTimeLabel);
-			if (timeLabel != oldTimeLabel)
-			{
+			if (timeLabel != oldTimeLabel) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.TIME_LABEL_USE__TIME_LABEL, oldTimeLabel, timeLabel));
 			}
@@ -159,16 +164,6 @@ public class TimeLabelUseImpl extends DynamicDataUseImpl implements TimeLabelUse
 			eNotify(new ENotificationImpl(this, Notification.SET, tdlPackage.TIME_LABEL_USE__KIND, oldKind, kind));
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #resolveDataType() <em>Resolve Data Type</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #resolveDataType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate RESOLVE_DATA_TYPE__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.TIME_LABEL_USE___RESOLVE_DATA_TYPE).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -177,14 +172,16 @@ public class TimeLabelUseImpl extends DynamicDataUseImpl implements TimeLabelUse
 	@Override
 	public DataType resolveDataType()
 	{
-		try
-		{
-			return (DataType)RESOLVE_DATA_TYPE__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
-		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
-		}
+		/**
+		 * Time.allInstances()->asOrderedSet()->first()
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_Time_0 = idResolver.getClass(tdlTables.CLSSid_Time, null);
+		final /*@NonInvalid*/ SetValue allInstances = ClassifierAllInstancesOperation.INSTANCE.evaluate(executor, tdlTables.SET_CLSSid_Time, TYP_tdl_c_c_Time_0);
+		final /*@NonInvalid*/ OrderedSetValue asOrderedSet = CollectionAsOrderedSetOperation.INSTANCE.evaluate(allInstances);
+		final /*@Thrown*/ Time first = (Time)OrderedCollectionFirstOperation.INSTANCE.evaluate(asOrderedSet);
+		return first;
 	}
 
 	/**
@@ -195,8 +192,7 @@ public class TimeLabelUseImpl extends DynamicDataUseImpl implements TimeLabelUse
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TIME_LABEL_USE__TIME_LABEL:
 				if (resolve) return getTimeLabel();
 				return basicGetTimeLabel();
@@ -214,8 +210,7 @@ public class TimeLabelUseImpl extends DynamicDataUseImpl implements TimeLabelUse
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TIME_LABEL_USE__TIME_LABEL:
 				setTimeLabel((TimeLabel)newValue);
 				return;
@@ -234,8 +229,7 @@ public class TimeLabelUseImpl extends DynamicDataUseImpl implements TimeLabelUse
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TIME_LABEL_USE__TIME_LABEL:
 				setTimeLabel((TimeLabel)null);
 				return;
@@ -254,8 +248,7 @@ public class TimeLabelUseImpl extends DynamicDataUseImpl implements TimeLabelUse
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TIME_LABEL_USE__TIME_LABEL:
 				return timeLabel != null;
 			case tdlPackage.TIME_LABEL_USE__KIND:
@@ -272,10 +265,8 @@ public class TimeLabelUseImpl extends DynamicDataUseImpl implements TimeLabelUse
 	@Override
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass)
 	{
-		if (baseClass == DataUse.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == DataUse.class) {
+			switch (baseOperationID) {
 				case tdlPackage.DATA_USE___RESOLVE_DATA_TYPE: return tdlPackage.TIME_LABEL_USE___RESOLVE_DATA_TYPE;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
@@ -291,8 +282,7 @@ public class TimeLabelUseImpl extends DynamicDataUseImpl implements TimeLabelUse
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.TIME_LABEL_USE___RESOLVE_DATA_TYPE:
 				return resolveDataType();
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TimeOperationImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TimeOperationImpl.java
index 463b226149ea17bb428bfcad20851f1b0603be22..4270058bf20bf85af2a04b298051c8177df47652 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TimeOperationImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TimeOperationImpl.java
@@ -4,24 +4,41 @@ package org.etsi.mts.tdl.impl;
 
 import java.lang.reflect.InvocationTargetException;
 
+import java.util.Iterator;
+import java.util.List;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.ids.IdResolver.IdResolverExtension;
+import org.eclipse.ocl.pivot.library.collection.CollectionAsOrderedSetOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsSetOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsTypeOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclIsKindOfOperation;
+import org.eclipse.ocl.pivot.messages.PivotMessages;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
+import org.eclipse.ocl.pivot.values.OrderedSetValue;
+import org.eclipse.ocl.pivot.values.SetValue;
 import org.etsi.mts.tdl.AtomicBehaviour;
 import org.etsi.mts.tdl.Behaviour;
+import org.etsi.mts.tdl.Block;
 import org.etsi.mts.tdl.ComponentInstance;
 import org.etsi.mts.tdl.DataUse;
+import org.etsi.mts.tdl.Element;
+import org.etsi.mts.tdl.TestConfiguration;
+import org.etsi.mts.tdl.TestDescription;
 import org.etsi.mts.tdl.TimeOperation;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -88,12 +105,10 @@ public abstract class TimeOperationImpl extends AtomicBehaviourImpl implements T
 	@Override
 	public ComponentInstance getComponentInstance()
 	{
-		if (componentInstance != null && componentInstance.eIsProxy())
-		{
+		if (componentInstance != null && componentInstance.eIsProxy()) {
 			InternalEObject oldComponentInstance = (InternalEObject)componentInstance;
 			componentInstance = (ComponentInstance)eResolveProxy(oldComponentInstance);
-			if (componentInstance != oldComponentInstance)
-			{
+			if (componentInstance != oldComponentInstance) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.TIME_OPERATION__COMPONENT_INSTANCE, oldComponentInstance, componentInstance));
 			}
@@ -145,8 +160,7 @@ public abstract class TimeOperationImpl extends AtomicBehaviourImpl implements T
 	{
 		DataUse oldPeriod = period;
 		period = newPeriod;
-		if (eNotificationRequired())
-		{
+		if (eNotificationRequired()) {
 			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, tdlPackage.TIME_OPERATION__PERIOD, oldPeriod, newPeriod);
 			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
@@ -161,8 +175,7 @@ public abstract class TimeOperationImpl extends AtomicBehaviourImpl implements T
 	@Override
 	public void setPeriod(DataUse newPeriod)
 	{
-		if (newPeriod != period)
-		{
+		if (newPeriod != period) {
 			NotificationChain msgs = null;
 			if (period != null)
 				msgs = ((InternalEObject)period).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - tdlPackage.TIME_OPERATION__PERIOD, null, msgs);
@@ -175,16 +188,6 @@ public abstract class TimeOperationImpl extends AtomicBehaviourImpl implements T
 			eNotify(new ENotificationImpl(this, Notification.SET, tdlPackage.TIME_OPERATION__PERIOD, newPeriod, newPeriod));
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #getParticipatingComponents() <em>Get Participating Components</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getParticipatingComponents()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate GET_PARTICIPATING_COMPONENTS__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.TIME_OPERATION___GET_PARTICIPATING_COMPONENTS).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -194,14 +197,126 @@ public abstract class TimeOperationImpl extends AtomicBehaviourImpl implements T
 	@Override
 	public EList<ComponentInstance> getParticipatingComponents()
 	{
-		try
-		{
-			return (EList<ComponentInstance>)GET_PARTICIPATING_COMPONENTS__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if
+		 *   self.getParentTestDescription()
+		 *   ->exists(td | td.isLocallyOrdered) and
+		 *   self.container()
+		 *   .oclIsKindOf(Block)
+		 * then
+		 *   if not self.componentInstance.oclIsUndefined()
+		 *   then OrderedSet{self.componentInstance}
+		 *   else
+		 *     self.container()
+		 *     .oclAsType(Block)
+		 *     .getParticipatingComponentsExcluding(self)
+		 *     ->asOrderedSet()
+		 *   endif
+		 * else
+		 *   self.getParentTestDescription()
+		 *   .testConfiguration.componentInstance->asOrderedSet()
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ org.eclipse.ocl.pivot.Class TYP_tdl_c_c_Block_0 = idResolver.getClass(tdlTables.CLSSid_Block, null);
+		final /*@NonInvalid*/ Element container = this.container();
+		final /*@NonInvalid*/ TestDescription getParentTestDescription_0 = this.getParentTestDescription();
+		final /*@NonInvalid*/ SetValue oclAsSet = OclAnyOclAsSetOperation.INSTANCE.evaluate(executor, tdlTables.SET_CLSSid_TestDescription, getParentTestDescription_0);
+		/*@Thrown*/ Object accumulator = ValueUtil.FALSE_VALUE;
+		Iterator<Object> ITERATOR_td = oclAsSet.iterator();
+		/*@NonInvalid*/ Boolean exists;
+		while (true) {
+			if (!ITERATOR_td.hasNext()) {
+				if (accumulator == ValueUtil.FALSE_VALUE) {
+					exists = ValueUtil.FALSE_VALUE;
+				}
+				else {
+					throw (InvalidValueException)accumulator;
+				}
+				break;
+			}
+			/*@NonInvalid*/ TestDescription td = (TestDescription)ITERATOR_td.next();
+			/**
+			 * td.isLocallyOrdered
+			 */
+			final /*@NonInvalid*/ boolean isLocallyOrdered = td.isIsLocallyOrdered();
+			//
+			if (isLocallyOrdered) {					// Normal successful body evaluation result
+				exists = ValueUtil.TRUE_VALUE;
+				break;														// Stop immediately
+			}
+			else if (!isLocallyOrdered) {				// Normal unsuccessful body evaluation result
+				;															// Carry on
+			}
+			else {															// Impossible badly typed result
+				accumulator = new InvalidValueException(PivotMessages.NonBooleanBody, "exists");
+			}
+		}
+		final /*@Thrown*/ Boolean and;
+		if (exists == ValueUtil.FALSE_VALUE) {
+			and = ValueUtil.FALSE_VALUE;
+		}
+		else {
+			final /*@NonInvalid*/ boolean oclIsKindOf = OclAnyOclIsKindOfOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_Block_0).booleanValue();
+			if (!oclIsKindOf) {
+				and = ValueUtil.FALSE_VALUE;
+			}
+			else {
+				if (exists == null) {
+					and = null;
+				}
+				else {
+					and = ValueUtil.TRUE_VALUE;
+				}
+			}
+		}
+		if (and == null) {
+			throw new InvalidValueException("Null if condition");
+		}
+		/*@Thrown*/ OrderedSetValue local_1;
+		if (and) {
+			final /*@NonInvalid*/ ComponentInstance componentInstance_0 = this.getComponentInstance();
+			final /*@NonInvalid*/ boolean oclIsUndefined = componentInstance_0 == null;
+			final /*@NonInvalid*/ Boolean not;
+			if (!oclIsUndefined) {
+				not = ValueUtil.TRUE_VALUE;
+			}
+			else {
+				if (oclIsUndefined) {
+					not = ValueUtil.FALSE_VALUE;
+				}
+				else {
+					not = null;
+				}
+			}
+			if (not == null) {
+				throw new InvalidValueException("Null if condition");
+			}
+			/*@Thrown*/ OrderedSetValue local_0;
+			if (not) {
+				final /*@NonInvalid*/ OrderedSetValue OrderedSet = ValueUtil.createOrderedSetOfEach(tdlTables.ORD_CLSSid_ComponentInstance, componentInstance_0);
+				local_0 = OrderedSet;
+			}
+			else {
+				final /*@Thrown*/ Block oclAsType = (Block)OclAnyOclAsTypeOperation.INSTANCE.evaluate(executor, container, TYP_tdl_c_c_Block_0);
+				final /*@Thrown*/ List<ComponentInstance> getParticipatingComponentsExcluding = oclAsType.getParticipatingComponentsExcluding(this);
+				final /*@Thrown*/ OrderedSetValue BOXED_getParticipatingComponentsExcluding = idResolver.createOrderedSetOfAll(tdlTables.ORD_CLSSid_ComponentInstance, getParticipatingComponentsExcluding);
+				final /*@Thrown*/ OrderedSetValue asOrderedSet = CollectionAsOrderedSetOperation.INSTANCE.evaluate(BOXED_getParticipatingComponentsExcluding);
+				local_0 = asOrderedSet;
+			}
+			local_1 = local_0;
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		else {
+			final /*@NonInvalid*/ TestConfiguration testConfiguration = getParentTestDescription_0.getTestConfiguration();
+			final /*@NonInvalid*/ List<ComponentInstance> componentInstance_1 = testConfiguration.getComponentInstance();
+			final /*@NonInvalid*/ SetValue BOXED_componentInstance_1 = idResolver.createSetOfAll(tdlTables.SET_CLSSid_ComponentInstance, componentInstance_1);
+			final /*@NonInvalid*/ OrderedSetValue asOrderedSet_0 = CollectionAsOrderedSetOperation.INSTANCE.evaluate(BOXED_componentInstance_1);
+			local_1 = asOrderedSet_0;
 		}
+		final /*@Thrown*/ List<ComponentInstance> ECORE_local_1 = ((IdResolverExtension)idResolver).ecoreValueOfAll(ComponentInstance.class, local_1);
+		return (EList<ComponentInstance>)ECORE_local_1;
 	}
 
 	/**
@@ -212,8 +327,7 @@ public abstract class TimeOperationImpl extends AtomicBehaviourImpl implements T
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TIME_OPERATION__PERIOD:
 				return basicSetPeriod(null, msgs);
 		}
@@ -228,8 +342,7 @@ public abstract class TimeOperationImpl extends AtomicBehaviourImpl implements T
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TIME_OPERATION__COMPONENT_INSTANCE:
 				if (resolve) return getComponentInstance();
 				return basicGetComponentInstance();
@@ -247,8 +360,7 @@ public abstract class TimeOperationImpl extends AtomicBehaviourImpl implements T
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TIME_OPERATION__COMPONENT_INSTANCE:
 				setComponentInstance((ComponentInstance)newValue);
 				return;
@@ -267,8 +379,7 @@ public abstract class TimeOperationImpl extends AtomicBehaviourImpl implements T
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TIME_OPERATION__COMPONENT_INSTANCE:
 				setComponentInstance((ComponentInstance)null);
 				return;
@@ -287,8 +398,7 @@ public abstract class TimeOperationImpl extends AtomicBehaviourImpl implements T
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TIME_OPERATION__COMPONENT_INSTANCE:
 				return componentInstance != null;
 			case tdlPackage.TIME_OPERATION__PERIOD:
@@ -305,18 +415,14 @@ public abstract class TimeOperationImpl extends AtomicBehaviourImpl implements T
 	@Override
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass)
 	{
-		if (baseClass == Behaviour.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == Behaviour.class) {
+			switch (baseOperationID) {
 				case tdlPackage.BEHAVIOUR___GET_PARTICIPATING_COMPONENTS: return tdlPackage.TIME_OPERATION___GET_PARTICIPATING_COMPONENTS;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
 		}
-		if (baseClass == AtomicBehaviour.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == AtomicBehaviour.class) {
+			switch (baseOperationID) {
 				case tdlPackage.ATOMIC_BEHAVIOUR___GET_PARTICIPATING_COMPONENTS: return tdlPackage.TIME_OPERATION___GET_PARTICIPATING_COMPONENTS;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
@@ -332,8 +438,7 @@ public abstract class TimeOperationImpl extends AtomicBehaviourImpl implements T
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.TIME_OPERATION___GET_PARTICIPATING_COMPONENTS:
 				return getParticipatingComponents();
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TimerOperationImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TimerOperationImpl.java
index 5a7fc4020c4781dcb0f97e662aa4cb76123a9eb9..1d2cc4a6f1b1750eb414160b610961a2bd008efb 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TimerOperationImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TimerOperationImpl.java
@@ -4,23 +4,36 @@ package org.etsi.mts.tdl.impl;
 
 import java.lang.reflect.InvocationTargetException;
 
+import java.util.Iterator;
+import java.util.List;
 import org.eclipse.emf.common.notify.Notification;
 
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
+import org.eclipse.ocl.pivot.evaluation.Executor;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.ids.IdResolver.IdResolverExtension;
+import org.eclipse.ocl.pivot.library.collection.CollectionAsOrderedSetOperation;
+import org.eclipse.ocl.pivot.library.oclany.OclAnyOclAsSetOperation;
+import org.eclipse.ocl.pivot.messages.PivotMessages;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.pivot.utilities.ValueUtil;
+import org.eclipse.ocl.pivot.values.InvalidValueException;
+import org.eclipse.ocl.pivot.values.OrderedSetValue;
+import org.eclipse.ocl.pivot.values.SetValue;
 import org.etsi.mts.tdl.AtomicBehaviour;
 import org.etsi.mts.tdl.Behaviour;
 import org.etsi.mts.tdl.ComponentInstance;
+import org.etsi.mts.tdl.TestConfiguration;
+import org.etsi.mts.tdl.TestDescription;
 import org.etsi.mts.tdl.Timer;
 import org.etsi.mts.tdl.TimerOperation;
 import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.tdlTables;
 
 /**
  * <!-- begin-user-doc -->
@@ -87,12 +100,10 @@ public abstract class TimerOperationImpl extends AtomicBehaviourImpl implements
 	@Override
 	public Timer getTimer()
 	{
-		if (timer != null && timer.eIsProxy())
-		{
+		if (timer != null && timer.eIsProxy()) {
 			InternalEObject oldTimer = (InternalEObject)timer;
 			timer = (Timer)eResolveProxy(oldTimer);
-			if (timer != oldTimer)
-			{
+			if (timer != oldTimer) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.TIMER_OPERATION__TIMER, oldTimer, timer));
 			}
@@ -132,12 +143,10 @@ public abstract class TimerOperationImpl extends AtomicBehaviourImpl implements
 	@Override
 	public ComponentInstance getComponentInstance()
 	{
-		if (componentInstance != null && componentInstance.eIsProxy())
-		{
+		if (componentInstance != null && componentInstance.eIsProxy()) {
 			InternalEObject oldComponentInstance = (InternalEObject)componentInstance;
 			componentInstance = (ComponentInstance)eResolveProxy(oldComponentInstance);
-			if (componentInstance != oldComponentInstance)
-			{
+			if (componentInstance != oldComponentInstance) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.TIMER_OPERATION__COMPONENT_INSTANCE, oldComponentInstance, componentInstance));
 			}
@@ -169,16 +178,6 @@ public abstract class TimerOperationImpl extends AtomicBehaviourImpl implements
 			eNotify(new ENotificationImpl(this, Notification.SET, tdlPackage.TIMER_OPERATION__COMPONENT_INSTANCE, oldComponentInstance, componentInstance));
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #getParticipatingComponents() <em>Get Participating Components</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getParticipatingComponents()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate GET_PARTICIPATING_COMPONENTS__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.TIMER_OPERATION___GET_PARTICIPATING_COMPONENTS).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -188,14 +187,69 @@ public abstract class TimerOperationImpl extends AtomicBehaviourImpl implements
 	@Override
 	public EList<ComponentInstance> getParticipatingComponents()
 	{
-		try
-		{
-			return (EList<ComponentInstance>)GET_PARTICIPATING_COMPONENTS__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
+		/**
+		 *
+		 * if
+		 *   self.getParentTestDescription()
+		 *   ->exists(td | td.isLocallyOrdered)
+		 * then OrderedSet{self.componentInstance}
+		 * else
+		 *   self.getParentTestDescription()
+		 *   .testConfiguration.componentInstance->asOrderedSet()
+		 * endif
+		 */
+		final /*@NonInvalid*/ Executor executor = PivotUtil.getExecutor(this);
+		final /*@NonInvalid*/ IdResolver idResolver = executor.getIdResolver();
+		final /*@NonInvalid*/ TestDescription getParentTestDescription = this.getParentTestDescription();
+		final /*@NonInvalid*/ SetValue oclAsSet = OclAnyOclAsSetOperation.INSTANCE.evaluate(executor, tdlTables.SET_CLSSid_TestDescription, getParentTestDescription);
+		/*@Thrown*/ Object accumulator = ValueUtil.FALSE_VALUE;
+		Iterator<Object> ITERATOR_td = oclAsSet.iterator();
+		/*@NonInvalid*/ Boolean exists;
+		while (true) {
+			if (!ITERATOR_td.hasNext()) {
+				if (accumulator == ValueUtil.FALSE_VALUE) {
+					exists = ValueUtil.FALSE_VALUE;
+				}
+				else {
+					throw (InvalidValueException)accumulator;
+				}
+				break;
+			}
+			/*@NonInvalid*/ TestDescription td = (TestDescription)ITERATOR_td.next();
+			/**
+			 * td.isLocallyOrdered
+			 */
+			final /*@NonInvalid*/ boolean isLocallyOrdered = td.isIsLocallyOrdered();
+			//
+			if (isLocallyOrdered) {					// Normal successful body evaluation result
+				exists = ValueUtil.TRUE_VALUE;
+				break;														// Stop immediately
+			}
+			else if (!isLocallyOrdered) {				// Normal unsuccessful body evaluation result
+				;															// Carry on
+			}
+			else {															// Impossible badly typed result
+				accumulator = new InvalidValueException(PivotMessages.NonBooleanBody, "exists");
+			}
+		}
+		if (exists == null) {
+			throw new InvalidValueException("Null if condition");
+		}
+		/*@NonInvalid*/ OrderedSetValue local_0;
+		if (exists) {
+			final /*@NonInvalid*/ ComponentInstance componentInstance = this.getComponentInstance();
+			final /*@NonInvalid*/ OrderedSetValue OrderedSet = ValueUtil.createOrderedSetOfEach(tdlTables.ORD_CLSSid_ComponentInstance, componentInstance);
+			local_0 = OrderedSet;
 		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
+		else {
+			final /*@NonInvalid*/ TestConfiguration testConfiguration = getParentTestDescription.getTestConfiguration();
+			final /*@NonInvalid*/ List<ComponentInstance> componentInstance_0 = testConfiguration.getComponentInstance();
+			final /*@NonInvalid*/ SetValue BOXED_componentInstance_0 = idResolver.createSetOfAll(tdlTables.SET_CLSSid_ComponentInstance, componentInstance_0);
+			final /*@NonInvalid*/ OrderedSetValue asOrderedSet = CollectionAsOrderedSetOperation.INSTANCE.evaluate(BOXED_componentInstance_0);
+			local_0 = asOrderedSet;
 		}
+		final /*@NonInvalid*/ List<ComponentInstance> ECORE_local_0 = ((IdResolverExtension)idResolver).ecoreValueOfAll(ComponentInstance.class, local_0);
+		return (EList<ComponentInstance>)ECORE_local_0;
 	}
 
 	/**
@@ -206,8 +260,7 @@ public abstract class TimerOperationImpl extends AtomicBehaviourImpl implements
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TIMER_OPERATION__TIMER:
 				if (resolve) return getTimer();
 				return basicGetTimer();
@@ -226,8 +279,7 @@ public abstract class TimerOperationImpl extends AtomicBehaviourImpl implements
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TIMER_OPERATION__TIMER:
 				setTimer((Timer)newValue);
 				return;
@@ -246,8 +298,7 @@ public abstract class TimerOperationImpl extends AtomicBehaviourImpl implements
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TIMER_OPERATION__TIMER:
 				setTimer((Timer)null);
 				return;
@@ -266,8 +317,7 @@ public abstract class TimerOperationImpl extends AtomicBehaviourImpl implements
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TIMER_OPERATION__TIMER:
 				return timer != null;
 			case tdlPackage.TIMER_OPERATION__COMPONENT_INSTANCE:
@@ -284,18 +334,14 @@ public abstract class TimerOperationImpl extends AtomicBehaviourImpl implements
 	@Override
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass)
 	{
-		if (baseClass == Behaviour.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == Behaviour.class) {
+			switch (baseOperationID) {
 				case tdlPackage.BEHAVIOUR___GET_PARTICIPATING_COMPONENTS: return tdlPackage.TIMER_OPERATION___GET_PARTICIPATING_COMPONENTS;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
 		}
-		if (baseClass == AtomicBehaviour.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == AtomicBehaviour.class) {
+			switch (baseOperationID) {
 				case tdlPackage.ATOMIC_BEHAVIOUR___GET_PARTICIPATING_COMPONENTS: return tdlPackage.TIMER_OPERATION___GET_PARTICIPATING_COMPONENTS;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
@@ -311,8 +357,7 @@ public abstract class TimerOperationImpl extends AtomicBehaviourImpl implements
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.TIMER_OPERATION___GET_PARTICIPATING_COMPONENTS:
 				return getParticipatingComponents();
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TimerStartImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TimerStartImpl.java
index e0cb4485f24105fca16fe9b017f106d14497752f..4ae5642c2518de75fb51529330b110fc34199fe2 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TimerStartImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/TimerStartImpl.java
@@ -80,8 +80,7 @@ public class TimerStartImpl extends TimerOperationImpl implements TimerStart
 	{
 		DataUse oldPeriod = period;
 		period = newPeriod;
-		if (eNotificationRequired())
-		{
+		if (eNotificationRequired()) {
 			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, tdlPackage.TIMER_START__PERIOD, oldPeriod, newPeriod);
 			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
@@ -96,8 +95,7 @@ public class TimerStartImpl extends TimerOperationImpl implements TimerStart
 	@Override
 	public void setPeriod(DataUse newPeriod)
 	{
-		if (newPeriod != period)
-		{
+		if (newPeriod != period) {
 			NotificationChain msgs = null;
 			if (period != null)
 				msgs = ((InternalEObject)period).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - tdlPackage.TIMER_START__PERIOD, null, msgs);
@@ -118,8 +116,7 @@ public class TimerStartImpl extends TimerOperationImpl implements TimerStart
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TIMER_START__PERIOD:
 				return basicSetPeriod(null, msgs);
 		}
@@ -134,8 +131,7 @@ public class TimerStartImpl extends TimerOperationImpl implements TimerStart
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TIMER_START__PERIOD:
 				return getPeriod();
 		}
@@ -150,8 +146,7 @@ public class TimerStartImpl extends TimerOperationImpl implements TimerStart
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TIMER_START__PERIOD:
 				setPeriod((DataUse)newValue);
 				return;
@@ -167,8 +162,7 @@ public class TimerStartImpl extends TimerOperationImpl implements TimerStart
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TIMER_START__PERIOD:
 				setPeriod((DataUse)null);
 				return;
@@ -184,8 +178,7 @@ public class TimerStartImpl extends TimerOperationImpl implements TimerStart
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.TIMER_START__PERIOD:
 				return period != null;
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ValueAssignmentImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ValueAssignmentImpl.java
index d2b2ee554d37264a33cec208a60b9a0f1d363208..13f9303b4f54f46cced6fb62b7b526b93553855b 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ValueAssignmentImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/ValueAssignmentImpl.java
@@ -79,12 +79,10 @@ public class ValueAssignmentImpl extends ElementImpl implements ValueAssignment
 	@Override
 	public Variable getVariable()
 	{
-		if (variable != null && variable.eIsProxy())
-		{
+		if (variable != null && variable.eIsProxy()) {
 			InternalEObject oldVariable = (InternalEObject)variable;
 			variable = (Variable)eResolveProxy(oldVariable);
-			if (variable != oldVariable)
-			{
+			if (variable != oldVariable) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.VALUE_ASSIGNMENT__VARIABLE, oldVariable, variable));
 			}
@@ -124,12 +122,10 @@ public class ValueAssignmentImpl extends ElementImpl implements ValueAssignment
 	@Override
 	public Parameter getParameter()
 	{
-		if (parameter != null && parameter.eIsProxy())
-		{
+		if (parameter != null && parameter.eIsProxy()) {
 			InternalEObject oldParameter = (InternalEObject)parameter;
 			parameter = (Parameter)eResolveProxy(oldParameter);
-			if (parameter != oldParameter)
-			{
+			if (parameter != oldParameter) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.VALUE_ASSIGNMENT__PARAMETER, oldParameter, parameter));
 			}
@@ -169,8 +165,7 @@ public class ValueAssignmentImpl extends ElementImpl implements ValueAssignment
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.VALUE_ASSIGNMENT__VARIABLE:
 				if (resolve) return getVariable();
 				return basicGetVariable();
@@ -189,8 +184,7 @@ public class ValueAssignmentImpl extends ElementImpl implements ValueAssignment
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.VALUE_ASSIGNMENT__VARIABLE:
 				setVariable((Variable)newValue);
 				return;
@@ -209,8 +203,7 @@ public class ValueAssignmentImpl extends ElementImpl implements ValueAssignment
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.VALUE_ASSIGNMENT__VARIABLE:
 				setVariable((Variable)null);
 				return;
@@ -229,8 +222,7 @@ public class ValueAssignmentImpl extends ElementImpl implements ValueAssignment
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.VALUE_ASSIGNMENT__VARIABLE:
 				return variable != null;
 			case tdlPackage.VALUE_ASSIGNMENT__PARAMETER:
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/VariableImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/VariableImpl.java
index 3958059b7aa27a756721b968ce6044bc672b50f8..2582bc426821ab1e5fcfc0fed59360b4954f0104 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/VariableImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/VariableImpl.java
@@ -67,12 +67,10 @@ public class VariableImpl extends NamedElementImpl implements Variable
 	@Override
 	public DataType getDataType()
 	{
-		if (dataType != null && dataType.eIsProxy())
-		{
+		if (dataType != null && dataType.eIsProxy()) {
 			InternalEObject oldDataType = (InternalEObject)dataType;
 			dataType = (DataType)eResolveProxy(oldDataType);
-			if (dataType != oldDataType)
-			{
+			if (dataType != oldDataType) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.VARIABLE__DATA_TYPE, oldDataType, dataType));
 			}
@@ -112,8 +110,7 @@ public class VariableImpl extends NamedElementImpl implements Variable
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.VARIABLE__DATA_TYPE:
 				if (resolve) return getDataType();
 				return basicGetDataType();
@@ -129,8 +126,7 @@ public class VariableImpl extends NamedElementImpl implements Variable
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.VARIABLE__DATA_TYPE:
 				setDataType((DataType)newValue);
 				return;
@@ -146,8 +142,7 @@ public class VariableImpl extends NamedElementImpl implements Variable
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.VARIABLE__DATA_TYPE:
 				setDataType((DataType)null);
 				return;
@@ -163,8 +158,7 @@ public class VariableImpl extends NamedElementImpl implements Variable
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.VARIABLE__DATA_TYPE:
 				return dataType != null;
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/VariableUseImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/VariableUseImpl.java
index 8399783187dc88ed4b44b43953aea87897258ea8..b289c4a4cc6c19370c0b7549cd50f32efe46459a 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/VariableUseImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/VariableUseImpl.java
@@ -7,10 +7,7 @@ import java.lang.reflect.InvocationTargetException;
 import org.eclipse.emf.common.notify.Notification;
 
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.WrappedException;
-
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.InternalEObject;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
@@ -87,12 +84,10 @@ public class VariableUseImpl extends DynamicDataUseImpl implements VariableUse
 	@Override
 	public ComponentInstance getComponentInstance()
 	{
-		if (componentInstance != null && componentInstance.eIsProxy())
-		{
+		if (componentInstance != null && componentInstance.eIsProxy()) {
 			InternalEObject oldComponentInstance = (InternalEObject)componentInstance;
 			componentInstance = (ComponentInstance)eResolveProxy(oldComponentInstance);
-			if (componentInstance != oldComponentInstance)
-			{
+			if (componentInstance != oldComponentInstance) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.VARIABLE_USE__COMPONENT_INSTANCE, oldComponentInstance, componentInstance));
 			}
@@ -132,12 +127,10 @@ public class VariableUseImpl extends DynamicDataUseImpl implements VariableUse
 	@Override
 	public Variable getVariable()
 	{
-		if (variable != null && variable.eIsProxy())
-		{
+		if (variable != null && variable.eIsProxy()) {
 			InternalEObject oldVariable = (InternalEObject)variable;
 			variable = (Variable)eResolveProxy(oldVariable);
-			if (variable != oldVariable)
-			{
+			if (variable != oldVariable) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, tdlPackage.VARIABLE_USE__VARIABLE, oldVariable, variable));
 			}
@@ -169,16 +162,6 @@ public class VariableUseImpl extends DynamicDataUseImpl implements VariableUse
 			eNotify(new ENotificationImpl(this, Notification.SET, tdlPackage.VARIABLE_USE__VARIABLE, oldVariable, variable));
 	}
 
-	/**
-	 * The cached invocation delegate for the '{@link #resolveDataType() <em>Resolve Data Type</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #resolveDataType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final EOperation.Internal.InvocationDelegate RESOLVE_DATA_TYPE__EINVOCATION_DELEGATE = ((EOperation.Internal)tdlPackage.Literals.VARIABLE_USE___RESOLVE_DATA_TYPE).getInvocationDelegate();
-
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -187,14 +170,12 @@ public class VariableUseImpl extends DynamicDataUseImpl implements VariableUse
 	@Override
 	public DataType resolveDataType()
 	{
-		try
-		{
-			return (DataType)RESOLVE_DATA_TYPE__EINVOCATION_DELEGATE.dynamicInvoke(this, null);
-		}
-		catch (InvocationTargetException ite)
-		{
-			throw new WrappedException(ite);
-		}
+		/**
+		 * self.variable.dataType
+		 */
+		final /*@NonInvalid*/ Variable variable = this.getVariable();
+		final /*@NonInvalid*/ DataType dataType = variable.getDataType();
+		return dataType;
 	}
 
 	/**
@@ -205,8 +186,7 @@ public class VariableUseImpl extends DynamicDataUseImpl implements VariableUse
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.VARIABLE_USE__COMPONENT_INSTANCE:
 				if (resolve) return getComponentInstance();
 				return basicGetComponentInstance();
@@ -225,8 +205,7 @@ public class VariableUseImpl extends DynamicDataUseImpl implements VariableUse
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.VARIABLE_USE__COMPONENT_INSTANCE:
 				setComponentInstance((ComponentInstance)newValue);
 				return;
@@ -245,8 +224,7 @@ public class VariableUseImpl extends DynamicDataUseImpl implements VariableUse
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.VARIABLE_USE__COMPONENT_INSTANCE:
 				setComponentInstance((ComponentInstance)null);
 				return;
@@ -265,8 +243,7 @@ public class VariableUseImpl extends DynamicDataUseImpl implements VariableUse
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.VARIABLE_USE__COMPONENT_INSTANCE:
 				return componentInstance != null;
 			case tdlPackage.VARIABLE_USE__VARIABLE:
@@ -283,10 +260,8 @@ public class VariableUseImpl extends DynamicDataUseImpl implements VariableUse
 	@Override
 	public int eDerivedOperationID(int baseOperationID, Class<?> baseClass)
 	{
-		if (baseClass == DataUse.class)
-		{
-			switch (baseOperationID)
-			{
+		if (baseClass == DataUse.class) {
+			switch (baseOperationID) {
 				case tdlPackage.DATA_USE___RESOLVE_DATA_TYPE: return tdlPackage.VARIABLE_USE___RESOLVE_DATA_TYPE;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
@@ -302,8 +277,7 @@ public class VariableUseImpl extends DynamicDataUseImpl implements VariableUse
 	@Override
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException
 	{
-		switch (operationID)
-		{
+		switch (operationID) {
 			case tdlPackage.VARIABLE_USE___RESOLVE_DATA_TYPE:
 				return resolveDataType();
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/VerdictAssignmentImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/VerdictAssignmentImpl.java
index 2721eed36f908952851702272a660f0d59d58efb..51c434a647551796836a72e72774e39cad13992c 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/VerdictAssignmentImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/VerdictAssignmentImpl.java
@@ -80,8 +80,7 @@ public class VerdictAssignmentImpl extends AtomicBehaviourImpl implements Verdic
 	{
 		DataUse oldVerdict = verdict;
 		verdict = newVerdict;
-		if (eNotificationRequired())
-		{
+		if (eNotificationRequired()) {
 			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, tdlPackage.VERDICT_ASSIGNMENT__VERDICT, oldVerdict, newVerdict);
 			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
@@ -96,8 +95,7 @@ public class VerdictAssignmentImpl extends AtomicBehaviourImpl implements Verdic
 	@Override
 	public void setVerdict(DataUse newVerdict)
 	{
-		if (newVerdict != verdict)
-		{
+		if (newVerdict != verdict) {
 			NotificationChain msgs = null;
 			if (verdict != null)
 				msgs = ((InternalEObject)verdict).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - tdlPackage.VERDICT_ASSIGNMENT__VERDICT, null, msgs);
@@ -118,8 +116,7 @@ public class VerdictAssignmentImpl extends AtomicBehaviourImpl implements Verdic
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.VERDICT_ASSIGNMENT__VERDICT:
 				return basicSetVerdict(null, msgs);
 		}
@@ -134,8 +131,7 @@ public class VerdictAssignmentImpl extends AtomicBehaviourImpl implements Verdic
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.VERDICT_ASSIGNMENT__VERDICT:
 				return getVerdict();
 		}
@@ -150,8 +146,7 @@ public class VerdictAssignmentImpl extends AtomicBehaviourImpl implements Verdic
 	@Override
 	public void eSet(int featureID, Object newValue)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.VERDICT_ASSIGNMENT__VERDICT:
 				setVerdict((DataUse)newValue);
 				return;
@@ -167,8 +162,7 @@ public class VerdictAssignmentImpl extends AtomicBehaviourImpl implements Verdic
 	@Override
 	public void eUnset(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.VERDICT_ASSIGNMENT__VERDICT:
 				setVerdict((DataUse)null);
 				return;
@@ -184,8 +178,7 @@ public class VerdictAssignmentImpl extends AtomicBehaviourImpl implements Verdic
 	@Override
 	public boolean eIsSet(int featureID)
 	{
-		switch (featureID)
-		{
+		switch (featureID) {
 			case tdlPackage.VERDICT_ASSIGNMENT__VERDICT:
 				return verdict != null;
 		}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/tdlFactoryImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/tdlFactoryImpl.java
index b3256e2febcaa8bab28f578671428d20159febd9..00dbfe8a55831895d392edf84247a2afd63a4d2e 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/tdlFactoryImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/tdlFactoryImpl.java
@@ -24,6 +24,7 @@ import org.etsi.mts.tdl.BehaviourDescription;
 import org.etsi.mts.tdl.Block;
 import org.etsi.mts.tdl.BoundedLoopBehaviour;
 import org.etsi.mts.tdl.Break;
+import org.etsi.mts.tdl.CastDataUse;
 import org.etsi.mts.tdl.CollectionDataInstance;
 import org.etsi.mts.tdl.CollectionDataType;
 import org.etsi.mts.tdl.Comment;
@@ -119,16 +120,13 @@ public class tdlFactoryImpl extends EFactoryImpl implements tdlFactory
 	 */
 	public static tdlFactory init()
 	{
-		try
-		{
+		try {
 			tdlFactory thetdlFactory = (tdlFactory)EPackage.Registry.INSTANCE.getEFactory(tdlPackage.eNS_URI);
-			if (thetdlFactory != null)
-			{
+			if (thetdlFactory != null) {
 				return thetdlFactory;
 			}
 		}
-		catch (Exception exception)
-		{
+		catch (Exception exception) {
 			EcorePlugin.INSTANCE.log(exception);
 		}
 		return new tdlFactoryImpl();
@@ -153,8 +151,7 @@ public class tdlFactoryImpl extends EFactoryImpl implements tdlFactory
 	@Override
 	public EObject create(EClass eClass)
 	{
-		switch (eClass.getClassifierID())
-		{
+		switch (eClass.getClassifierID()) {
 			case tdlPackage.COMMENT: return createComment();
 			case tdlPackage.ANNOTATION: return createAnnotation();
 			case tdlPackage.ANNOTATION_TYPE: return createAnnotationType();
@@ -240,6 +237,7 @@ public class tdlFactoryImpl extends EFactoryImpl implements tdlFactory
 			case tdlPackage.CONSTRAINT: return createConstraint();
 			case tdlPackage.ENUM_DATA_TYPE: return createEnumDataType();
 			case tdlPackage.DATA_ELEMENT_USE: return createDataElementUse();
+			case tdlPackage.CAST_DATA_USE: return createCastDataUse();
 			default:
 				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
 		}
@@ -253,8 +251,7 @@ public class tdlFactoryImpl extends EFactoryImpl implements tdlFactory
 	@Override
 	public Object createFromString(EDataType eDataType, String initialValue)
 	{
-		switch (eDataType.getClassifierID())
-		{
+		switch (eDataType.getClassifierID()) {
 			case tdlPackage.UNASSIGNED_MEMBER_TREATMENT:
 				return createUnassignedMemberTreatmentFromString(eDataType, initialValue);
 			case tdlPackage.COMPONENT_INSTANCE_ROLE:
@@ -278,8 +275,7 @@ public class tdlFactoryImpl extends EFactoryImpl implements tdlFactory
 	@Override
 	public String convertToString(EDataType eDataType, Object instanceValue)
 	{
-		switch (eDataType.getClassifierID())
-		{
+		switch (eDataType.getClassifierID()) {
 			case tdlPackage.UNASSIGNED_MEMBER_TREATMENT:
 				return convertUnassignedMemberTreatmentToString(eDataType, instanceValue);
 			case tdlPackage.COMPONENT_INSTANCE_ROLE:
@@ -1315,6 +1311,17 @@ public class tdlFactoryImpl extends EFactoryImpl implements tdlFactory
 		return dataElementUse;
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public CastDataUse createCastDataUse() {
+		CastDataUseImpl castDataUse = new CastDataUseImpl();
+		return castDataUse;
+	}
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/tdlPackageImpl.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/tdlPackageImpl.java
index d445d66add1e299bb8c67066b937f95a0ea782dd..365654af3ca836f29d577ab4e85f39adac8dd5cc 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/tdlPackageImpl.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/impl/tdlPackageImpl.java
@@ -27,6 +27,7 @@ import org.etsi.mts.tdl.BehaviourDescription;
 import org.etsi.mts.tdl.Block;
 import org.etsi.mts.tdl.BoundedLoopBehaviour;
 import org.etsi.mts.tdl.Break;
+import org.etsi.mts.tdl.CastDataUse;
 import org.etsi.mts.tdl.CollectionDataInstance;
 import org.etsi.mts.tdl.CollectionDataType;
 import org.etsi.mts.tdl.CombinedBehaviour;
@@ -875,6 +876,13 @@ public class tdlPackageImpl extends EPackageImpl implements tdlPackage
 	 */
 	private EClass dataElementUseEClass = null;
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass castDataUseEClass = null;
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -1818,6 +1826,28 @@ public class tdlPackageImpl extends EPackageImpl implements tdlPackage
 		return (EReference)parameterBindingEClass.getEStructuralFeatures().get(1);
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EReference getParameterBinding_Reduction()
+	{
+		return (EReference)parameterBindingEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EOperation getParameterBinding__ResolveParameterType()
+	{
+		return parameterBindingEClass.getEOperations().get(0);
+	}
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -4216,6 +4246,46 @@ public class tdlPackageImpl extends EPackageImpl implements tdlPackage
 		return dataElementUseEClass.getEOperations().get(0);
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EClass getCastDataUse() {
+		return castDataUseEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EReference getCastDataUse_DataUse() {
+		return (EReference)castDataUseEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EReference getCastDataUse_DataType() {
+		return (EReference)castDataUseEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EOperation getCastDataUse__ResolveDataType() {
+		return castDataUseEClass.getEOperations().get(0);
+	}
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -4402,6 +4472,8 @@ public class tdlPackageImpl extends EPackageImpl implements tdlPackage
 		parameterBindingEClass = createEClass(PARAMETER_BINDING);
 		createEReference(parameterBindingEClass, PARAMETER_BINDING__DATA_USE);
 		createEReference(parameterBindingEClass, PARAMETER_BINDING__PARAMETER);
+		createEReference(parameterBindingEClass, PARAMETER_BINDING__REDUCTION);
+		createEOperation(parameterBindingEClass, PARAMETER_BINDING___RESOLVE_PARAMETER_TYPE);
 
 		actionEClass = createEClass(ACTION);
 		createEAttribute(actionEClass, ACTION__BODY);
@@ -4701,6 +4773,11 @@ public class tdlPackageImpl extends EPackageImpl implements tdlPackage
 		createEReference(dataElementUseEClass, DATA_ELEMENT_USE__ITEM);
 		createEOperation(dataElementUseEClass, DATA_ELEMENT_USE___RESOLVE_DATA_TYPE);
 
+		castDataUseEClass = createEClass(CAST_DATA_USE);
+		createEReference(castDataUseEClass, CAST_DATA_USE__DATA_USE);
+		createEReference(castDataUseEClass, CAST_DATA_USE__DATA_TYPE);
+		createEOperation(castDataUseEClass, CAST_DATA_USE___RESOLVE_DATA_TYPE);
+
 		// Create enums
 		unassignedMemberTreatmentEEnum = createEEnum(UNASSIGNED_MEMBER_TREATMENT);
 		componentInstanceRoleEEnum = createEEnum(COMPONENT_INSTANCE_ROLE);
@@ -4842,6 +4919,7 @@ public class tdlPackageImpl extends EPackageImpl implements tdlPackage
 		constraintEClass.getESuperTypes().add(this.getElement());
 		enumDataTypeEClass.getESuperTypes().add(this.getSimpleDataType());
 		dataElementUseEClass.getESuperTypes().add(this.getDataUse());
+		castDataUseEClass.getESuperTypes().add(this.getStaticDataUse());
 
 		// Initialize classes, features, and operations; add parameters
 		initEClass(elementEClass, Element.class, "Element", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
@@ -4958,6 +5036,9 @@ public class tdlPackageImpl extends EPackageImpl implements tdlPackage
 		initEClass(parameterBindingEClass, ParameterBinding.class, "ParameterBinding", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEReference(getParameterBinding_DataUse(), this.getDataUse(), null, "dataUse", null, 1, 1, ParameterBinding.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getParameterBinding_Parameter(), this.getParameter(), null, "parameter", null, 1, 1, ParameterBinding.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getParameterBinding_Reduction(), this.getMemberReference(), null, "reduction", null, 0, -1, ParameterBinding.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEOperation(getParameterBinding__ResolveParameterType(), this.getDataType(), "resolveParameterType", 0, 1, IS_UNIQUE, IS_ORDERED);
 
 		initEClass(actionEClass, Action.class, "Action", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEAttribute(getAction_Body(), ecorePackage.getEString(), "body", null, 0, 1, Action.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
@@ -5294,6 +5375,12 @@ public class tdlPackageImpl extends EPackageImpl implements tdlPackage
 
 		initEOperation(getDataElementUse__ResolveDataType(), this.getDataType(), "resolveDataType", 0, 1, IS_UNIQUE, IS_ORDERED);
 
+		initEClass(castDataUseEClass, CastDataUse.class, "CastDataUse", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getCastDataUse_DataUse(), this.getDataUse(), null, "dataUse", null, 1, 1, CastDataUse.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getCastDataUse_DataType(), this.getDataType(), null, "dataType", null, 1, 1, CastDataUse.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEOperation(getCastDataUse__ResolveDataType(), this.getDataType(), "resolveDataType", 0, 1, IS_UNIQUE, IS_ORDERED);
+
 		// Initialize enums and add enum literals
 		initEEnum(unassignedMemberTreatmentEEnum, UnassignedMemberTreatment.class, "UnassignedMemberTreatment");
 		addEEnumLiteral(unassignedMemberTreatmentEEnum, UnassignedMemberTreatment.UNDEFINED);
@@ -5342,11 +5429,7 @@ public class tdlPackageImpl extends EPackageImpl implements tdlPackage
 		addAnnotation
 		  (this,
 		   source,
-		   new String[]
-		   {
-			   "invocationDelegates", "http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot",
-			   "settingDelegates", "http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot",
-			   "validationDelegates", "http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot"
+		   new String[] {
 		   });
 	}
 
@@ -5362,317 +5445,278 @@ public class tdlPackageImpl extends EPackageImpl implements tdlPackage
 		addAnnotation
 		  (getElement__Container(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n            if (not self.oclContainer().oclIsUndefined()) then\n                self.oclContainer().oclAsType(Element)\n            else \n                null\n            endif"
 		   });
 		addAnnotation
 		  (getElement__GetParentTestDescription(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "  \n            if (self.oclContainer().oclIsUndefined()) then\n                null\n            else \n                if (self.container().oclIsKindOf(TestDescription)) then\n                    self.container().oclAsType(TestDescription)\n                else\n                    self.container().getParentTestDescription()\n                endif\n            endif"
 		   });
 		addAnnotation
 		  (getPackageableElement__ConformsTo__String(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "             \n                if (self.getElementNamed(n).oclIsUndefined()) then\n                    false\n                else\n                    self.conformsTo(self.getElementNamed(n)) \n                endif\n            "
 		   });
 		addAnnotation
 		  (getPackageableElement__GetElementNamed__String(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n                self.oclType().allInstances()->select(e | e.name = n)->asOrderedSet()->first()\n            "
 		   });
 		addAnnotation
 		  (getPackageableElement__ConformsTo__PackageableElement(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n            if (self = n) then\n                true\n            else\n                if (self.oclIsKindOf(AnnotationType) and not self.oclAsType(AnnotationType).extension.oclIsUndefined()) then\n                    self.oclAsType(AnnotationType).extension.isExtending(n)\n                else\n                    if (self.oclIsKindOf(ComponentType) and not self.oclAsType(ComponentType).extension.oclIsUndefined()) then\n                        self.oclAsType(ComponentType).extension.isExtending(n)\n                    else\n                        if (self.oclIsKindOf(GateType) and not self.oclAsType(GateType).extension.oclIsUndefined()) then\n                            self.oclAsType(GateType).extension.isExtending(n)\n                        else\n                            if (self.oclIsKindOf(StructuredDataType)) then\n                                self.oclAsType(StructuredDataType).extension->exists(ex | ex.isExtending(n))\n                            else\n                                if (self.oclIsKindOf(SimpleDataType) and not self.oclAsType(SimpleDataType).extension.oclIsUndefined()) then\n                                    self.oclAsType(SimpleDataType).extension.isExtending(n)\n                                else\n                                    false\n                                endif\n                            endif\n                        endif\n                    endif\n                endif\n            endif\n            "
 		   });
-		addAnnotation
-		  (getNamedElement_QualifiedName(),
-		   source,
-		   new String[]
-		   {
-			   "derivation", "\n            if (self.name.oclIsUndefined()) then\n                \'\'\n            else\n                if (not self.oclContainer().oclIsUndefined()) then\n                    if (self.oclContainer().oclIsKindOf(NamedElement)) then\n                        self.oclContainer().oclAsType(NamedElement).qualifiedName + \'::\' + self.name\n                    else\n                        self.oclContainer().oclAsType(ocl::OclElement)->closure(oclContainer())\n                        ->select(c | c.oclIsKindOf(NamedElement))\n                        ->asOrderedSet()\n                        ->first().oclAsType(NamedElement).qualifiedName + \'::\' + self.name\n                    endif\n                else\n                    self.name\n                endif\n            endif"
-		   });
 		addAnnotation
 		  (getDataType__AllConstraints(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n                    self.constraint\n                "
 		   });
 		addAnnotation
 		  (getSimpleDataType__AllConstraints(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n            if (not self.extension.oclIsUndefined()) then\n                self.extension.extending.oclAsType(SimpleDataType).allConstraints()->union(self.constraint)->asOrderedSet()\n            else \n                self.constraint\n            endif\n            "
 		   });
 		addAnnotation
 		  (getStructuredDataType__AllMembers(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n            if (not self.extension->isEmpty()) then\n                self.extension->collect(e | e.extending.oclAsType(StructuredDataType).allMembers())->union(self.member)->asOrderedSet()\n            else \n                self.member\n            endif\n            "
 		   });
 		addAnnotation
 		  (getStructuredDataType__AllConstraints(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n            if (not self.extension->isEmpty()) then\n                self.extension->collect(e | e.extending.oclAsType(StructuredDataType).allConstraints())->union(self.constraint)->asOrderedSet()\n            else \n                self.constraint\n            endif\n            "
 		   });
 		addAnnotation
 		  (getDataUse__ResolveDataType(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "null"
 		   });
 		addAnnotation
 		  (getDataUse__IsEffectivelyStatic(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n                (self.oclIsKindOf(StaticDataUse)\n                    or (self.oclIsKindOf(DataElementUse) and \n                        (self.oclAsType(DataElementUse).dataElement.oclIsUndefined()\n                            or self.oclAsType(DataElementUse).dataElement.oclIsKindOf(DataInstance)\n                            or self.oclAsType(DataElementUse).dataElement.oclIsKindOf(DataType)\n                        )\n                    )\n                )\n                and self.argument->forAll(a | a.dataUse.isEffectivelyStatic())\n                "
 		   });
+		addAnnotation
+		  (getParameterBinding__ResolveParameterType(),
+		   source,
+		   new String[] {
+			   "body", "\t\t\t\n\t            \tif (self.reduction->isEmpty()) then\n\t                \tself.parameter.dataType\n\t            \telse \n\t            \t\tif (self.reduction->last().member.oclIsUndefined()) then\n\t            \t\t\tif (self.reduction->last().collectionIndex.oclIsUndefined()) then\n\t                \t\t\tself.parameter.dataType\n\t            \t\t\telse\n\t            \t\t\t\tself.parameter.dataType.oclAsType(CollectionDataType).itemType\n\t            \t\t\tendif \n\t            \t\telse \n\t                \t\tself.reduction->last().member.dataType\n\t            \t\tendif\n\t                endif\n\t                "
+		   });
 		addAnnotation
 		  (getFormalParameterUse__ResolveDataType(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "self.parameter.dataType"
 		   });
 		addAnnotation
 		  (getFunctionCall__ResolveDataType(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "self.function.returnType"
 		   });
 		addAnnotation
 		  (getVariableUse__ResolveDataType(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "self.variable.dataType"
 		   });
 		addAnnotation
 		  (getComponentType__AllGates(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n            if (not self.extension.oclIsUndefined()) then\n                self.extension.extending.oclAsType(ComponentType).allGates()->union(self.gateInstance)->asOrderedSet()\n            else \n                self.gateInstance\n            endif\n            "
 		   });
 		addAnnotation
 		  (getComponentType__AllTimers(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n            if (not self.extension.oclIsUndefined()) then\n                self.extension.extending.oclAsType(ComponentType).allTimers()->union(self.timer)->asOrderedSet()\n            else \n                self.timer\n            endif\n            "
 		   });
 		addAnnotation
 		  (getComponentType__AllVariables(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n            if (not self.extension.oclIsUndefined()) then\n                self.extension.extending.oclAsType(ComponentType).allVariables()->union(self.variable)->asOrderedSet()\n            else \n                self.variable\n            endif\n            "
 		   });
 		addAnnotation
 		  (getGateType__AllDataTypes(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n            if (not self.extension.oclIsUndefined()) then\n                self.extension.extending.oclAsType(GateType).allDataTypes()->union(self.dataType)->asOrderedSet()\n            else \n                self.dataType\n            endif\n            "
 		   });
 		addAnnotation
 		  (getSpecialValueUse__ResolveDataType(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n                    if (self.container().oclIsTypeOf(MemberAssignment)) then\n                        self.container().oclAsType(MemberAssignment).member.dataType\n                    else \n                        if (self.container().oclIsTypeOf(ParameterBinding)) then\n                            self.container().oclAsType(ParameterBinding).parameter.dataType\n                        else \n                            if (self.container().oclIsTypeOf(Interaction) and \n                                self.oclIsTypeOf(AnyValue)) then\n                                self.oclAsType(AnyValue).dataType\n                            else\n                                null\n                            endif\n                        endif\n                    endif\n                "
 		   });
 		addAnnotation
 		  (getAnyValue__ResolveDataType(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n                    if (not self.dataType.oclIsUndefined()) then\n                        self.dataType\n                    else \n                        if (self.container().oclIsTypeOf(MemberAssignment)) then\n                            self.container().oclAsType(MemberAssignment).member.dataType\n                        else \n                            if (self.container().oclIsTypeOf(ParameterBinding)) then\n                                self.container().oclAsType(ParameterBinding).parameter.dataType\n                            else\n                                if (self.container().oclIsTypeOf(CollectionDataInstance)) then\n                                    self.container().oclAsType(CollectionDataInstance).dataType.oclAsType(CollectionDataType).itemType\n                                else\n                                    if (self.container().oclIsTypeOf(DataElementUse)) then\n                                        self.container().oclAsType(DataElementUse).resolveDataType().oclAsType(CollectionDataType).itemType\n                                    else\n                                        if (self.container().oclIsTypeOf(DataInstanceUse)) then\n                                            self.container().oclAsType(DataInstanceUse).resolveDataType().oclAsType(CollectionDataType).itemType\n                                        else\n                                            null\n                                        endif\n                                    endif\n                                endif\n                            endif\n                        endif\n                    endif\n                "
 		   });
 		addAnnotation
 		  (getDataInstanceUse__ResolveDataType(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n                if (not self.dataInstance.oclIsUndefined()) then\n                    self.dataInstance.dataType\n                else \n                    if (not self.dataType.oclIsUndefined()) then\n                        self.dataType\n                    else \n                        if (self.container().oclIsTypeOf(MemberAssignment)) then\n                            self.container().oclAsType(MemberAssignment).member.dataType\n                        else \n                            if (self.container().oclIsTypeOf(ParameterBinding)) then\n                                self.container().oclAsType(ParameterBinding).parameter.dataType\n                            else\n                                if (self.container().oclIsTypeOf(CollectionDataInstance)) then\n                                    self.container().oclAsType(CollectionDataInstance).dataType.oclAsType(CollectionDataType).itemType\n                                else\n                                    if (self.container().oclIsTypeOf(DataElementUse)) then\n                                        self.container().oclAsType(DataElementUse).resolveDataType().oclAsType(CollectionDataType).itemType\n                                    else\n                                        if (self.container().oclIsTypeOf(DataInstanceUse)) then\n                                            self.container().oclAsType(DataInstanceUse).resolveDataType().oclAsType(CollectionDataType).itemType\n                                        else\n                                            null\n                                        endif\n                                    endif\n                                endif\n                            endif\n                        endif\n                    endif\n                endif\n                "
 		   });
 		addAnnotation
 		  (getTimerOperation__GetParticipatingComponents(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n                    if self.getParentTestDescription()->exists(td | td.isLocallyOrdered) then\n                        OrderedSet { self.componentInstance }\n                    else\n                        self.getParentTestDescription().testConfiguration.componentInstance->asOrderedSet()\n                    endif\n                "
 		   });
 		addAnnotation
 		  (getAtomicBehaviour__GetParticipatingComponents(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n                    if self.getParentTestDescription()->exists(td | td.isLocallyOrdered) and self.container().oclIsKindOf(Block) then\n                        self.container().oclAsType(Block).getParticipatingComponentsExcluding(self)->asOrderedSet()\n                     else\n                        self.getParentTestDescription().testConfiguration.componentInstance->asOrderedSet()\n                    endif\n                "
 		   });
 		addAnnotation
 		  (getBehaviour__IsTesterInputEvent(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n                if (self.oclIsKindOf(TimeOut) or \n                    self.oclIsKindOf(Quiescence) or\n                    (self.oclIsKindOf(Interaction) and\n                        self.oclAsType(Interaction).sourceGate.component.role = ComponentInstanceRole::SUT and\n                    self.oclAsType(Interaction).target->exists(t | t.targetGate.component.role = ComponentInstanceRole::Tester)\n                    )\n                ) then\n                    true\n                else\n                    false\n                endif"
 		   });
 		addAnnotation
 		  (getBehaviour__GetParticipatingComponents(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n                    if self.getParentTestDescription()->exists(td | td.isLocallyOrdered) then\n                        OrderedSet{}\n                    else\n                        self.getParentTestDescription().testConfiguration.componentInstance->asOrderedSet()\n                    endif\n                "
 		   });
 		addAnnotation
 		  (getTimeOperation__GetParticipatingComponents(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n                    if self.getParentTestDescription()->exists(td | td.isLocallyOrdered) and self.container().oclIsKindOf(Block) then (\n                        if not self.componentInstance.oclIsUndefined() then\n                            OrderedSet { self.componentInstance }\n                        else\n                            self.container().oclAsType(Block).getParticipatingComponentsExcluding(self)->asOrderedSet()\n                        endif\n                     ) else\n                        self.getParentTestDescription().testConfiguration.componentInstance->asOrderedSet()\n                    endif\n                "
 		   });
 		addAnnotation
 		  (getQuiescence__GetParticipatingComponents(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n                    if self.getParentTestDescription()->exists(td | td.isLocallyOrdered) and self.container().oclIsKindOf(Block) then (\n                        if not self.componentInstance.oclIsUndefined() or not self.gateReference.oclIsUndefined() then\n                            self.componentInstance->including(self.gateReference.component)->asOrderedSet()\n                        else\n                            self.container().oclAsType(Block).getParticipatingComponentsExcluding(self)->asOrderedSet()\n                        endif\n                     ) else\n                        self.getParentTestDescription().testConfiguration.componentInstance->asOrderedSet()\n                    endif\n                "
 		   });
 		addAnnotation
 		  (getTimeLabelUse__ResolveDataType(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "Time.allInstances()->asOrderedSet()->first()"
 		   });
 		addAnnotation
 		  (getTestConfiguration__CompatibleWith__TestConfiguration_EList(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "self.componentInstance->forAll(c | cb->exists(formalComponent = c)) and\nself.connection->forAll(c1 | tc.connection->exists(c2 |\n\tc1.endPoint->reject(ep1 | c2.endPoint->exists(ep2 |\n\t\tcb->any(formalComponent = ep1.component).actualComponent = ep2.component and ep1.gate = ep2.gate\n\t))->isEmpty()\n))"
 		   });
 		addAnnotation
 		  (getBlock__GetParticipatingComponents(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n                    if self.getParentTestDescription()->exists(td | td.isLocallyOrdered) then\n                        self.behaviour.getParticipatingComponents()->asOrderedSet()\n                    else\n                        self.getParentTestDescription().testConfiguration.componentInstance->asOrderedSet()\n                    endif\n                "
 		   });
 		addAnnotation
 		  (getBlock__GetParticipatingComponentsExcluding__Behaviour(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n                    if self.getParentTestDescription()->exists(td | td.isLocallyOrdered) then\n                        self.behaviour->excluding(excluded).getParticipatingComponents()->asOrderedSet()\n                    else\n                        self.getParentTestDescription().testConfiguration.componentInstance->asOrderedSet()\n                    endif\n                "
 		   });
 		addAnnotation
 		  (getPeriodicBehaviour__GetParticipatingComponents(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n                    if self.getParentTestDescription()->exists(td | td.isLocallyOrdered) then\n                        self.block.getParticipatingComponents()->asOrderedSet()\n                    else\n                        self.getParentTestDescription().testConfiguration.componentInstance->asOrderedSet()\n                    endif\n                "
 		   });
 		addAnnotation
 		  (getExceptionalBehaviour__GetParticipatingComponents(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n                    if self.getParentTestDescription()->exists(td | td.isLocallyOrdered) then\n                        self.block.getParticipatingComponents()->asOrderedSet()\n                    else\n                        self.getParentTestDescription().testConfiguration.componentInstance->asOrderedSet()\n                    endif\n                "
 		   });
 		addAnnotation
 		  (getMultipleCombinedBehaviour__GetParticipatingComponents(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n                    if self.getParentTestDescription()->exists(td | td.isLocallyOrdered) then\n                        self.periodic.getParticipatingComponents()\n                        ->union(self.exceptional.getParticipatingComponents())\n                        ->union(self.block.getParticipatingComponents())->asOrderedSet()\n                    else\n                        self.getParentTestDescription().testConfiguration.componentInstance->asOrderedSet()\n                    endif\n                "
 		   });
 		addAnnotation
 		  (getSingleCombinedBehaviour__GetParticipatingComponents(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n                    if self.getParentTestDescription()->exists(td | td.isLocallyOrdered) then\n                        self.periodic.getParticipatingComponents()\n                        ->union(self.exceptional.getParticipatingComponents())\n                        ->union(self.block.getParticipatingComponents())->asOrderedSet()\n                    else\n                        self.getParentTestDescription().testConfiguration.componentInstance->asOrderedSet()\n                    endif\n                "
 		   });
 		addAnnotation
 		  (getAssignment__GetParticipatingComponents(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n                    if self.getParentTestDescription()->exists(td | td.isLocallyOrdered) and self.container().oclIsKindOf(Block) then (\n                        if not self.variable.componentInstance.oclIsUndefined() then\n                            OrderedSet { self.variable.componentInstance }\n                        else\n                            self.container().oclAsType(Block).getParticipatingComponentsExcluding(self)->asOrderedSet()\n                        endif\n                     ) else\n                        self.getParentTestDescription().testConfiguration.componentInstance->asOrderedSet()\n                    endif\n                "
 		   });
 		addAnnotation
 		  (getActionBehaviour__GetParticipatingComponents(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n                    if self.getParentTestDescription()->exists(td | td.isLocallyOrdered) and self.container().oclIsKindOf(Block) then (\n                        if not self.componentInstance.oclIsUndefined() then\n                            OrderedSet { self.componentInstance }\n                        else\n                            self.container().oclAsType(Block).getParticipatingComponentsExcluding(self)->asOrderedSet()\n                        endif\n                     ) else\n                        self.getParentTestDescription().testConfiguration.componentInstance->asOrderedSet()\n                    endif\n                "
 		   });
 		addAnnotation
 		  (getTestDescriptionReference__GetParticipatingComponents(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n                    if self.getParentTestDescription()->exists(td | td.isLocallyOrdered) and not self.componentInstanceBinding->isEmpty() then\n                        self.componentInstanceBinding.actualComponent->asOrderedSet()\n                     else\n                        self.getParentTestDescription().testConfiguration.componentInstance->asOrderedSet()\n                    endif\n                "
 		   });
 		addAnnotation
 		  (getInteraction__GetParticipatingComponents(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n                    if self.getParentTestDescription()->exists(td | td.isLocallyOrdered) then\n                        self.target\n                        ->collect(targetGate.component)\n                        ->including(sourceGate.component)\n                        ->asOrderedSet()\n                     else\n                        self.getParentTestDescription().testConfiguration.componentInstance->asOrderedSet()\n                    endif\n                "
 		   });
 		addAnnotation
 		  (getPredefinedFunctionCall__ResolveDataType(),
 		   source,
-		   new String[]
-		   {
-			   "body", "self.function.returnType"
+		   new String[] {
+			   "body", "\n\t                if not self.function.returnType.oclIsUndefined() then\n\t\t\t\t\t\tself.function.returnType\n\t\t\t\t\telse \n\t\t\t\t\t\tself.actualParameters.resolveDataType()->asOrderedSet()->first()\n\t\t\t\t\tendif\n\t\t\t\t\t"
 		   });
 		addAnnotation
 		  (getExtension__TransitiveExtending(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n                if (self.extending.oclIsKindOf(AnnotationType)) then\n                    OrderedSet { self.extending.oclAsType(AnnotationType).extension }\n                else\n                    if (self.extending.oclIsKindOf(ComponentType)) then\n                        OrderedSet { self.extending.oclAsType(ComponentType).extension }\n                    else\n                        if (self.extending.oclIsKindOf(GateType)) then\n                            OrderedSet { self.extending.oclAsType(GateType).extension }\n                        else\n                            if (self.extending.oclIsKindOf(StructuredDataType)) then\n                                self.extending.oclAsType(StructuredDataType).extension\n                            else\n                                if (self.extending.oclIsKindOf(SimpleDataType)) then\n                                    OrderedSet { self.extending.oclAsType(SimpleDataType).extension }\n                                else\n                                    OrderedSet { }\n                                endif\n                            endif\n                        endif\n                    endif\n                endif\n                "
 		   });
 		addAnnotation
 		  (getExtension__IsExtending__PackageableElement(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n                if (self.extending = e) then\n                    true\n                else\n                    if (self->closure(transitiveExtending())->includes(e)) then\n                        true\n                    else\n                        false\n                    endif \n                endif\n                "
 		   });
 		addAnnotation
 		  (getLiteralValueUse__ResolveDataType(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "body", "\n                if (not self.dataType.oclIsUndefined()) then\n                    self.dataType\n                else \n                    if (self.container().oclIsTypeOf(MemberAssignment)) then\n                        self.container().oclAsType(MemberAssignment).member.dataType\n                    else \n                        if (self.container().oclIsTypeOf(ParameterBinding)) then\n                            self.container().oclAsType(ParameterBinding).parameter.dataType\n                        else\n                            if (not self.intValue.oclIsUndefined()) then\n                                SimpleDataType.allInstances()->select(t | t.name = \'Integer\')->asOrderedSet()->first()\n                            else\n                                if (not self.boolValue.oclIsUndefined()) then\n                                    SimpleDataType.allInstances()->select(t | t.name = \'Boolean\')->asOrderedSet()->first()\n                                else \n                                    SimpleDataType.allInstances()->select(t | t.name = \'String\')->asOrderedSet()->first()\n                                endif\n                            endif\n                        endif\n                    endif\n                endif\n                "
 		   });
 		addAnnotation
 		  (getDataElementUse__ResolveDataType(),
 		   source,
-		   new String[]
-		   {
-			   "body", "\n                if (not self.dataElement.oclIsUndefined()) then\n                    if (self.dataElement.oclIsKindOf(DataType)) then\n                        self.dataElement.oclAsType(DataType)\n                    else\n                        if (self.dataElement.oclIsKindOf(DataInstance)) then\n                            self.dataElement.oclAsType(DataInstance).dataType\n                        else \n                            if (self.dataElement.oclIsTypeOf(FormalParameter)) then\n                                self.dataElement.oclAsType(FormalParameter).dataType\n                            else \n                                if (self.dataElement.oclIsTypeOf(Function)) then\n                                    self.dataElement.oclAsType(Function).returnType\n                                else\n                                    null\n                                endif\n                            endif \n                        endif\n                    endif\n                else \n                    if (self.container().oclIsTypeOf(MemberAssignment)) then\n                        self.container().oclAsType(MemberAssignment).member.dataType\n                    else \n                        if (self.container().oclIsTypeOf(ParameterBinding)) then\n                            self.container().oclAsType(ParameterBinding).parameter.dataType\n                        else\n                            if (self.container().oclIsTypeOf(CollectionDataInstance)) then\n                                self.container().oclAsType(CollectionDataInstance).dataType.oclAsType(CollectionDataType).itemType\n                            else\n                                if (self.container().oclIsTypeOf(DataElementUse)) then\n                                    self.container().oclAsType(DataElementUse).resolveDataType().oclAsType(CollectionDataType).itemType\n                                else\n                                    if (self.container().oclIsTypeOf(DataInstanceUse)) then\n                                        self.container().oclAsType(DataInstanceUse).resolveDataType().oclAsType(CollectionDataType).itemType\n                                    else\n                                        null\n                                    endif\n                                endif\n                            endif\n                        endif\n                    endif\n                endif\n                "
+		   new String[] {
+			   "body", "\n                if (not self.dataElement.oclIsUndefined()) then\n                    if (self.dataElement.oclIsKindOf(DataType)) then\n                        self.dataElement.oclAsType(DataType)\n                    else\n                        if (self.dataElement.oclIsKindOf(DataInstance)) then\n                            self.dataElement.oclAsType(DataInstance).dataType\n                        else \n                            if (self.dataElement.oclIsTypeOf(FormalParameter)) then\n                                self.dataElement.oclAsType(FormalParameter).dataType\n                            else \n                                if (self.dataElement.oclIsTypeOf(Function)) then\n                                    self.dataElement.oclAsType(Function).returnType\n                                else\n                                    null\n                                endif\n                            endif \n                        endif\n                    endif\n                else \n                    if (self.container().oclIsTypeOf(MemberAssignment)) then\n                        self.container().oclAsType(MemberAssignment).member.dataType\n                    else \n                        if (self.container().oclIsTypeOf(ParameterBinding)) then\n                        \tself.container().oclAsType(ParameterBinding).resolveParameterType()\n                        else\n                            if (self.container().oclIsTypeOf(CollectionDataInstance)) then\n                                self.container().oclAsType(CollectionDataInstance).dataType.oclAsType(CollectionDataType).itemType\n                            else\n                                if (self.container().oclIsTypeOf(DataElementUse)) then\n                                    self.container().oclAsType(DataElementUse).resolveDataType().oclAsType(CollectionDataType).itemType\n                                else\n                                    if (self.container().oclIsTypeOf(DataInstanceUse)) then\n                                        self.container().oclAsType(DataInstanceUse).resolveDataType().oclAsType(CollectionDataType).itemType\n                                    else\n                                        null\n                                    endif\n                                endif\n                            endif\n                        endif\n                    endif\n                endif\n                "
+		   });
+		addAnnotation
+		  (getCastDataUse__ResolveDataType(),
+		   source,
+		   new String[] {
+			   "body", "self.dataType"
 		   });
 	}
 
@@ -5688,239 +5732,205 @@ public class tdlPackageImpl extends EPackageImpl implements tdlPackage
 		addAnnotation
 		  (getDataType__AllConstraints(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getDataType_Constraint(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getSimpleDataType__AllConstraints(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getStructuredDataType__AllMembers(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getStructuredDataType__AllConstraints(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getStructuredDataType_Extension(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getMember_Constraint(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getComponentType__AllGates(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getComponentType__AllTimers(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getComponentType__AllVariables(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getGateType__AllDataTypes(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getDataInstanceUse_Item(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getTimerOperation__GetParticipatingComponents(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getAtomicBehaviour__GetParticipatingComponents(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getBehaviour__GetParticipatingComponents(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getTimeOperation__GetParticipatingComponents(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getQuiescence__GetParticipatingComponents(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getBlock__GetParticipatingComponents(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getBlock__GetParticipatingComponentsExcluding__Behaviour(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getPeriodicBehaviour__GetParticipatingComponents(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getExceptionalBehaviour__GetParticipatingComponents(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getMultipleCombinedBehaviour__GetParticipatingComponents(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getSingleCombinedBehaviour__GetParticipatingComponents(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getTarget_ValueAssignment(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getAssignment__GetParticipatingComponents(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getActionBehaviour__GetParticipatingComponents(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getTestDescriptionReference__GetParticipatingComponents(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getInteraction__GetParticipatingComponents(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getProcedureCall_Argument(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getProcedureSignature_Parameter(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getCollectionDataInstance_Item(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getExtension__TransitiveExtending(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getConstraint_Quantifier(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 		addAnnotation
 		  (getDataElementUse_Item(),
 		   source,
-		   new String[]
-		   {
+		   new String[] {
 			   "nullFree", "false"
 		   });
 	}
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/tdlFactory.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/tdlFactory.java
index e402b80add648149c340c9d3fe0093263b74bf5b..9f458c24c32d2661b2a080645c1aabc17a2cab5f 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/tdlFactory.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/tdlFactory.java
@@ -787,6 +787,15 @@ public interface tdlFactory extends EFactory
 	 */
 	DataElementUse createDataElementUse();
 
+	/**
+	 * Returns a new object of class '<em>Cast Data Use</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Cast Data Use</em>'.
+	 * @generated
+	 */
+	CastDataUse createCastDataUse();
+
 	/**
 	 * Returns the package supported by this factory.
 	 * <!-- begin-user-doc -->
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/tdlPackage.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/tdlPackage.java
index b81434f96a7d547f7c7c9afae05474e0be2e8554..8afc583d369ddbbce25b27f3eb6ed503d77528ae 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/tdlPackage.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/tdlPackage.java
@@ -23,7 +23,7 @@ import org.eclipse.emf.ecore.EReference;
  * <!-- end-user-doc -->
  * @see org.etsi.mts.tdl.tdlFactory
  * @model kind="package"
- *        annotation="http://www.eclipse.org/emf/2002/Ecore invocationDelegates='http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot' settingDelegates='http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot' validationDelegates='http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot'"
+ *        annotation="http://www.eclipse.org/emf/2002/Ecore"
  * @generated
  */
 public interface tdlPackage extends EPackage
@@ -2776,6 +2776,15 @@ public interface tdlPackage extends EPackage
 	 */
 	int PARAMETER_BINDING__PARAMETER = ELEMENT_FEATURE_COUNT + 1;
 
+	/**
+	 * The feature id for the '<em><b>Reduction</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PARAMETER_BINDING__REDUCTION = ELEMENT_FEATURE_COUNT + 2;
+
 	/**
 	 * The number of structural features of the '<em>Parameter Binding</em>' class.
 	 * <!-- begin-user-doc -->
@@ -2783,7 +2792,7 @@ public interface tdlPackage extends EPackage
 	 * @generated
 	 * @ordered
 	 */
-	int PARAMETER_BINDING_FEATURE_COUNT = ELEMENT_FEATURE_COUNT + 2;
+	int PARAMETER_BINDING_FEATURE_COUNT = ELEMENT_FEATURE_COUNT + 3;
 
 	/**
 	 * The operation id for the '<em>Container</em>' operation.
@@ -2803,6 +2812,15 @@ public interface tdlPackage extends EPackage
 	 */
 	int PARAMETER_BINDING___GET_PARENT_TEST_DESCRIPTION = ELEMENT___GET_PARENT_TEST_DESCRIPTION;
 
+	/**
+	 * The operation id for the '<em>Resolve Parameter Type</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PARAMETER_BINDING___RESOLVE_PARAMETER_TYPE = ELEMENT_OPERATION_COUNT + 0;
+
 	/**
 	 * The number of operations of the '<em>Parameter Binding</em>' class.
 	 * <!-- begin-user-doc -->
@@ -2810,7 +2828,7 @@ public interface tdlPackage extends EPackage
 	 * @generated
 	 * @ordered
 	 */
-	int PARAMETER_BINDING_OPERATION_COUNT = ELEMENT_OPERATION_COUNT + 0;
+	int PARAMETER_BINDING_OPERATION_COUNT = ELEMENT_OPERATION_COUNT + 1;
 
 	/**
 	 * The meta object id for the '{@link org.etsi.mts.tdl.impl.ActionImpl <em>Action</em>}' class.
@@ -12504,6 +12522,133 @@ public interface tdlPackage extends EPackage
 	 */
 	int DATA_ELEMENT_USE_OPERATION_COUNT = DATA_USE_OPERATION_COUNT + 1;
 
+	/**
+	 * The meta object id for the '{@link org.etsi.mts.tdl.impl.CastDataUseImpl <em>Cast Data Use</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.etsi.mts.tdl.impl.CastDataUseImpl
+	 * @see org.etsi.mts.tdl.impl.tdlPackageImpl#getCastDataUse()
+	 * @generated
+	 */
+	int CAST_DATA_USE = 105;
+
+	/**
+	 * The feature id for the '<em><b>Comment</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CAST_DATA_USE__COMMENT = STATIC_DATA_USE__COMMENT;
+
+	/**
+	 * The feature id for the '<em><b>Annotation</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CAST_DATA_USE__ANNOTATION = STATIC_DATA_USE__ANNOTATION;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CAST_DATA_USE__NAME = STATIC_DATA_USE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Argument</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CAST_DATA_USE__ARGUMENT = STATIC_DATA_USE__ARGUMENT;
+
+	/**
+	 * The feature id for the '<em><b>Reduction</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CAST_DATA_USE__REDUCTION = STATIC_DATA_USE__REDUCTION;
+
+	/**
+	 * The feature id for the '<em><b>Data Use</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CAST_DATA_USE__DATA_USE = STATIC_DATA_USE_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Data Type</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CAST_DATA_USE__DATA_TYPE = STATIC_DATA_USE_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Cast Data Use</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CAST_DATA_USE_FEATURE_COUNT = STATIC_DATA_USE_FEATURE_COUNT + 2;
+
+	/**
+	 * The operation id for the '<em>Container</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CAST_DATA_USE___CONTAINER = STATIC_DATA_USE___CONTAINER;
+
+	/**
+	 * The operation id for the '<em>Get Parent Test Description</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CAST_DATA_USE___GET_PARENT_TEST_DESCRIPTION = STATIC_DATA_USE___GET_PARENT_TEST_DESCRIPTION;
+
+	/**
+	 * The operation id for the '<em>Is Effectively Static</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CAST_DATA_USE___IS_EFFECTIVELY_STATIC = STATIC_DATA_USE___IS_EFFECTIVELY_STATIC;
+
+	/**
+	 * The operation id for the '<em>Resolve Data Type</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CAST_DATA_USE___RESOLVE_DATA_TYPE = STATIC_DATA_USE_OPERATION_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Cast Data Use</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CAST_DATA_USE_OPERATION_COUNT = STATIC_DATA_USE_OPERATION_COUNT + 1;
+
 	/**
 	 * The meta object id for the '{@link org.etsi.mts.tdl.UnassignedMemberTreatment <em>Unassigned Member Treatment</em>}' enum.
 	 * <!-- begin-user-doc -->
@@ -12512,7 +12657,7 @@ public interface tdlPackage extends EPackage
 	 * @see org.etsi.mts.tdl.impl.tdlPackageImpl#getUnassignedMemberTreatment()
 	 * @generated
 	 */
-	int UNASSIGNED_MEMBER_TREATMENT = 105;
+	int UNASSIGNED_MEMBER_TREATMENT = 106;
 
 	/**
 	 * The meta object id for the '{@link org.etsi.mts.tdl.ComponentInstanceRole <em>Component Instance Role</em>}' enum.
@@ -12522,7 +12667,7 @@ public interface tdlPackage extends EPackage
 	 * @see org.etsi.mts.tdl.impl.tdlPackageImpl#getComponentInstanceRole()
 	 * @generated
 	 */
-	int COMPONENT_INSTANCE_ROLE = 106;
+	int COMPONENT_INSTANCE_ROLE = 107;
 
 	/**
 	 * The meta object id for the '{@link org.etsi.mts.tdl.GateTypeKind <em>Gate Type Kind</em>}' enum.
@@ -12532,7 +12677,7 @@ public interface tdlPackage extends EPackage
 	 * @see org.etsi.mts.tdl.impl.tdlPackageImpl#getGateTypeKind()
 	 * @generated
 	 */
-	int GATE_TYPE_KIND = 107;
+	int GATE_TYPE_KIND = 108;
 
 	/**
 	 * The meta object id for the '{@link org.etsi.mts.tdl.TimeLabelUseKind <em>Time Label Use Kind</em>}' enum.
@@ -12542,7 +12687,7 @@ public interface tdlPackage extends EPackage
 	 * @see org.etsi.mts.tdl.impl.tdlPackageImpl#getTimeLabelUseKind()
 	 * @generated
 	 */
-	int TIME_LABEL_USE_KIND = 108;
+	int TIME_LABEL_USE_KIND = 109;
 
 	/**
 	 * The meta object id for the '{@link org.etsi.mts.tdl.ParameterKind <em>Parameter Kind</em>}' enum.
@@ -12552,7 +12697,7 @@ public interface tdlPackage extends EPackage
 	 * @see org.etsi.mts.tdl.impl.tdlPackageImpl#getParameterKind()
 	 * @generated
 	 */
-	int PARAMETER_KIND = 109;
+	int PARAMETER_KIND = 110;
 
 
 	/**
@@ -13355,6 +13500,27 @@ public interface tdlPackage extends EPackage
 	 */
 	EReference getParameterBinding_Parameter();
 
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.etsi.mts.tdl.ParameterBinding#getReduction <em>Reduction</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Reduction</em>'.
+	 * @see org.etsi.mts.tdl.ParameterBinding#getReduction()
+	 * @see #getParameterBinding()
+	 * @generated
+	 */
+	EReference getParameterBinding_Reduction();
+
+	/**
+	 * Returns the meta object for the '{@link org.etsi.mts.tdl.ParameterBinding#resolveParameterType() <em>Resolve Parameter Type</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Resolve Parameter Type</em>' operation.
+	 * @see org.etsi.mts.tdl.ParameterBinding#resolveParameterType()
+	 * @generated
+	 */
+	EOperation getParameterBinding__ResolveParameterType();
+
 	/**
 	 * Returns the meta object for class '{@link org.etsi.mts.tdl.Action <em>Action</em>}'.
 	 * <!-- begin-user-doc -->
@@ -15640,6 +15806,48 @@ public interface tdlPackage extends EPackage
 	 */
 	EOperation getDataElementUse__ResolveDataType();
 
+	/**
+	 * Returns the meta object for class '{@link org.etsi.mts.tdl.CastDataUse <em>Cast Data Use</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Cast Data Use</em>'.
+	 * @see org.etsi.mts.tdl.CastDataUse
+	 * @generated
+	 */
+	EClass getCastDataUse();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.etsi.mts.tdl.CastDataUse#getDataUse <em>Data Use</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Data Use</em>'.
+	 * @see org.etsi.mts.tdl.CastDataUse#getDataUse()
+	 * @see #getCastDataUse()
+	 * @generated
+	 */
+	EReference getCastDataUse_DataUse();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.etsi.mts.tdl.CastDataUse#getDataType <em>Data Type</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Data Type</em>'.
+	 * @see org.etsi.mts.tdl.CastDataUse#getDataType()
+	 * @see #getCastDataUse()
+	 * @generated
+	 */
+	EReference getCastDataUse_DataType();
+
+	/**
+	 * Returns the meta object for the '{@link org.etsi.mts.tdl.CastDataUse#resolveDataType() <em>Resolve Data Type</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Resolve Data Type</em>' operation.
+	 * @see org.etsi.mts.tdl.CastDataUse#resolveDataType()
+	 * @generated
+	 */
+	EOperation getCastDataUse__ResolveDataType();
+
 	/**
 	 * Returns the meta object for enum '{@link org.etsi.mts.tdl.UnassignedMemberTreatment <em>Unassigned Member Treatment</em>}'.
 	 * <!-- begin-user-doc -->
@@ -16372,6 +16580,22 @@ public interface tdlPackage extends EPackage
 		 */
 		EReference PARAMETER_BINDING__PARAMETER = eINSTANCE.getParameterBinding_Parameter();
 
+		/**
+		 * The meta object literal for the '<em><b>Reduction</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference PARAMETER_BINDING__REDUCTION = eINSTANCE.getParameterBinding_Reduction();
+
+		/**
+		 * The meta object literal for the '<em><b>Resolve Parameter Type</b></em>' operation.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EOperation PARAMETER_BINDING___RESOLVE_PARAMETER_TYPE = eINSTANCE.getParameterBinding__ResolveParameterType();
+
 		/**
 		 * The meta object literal for the '{@link org.etsi.mts.tdl.impl.ActionImpl <em>Action</em>}' class.
 		 * <!-- begin-user-doc -->
@@ -18276,6 +18500,40 @@ public interface tdlPackage extends EPackage
 		 */
 		EOperation DATA_ELEMENT_USE___RESOLVE_DATA_TYPE = eINSTANCE.getDataElementUse__ResolveDataType();
 
+		/**
+		 * The meta object literal for the '{@link org.etsi.mts.tdl.impl.CastDataUseImpl <em>Cast Data Use</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.etsi.mts.tdl.impl.CastDataUseImpl
+		 * @see org.etsi.mts.tdl.impl.tdlPackageImpl#getCastDataUse()
+		 * @generated
+		 */
+		EClass CAST_DATA_USE = eINSTANCE.getCastDataUse();
+
+		/**
+		 * The meta object literal for the '<em><b>Data Use</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference CAST_DATA_USE__DATA_USE = eINSTANCE.getCastDataUse_DataUse();
+
+		/**
+		 * The meta object literal for the '<em><b>Data Type</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference CAST_DATA_USE__DATA_TYPE = eINSTANCE.getCastDataUse_DataType();
+
+		/**
+		 * The meta object literal for the '<em><b>Resolve Data Type</b></em>' operation.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EOperation CAST_DATA_USE___RESOLVE_DATA_TYPE = eINSTANCE.getCastDataUse__ResolveDataType();
+
 		/**
 		 * The meta object literal for the '{@link org.etsi.mts.tdl.UnassignedMemberTreatment <em>Unassigned Member Treatment</em>}' enum.
 		 * <!-- begin-user-doc -->
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/util/tdlAdapterFactory.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/util/tdlAdapterFactory.java
index e980db8759d6bac1ce61cfdeeccae8804cfa10ec..d8d69b52aa834a12a012a91ebea328cc91211d6b 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/util/tdlAdapterFactory.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/util/tdlAdapterFactory.java
@@ -25,6 +25,7 @@ import org.etsi.mts.tdl.BehaviourDescription;
 import org.etsi.mts.tdl.Block;
 import org.etsi.mts.tdl.BoundedLoopBehaviour;
 import org.etsi.mts.tdl.Break;
+import org.etsi.mts.tdl.CastDataUse;
 import org.etsi.mts.tdl.CollectionDataInstance;
 import org.etsi.mts.tdl.CollectionDataType;
 import org.etsi.mts.tdl.CombinedBehaviour;
@@ -141,8 +142,7 @@ public class tdlAdapterFactory extends AdapterFactoryImpl
 	 */
 	public tdlAdapterFactory()
 	{
-		if (modelPackage == null)
-		{
+		if (modelPackage == null) {
 			modelPackage = tdlPackage.eINSTANCE;
 		}
 	}
@@ -158,12 +158,10 @@ public class tdlAdapterFactory extends AdapterFactoryImpl
 	@Override
 	public boolean isFactoryForType(Object object)
 	{
-		if (object == modelPackage)
-		{
+		if (object == modelPackage) {
 			return true;
 		}
-		if (object instanceof EObject)
-		{
+		if (object instanceof EObject) {
 			return ((EObject)object).eClass().getEPackage() == modelPackage;
 		}
 		return false;
@@ -176,536 +174,433 @@ public class tdlAdapterFactory extends AdapterFactoryImpl
 	 * @generated
 	 */
 	protected tdlSwitch<Adapter> modelSwitch =
-		new tdlSwitch<Adapter>()
-		{
+		new tdlSwitch<Adapter>() {
 			@Override
-			public Adapter caseElement(Element object)
-			{
+			public Adapter caseElement(Element object) {
 				return createElementAdapter();
 			}
 			@Override
-			public Adapter caseComment(Comment object)
-			{
+			public Adapter caseComment(Comment object) {
 				return createCommentAdapter();
 			}
 			@Override
-			public Adapter caseAnnotation(Annotation object)
-			{
+			public Adapter caseAnnotation(Annotation object) {
 				return createAnnotationAdapter();
 			}
 			@Override
-			public Adapter caseAnnotationType(AnnotationType object)
-			{
+			public Adapter caseAnnotationType(AnnotationType object) {
 				return createAnnotationTypeAdapter();
 			}
 			@Override
-			public Adapter casePackageableElement(PackageableElement object)
-			{
+			public Adapter casePackageableElement(PackageableElement object) {
 				return createPackageableElementAdapter();
 			}
 			@Override
-			public Adapter caseNamedElement(NamedElement object)
-			{
+			public Adapter caseNamedElement(NamedElement object) {
 				return createNamedElementAdapter();
 			}
 			@Override
-			public Adapter casePackage(org.etsi.mts.tdl.Package object)
-			{
+			public Adapter casePackage(org.etsi.mts.tdl.Package object) {
 				return createPackageAdapter();
 			}
 			@Override
-			public Adapter caseElementImport(ElementImport object)
-			{
+			public Adapter caseElementImport(ElementImport object) {
 				return createElementImportAdapter();
 			}
 			@Override
-			public Adapter caseTestObjective(TestObjective object)
-			{
+			public Adapter caseTestObjective(TestObjective object) {
 				return createTestObjectiveAdapter();
 			}
 			@Override
-			public Adapter caseDataInstance(DataInstance object)
-			{
+			public Adapter caseDataInstance(DataInstance object) {
 				return createDataInstanceAdapter();
 			}
 			@Override
-			public Adapter caseMappableDataElement(MappableDataElement object)
-			{
+			public Adapter caseMappableDataElement(MappableDataElement object) {
 				return createMappableDataElementAdapter();
 			}
 			@Override
-			public Adapter caseDataType(DataType object)
-			{
+			public Adapter caseDataType(DataType object) {
 				return createDataTypeAdapter();
 			}
 			@Override
-			public Adapter caseDataResourceMapping(DataResourceMapping object)
-			{
+			public Adapter caseDataResourceMapping(DataResourceMapping object) {
 				return createDataResourceMappingAdapter();
 			}
 			@Override
-			public Adapter caseDataElementMapping(DataElementMapping object)
-			{
+			public Adapter caseDataElementMapping(DataElementMapping object) {
 				return createDataElementMappingAdapter();
 			}
 			@Override
-			public Adapter caseParameterMapping(ParameterMapping object)
-			{
+			public Adapter caseParameterMapping(ParameterMapping object) {
 				return createParameterMappingAdapter();
 			}
 			@Override
-			public Adapter caseParameter(Parameter object)
-			{
+			public Adapter caseParameter(Parameter object) {
 				return createParameterAdapter();
 			}
 			@Override
-			public Adapter caseSimpleDataType(SimpleDataType object)
-			{
+			public Adapter caseSimpleDataType(SimpleDataType object) {
 				return createSimpleDataTypeAdapter();
 			}
 			@Override
-			public Adapter caseSimpleDataInstance(SimpleDataInstance object)
-			{
+			public Adapter caseSimpleDataInstance(SimpleDataInstance object) {
 				return createSimpleDataInstanceAdapter();
 			}
 			@Override
-			public Adapter caseStructuredDataType(StructuredDataType object)
-			{
+			public Adapter caseStructuredDataType(StructuredDataType object) {
 				return createStructuredDataTypeAdapter();
 			}
 			@Override
-			public Adapter caseMember(Member object)
-			{
+			public Adapter caseMember(Member object) {
 				return createMemberAdapter();
 			}
 			@Override
-			public Adapter caseStructuredDataInstance(StructuredDataInstance object)
-			{
+			public Adapter caseStructuredDataInstance(StructuredDataInstance object) {
 				return createStructuredDataInstanceAdapter();
 			}
 			@Override
-			public Adapter caseMemberAssignment(MemberAssignment object)
-			{
+			public Adapter caseMemberAssignment(MemberAssignment object) {
 				return createMemberAssignmentAdapter();
 			}
 			@Override
-			public Adapter caseStaticDataUse(StaticDataUse object)
-			{
+			public Adapter caseStaticDataUse(StaticDataUse object) {
 				return createStaticDataUseAdapter();
 			}
 			@Override
-			public Adapter caseDataUse(DataUse object)
-			{
+			public Adapter caseDataUse(DataUse object) {
 				return createDataUseAdapter();
 			}
 			@Override
-			public Adapter caseParameterBinding(ParameterBinding object)
-			{
+			public Adapter caseParameterBinding(ParameterBinding object) {
 				return createParameterBindingAdapter();
 			}
 			@Override
-			public Adapter caseAction(Action object)
-			{
+			public Adapter caseAction(Action object) {
 				return createActionAdapter();
 			}
 			@Override
-			public Adapter caseFormalParameter(FormalParameter object)
-			{
+			public Adapter caseFormalParameter(FormalParameter object) {
 				return createFormalParameterAdapter();
 			}
 			@Override
-			public Adapter caseFunction(Function object)
-			{
+			public Adapter caseFunction(Function object) {
 				return createFunctionAdapter();
 			}
 			@Override
-			public Adapter caseFormalParameterUse(FormalParameterUse object)
-			{
+			public Adapter caseFormalParameterUse(FormalParameterUse object) {
 				return createFormalParameterUseAdapter();
 			}
 			@Override
-			public Adapter caseDynamicDataUse(DynamicDataUse object)
-			{
+			public Adapter caseDynamicDataUse(DynamicDataUse object) {
 				return createDynamicDataUseAdapter();
 			}
 			@Override
-			public Adapter caseVariable(Variable object)
-			{
+			public Adapter caseVariable(Variable object) {
 				return createVariableAdapter();
 			}
 			@Override
-			public Adapter caseFunctionCall(FunctionCall object)
-			{
+			public Adapter caseFunctionCall(FunctionCall object) {
 				return createFunctionCallAdapter();
 			}
 			@Override
-			public Adapter caseVariableUse(VariableUse object)
-			{
+			public Adapter caseVariableUse(VariableUse object) {
 				return createVariableUseAdapter();
 			}
 			@Override
-			public Adapter caseComponentInstance(ComponentInstance object)
-			{
+			public Adapter caseComponentInstance(ComponentInstance object) {
 				return createComponentInstanceAdapter();
 			}
 			@Override
-			public Adapter caseComponentType(ComponentType object)
-			{
+			public Adapter caseComponentType(ComponentType object) {
 				return createComponentTypeAdapter();
 			}
 			@Override
-			public Adapter caseGateInstance(GateInstance object)
-			{
+			public Adapter caseGateInstance(GateInstance object) {
 				return createGateInstanceAdapter();
 			}
 			@Override
-			public Adapter caseGateType(GateType object)
-			{
+			public Adapter caseGateType(GateType object) {
 				return createGateTypeAdapter();
 			}
 			@Override
-			public Adapter caseTimer(Timer object)
-			{
+			public Adapter caseTimer(Timer object) {
 				return createTimerAdapter();
 			}
 			@Override
-			public Adapter caseOmitValue(OmitValue object)
-			{
+			public Adapter caseOmitValue(OmitValue object) {
 				return createOmitValueAdapter();
 			}
 			@Override
-			public Adapter caseSpecialValueUse(SpecialValueUse object)
-			{
+			public Adapter caseSpecialValueUse(SpecialValueUse object) {
 				return createSpecialValueUseAdapter();
 			}
 			@Override
-			public Adapter caseAnyValue(AnyValue object)
-			{
+			public Adapter caseAnyValue(AnyValue object) {
 				return createAnyValueAdapter();
 			}
 			@Override
-			public Adapter caseAnyValueOrOmit(AnyValueOrOmit object)
-			{
+			public Adapter caseAnyValueOrOmit(AnyValueOrOmit object) {
 				return createAnyValueOrOmitAdapter();
 			}
 			@Override
-			public Adapter caseDataInstanceUse(DataInstanceUse object)
-			{
+			public Adapter caseDataInstanceUse(DataInstanceUse object) {
 				return createDataInstanceUseAdapter();
 			}
 			@Override
-			public Adapter caseTime(Time object)
-			{
+			public Adapter caseTime(Time object) {
 				return createTimeAdapter();
 			}
 			@Override
-			public Adapter caseTimeLabel(TimeLabel object)
-			{
+			public Adapter caseTimeLabel(TimeLabel object) {
 				return createTimeLabelAdapter();
 			}
 			@Override
-			public Adapter caseTimerOperation(TimerOperation object)
-			{
+			public Adapter caseTimerOperation(TimerOperation object) {
 				return createTimerOperationAdapter();
 			}
 			@Override
-			public Adapter caseAtomicBehaviour(AtomicBehaviour object)
-			{
+			public Adapter caseAtomicBehaviour(AtomicBehaviour object) {
 				return createAtomicBehaviourAdapter();
 			}
 			@Override
-			public Adapter caseBehaviour(Behaviour object)
-			{
+			public Adapter caseBehaviour(Behaviour object) {
 				return createBehaviourAdapter();
 			}
 			@Override
-			public Adapter caseTimeConstraint(TimeConstraint object)
-			{
+			public Adapter caseTimeConstraint(TimeConstraint object) {
 				return createTimeConstraintAdapter();
 			}
 			@Override
-			public Adapter caseTimerStart(TimerStart object)
-			{
+			public Adapter caseTimerStart(TimerStart object) {
 				return createTimerStartAdapter();
 			}
 			@Override
-			public Adapter caseTimerStop(TimerStop object)
-			{
+			public Adapter caseTimerStop(TimerStop object) {
 				return createTimerStopAdapter();
 			}
 			@Override
-			public Adapter caseTimeOut(TimeOut object)
-			{
+			public Adapter caseTimeOut(TimeOut object) {
 				return createTimeOutAdapter();
 			}
 			@Override
-			public Adapter caseTimeOperation(TimeOperation object)
-			{
+			public Adapter caseTimeOperation(TimeOperation object) {
 				return createTimeOperationAdapter();
 			}
 			@Override
-			public Adapter caseWait(Wait object)
-			{
+			public Adapter caseWait(Wait object) {
 				return createWaitAdapter();
 			}
 			@Override
-			public Adapter caseQuiescence(Quiescence object)
-			{
+			public Adapter caseQuiescence(Quiescence object) {
 				return createQuiescenceAdapter();
 			}
 			@Override
-			public Adapter caseGateReference(GateReference object)
-			{
+			public Adapter caseGateReference(GateReference object) {
 				return createGateReferenceAdapter();
 			}
 			@Override
-			public Adapter caseTimeLabelUse(TimeLabelUse object)
-			{
+			public Adapter caseTimeLabelUse(TimeLabelUse object) {
 				return createTimeLabelUseAdapter();
 			}
 			@Override
-			public Adapter caseTestConfiguration(TestConfiguration object)
-			{
+			public Adapter caseTestConfiguration(TestConfiguration object) {
 				return createTestConfigurationAdapter();
 			}
 			@Override
-			public Adapter caseConnection(Connection object)
-			{
+			public Adapter caseConnection(Connection object) {
 				return createConnectionAdapter();
 			}
 			@Override
-			public Adapter caseTestDescription(TestDescription object)
-			{
+			public Adapter caseTestDescription(TestDescription object) {
 				return createTestDescriptionAdapter();
 			}
 			@Override
-			public Adapter caseBehaviourDescription(BehaviourDescription object)
-			{
+			public Adapter caseBehaviourDescription(BehaviourDescription object) {
 				return createBehaviourDescriptionAdapter();
 			}
 			@Override
-			public Adapter caseBlock(Block object)
-			{
+			public Adapter caseBlock(Block object) {
 				return createBlockAdapter();
 			}
 			@Override
-			public Adapter caseCombinedBehaviour(CombinedBehaviour object)
-			{
+			public Adapter caseCombinedBehaviour(CombinedBehaviour object) {
 				return createCombinedBehaviourAdapter();
 			}
 			@Override
-			public Adapter casePeriodicBehaviour(PeriodicBehaviour object)
-			{
+			public Adapter casePeriodicBehaviour(PeriodicBehaviour object) {
 				return createPeriodicBehaviourAdapter();
 			}
 			@Override
-			public Adapter caseExceptionalBehaviour(ExceptionalBehaviour object)
-			{
+			public Adapter caseExceptionalBehaviour(ExceptionalBehaviour object) {
 				return createExceptionalBehaviourAdapter();
 			}
 			@Override
-			public Adapter caseAlternativeBehaviour(AlternativeBehaviour object)
-			{
+			public Adapter caseAlternativeBehaviour(AlternativeBehaviour object) {
 				return createAlternativeBehaviourAdapter();
 			}
 			@Override
-			public Adapter caseMultipleCombinedBehaviour(MultipleCombinedBehaviour object)
-			{
+			public Adapter caseMultipleCombinedBehaviour(MultipleCombinedBehaviour object) {
 				return createMultipleCombinedBehaviourAdapter();
 			}
 			@Override
-			public Adapter caseParallelBehaviour(ParallelBehaviour object)
-			{
+			public Adapter caseParallelBehaviour(ParallelBehaviour object) {
 				return createParallelBehaviourAdapter();
 			}
 			@Override
-			public Adapter caseBoundedLoopBehaviour(BoundedLoopBehaviour object)
-			{
+			public Adapter caseBoundedLoopBehaviour(BoundedLoopBehaviour object) {
 				return createBoundedLoopBehaviourAdapter();
 			}
 			@Override
-			public Adapter caseSingleCombinedBehaviour(SingleCombinedBehaviour object)
-			{
+			public Adapter caseSingleCombinedBehaviour(SingleCombinedBehaviour object) {
 				return createSingleCombinedBehaviourAdapter();
 			}
 			@Override
-			public Adapter caseOptionalBehaviour(OptionalBehaviour object)
-			{
+			public Adapter caseOptionalBehaviour(OptionalBehaviour object) {
 				return createOptionalBehaviourAdapter();
 			}
 			@Override
-			public Adapter caseUnboundedLoopBehaviour(UnboundedLoopBehaviour object)
-			{
+			public Adapter caseUnboundedLoopBehaviour(UnboundedLoopBehaviour object) {
 				return createUnboundedLoopBehaviourAdapter();
 			}
 			@Override
-			public Adapter caseConditionalBehaviour(ConditionalBehaviour object)
-			{
+			public Adapter caseConditionalBehaviour(ConditionalBehaviour object) {
 				return createConditionalBehaviourAdapter();
 			}
 			@Override
-			public Adapter caseCompoundBehaviour(CompoundBehaviour object)
-			{
+			public Adapter caseCompoundBehaviour(CompoundBehaviour object) {
 				return createCompoundBehaviourAdapter();
 			}
 			@Override
-			public Adapter caseDefaultBehaviour(DefaultBehaviour object)
-			{
+			public Adapter caseDefaultBehaviour(DefaultBehaviour object) {
 				return createDefaultBehaviourAdapter();
 			}
 			@Override
-			public Adapter caseInterruptBehaviour(InterruptBehaviour object)
-			{
+			public Adapter caseInterruptBehaviour(InterruptBehaviour object) {
 				return createInterruptBehaviourAdapter();
 			}
 			@Override
-			public Adapter caseTarget(Target object)
-			{
+			public Adapter caseTarget(Target object) {
 				return createTargetAdapter();
 			}
 			@Override
-			public Adapter caseVerdictAssignment(VerdictAssignment object)
-			{
+			public Adapter caseVerdictAssignment(VerdictAssignment object) {
 				return createVerdictAssignmentAdapter();
 			}
 			@Override
-			public Adapter caseAssertion(Assertion object)
-			{
+			public Adapter caseAssertion(Assertion object) {
 				return createAssertionAdapter();
 			}
 			@Override
-			public Adapter caseStop(Stop object)
-			{
+			public Adapter caseStop(Stop object) {
 				return createStopAdapter();
 			}
 			@Override
-			public Adapter caseBreak(Break object)
-			{
+			public Adapter caseBreak(Break object) {
 				return createBreakAdapter();
 			}
 			@Override
-			public Adapter caseAssignment(Assignment object)
-			{
+			public Adapter caseAssignment(Assignment object) {
 				return createAssignmentAdapter();
 			}
 			@Override
-			public Adapter caseActionBehaviour(ActionBehaviour object)
-			{
+			public Adapter caseActionBehaviour(ActionBehaviour object) {
 				return createActionBehaviourAdapter();
 			}
 			@Override
-			public Adapter caseInlineAction(InlineAction object)
-			{
+			public Adapter caseInlineAction(InlineAction object) {
 				return createInlineActionAdapter();
 			}
 			@Override
-			public Adapter caseActionReference(ActionReference object)
-			{
+			public Adapter caseActionReference(ActionReference object) {
 				return createActionReferenceAdapter();
 			}
 			@Override
-			public Adapter caseTestDescriptionReference(TestDescriptionReference object)
-			{
+			public Adapter caseTestDescriptionReference(TestDescriptionReference object) {
 				return createTestDescriptionReferenceAdapter();
 			}
 			@Override
-			public Adapter caseComponentInstanceBinding(ComponentInstanceBinding object)
-			{
+			public Adapter caseComponentInstanceBinding(ComponentInstanceBinding object) {
 				return createComponentInstanceBindingAdapter();
 			}
 			@Override
-			public Adapter caseInteraction(Interaction object)
-			{
+			public Adapter caseInteraction(Interaction object) {
 				return createInteractionAdapter();
 			}
 			@Override
-			public Adapter caseMessage(Message object)
-			{
+			public Adapter caseMessage(Message object) {
 				return createMessageAdapter();
 			}
 			@Override
-			public Adapter casePredefinedFunction(PredefinedFunction object)
-			{
+			public Adapter casePredefinedFunction(PredefinedFunction object) {
 				return createPredefinedFunctionAdapter();
 			}
 			@Override
-			public Adapter caseMemberReference(MemberReference object)
-			{
+			public Adapter caseMemberReference(MemberReference object) {
 				return createMemberReferenceAdapter();
 			}
 			@Override
-			public Adapter casePredefinedFunctionCall(PredefinedFunctionCall object)
-			{
+			public Adapter casePredefinedFunctionCall(PredefinedFunctionCall object) {
 				return createPredefinedFunctionCallAdapter();
 			}
 			@Override
-			public Adapter caseLocalExpression(LocalExpression object)
-			{
+			public Adapter caseLocalExpression(LocalExpression object) {
 				return createLocalExpressionAdapter();
 			}
 			@Override
-			public Adapter caseValueAssignment(ValueAssignment object)
-			{
+			public Adapter caseValueAssignment(ValueAssignment object) {
 				return createValueAssignmentAdapter();
 			}
 			@Override
-			public Adapter caseProcedureCall(ProcedureCall object)
-			{
+			public Adapter caseProcedureCall(ProcedureCall object) {
 				return createProcedureCallAdapter();
 			}
 			@Override
-			public Adapter caseProcedureSignature(ProcedureSignature object)
-			{
+			public Adapter caseProcedureSignature(ProcedureSignature object) {
 				return createProcedureSignatureAdapter();
 			}
 			@Override
-			public Adapter caseProcedureParameter(ProcedureParameter object)
-			{
+			public Adapter caseProcedureParameter(ProcedureParameter object) {
 				return createProcedureParameterAdapter();
 			}
 			@Override
-			public Adapter caseCollectionDataType(CollectionDataType object)
-			{
+			public Adapter caseCollectionDataType(CollectionDataType object) {
 				return createCollectionDataTypeAdapter();
 			}
 			@Override
-			public Adapter caseCollectionDataInstance(CollectionDataInstance object)
-			{
+			public Adapter caseCollectionDataInstance(CollectionDataInstance object) {
 				return createCollectionDataInstanceAdapter();
 			}
 			@Override
-			public Adapter caseExtension(Extension object)
-			{
+			public Adapter caseExtension(Extension object) {
 				return createExtensionAdapter();
 			}
 			@Override
-			public Adapter caseLiteralValueUse(LiteralValueUse object)
-			{
+			public Adapter caseLiteralValueUse(LiteralValueUse object) {
 				return createLiteralValueUseAdapter();
 			}
 			@Override
-			public Adapter caseConstraintType(ConstraintType object)
-			{
+			public Adapter caseConstraintType(ConstraintType object) {
 				return createConstraintTypeAdapter();
 			}
 			@Override
-			public Adapter caseConstraint(Constraint object)
-			{
+			public Adapter caseConstraint(Constraint object) {
 				return createConstraintAdapter();
 			}
 			@Override
-			public Adapter caseEnumDataType(EnumDataType object)
-			{
+			public Adapter caseEnumDataType(EnumDataType object) {
 				return createEnumDataTypeAdapter();
 			}
 			@Override
-			public Adapter caseDataElementUse(DataElementUse object)
-			{
+			public Adapter caseDataElementUse(DataElementUse object) {
 				return createDataElementUseAdapter();
 			}
 			@Override
-			public Adapter defaultCase(EObject object)
-			{
+			public Adapter caseCastDataUse(CastDataUse object) {
+				return createCastDataUseAdapter();
+			}
+			@Override
+			public Adapter defaultCase(EObject object) {
 				return createEObjectAdapter();
 			}
 		};
@@ -2300,6 +2195,20 @@ public class tdlAdapterFactory extends AdapterFactoryImpl
 		return null;
 	}
 
+	/**
+	 * Creates a new adapter for an object of class '{@link org.etsi.mts.tdl.CastDataUse <em>Cast Data Use</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.etsi.mts.tdl.CastDataUse
+	 * @generated
+	 */
+	public Adapter createCastDataUseAdapter() {
+		return null;
+	}
+
 	/**
 	 * Creates a new adapter for the default case.
 	 * <!-- begin-user-doc -->
diff --git a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/util/tdlSwitch.java b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/util/tdlSwitch.java
index 3dc43e845d405193d5904f6252e0ea793bf5ba3f..ba73aed06efd9280347b57dec5823ffe3e3ae818 100644
--- a/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/util/tdlSwitch.java
+++ b/plugins/org.etsi.mts.tdl.model/src-gen/org/etsi/mts/tdl/util/tdlSwitch.java
@@ -23,6 +23,7 @@ import org.etsi.mts.tdl.BehaviourDescription;
 import org.etsi.mts.tdl.Block;
 import org.etsi.mts.tdl.BoundedLoopBehaviour;
 import org.etsi.mts.tdl.Break;
+import org.etsi.mts.tdl.CastDataUse;
 import org.etsi.mts.tdl.CollectionDataInstance;
 import org.etsi.mts.tdl.CollectionDataType;
 import org.etsi.mts.tdl.CombinedBehaviour;
@@ -144,8 +145,7 @@ public class tdlSwitch<T> extends Switch<T>
 	 */
 	public tdlSwitch()
 	{
-		if (modelPackage == null)
-		{
+		if (modelPackage == null) {
 			modelPackage = tdlPackage.eINSTANCE;
 		}
 	}
@@ -174,33 +174,28 @@ public class tdlSwitch<T> extends Switch<T>
 	@Override
 	protected T doSwitch(int classifierID, EObject theEObject)
 	{
-		switch (classifierID)
-		{
-			case tdlPackage.ELEMENT:
-			{
+		switch (classifierID) {
+			case tdlPackage.ELEMENT: {
 				Element element = (Element)theEObject;
 				T result = caseElement(element);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.COMMENT:
-			{
+			case tdlPackage.COMMENT: {
 				Comment comment = (Comment)theEObject;
 				T result = caseComment(comment);
 				if (result == null) result = caseElement(comment);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.ANNOTATION:
-			{
+			case tdlPackage.ANNOTATION: {
 				Annotation annotation = (Annotation)theEObject;
 				T result = caseAnnotation(annotation);
 				if (result == null) result = caseElement(annotation);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.ANNOTATION_TYPE:
-			{
+			case tdlPackage.ANNOTATION_TYPE: {
 				AnnotationType annotationType = (AnnotationType)theEObject;
 				T result = caseAnnotationType(annotationType);
 				if (result == null) result = casePackageableElement(annotationType);
@@ -209,8 +204,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.PACKAGEABLE_ELEMENT:
-			{
+			case tdlPackage.PACKAGEABLE_ELEMENT: {
 				PackageableElement packageableElement = (PackageableElement)theEObject;
 				T result = casePackageableElement(packageableElement);
 				if (result == null) result = caseNamedElement(packageableElement);
@@ -218,16 +212,14 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.NAMED_ELEMENT:
-			{
+			case tdlPackage.NAMED_ELEMENT: {
 				NamedElement namedElement = (NamedElement)theEObject;
 				T result = caseNamedElement(namedElement);
 				if (result == null) result = caseElement(namedElement);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.PACKAGE:
-			{
+			case tdlPackage.PACKAGE: {
 				org.etsi.mts.tdl.Package package_ = (org.etsi.mts.tdl.Package)theEObject;
 				T result = casePackage(package_);
 				if (result == null) result = caseNamedElement(package_);
@@ -235,16 +227,14 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.ELEMENT_IMPORT:
-			{
+			case tdlPackage.ELEMENT_IMPORT: {
 				ElementImport elementImport = (ElementImport)theEObject;
 				T result = caseElementImport(elementImport);
 				if (result == null) result = caseElement(elementImport);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.TEST_OBJECTIVE:
-			{
+			case tdlPackage.TEST_OBJECTIVE: {
 				TestObjective testObjective = (TestObjective)theEObject;
 				T result = caseTestObjective(testObjective);
 				if (result == null) result = casePackageableElement(testObjective);
@@ -253,8 +243,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.DATA_INSTANCE:
-			{
+			case tdlPackage.DATA_INSTANCE: {
 				DataInstance dataInstance = (DataInstance)theEObject;
 				T result = caseDataInstance(dataInstance);
 				if (result == null) result = caseMappableDataElement(dataInstance);
@@ -264,8 +253,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.MAPPABLE_DATA_ELEMENT:
-			{
+			case tdlPackage.MAPPABLE_DATA_ELEMENT: {
 				MappableDataElement mappableDataElement = (MappableDataElement)theEObject;
 				T result = caseMappableDataElement(mappableDataElement);
 				if (result == null) result = casePackageableElement(mappableDataElement);
@@ -274,8 +262,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.DATA_TYPE:
-			{
+			case tdlPackage.DATA_TYPE: {
 				DataType dataType = (DataType)theEObject;
 				T result = caseDataType(dataType);
 				if (result == null) result = caseMappableDataElement(dataType);
@@ -285,8 +272,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.DATA_RESOURCE_MAPPING:
-			{
+			case tdlPackage.DATA_RESOURCE_MAPPING: {
 				DataResourceMapping dataResourceMapping = (DataResourceMapping)theEObject;
 				T result = caseDataResourceMapping(dataResourceMapping);
 				if (result == null) result = casePackageableElement(dataResourceMapping);
@@ -295,8 +281,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.DATA_ELEMENT_MAPPING:
-			{
+			case tdlPackage.DATA_ELEMENT_MAPPING: {
 				DataElementMapping dataElementMapping = (DataElementMapping)theEObject;
 				T result = caseDataElementMapping(dataElementMapping);
 				if (result == null) result = casePackageableElement(dataElementMapping);
@@ -305,16 +290,14 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.PARAMETER_MAPPING:
-			{
+			case tdlPackage.PARAMETER_MAPPING: {
 				ParameterMapping parameterMapping = (ParameterMapping)theEObject;
 				T result = caseParameterMapping(parameterMapping);
 				if (result == null) result = caseElement(parameterMapping);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.PARAMETER:
-			{
+			case tdlPackage.PARAMETER: {
 				Parameter parameter = (Parameter)theEObject;
 				T result = caseParameter(parameter);
 				if (result == null) result = caseNamedElement(parameter);
@@ -322,8 +305,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.SIMPLE_DATA_TYPE:
-			{
+			case tdlPackage.SIMPLE_DATA_TYPE: {
 				SimpleDataType simpleDataType = (SimpleDataType)theEObject;
 				T result = caseSimpleDataType(simpleDataType);
 				if (result == null) result = caseDataType(simpleDataType);
@@ -334,8 +316,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.SIMPLE_DATA_INSTANCE:
-			{
+			case tdlPackage.SIMPLE_DATA_INSTANCE: {
 				SimpleDataInstance simpleDataInstance = (SimpleDataInstance)theEObject;
 				T result = caseSimpleDataInstance(simpleDataInstance);
 				if (result == null) result = caseDataInstance(simpleDataInstance);
@@ -346,8 +327,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.STRUCTURED_DATA_TYPE:
-			{
+			case tdlPackage.STRUCTURED_DATA_TYPE: {
 				StructuredDataType structuredDataType = (StructuredDataType)theEObject;
 				T result = caseStructuredDataType(structuredDataType);
 				if (result == null) result = caseDataType(structuredDataType);
@@ -358,8 +338,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.MEMBER:
-			{
+			case tdlPackage.MEMBER: {
 				Member member = (Member)theEObject;
 				T result = caseMember(member);
 				if (result == null) result = caseParameter(member);
@@ -368,8 +347,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.STRUCTURED_DATA_INSTANCE:
-			{
+			case tdlPackage.STRUCTURED_DATA_INSTANCE: {
 				StructuredDataInstance structuredDataInstance = (StructuredDataInstance)theEObject;
 				T result = caseStructuredDataInstance(structuredDataInstance);
 				if (result == null) result = caseDataInstance(structuredDataInstance);
@@ -380,16 +358,14 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.MEMBER_ASSIGNMENT:
-			{
+			case tdlPackage.MEMBER_ASSIGNMENT: {
 				MemberAssignment memberAssignment = (MemberAssignment)theEObject;
 				T result = caseMemberAssignment(memberAssignment);
 				if (result == null) result = caseElement(memberAssignment);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.STATIC_DATA_USE:
-			{
+			case tdlPackage.STATIC_DATA_USE: {
 				StaticDataUse staticDataUse = (StaticDataUse)theEObject;
 				T result = caseStaticDataUse(staticDataUse);
 				if (result == null) result = caseDataUse(staticDataUse);
@@ -397,24 +373,21 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.DATA_USE:
-			{
+			case tdlPackage.DATA_USE: {
 				DataUse dataUse = (DataUse)theEObject;
 				T result = caseDataUse(dataUse);
 				if (result == null) result = caseElement(dataUse);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.PARAMETER_BINDING:
-			{
+			case tdlPackage.PARAMETER_BINDING: {
 				ParameterBinding parameterBinding = (ParameterBinding)theEObject;
 				T result = caseParameterBinding(parameterBinding);
 				if (result == null) result = caseElement(parameterBinding);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.ACTION:
-			{
+			case tdlPackage.ACTION: {
 				Action action = (Action)theEObject;
 				T result = caseAction(action);
 				if (result == null) result = caseMappableDataElement(action);
@@ -424,8 +397,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.FORMAL_PARAMETER:
-			{
+			case tdlPackage.FORMAL_PARAMETER: {
 				FormalParameter formalParameter = (FormalParameter)theEObject;
 				T result = caseFormalParameter(formalParameter);
 				if (result == null) result = caseParameter(formalParameter);
@@ -434,8 +406,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.FUNCTION:
-			{
+			case tdlPackage.FUNCTION: {
 				Function function = (Function)theEObject;
 				T result = caseFunction(function);
 				if (result == null) result = caseAction(function);
@@ -446,8 +417,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.FORMAL_PARAMETER_USE:
-			{
+			case tdlPackage.FORMAL_PARAMETER_USE: {
 				FormalParameterUse formalParameterUse = (FormalParameterUse)theEObject;
 				T result = caseFormalParameterUse(formalParameterUse);
 				if (result == null) result = caseDynamicDataUse(formalParameterUse);
@@ -456,8 +426,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.DYNAMIC_DATA_USE:
-			{
+			case tdlPackage.DYNAMIC_DATA_USE: {
 				DynamicDataUse dynamicDataUse = (DynamicDataUse)theEObject;
 				T result = caseDynamicDataUse(dynamicDataUse);
 				if (result == null) result = caseDataUse(dynamicDataUse);
@@ -465,8 +434,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.VARIABLE:
-			{
+			case tdlPackage.VARIABLE: {
 				Variable variable = (Variable)theEObject;
 				T result = caseVariable(variable);
 				if (result == null) result = caseNamedElement(variable);
@@ -474,8 +442,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.FUNCTION_CALL:
-			{
+			case tdlPackage.FUNCTION_CALL: {
 				FunctionCall functionCall = (FunctionCall)theEObject;
 				T result = caseFunctionCall(functionCall);
 				if (result == null) result = caseDynamicDataUse(functionCall);
@@ -484,8 +451,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.VARIABLE_USE:
-			{
+			case tdlPackage.VARIABLE_USE: {
 				VariableUse variableUse = (VariableUse)theEObject;
 				T result = caseVariableUse(variableUse);
 				if (result == null) result = caseDynamicDataUse(variableUse);
@@ -494,8 +460,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.COMPONENT_INSTANCE:
-			{
+			case tdlPackage.COMPONENT_INSTANCE: {
 				ComponentInstance componentInstance = (ComponentInstance)theEObject;
 				T result = caseComponentInstance(componentInstance);
 				if (result == null) result = caseNamedElement(componentInstance);
@@ -503,8 +468,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.COMPONENT_TYPE:
-			{
+			case tdlPackage.COMPONENT_TYPE: {
 				ComponentType componentType = (ComponentType)theEObject;
 				T result = caseComponentType(componentType);
 				if (result == null) result = casePackageableElement(componentType);
@@ -513,8 +477,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.GATE_INSTANCE:
-			{
+			case tdlPackage.GATE_INSTANCE: {
 				GateInstance gateInstance = (GateInstance)theEObject;
 				T result = caseGateInstance(gateInstance);
 				if (result == null) result = caseNamedElement(gateInstance);
@@ -522,8 +485,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.GATE_TYPE:
-			{
+			case tdlPackage.GATE_TYPE: {
 				GateType gateType = (GateType)theEObject;
 				T result = caseGateType(gateType);
 				if (result == null) result = casePackageableElement(gateType);
@@ -532,8 +494,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.TIMER:
-			{
+			case tdlPackage.TIMER: {
 				Timer timer = (Timer)theEObject;
 				T result = caseTimer(timer);
 				if (result == null) result = caseNamedElement(timer);
@@ -541,8 +502,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.OMIT_VALUE:
-			{
+			case tdlPackage.OMIT_VALUE: {
 				OmitValue omitValue = (OmitValue)theEObject;
 				T result = caseOmitValue(omitValue);
 				if (result == null) result = caseSpecialValueUse(omitValue);
@@ -552,8 +512,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.SPECIAL_VALUE_USE:
-			{
+			case tdlPackage.SPECIAL_VALUE_USE: {
 				SpecialValueUse specialValueUse = (SpecialValueUse)theEObject;
 				T result = caseSpecialValueUse(specialValueUse);
 				if (result == null) result = caseStaticDataUse(specialValueUse);
@@ -562,8 +521,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.ANY_VALUE:
-			{
+			case tdlPackage.ANY_VALUE: {
 				AnyValue anyValue = (AnyValue)theEObject;
 				T result = caseAnyValue(anyValue);
 				if (result == null) result = caseSpecialValueUse(anyValue);
@@ -573,8 +531,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.ANY_VALUE_OR_OMIT:
-			{
+			case tdlPackage.ANY_VALUE_OR_OMIT: {
 				AnyValueOrOmit anyValueOrOmit = (AnyValueOrOmit)theEObject;
 				T result = caseAnyValueOrOmit(anyValueOrOmit);
 				if (result == null) result = caseSpecialValueUse(anyValueOrOmit);
@@ -584,8 +541,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.DATA_INSTANCE_USE:
-			{
+			case tdlPackage.DATA_INSTANCE_USE: {
 				DataInstanceUse dataInstanceUse = (DataInstanceUse)theEObject;
 				T result = caseDataInstanceUse(dataInstanceUse);
 				if (result == null) result = caseStaticDataUse(dataInstanceUse);
@@ -594,8 +550,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.TIME:
-			{
+			case tdlPackage.TIME: {
 				Time time = (Time)theEObject;
 				T result = caseTime(time);
 				if (result == null) result = caseSimpleDataType(time);
@@ -607,8 +562,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.TIME_LABEL:
-			{
+			case tdlPackage.TIME_LABEL: {
 				TimeLabel timeLabel = (TimeLabel)theEObject;
 				T result = caseTimeLabel(timeLabel);
 				if (result == null) result = caseNamedElement(timeLabel);
@@ -616,8 +570,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.TIMER_OPERATION:
-			{
+			case tdlPackage.TIMER_OPERATION: {
 				TimerOperation timerOperation = (TimerOperation)theEObject;
 				T result = caseTimerOperation(timerOperation);
 				if (result == null) result = caseAtomicBehaviour(timerOperation);
@@ -626,8 +579,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.ATOMIC_BEHAVIOUR:
-			{
+			case tdlPackage.ATOMIC_BEHAVIOUR: {
 				AtomicBehaviour atomicBehaviour = (AtomicBehaviour)theEObject;
 				T result = caseAtomicBehaviour(atomicBehaviour);
 				if (result == null) result = caseBehaviour(atomicBehaviour);
@@ -635,24 +587,21 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.BEHAVIOUR:
-			{
+			case tdlPackage.BEHAVIOUR: {
 				Behaviour behaviour = (Behaviour)theEObject;
 				T result = caseBehaviour(behaviour);
 				if (result == null) result = caseElement(behaviour);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.TIME_CONSTRAINT:
-			{
+			case tdlPackage.TIME_CONSTRAINT: {
 				TimeConstraint timeConstraint = (TimeConstraint)theEObject;
 				T result = caseTimeConstraint(timeConstraint);
 				if (result == null) result = caseElement(timeConstraint);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.TIMER_START:
-			{
+			case tdlPackage.TIMER_START: {
 				TimerStart timerStart = (TimerStart)theEObject;
 				T result = caseTimerStart(timerStart);
 				if (result == null) result = caseTimerOperation(timerStart);
@@ -662,8 +611,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.TIMER_STOP:
-			{
+			case tdlPackage.TIMER_STOP: {
 				TimerStop timerStop = (TimerStop)theEObject;
 				T result = caseTimerStop(timerStop);
 				if (result == null) result = caseTimerOperation(timerStop);
@@ -673,8 +621,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.TIME_OUT:
-			{
+			case tdlPackage.TIME_OUT: {
 				TimeOut timeOut = (TimeOut)theEObject;
 				T result = caseTimeOut(timeOut);
 				if (result == null) result = caseTimerOperation(timeOut);
@@ -684,8 +631,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.TIME_OPERATION:
-			{
+			case tdlPackage.TIME_OPERATION: {
 				TimeOperation timeOperation = (TimeOperation)theEObject;
 				T result = caseTimeOperation(timeOperation);
 				if (result == null) result = caseAtomicBehaviour(timeOperation);
@@ -694,8 +640,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.WAIT:
-			{
+			case tdlPackage.WAIT: {
 				Wait wait = (Wait)theEObject;
 				T result = caseWait(wait);
 				if (result == null) result = caseTimeOperation(wait);
@@ -705,8 +650,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.QUIESCENCE:
-			{
+			case tdlPackage.QUIESCENCE: {
 				Quiescence quiescence = (Quiescence)theEObject;
 				T result = caseQuiescence(quiescence);
 				if (result == null) result = caseTimeOperation(quiescence);
@@ -716,16 +660,14 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.GATE_REFERENCE:
-			{
+			case tdlPackage.GATE_REFERENCE: {
 				GateReference gateReference = (GateReference)theEObject;
 				T result = caseGateReference(gateReference);
 				if (result == null) result = caseElement(gateReference);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.TIME_LABEL_USE:
-			{
+			case tdlPackage.TIME_LABEL_USE: {
 				TimeLabelUse timeLabelUse = (TimeLabelUse)theEObject;
 				T result = caseTimeLabelUse(timeLabelUse);
 				if (result == null) result = caseDynamicDataUse(timeLabelUse);
@@ -734,8 +676,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.TEST_CONFIGURATION:
-			{
+			case tdlPackage.TEST_CONFIGURATION: {
 				TestConfiguration testConfiguration = (TestConfiguration)theEObject;
 				T result = caseTestConfiguration(testConfiguration);
 				if (result == null) result = casePackageableElement(testConfiguration);
@@ -744,16 +685,14 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.CONNECTION:
-			{
+			case tdlPackage.CONNECTION: {
 				Connection connection = (Connection)theEObject;
 				T result = caseConnection(connection);
 				if (result == null) result = caseElement(connection);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.TEST_DESCRIPTION:
-			{
+			case tdlPackage.TEST_DESCRIPTION: {
 				TestDescription testDescription = (TestDescription)theEObject;
 				T result = caseTestDescription(testDescription);
 				if (result == null) result = casePackageableElement(testDescription);
@@ -762,24 +701,21 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.BEHAVIOUR_DESCRIPTION:
-			{
+			case tdlPackage.BEHAVIOUR_DESCRIPTION: {
 				BehaviourDescription behaviourDescription = (BehaviourDescription)theEObject;
 				T result = caseBehaviourDescription(behaviourDescription);
 				if (result == null) result = caseElement(behaviourDescription);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.BLOCK:
-			{
+			case tdlPackage.BLOCK: {
 				Block block = (Block)theEObject;
 				T result = caseBlock(block);
 				if (result == null) result = caseElement(block);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.COMBINED_BEHAVIOUR:
-			{
+			case tdlPackage.COMBINED_BEHAVIOUR: {
 				CombinedBehaviour combinedBehaviour = (CombinedBehaviour)theEObject;
 				T result = caseCombinedBehaviour(combinedBehaviour);
 				if (result == null) result = caseBehaviour(combinedBehaviour);
@@ -787,8 +723,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.PERIODIC_BEHAVIOUR:
-			{
+			case tdlPackage.PERIODIC_BEHAVIOUR: {
 				PeriodicBehaviour periodicBehaviour = (PeriodicBehaviour)theEObject;
 				T result = casePeriodicBehaviour(periodicBehaviour);
 				if (result == null) result = caseBehaviour(periodicBehaviour);
@@ -796,8 +731,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.EXCEPTIONAL_BEHAVIOUR:
-			{
+			case tdlPackage.EXCEPTIONAL_BEHAVIOUR: {
 				ExceptionalBehaviour exceptionalBehaviour = (ExceptionalBehaviour)theEObject;
 				T result = caseExceptionalBehaviour(exceptionalBehaviour);
 				if (result == null) result = caseBehaviour(exceptionalBehaviour);
@@ -805,8 +739,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.ALTERNATIVE_BEHAVIOUR:
-			{
+			case tdlPackage.ALTERNATIVE_BEHAVIOUR: {
 				AlternativeBehaviour alternativeBehaviour = (AlternativeBehaviour)theEObject;
 				T result = caseAlternativeBehaviour(alternativeBehaviour);
 				if (result == null) result = caseMultipleCombinedBehaviour(alternativeBehaviour);
@@ -816,8 +749,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.MULTIPLE_COMBINED_BEHAVIOUR:
-			{
+			case tdlPackage.MULTIPLE_COMBINED_BEHAVIOUR: {
 				MultipleCombinedBehaviour multipleCombinedBehaviour = (MultipleCombinedBehaviour)theEObject;
 				T result = caseMultipleCombinedBehaviour(multipleCombinedBehaviour);
 				if (result == null) result = caseCombinedBehaviour(multipleCombinedBehaviour);
@@ -826,8 +758,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.PARALLEL_BEHAVIOUR:
-			{
+			case tdlPackage.PARALLEL_BEHAVIOUR: {
 				ParallelBehaviour parallelBehaviour = (ParallelBehaviour)theEObject;
 				T result = caseParallelBehaviour(parallelBehaviour);
 				if (result == null) result = caseMultipleCombinedBehaviour(parallelBehaviour);
@@ -837,8 +768,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.BOUNDED_LOOP_BEHAVIOUR:
-			{
+			case tdlPackage.BOUNDED_LOOP_BEHAVIOUR: {
 				BoundedLoopBehaviour boundedLoopBehaviour = (BoundedLoopBehaviour)theEObject;
 				T result = caseBoundedLoopBehaviour(boundedLoopBehaviour);
 				if (result == null) result = caseSingleCombinedBehaviour(boundedLoopBehaviour);
@@ -848,8 +778,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.SINGLE_COMBINED_BEHAVIOUR:
-			{
+			case tdlPackage.SINGLE_COMBINED_BEHAVIOUR: {
 				SingleCombinedBehaviour singleCombinedBehaviour = (SingleCombinedBehaviour)theEObject;
 				T result = caseSingleCombinedBehaviour(singleCombinedBehaviour);
 				if (result == null) result = caseCombinedBehaviour(singleCombinedBehaviour);
@@ -858,8 +787,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.OPTIONAL_BEHAVIOUR:
-			{
+			case tdlPackage.OPTIONAL_BEHAVIOUR: {
 				OptionalBehaviour optionalBehaviour = (OptionalBehaviour)theEObject;
 				T result = caseOptionalBehaviour(optionalBehaviour);
 				if (result == null) result = caseSingleCombinedBehaviour(optionalBehaviour);
@@ -869,8 +797,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.UNBOUNDED_LOOP_BEHAVIOUR:
-			{
+			case tdlPackage.UNBOUNDED_LOOP_BEHAVIOUR: {
 				UnboundedLoopBehaviour unboundedLoopBehaviour = (UnboundedLoopBehaviour)theEObject;
 				T result = caseUnboundedLoopBehaviour(unboundedLoopBehaviour);
 				if (result == null) result = caseSingleCombinedBehaviour(unboundedLoopBehaviour);
@@ -880,8 +807,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.CONDITIONAL_BEHAVIOUR:
-			{
+			case tdlPackage.CONDITIONAL_BEHAVIOUR: {
 				ConditionalBehaviour conditionalBehaviour = (ConditionalBehaviour)theEObject;
 				T result = caseConditionalBehaviour(conditionalBehaviour);
 				if (result == null) result = caseMultipleCombinedBehaviour(conditionalBehaviour);
@@ -891,8 +817,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.COMPOUND_BEHAVIOUR:
-			{
+			case tdlPackage.COMPOUND_BEHAVIOUR: {
 				CompoundBehaviour compoundBehaviour = (CompoundBehaviour)theEObject;
 				T result = caseCompoundBehaviour(compoundBehaviour);
 				if (result == null) result = caseSingleCombinedBehaviour(compoundBehaviour);
@@ -902,8 +827,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.DEFAULT_BEHAVIOUR:
-			{
+			case tdlPackage.DEFAULT_BEHAVIOUR: {
 				DefaultBehaviour defaultBehaviour = (DefaultBehaviour)theEObject;
 				T result = caseDefaultBehaviour(defaultBehaviour);
 				if (result == null) result = caseExceptionalBehaviour(defaultBehaviour);
@@ -912,8 +836,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.INTERRUPT_BEHAVIOUR:
-			{
+			case tdlPackage.INTERRUPT_BEHAVIOUR: {
 				InterruptBehaviour interruptBehaviour = (InterruptBehaviour)theEObject;
 				T result = caseInterruptBehaviour(interruptBehaviour);
 				if (result == null) result = caseExceptionalBehaviour(interruptBehaviour);
@@ -922,16 +845,14 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.TARGET:
-			{
+			case tdlPackage.TARGET: {
 				Target target = (Target)theEObject;
 				T result = caseTarget(target);
 				if (result == null) result = caseElement(target);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.VERDICT_ASSIGNMENT:
-			{
+			case tdlPackage.VERDICT_ASSIGNMENT: {
 				VerdictAssignment verdictAssignment = (VerdictAssignment)theEObject;
 				T result = caseVerdictAssignment(verdictAssignment);
 				if (result == null) result = caseAtomicBehaviour(verdictAssignment);
@@ -940,8 +861,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.ASSERTION:
-			{
+			case tdlPackage.ASSERTION: {
 				Assertion assertion = (Assertion)theEObject;
 				T result = caseAssertion(assertion);
 				if (result == null) result = caseActionBehaviour(assertion);
@@ -951,8 +871,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.STOP:
-			{
+			case tdlPackage.STOP: {
 				Stop stop = (Stop)theEObject;
 				T result = caseStop(stop);
 				if (result == null) result = caseAtomicBehaviour(stop);
@@ -961,8 +880,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.BREAK:
-			{
+			case tdlPackage.BREAK: {
 				Break break_ = (Break)theEObject;
 				T result = caseBreak(break_);
 				if (result == null) result = caseAtomicBehaviour(break_);
@@ -971,8 +889,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.ASSIGNMENT:
-			{
+			case tdlPackage.ASSIGNMENT: {
 				Assignment assignment = (Assignment)theEObject;
 				T result = caseAssignment(assignment);
 				if (result == null) result = caseAtomicBehaviour(assignment);
@@ -981,8 +898,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.ACTION_BEHAVIOUR:
-			{
+			case tdlPackage.ACTION_BEHAVIOUR: {
 				ActionBehaviour actionBehaviour = (ActionBehaviour)theEObject;
 				T result = caseActionBehaviour(actionBehaviour);
 				if (result == null) result = caseAtomicBehaviour(actionBehaviour);
@@ -991,8 +907,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.INLINE_ACTION:
-			{
+			case tdlPackage.INLINE_ACTION: {
 				InlineAction inlineAction = (InlineAction)theEObject;
 				T result = caseInlineAction(inlineAction);
 				if (result == null) result = caseActionBehaviour(inlineAction);
@@ -1002,8 +917,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.ACTION_REFERENCE:
-			{
+			case tdlPackage.ACTION_REFERENCE: {
 				ActionReference actionReference = (ActionReference)theEObject;
 				T result = caseActionReference(actionReference);
 				if (result == null) result = caseActionBehaviour(actionReference);
@@ -1013,8 +927,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.TEST_DESCRIPTION_REFERENCE:
-			{
+			case tdlPackage.TEST_DESCRIPTION_REFERENCE: {
 				TestDescriptionReference testDescriptionReference = (TestDescriptionReference)theEObject;
 				T result = caseTestDescriptionReference(testDescriptionReference);
 				if (result == null) result = caseAtomicBehaviour(testDescriptionReference);
@@ -1023,16 +936,14 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.COMPONENT_INSTANCE_BINDING:
-			{
+			case tdlPackage.COMPONENT_INSTANCE_BINDING: {
 				ComponentInstanceBinding componentInstanceBinding = (ComponentInstanceBinding)theEObject;
 				T result = caseComponentInstanceBinding(componentInstanceBinding);
 				if (result == null) result = caseElement(componentInstanceBinding);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.INTERACTION:
-			{
+			case tdlPackage.INTERACTION: {
 				Interaction interaction = (Interaction)theEObject;
 				T result = caseInteraction(interaction);
 				if (result == null) result = caseAtomicBehaviour(interaction);
@@ -1041,8 +952,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.MESSAGE:
-			{
+			case tdlPackage.MESSAGE: {
 				Message message = (Message)theEObject;
 				T result = caseMessage(message);
 				if (result == null) result = caseInteraction(message);
@@ -1052,8 +962,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.PREDEFINED_FUNCTION:
-			{
+			case tdlPackage.PREDEFINED_FUNCTION: {
 				PredefinedFunction predefinedFunction = (PredefinedFunction)theEObject;
 				T result = casePredefinedFunction(predefinedFunction);
 				if (result == null) result = casePackageableElement(predefinedFunction);
@@ -1062,16 +971,14 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.MEMBER_REFERENCE:
-			{
+			case tdlPackage.MEMBER_REFERENCE: {
 				MemberReference memberReference = (MemberReference)theEObject;
 				T result = caseMemberReference(memberReference);
 				if (result == null) result = caseElement(memberReference);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.PREDEFINED_FUNCTION_CALL:
-			{
+			case tdlPackage.PREDEFINED_FUNCTION_CALL: {
 				PredefinedFunctionCall predefinedFunctionCall = (PredefinedFunctionCall)theEObject;
 				T result = casePredefinedFunctionCall(predefinedFunctionCall);
 				if (result == null) result = caseDynamicDataUse(predefinedFunctionCall);
@@ -1080,24 +987,21 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.LOCAL_EXPRESSION:
-			{
+			case tdlPackage.LOCAL_EXPRESSION: {
 				LocalExpression localExpression = (LocalExpression)theEObject;
 				T result = caseLocalExpression(localExpression);
 				if (result == null) result = caseElement(localExpression);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.VALUE_ASSIGNMENT:
-			{
+			case tdlPackage.VALUE_ASSIGNMENT: {
 				ValueAssignment valueAssignment = (ValueAssignment)theEObject;
 				T result = caseValueAssignment(valueAssignment);
 				if (result == null) result = caseElement(valueAssignment);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.PROCEDURE_CALL:
-			{
+			case tdlPackage.PROCEDURE_CALL: {
 				ProcedureCall procedureCall = (ProcedureCall)theEObject;
 				T result = caseProcedureCall(procedureCall);
 				if (result == null) result = caseInteraction(procedureCall);
@@ -1107,8 +1011,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.PROCEDURE_SIGNATURE:
-			{
+			case tdlPackage.PROCEDURE_SIGNATURE: {
 				ProcedureSignature procedureSignature = (ProcedureSignature)theEObject;
 				T result = caseProcedureSignature(procedureSignature);
 				if (result == null) result = caseDataType(procedureSignature);
@@ -1119,8 +1022,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.PROCEDURE_PARAMETER:
-			{
+			case tdlPackage.PROCEDURE_PARAMETER: {
 				ProcedureParameter procedureParameter = (ProcedureParameter)theEObject;
 				T result = caseProcedureParameter(procedureParameter);
 				if (result == null) result = caseParameter(procedureParameter);
@@ -1129,8 +1031,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.COLLECTION_DATA_TYPE:
-			{
+			case tdlPackage.COLLECTION_DATA_TYPE: {
 				CollectionDataType collectionDataType = (CollectionDataType)theEObject;
 				T result = caseCollectionDataType(collectionDataType);
 				if (result == null) result = caseDataType(collectionDataType);
@@ -1141,8 +1042,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.COLLECTION_DATA_INSTANCE:
-			{
+			case tdlPackage.COLLECTION_DATA_INSTANCE: {
 				CollectionDataInstance collectionDataInstance = (CollectionDataInstance)theEObject;
 				T result = caseCollectionDataInstance(collectionDataInstance);
 				if (result == null) result = caseDataInstance(collectionDataInstance);
@@ -1153,16 +1053,14 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.EXTENSION:
-			{
+			case tdlPackage.EXTENSION: {
 				Extension extension = (Extension)theEObject;
 				T result = caseExtension(extension);
 				if (result == null) result = caseElement(extension);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.LITERAL_VALUE_USE:
-			{
+			case tdlPackage.LITERAL_VALUE_USE: {
 				LiteralValueUse literalValueUse = (LiteralValueUse)theEObject;
 				T result = caseLiteralValueUse(literalValueUse);
 				if (result == null) result = caseStaticDataUse(literalValueUse);
@@ -1171,8 +1069,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.CONSTRAINT_TYPE:
-			{
+			case tdlPackage.CONSTRAINT_TYPE: {
 				ConstraintType constraintType = (ConstraintType)theEObject;
 				T result = caseConstraintType(constraintType);
 				if (result == null) result = casePackageableElement(constraintType);
@@ -1181,16 +1078,14 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.CONSTRAINT:
-			{
+			case tdlPackage.CONSTRAINT: {
 				Constraint constraint = (Constraint)theEObject;
 				T result = caseConstraint(constraint);
 				if (result == null) result = caseElement(constraint);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.ENUM_DATA_TYPE:
-			{
+			case tdlPackage.ENUM_DATA_TYPE: {
 				EnumDataType enumDataType = (EnumDataType)theEObject;
 				T result = caseEnumDataType(enumDataType);
 				if (result == null) result = caseSimpleDataType(enumDataType);
@@ -1202,8 +1097,7 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case tdlPackage.DATA_ELEMENT_USE:
-			{
+			case tdlPackage.DATA_ELEMENT_USE: {
 				DataElementUse dataElementUse = (DataElementUse)theEObject;
 				T result = caseDataElementUse(dataElementUse);
 				if (result == null) result = caseDataUse(dataElementUse);
@@ -1211,6 +1105,15 @@ public class tdlSwitch<T> extends Switch<T>
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
+			case tdlPackage.CAST_DATA_USE: {
+				CastDataUse castDataUse = (CastDataUse)theEObject;
+				T result = caseCastDataUse(castDataUse);
+				if (result == null) result = caseStaticDataUse(castDataUse);
+				if (result == null) result = caseDataUse(castDataUse);
+				if (result == null) result = caseElement(castDataUse);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
 			default: return defaultCase(theEObject);
 		}
 	}
@@ -2895,6 +2798,21 @@ public class tdlSwitch<T> extends Switch<T>
 		return null;
 	}
 
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Cast Data Use</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>Cast Data Use</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseCastDataUse(CastDataUse object) {
+		return null;
+	}
+
 	/**
 	 * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
 	 * <!-- begin-user-doc -->
diff --git a/plugins/org.etsi.mts.tdl.model/src/org/etsi/mts/tdl/Activator.java b/plugins/org.etsi.mts.tdl.model/src/org/etsi/mts/tdl/Activator.java
index a5a835451a520ca9dcfd9f0f4eb1384b4bce22c7..32f03943998cddffeb63912135e2860a062be217 100644
--- a/plugins/org.etsi.mts.tdl.model/src/org/etsi/mts/tdl/Activator.java
+++ b/plugins/org.etsi.mts.tdl.model/src/org/etsi/mts/tdl/Activator.java
@@ -3,16 +3,23 @@ package org.etsi.mts.tdl;
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.util.List;
+import java.util.Map;
 
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.FileLocator;
 import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.common.util.DiagnosticChain;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EClassifier;
+import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EPackage;
 import org.eclipse.emf.ecore.EValidator;
 import org.eclipse.emf.ecore.resource.Resource.Diagnostic;
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
 import org.eclipse.ocl.pivot.internal.utilities.EnvironmentFactoryInternal;
 import org.eclipse.ocl.pivot.resource.CSResource;
 import org.eclipse.ocl.pivot.utilities.PivotUtil;
@@ -59,6 +66,18 @@ public class Activator implements BundleActivator {
 					}
 					return success;
 				}
+				@Override
+				protected boolean validatePivot(@NonNull EClassifier eClassifier, @Nullable Object object,
+						@Nullable DiagnosticChain diagnostics, Map<Object, Object> validationContext) {
+					// Don't validate derived files
+					if (object instanceof EObject) {
+						URI uri = ((EObject) object).eResource().getURI();
+						IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(uri.toPlatformString(true)));
+						if (file != null && file.isDerived())
+							return true;
+					}
+					return super.validatePivot(eClassifier, object, diagnostics, validationContext);
+				}
 			};
 			EValidator.Registry.INSTANCE.put(tdlPackage.eINSTANCE, validator);
 		} catch (URISyntaxException e) {
diff --git a/plugins/org.etsi.mts.tdl.openapi.generator.ui/src/org/etsi/mts/tdl/openapi/generator/ui/handlers/OpenAPIGeneratorLauncher.java b/plugins/org.etsi.mts.tdl.openapi.generator.ui/src/org/etsi/mts/tdl/openapi/generator/ui/handlers/OpenAPIGeneratorLauncher.java
index 2937e1683b4de3d06f85506b87e7f998d7fe9b73..27e3775547447f156baeae93bae832fe2f81536b 100644
--- a/plugins/org.etsi.mts.tdl.openapi.generator.ui/src/org/etsi/mts/tdl/openapi/generator/ui/handlers/OpenAPIGeneratorLauncher.java
+++ b/plugins/org.etsi.mts.tdl.openapi.generator.ui/src/org/etsi/mts/tdl/openapi/generator/ui/handlers/OpenAPIGeneratorLauncher.java
@@ -55,6 +55,7 @@ public class OpenAPIGeneratorLauncher {
 			new File(output).mkdirs();
 		}
 
+		input = input.replaceAll("\\\\", "/");
 		List<String> args = new ArrayList<String>(
 				Arrays.asList(new String[] { "generate", "-g", target, "-i", input, "-o", output }));
 		
diff --git a/plugins/org.etsi.mts.tdl.openapi.generator.wrapper/META-INF/MANIFEST.MF b/plugins/org.etsi.mts.tdl.openapi.generator.wrapper/META-INF/MANIFEST.MF
deleted file mode 100644
index 5dc6c60681711861749266cd345db7caeb64dc0a..0000000000000000000000000000000000000000
--- a/plugins/org.etsi.mts.tdl.openapi.generator.wrapper/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,663 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: OpenAPI Generator Wrapper
-Bundle-SymbolicName: org.etsi.mts.tdl.openapi.generator.wrapper
-Bundle-Version: 6.3.0
-Bundle-ClassPath: openapi-generator-cli-6.3.0.jar
-Bundle-Vendor: ETSI
-Export-Package: ch.lambdaj,
- ch.lambdaj.collection,
- ch.lambdaj.function.aggregate,
- ch.lambdaj.function.argument,
- ch.lambdaj.function.closure,
- ch.lambdaj.function.compare,
- ch.lambdaj.function.convert,
- ch.lambdaj.function.matcher,
- ch.lambdaj.group,
- ch.lambdaj.proxy,
- ch.lambdaj.util,
- ch.lambdaj.util.iterator,
- ch.qos.logback.classic,
- ch.qos.logback.classic.boolex,
- ch.qos.logback.classic.db.names,
- ch.qos.logback.classic.encoder,
- ch.qos.logback.classic.filter,
- ch.qos.logback.classic.helpers,
- ch.qos.logback.classic.html,
- ch.qos.logback.classic.jmx,
- ch.qos.logback.classic.joran,
- ch.qos.logback.classic.joran.action,
- ch.qos.logback.classic.jul,
- ch.qos.logback.classic.layout,
- ch.qos.logback.classic.log4j,
- ch.qos.logback.classic.net,
- ch.qos.logback.classic.net.server,
- ch.qos.logback.classic.pattern,
- ch.qos.logback.classic.pattern.color,
- ch.qos.logback.classic.selector,
- ch.qos.logback.classic.selector.servlet,
- ch.qos.logback.classic.servlet,
- ch.qos.logback.classic.sift,
- ch.qos.logback.classic.spi,
- ch.qos.logback.classic.turbo,
- ch.qos.logback.classic.util,
- ch.qos.logback.core,
- ch.qos.logback.core.boolex,
- ch.qos.logback.core.encoder,
- ch.qos.logback.core.filter,
- ch.qos.logback.core.helpers,
- ch.qos.logback.core.hook,
- ch.qos.logback.core.html,
- ch.qos.logback.core.joran,
- ch.qos.logback.core.joran.action,
- ch.qos.logback.core.joran.conditional,
- ch.qos.logback.core.joran.event,
- ch.qos.logback.core.joran.event.stax,
- ch.qos.logback.core.joran.node,
- ch.qos.logback.core.joran.spi,
- ch.qos.logback.core.joran.util,
- ch.qos.logback.core.joran.util.beans,
- ch.qos.logback.core.layout,
- ch.qos.logback.core.net,
- ch.qos.logback.core.net.server,
- ch.qos.logback.core.net.ssl,
- ch.qos.logback.core.pattern,
- ch.qos.logback.core.pattern.color,
- ch.qos.logback.core.pattern.parser,
- ch.qos.logback.core.pattern.util,
- ch.qos.logback.core.property,
- ch.qos.logback.core.read,
- ch.qos.logback.core.recovery,
- ch.qos.logback.core.rolling,
- ch.qos.logback.core.rolling.helper,
- ch.qos.logback.core.sift,
- ch.qos.logback.core.spi,
- ch.qos.logback.core.status,
- ch.qos.logback.core.subst,
- ch.qos.logback.core.util,
- com.fasterxml.jackson.annotation,
- com.fasterxml.jackson.core,
- com.fasterxml.jackson.core.async,
- com.fasterxml.jackson.core.base,
- com.fasterxml.jackson.core.exc,
- com.fasterxml.jackson.core.filter,
- com.fasterxml.jackson.core.format,
- com.fasterxml.jackson.core.io,
- com.fasterxml.jackson.core.json,
- com.fasterxml.jackson.core.json.async,
- com.fasterxml.jackson.core.sym,
- com.fasterxml.jackson.core.type,
- com.fasterxml.jackson.core.util,
- com.fasterxml.jackson.databind,
- com.fasterxml.jackson.databind.annotation,
- com.fasterxml.jackson.databind.cfg,
- com.fasterxml.jackson.databind.deser,
- com.fasterxml.jackson.databind.deser.impl,
- com.fasterxml.jackson.databind.deser.std,
- com.fasterxml.jackson.databind.exc,
- com.fasterxml.jackson.databind.ext,
- com.fasterxml.jackson.databind.introspect,
- com.fasterxml.jackson.databind.jdk14,
- com.fasterxml.jackson.databind.json,
- com.fasterxml.jackson.databind.jsonFormatVisitors,
- com.fasterxml.jackson.databind.jsonschema,
- com.fasterxml.jackson.databind.jsontype,
- com.fasterxml.jackson.databind.jsontype.impl,
- com.fasterxml.jackson.databind.module,
- com.fasterxml.jackson.databind.node,
- com.fasterxml.jackson.databind.ser,
- com.fasterxml.jackson.databind.ser.impl,
- com.fasterxml.jackson.databind.ser.std,
- com.fasterxml.jackson.databind.type,
- com.fasterxml.jackson.databind.util,
- com.fasterxml.jackson.dataformat.yaml,
- com.fasterxml.jackson.dataformat.yaml.snakeyaml.error,
- com.fasterxml.jackson.dataformat.yaml.util,
- com.fasterxml.jackson.datatype.guava,
- com.fasterxml.jackson.datatype.guava.deser,
- com.fasterxml.jackson.datatype.guava.deser.multimap,
- com.fasterxml.jackson.datatype.guava.deser.multimap.list,
- com.fasterxml.jackson.datatype.guava.deser.multimap.set,
- com.fasterxml.jackson.datatype.guava.deser.util,
- com.fasterxml.jackson.datatype.guava.ser,
- com.fasterxml.jackson.datatype.joda,
- com.fasterxml.jackson.datatype.joda.cfg,
- com.fasterxml.jackson.datatype.joda.deser,
- com.fasterxml.jackson.datatype.joda.deser.key,
- com.fasterxml.jackson.datatype.joda.ser,
- com.fasterxml.jackson.datatype.jsr310,
- com.fasterxml.jackson.datatype.jsr310.deser,
- com.fasterxml.jackson.datatype.jsr310.deser.key,
- com.fasterxml.jackson.datatype.jsr310.ser,
- com.fasterxml.jackson.datatype.jsr310.ser.key,
- com.fasterxml.jackson.datatype.jsr310.util,
- com.fasterxml.jackson.datatype.threetenbp,
- com.fasterxml.jackson.datatype.threetenbp.deser,
- com.fasterxml.jackson.datatype.threetenbp.deser.key,
- com.fasterxml.jackson.datatype.threetenbp.function,
- com.fasterxml.jackson.datatype.threetenbp.ser,
- com.fasterxml.jackson.datatype.threetenbp.ser.key,
- com.github.benmanes.caffeine,
- com.github.benmanes.caffeine.base,
- com.github.benmanes.caffeine.cache,
- com.github.benmanes.caffeine.cache.stats,
- com.github.curiousoddman.rgxgen,
- com.github.curiousoddman.rgxgen.config,
- com.github.curiousoddman.rgxgen.iterators,
- com.github.curiousoddman.rgxgen.iterators.suppliers,
- com.github.curiousoddman.rgxgen.nodes,
- com.github.curiousoddman.rgxgen.parsing,
- com.github.curiousoddman.rgxgen.parsing.dflt,
- com.github.curiousoddman.rgxgen.util,
- com.github.curiousoddman.rgxgen.visitors,
- com.github.fge,
- com.github.fge.jackson,
- com.github.fge.jackson.jsonpointer,
- com.github.fge.jsonpatch,
- com.github.fge.jsonpatch.diff,
- com.github.fge.jsonpatch.mergepatch,
- com.github.fge.jsonschema,
- com.github.fge.jsonschema.cfg,
- com.github.fge.jsonschema.core.exceptions,
- com.github.fge.jsonschema.core.keyword.syntax,
- com.github.fge.jsonschema.core.keyword.syntax.checkers,
- com.github.fge.jsonschema.core.keyword.syntax.checkers.common,
- com.github.fge.jsonschema.core.keyword.syntax.checkers.draftv3,
- com.github.fge.jsonschema.core.keyword.syntax.checkers.draftv4,
- com.github.fge.jsonschema.core.keyword.syntax.checkers.helpers,
- com.github.fge.jsonschema.core.keyword.syntax.checkers.hyperschema,
- com.github.fge.jsonschema.core.keyword.syntax.dictionaries,
- com.github.fge.jsonschema.core.load,
- com.github.fge.jsonschema.core.load.configuration,
- com.github.fge.jsonschema.core.load.download,
- com.github.fge.jsonschema.core.load.uri,
- com.github.fge.jsonschema.core.messages,
- com.github.fge.jsonschema.core.processing,
- com.github.fge.jsonschema.core.ref,
- com.github.fge.jsonschema.core.report,
- com.github.fge.jsonschema.core.tree,
- com.github.fge.jsonschema.core.tree.key,
- com.github.fge.jsonschema.core.util,
- com.github.fge.jsonschema.core.util.equivalence,
- com.github.fge.jsonschema.examples,
- com.github.fge.jsonschema.exceptions,
- com.github.fge.jsonschema.format,
- com.github.fge.jsonschema.format.common,
- com.github.fge.jsonschema.format.draftv3,
- com.github.fge.jsonschema.format.extra,
- com.github.fge.jsonschema.format.helpers,
- com.github.fge.jsonschema.keyword.digest,
- com.github.fge.jsonschema.keyword.digest.common,
- com.github.fge.jsonschema.keyword.digest.draftv3,
- com.github.fge.jsonschema.keyword.digest.draftv4,
- com.github.fge.jsonschema.keyword.digest.helpers,
- com.github.fge.jsonschema.keyword.validator,
- com.github.fge.jsonschema.keyword.validator.common,
- com.github.fge.jsonschema.keyword.validator.draftv3,
- com.github.fge.jsonschema.keyword.validator.draftv4,
- com.github.fge.jsonschema.keyword.validator.helpers,
- com.github.fge.jsonschema.library,
- com.github.fge.jsonschema.library.digest,
- com.github.fge.jsonschema.library.format,
- com.github.fge.jsonschema.library.validator,
- com.github.fge.jsonschema.main,
- com.github.fge.jsonschema.main.cli,
- com.github.fge.jsonschema.messages,
- com.github.fge.jsonschema.processors.build,
- com.github.fge.jsonschema.processors.data,
- com.github.fge.jsonschema.processors.digest,
- com.github.fge.jsonschema.processors.format,
- com.github.fge.jsonschema.processors.syntax,
- com.github.fge.jsonschema.processors.validation,
- com.github.fge.msgsimple,
- com.github.fge.msgsimple.bundle,
- com.github.fge.msgsimple.load,
- com.github.fge.msgsimple.locale,
- com.github.fge.msgsimple.provider,
- com.github.fge.msgsimple.source,
- com.github.fge.uritemplate,
- com.github.fge.uritemplate.expression,
- com.github.fge.uritemplate.parse,
- com.github.fge.uritemplate.render,
- com.github.fge.uritemplate.vars,
- com.github.fge.uritemplate.vars.specs,
- com.github.fge.uritemplate.vars.values,
- com.github.jknack.handlebars,
- com.github.jknack.handlebars.cache,
- com.github.jknack.handlebars.context,
- com.github.jknack.handlebars.helper,
- com.github.jknack.handlebars.internal,
- com.github.jknack.handlebars.internal.antlr,
- com.github.jknack.handlebars.internal.antlr.atn,
- com.github.jknack.handlebars.internal.antlr.dfa,
- com.github.jknack.handlebars.internal.antlr.misc,
- com.github.jknack.handlebars.internal.antlr.tree,
- com.github.jknack.handlebars.internal.antlr.tree.pattern,
- com.github.jknack.handlebars.internal.antlr.tree.xpath,
- com.github.jknack.handlebars.internal.lang3,
- com.github.jknack.handlebars.internal.lang3.builder,
- com.github.jknack.handlebars.internal.lang3.exception,
- com.github.jknack.handlebars.internal.lang3.function,
- com.github.jknack.handlebars.internal.lang3.math,
- com.github.jknack.handlebars.internal.lang3.mutable,
- com.github.jknack.handlebars.internal.lang3.text,
- com.github.jknack.handlebars.internal.lang3.text.translate,
- com.github.jknack.handlebars.internal.lang3.time,
- com.github.jknack.handlebars.internal.lang3.tuple,
- com.github.jknack.handlebars.internal.path,
- com.github.jknack.handlebars.internal.text,
- com.github.jknack.handlebars.internal.text.matcher,
- com.github.jknack.handlebars.internal.text.translate,
- com.github.jknack.handlebars.io,
- com.google.common.annotations,
- com.google.common.base,
- com.google.common.base.internal,
- com.google.common.cache,
- com.google.common.collect,
- com.google.common.escape,
- com.google.common.eventbus,
- com.google.common.graph,
- com.google.common.hash,
- com.google.common.html,
- com.google.common.io,
- com.google.common.math,
- com.google.common.net,
- com.google.common.primitives,
- com.google.common.reflect,
- com.google.common.util.concurrent,
- com.google.common.util.concurrent.internal,
- com.google.common.xml,
- com.google.errorprone.annotations,
- com.google.errorprone.annotations.concurrent,
- com.google.i18n.phonenumbers,
- com.google.i18n.phonenumbers.internal,
- com.google.j2objc.annotations,
- com.google.thirdparty.publicsuffix,
- com.mifmif.common.regex,
- com.mifmif.common.regex.util,
- com.samskivert.mustache,
- com.sun.jna,
- com.sun.jna.internal,
- com.sun.jna.ptr,
- com.sun.jna.win32,
- com.sun.mail.auth,
- com.sun.mail.handlers,
- com.sun.mail.util,
- dk.brics.automaton,
- io.airlift.airline,
- io.airlift.airline.model,
- io.swagger.annotations,
- io.swagger.config,
- io.swagger.converter,
- io.swagger.core.filter,
- io.swagger.deserializer,
- io.swagger.io,
- io.swagger.jackson,
- io.swagger.jackson.mixin,
- io.swagger.model,
- io.swagger.models,
- io.swagger.models.apideclaration,
- io.swagger.models.auth,
- io.swagger.models.parameters,
- io.swagger.models.properties,
- io.swagger.models.reader,
- io.swagger.models.refs,
- io.swagger.models.resourcelisting,
- io.swagger.models.utils,
- io.swagger.parser,
- io.swagger.parser.processors,
- io.swagger.parser.util,
- io.swagger.reader,
- io.swagger.report,
- io.swagger.transform.migrate,
- io.swagger.transform.migrate.resourcelisting,
- io.swagger.transform.util,
- io.swagger.util,
- io.swagger.v3.core.converter,
- io.swagger.v3.core.filter,
- io.swagger.v3.core.jackson,
- io.swagger.v3.core.jackson.mixin,
- io.swagger.v3.core.model,
- io.swagger.v3.core.util,
- io.swagger.v3.oas.annotations,
- io.swagger.v3.oas.annotations.callbacks,
- io.swagger.v3.oas.annotations.enums,
- io.swagger.v3.oas.annotations.extensions,
- io.swagger.v3.oas.annotations.headers,
- io.swagger.v3.oas.annotations.info,
- io.swagger.v3.oas.annotations.links,
- io.swagger.v3.oas.annotations.media,
- io.swagger.v3.oas.annotations.parameters,
- io.swagger.v3.oas.annotations.responses,
- io.swagger.v3.oas.annotations.security,
- io.swagger.v3.oas.annotations.servers,
- io.swagger.v3.oas.annotations.tags,
- io.swagger.v3.oas.models,
- io.swagger.v3.oas.models.annotations,
- io.swagger.v3.oas.models.callbacks,
- io.swagger.v3.oas.models.examples,
- io.swagger.v3.oas.models.headers,
- io.swagger.v3.oas.models.info,
- io.swagger.v3.oas.models.links,
- io.swagger.v3.oas.models.media,
- io.swagger.v3.oas.models.parameters,
- io.swagger.v3.oas.models.responses,
- io.swagger.v3.oas.models.security,
- io.swagger.v3.oas.models.servers,
- io.swagger.v3.oas.models.tags,
- io.swagger.v3.parser,
- io.swagger.v3.parser.converter,
- io.swagger.v3.parser.core.extensions,
- io.swagger.v3.parser.core.models,
- io.swagger.v3.parser.exception,
- io.swagger.v3.parser.extensions,
- io.swagger.v3.parser.models,
- io.swagger.v3.parser.processors,
- io.swagger.v3.parser.reference,
- io.swagger.v3.parser.util,
- io.swagger.validate,
- javax.activation,
- javax.annotation,
- javax.annotation.concurrent,
- javax.annotation.meta,
- javax.inject,
- javax.mail,
- javax.mail.event,
- javax.mail.internet,
- javax.mail.search,
- javax.mail.util,
- javax.validation,
- javax.validation.bootstrap,
- javax.validation.constraints,
- javax.validation.constraintvalidation,
- javax.validation.executable,
- javax.validation.groups,
- javax.validation.metadata,
- javax.validation.spi,
- javax.validation.valueextraction,
- javax.xml.bind,
- javax.xml.bind.annotation,
- javax.xml.bind.annotation.adapters,
- javax.xml.bind.attachment,
- javax.xml.bind.helpers,
- javax.xml.bind.util,
- joptsimple,
- joptsimple.internal,
- joptsimple.util,
- net.sf.cglib.asm,
- net.sf.cglib.asm.signature,
- net.sf.cglib.beans,
- net.sf.cglib.core,
- net.sf.cglib.proxy,
- net.sf.cglib.reflect,
- net.sf.cglib.transform,
- net.sf.cglib.transform.impl,
- net.sf.cglib.util,
- org.apache.commons.cli,
- org.apache.commons.codec,
- org.apache.commons.codec.binary,
- org.apache.commons.codec.cli,
- org.apache.commons.codec.digest,
- org.apache.commons.codec.language,
- org.apache.commons.codec.language.bm,
- org.apache.commons.codec.net,
- org.apache.commons.io,
- org.apache.commons.io.comparator,
- org.apache.commons.io.file,
- org.apache.commons.io.file.spi,
- org.apache.commons.io.filefilter,
- org.apache.commons.io.function,
- org.apache.commons.io.input,
- org.apache.commons.io.input.buffer,
- org.apache.commons.io.monitor,
- org.apache.commons.io.output,
- org.apache.commons.io.serialization,
- org.apache.commons.lang3,
- org.apache.commons.lang3.arch,
- org.apache.commons.lang3.builder,
- org.apache.commons.lang3.compare,
- org.apache.commons.lang3.concurrent,
- org.apache.commons.lang3.concurrent.locks,
- org.apache.commons.lang3.event,
- org.apache.commons.lang3.exception,
- org.apache.commons.lang3.function,
- org.apache.commons.lang3.math,
- org.apache.commons.lang3.mutable,
- org.apache.commons.lang3.reflect,
- org.apache.commons.lang3.stream,
- org.apache.commons.lang3.text,
- org.apache.commons.lang3.text.translate,
- org.apache.commons.lang3.time,
- org.apache.commons.lang3.tuple,
- org.apache.commons.logging,
- org.apache.commons.logging.impl,
- org.apache.commons.text,
- org.apache.commons.text.diff,
- org.apache.commons.text.io,
- org.apache.commons.text.lookup,
- org.apache.commons.text.matcher,
- org.apache.commons.text.numbers,
- org.apache.commons.text.similarity,
- org.apache.commons.text.translate,
- org.apache.http,
- org.apache.http.annotation,
- org.apache.http.auth,
- org.apache.http.auth.params,
- org.apache.http.client,
- org.apache.http.client.config,
- org.apache.http.client.entity,
- org.apache.http.client.methods,
- org.apache.http.client.params,
- org.apache.http.client.protocol,
- org.apache.http.client.utils,
- org.apache.http.concurrent,
- org.apache.http.config,
- org.apache.http.conn,
- org.apache.http.conn.params,
- org.apache.http.conn.routing,
- org.apache.http.conn.scheme,
- org.apache.http.conn.socket,
- org.apache.http.conn.ssl,
- org.apache.http.conn.util,
- org.apache.http.cookie,
- org.apache.http.cookie.params,
- org.apache.http.entity,
- org.apache.http.impl,
- org.apache.http.impl.auth,
- org.apache.http.impl.bootstrap,
- org.apache.http.impl.client,
- org.apache.http.impl.conn,
- org.apache.http.impl.conn.tsccm,
- org.apache.http.impl.cookie,
- org.apache.http.impl.entity,
- org.apache.http.impl.execchain,
- org.apache.http.impl.io,
- org.apache.http.impl.pool,
- org.apache.http.io,
- org.apache.http.message,
- org.apache.http.params,
- org.apache.http.pool,
- org.apache.http.protocol,
- org.apache.http.ssl,
- org.apache.http.util,
- org.checkerframework.checker.builder.qual,
- org.checkerframework.checker.calledmethods.qual,
- org.checkerframework.checker.compilermsgs.qual,
- org.checkerframework.checker.fenum.qual,
- org.checkerframework.checker.formatter.qual,
- org.checkerframework.checker.guieffect.qual,
- org.checkerframework.checker.i18n.qual,
- org.checkerframework.checker.i18nformatter.qual,
- org.checkerframework.checker.index.qual,
- org.checkerframework.checker.initialization.qual,
- org.checkerframework.checker.interning.qual,
- org.checkerframework.checker.lock.qual,
- org.checkerframework.checker.nullness.qual,
- org.checkerframework.checker.optional.qual,
- org.checkerframework.checker.regex.qual,
- org.checkerframework.checker.signature.qual,
- org.checkerframework.checker.signedness.qual,
- org.checkerframework.checker.tainting.qual,
- org.checkerframework.checker.units.qual,
- org.checkerframework.checker.units.qual,
- org.checkerframework.common.aliasing.qual,
- org.checkerframework.common.initializedfields.qual,
- org.checkerframework.common.reflection.qual,
- org.checkerframework.common.returnsreceiver.qual,
- org.checkerframework.common.subtyping.qual,
- org.checkerframework.common.util.report.qual,
- org.checkerframework.common.value.qual,
- org.checkerframework.dataflow.qual,
- org.checkerframework.framework.qual,
- org.codehaus.commons.compiler,
- org.codehaus.commons.compiler.io,
- org.codehaus.commons.compiler.java8.java.util,
- org.codehaus.commons.compiler.java8.java.util.function,
- org.codehaus.commons.compiler.java8.java.util.stream,
- org.codehaus.commons.compiler.java9.java.lang.module,
- org.codehaus.commons.compiler.samples,
- org.codehaus.commons.compiler.util,
- org.codehaus.commons.compiler.util.iterator,
- org.codehaus.commons.compiler.util.reflect,
- org.codehaus.commons.compiler.util.resource,
- org.codehaus.commons.nullanalysis,
- org.codehaus.janino,
- org.codehaus.janino.samples,
- org.codehaus.janino.tools,
- org.codehaus.janino.util,
- org.commonmark,
- org.commonmark.internal,
- org.commonmark.internal.inline,
- org.commonmark.internal.renderer,
- org.commonmark.internal.renderer.text,
- org.commonmark.internal.util,
- org.commonmark.node,
- org.commonmark.parser,
- org.commonmark.parser.block,
- org.commonmark.parser.delimiter,
- org.commonmark.renderer,
- org.commonmark.renderer.html,
- org.commonmark.renderer.text,
- org.hamcrest,
- org.hamcrest.beans,
- org.hamcrest.collection,
- org.hamcrest.core,
- org.hamcrest.generator,
- org.hamcrest.generator.config,
- org.hamcrest.generator.qdox,
- org.hamcrest.generator.qdox.ant,
- org.hamcrest.generator.qdox.directorywalker,
- org.hamcrest.generator.qdox.junit,
- org.hamcrest.generator.qdox.model,
- org.hamcrest.generator.qdox.model.util,
- org.hamcrest.generator.qdox.parser,
- org.hamcrest.generator.qdox.parser.impl,
- org.hamcrest.generator.qdox.parser.structs,
- org.hamcrest.generator.qdox.tools,
- org.hamcrest.integration,
- org.hamcrest.internal,
- org.hamcrest.number,
- org.hamcrest.object,
- org.hamcrest.text,
- org.hamcrest.text.pattern,
- org.hamcrest.text.pattern.internal.ast,
- org.hamcrest.text.pattern.internal.naming,
- org.hamcrest.xml,
- org.joda.time,
- org.joda.time.base,
- org.joda.time.chrono,
- org.joda.time.convert,
- org.joda.time.field,
- org.joda.time.format,
- org.joda.time.tz,
- org.mozilla.classfile,
- org.mozilla.javascript,
- org.mozilla.javascript.annotations,
- org.mozilla.javascript.ast,
- org.mozilla.javascript.commonjs.module,
- org.mozilla.javascript.commonjs.module.provider,
- org.mozilla.javascript.debug,
- org.mozilla.javascript.jdk13,
- org.mozilla.javascript.jdk15,
- org.mozilla.javascript.json,
- org.mozilla.javascript.optimizer,
- org.mozilla.javascript.regexp,
- org.mozilla.javascript.serialize,
- org.mozilla.javascript.tools,
- org.mozilla.javascript.tools.debugger,
- org.mozilla.javascript.tools.debugger.treetable,
- org.mozilla.javascript.tools.idswitch,
- org.mozilla.javascript.tools.jsc,
- org.mozilla.javascript.tools.shell,
- org.mozilla.javascript.typedarrays,
- org.mozilla.javascript.v8dtoa,
- org.mozilla.javascript.xml,
- org.mozilla.javascript.xmlimpl,
- org.objenesis,
- org.objenesis.instantiator,
- org.objenesis.instantiator.basic,
- org.objenesis.instantiator.gcj,
- org.objenesis.instantiator.jrockit,
- org.objenesis.instantiator.perc,
- org.objenesis.instantiator.sun,
- org.objenesis.strategy,
- org.openapitools.codegen,
- org.openapitools.codegen.api,
- org.openapitools.codegen.auth,
- org.openapitools.codegen.cmd,
- org.openapitools.codegen.config,
- org.openapitools.codegen.examples,
- org.openapitools.codegen.exceptions,
- org.openapitools.codegen.ignore,
- org.openapitools.codegen.ignore.rules,
- org.openapitools.codegen.languages,
- org.openapitools.codegen.languages.features,
- org.openapitools.codegen.meta,
- org.openapitools.codegen.meta.features,
- org.openapitools.codegen.meta.features.annotations,
- org.openapitools.codegen.model,
- org.openapitools.codegen.serializer,
- org.openapitools.codegen.templating,
- org.openapitools.codegen.templating.handlebars,
- org.openapitools.codegen.templating.mustache,
- org.openapitools.codegen.utils,
- org.openapitools.codegen.validation,
- org.openapitools.codegen.validations.oas,
- org.slf4j,
- org.slf4j.agent,
- org.slf4j.cal10n,
- org.slf4j.event,
- org.slf4j.ext,
- org.slf4j.helpers,
- org.slf4j.impl,
- org.slf4j.instrumentation,
- org.slf4j.profiler,
- org.slf4j.spi,
- org.threeten.bp,
- org.threeten.bp.chrono,
- org.threeten.bp.format,
- org.threeten.bp.jdk8,
- org.threeten.bp.temporal,
- org.threeten.bp.zone,
- org.yaml.snakeyaml,
- org.yaml.snakeyaml.comments,
- org.yaml.snakeyaml.composer,
- org.yaml.snakeyaml.constructor,
- org.yaml.snakeyaml.emitter,
- org.yaml.snakeyaml.env,
- org.yaml.snakeyaml.error,
- org.yaml.snakeyaml.events,
- org.yaml.snakeyaml.extensions.compactnotation,
- org.yaml.snakeyaml.external.biz.base64Coder,
- org.yaml.snakeyaml.external.com.google.gdata.util.common.base,
- org.yaml.snakeyaml.introspector,
- org.yaml.snakeyaml.nodes,
- org.yaml.snakeyaml.parser,
- org.yaml.snakeyaml.reader,
- org.yaml.snakeyaml.representer,
- org.yaml.snakeyaml.resolver,
- org.yaml.snakeyaml.scanner,
- org.yaml.snakeyaml.serializer,
- org.yaml.snakeyaml.tokens,
- org.yaml.snakeyaml.util
-Automatic-Module-Name: org.etsi.mts.tdl.openapi.generator.wrapper
diff --git a/plugins/org.etsi.mts.tdl.openapi.generator.wrapper/README.md b/plugins/org.etsi.mts.tdl.openapi.generator.wrapper/README.md
deleted file mode 100644
index 2b0038941c2e58d345748ac6473abe28018e9972..0000000000000000000000000000000000000000
--- a/plugins/org.etsi.mts.tdl.openapi.generator.wrapper/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# OpenAPI Generator Wrapper
-
-This plug-in wraps the [OpenAPI Generator](https://openapi-generator.tech) licensed unter the Apache 2.0 Software License for consumption as an Eclipse plug-in. It is currently used as a dependency in the OpenAPI-to-TDL generator and in the OpenAPI Generator UI components.
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.openapi.generator.wrapper/build.properties b/plugins/org.etsi.mts.tdl.openapi.generator.wrapper/build.properties
deleted file mode 100644
index 948c28979fb4a207c4a32617ead2251ba716b495..0000000000000000000000000000000000000000
--- a/plugins/org.etsi.mts.tdl.openapi.generator.wrapper/build.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-bin.includes = META-INF/,\
-               openapi-generator-cli-6.3.0.jar
diff --git a/plugins/org.etsi.mts.tdl.openapi.generator.wrapper/openapi-generator-cli-6.3.0-javadoc.jar b/plugins/org.etsi.mts.tdl.openapi.generator.wrapper/openapi-generator-cli-6.3.0-javadoc.jar
deleted file mode 100644
index 5bf67c86b696f7e7eef91a1320dadba75e8c0b22..0000000000000000000000000000000000000000
Binary files a/plugins/org.etsi.mts.tdl.openapi.generator.wrapper/openapi-generator-cli-6.3.0-javadoc.jar and /dev/null differ
diff --git a/plugins/org.etsi.mts.tdl.openapi.generator.wrapper/openapi-generator-cli-6.3.0-sources.jar b/plugins/org.etsi.mts.tdl.openapi.generator.wrapper/openapi-generator-cli-6.3.0-sources.jar
deleted file mode 100644
index dee84f9739105564c7acb24c32c3ca1740725764..0000000000000000000000000000000000000000
Binary files a/plugins/org.etsi.mts.tdl.openapi.generator.wrapper/openapi-generator-cli-6.3.0-sources.jar and /dev/null differ
diff --git a/plugins/org.etsi.mts.tdl.openapi.generator.wrapper/openapi-generator-cli-6.3.0.jar b/plugins/org.etsi.mts.tdl.openapi.generator.wrapper/openapi-generator-cli-6.3.0.jar
deleted file mode 100644
index 4949a0640d27449bb844d625dde2c12dedb58bed..0000000000000000000000000000000000000000
Binary files a/plugins/org.etsi.mts.tdl.openapi.generator.wrapper/openapi-generator-cli-6.3.0.jar and /dev/null differ
diff --git a/plugins/org.etsi.mts.tdl.openapi2tdl.next/src/org/etsi/mts/tdl/openapi2tdl/next/ConverterNext.java b/plugins/org.etsi.mts.tdl.openapi2tdl.next/src/org/etsi/mts/tdl/openapi2tdl/next/ConverterNext.java
index 94e6c92da3d041aee8562773da2cbebfec8d4388..af15ab57b7a6b46d8ced91f11978d06448050906 100644
--- a/plugins/org.etsi.mts.tdl.openapi2tdl.next/src/org/etsi/mts/tdl/openapi2tdl/next/ConverterNext.java
+++ b/plugins/org.etsi.mts.tdl.openapi2tdl.next/src/org/etsi/mts/tdl/openapi2tdl/next/ConverterNext.java
@@ -57,10 +57,10 @@ public class ConverterNext {
 		try {
 			Resource tr = TDLHelper.create(outputPath);
 			translator.setTargetResource(tr);
-			translator.initTargetResource(translator.cleanName(new File(inputPath).getName()));
+			translator.initTargetResource(translator.getCleanName(new File(inputPath).getName()));
 			translator.translate(inputPath);
 			name = ((Package) tr.getContents().get(0)).getName();
-			TDLHelper.store(tr);
+			TDLHelper.store(tr, true);
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
diff --git a/plugins/org.etsi.mts.tdl.openapi2tdl.next/src/org/etsi/mts/tdl/openapi2tdl/next/OpenAPI2TDLTranslatorNext.java b/plugins/org.etsi.mts.tdl.openapi2tdl.next/src/org/etsi/mts/tdl/openapi2tdl/next/OpenAPI2TDLTranslatorNext.java
index b1a39b41dfe67d4a70f0532697a344f3d6f0d5a1..86e308aac15974793263be1ae80569980697a088 100644
--- a/plugins/org.etsi.mts.tdl.openapi2tdl.next/src/org/etsi/mts/tdl/openapi2tdl/next/OpenAPI2TDLTranslatorNext.java
+++ b/plugins/org.etsi.mts.tdl.openapi2tdl.next/src/org/etsi/mts/tdl/openapi2tdl/next/OpenAPI2TDLTranslatorNext.java
@@ -22,11 +22,9 @@ import org.etsi.mts.tdl.DataType;
 import org.etsi.mts.tdl.DataUse;
 import org.etsi.mts.tdl.ElementImport;
 import org.etsi.mts.tdl.EnumDataType;
-import org.etsi.mts.tdl.Extension;
 import org.etsi.mts.tdl.LiteralValueUse;
 import org.etsi.mts.tdl.Member;
 import org.etsi.mts.tdl.MemberAssignment;
-import org.etsi.mts.tdl.NamedElement;
 import org.etsi.mts.tdl.Package;
 import org.etsi.mts.tdl.PackageableElement;
 import org.etsi.mts.tdl.ParameterBinding;
@@ -35,7 +33,6 @@ import org.etsi.mts.tdl.SimpleDataInstance;
 import org.etsi.mts.tdl.SimpleDataType;
 import org.etsi.mts.tdl.StructuredDataInstance;
 import org.etsi.mts.tdl.StructuredDataType;
-import org.etsi.mts.tdl.UnassignedMemberTreatment;
 import org.etsi.mts.tdl.tdlFactory;
 import org.etsi.mts.tdl.tdlPackage;
 import org.etsi.mts.tdl.helper.TDLHelper;
@@ -60,7 +57,6 @@ import io.swagger.v3.oas.models.Paths;
 import io.swagger.v3.oas.models.media.MediaType;
 import io.swagger.v3.oas.models.media.Schema;
 import io.swagger.v3.oas.models.parameters.Parameter;
-import io.swagger.v3.oas.models.parameters.QueryParameter;
 import io.swagger.v3.oas.models.parameters.RequestBody;
 import io.swagger.v3.parser.core.models.ParseOptions;
 import io.swagger.v3.parser.util.InlineModelResolver;
@@ -96,7 +92,7 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
 
 		model = parseSpec(filename, inline);
 		if (model.getInfo().getTitle() != null)
-			getGeneratedPackage().setName(cleanName(model.getInfo().getTitle()));
+			getGeneratedPackage().setName(getCleanName(model.getInfo().getTitle()));
 		drm = getTypeFor(sourceMappingTag, tdlPackage.Literals.DATA_RESOURCE_MAPPING);
 		drm.setResourceURI(new File(filename).getName());
 
@@ -146,6 +142,7 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
 		// Java mappings
 		Package mappingsPackage = null;
 		Package javaPackage = null;
+		AnnotationType mappingNameAnnot = null;
 		boolean generateJavaMappings = true;
 		if (preferences != null)
 			generateJavaMappings = preferences.getBoolean(PropertyPage.GENERATE_JAVA_MAPPING, false);
@@ -184,11 +181,12 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
 			for (PackageableElement e : theTdlPackage.getPackagedElement()) {
 				if (e.eClass().equals(tdlPackage.eINSTANCE.getAnnotationType())
 						&& e.getName().equals("MappingName")) {
+					mappingNameAnnot = (AnnotationType) e;
 					Annotation annot = tdlFactory.eINSTANCE.createAnnotation();
-					annot.setKey((AnnotationType) e);
+					annot.setKey(mappingNameAnnot);
 					annot.setValue("Java");
 					// XXX disabled due to serialization problem
-					 // drmTarget.getAnnotation().add(annot);
+					  drmTarget.getAnnotation().add(annot);
 					break;
 				}
 			}
@@ -197,6 +195,7 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
 
 		// Map operations to request body schemas so we can create wrappers later
 		Map<String, Set<PathOperation>> schemaOperations = new Hashtable<>();
+		Set<PathOperation> inlineSchemaOperations = new HashSet<>();
 		Set<PathOperation> noContentOperations = new HashSet<>();
 		Paths paths = model.getPaths();
 		for (String pathUri: paths.keySet()) {
@@ -210,21 +209,25 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
 					if (jsonContent != null) {
 						Schema schema = jsonContent.getSchema();
 						boolean array = false;
-						if (schema.getType() != null && schema.getType().equals("array")) {
+						if (getSchemaType(schema) != null && getSchemaType(schema).equals("array")) {
 							schema = schema.getItems();
 							array = true;
 						}
 						String schemaName = schema.get$ref();
-						schemaName = schemaName.replace("#/components/schemas/", "");
-						Set<PathOperation> set = schemaOperations.get(schemaName);
-						if (set == null) {
-							set = new HashSet<>();
-							schemaOperations.put(schemaName, set);
+						if (schemaName == null) {
+							inlineSchemaOperations.add(new PathOperation(pathUri, method, op, array, schema));
+						} else {
+							schemaName = schemaName.replace("#/components/schemas/", "");
+							Set<PathOperation> set = schemaOperations.get(schemaName);
+							if (set == null) {
+								set = new HashSet<>();
+								schemaOperations.put(schemaName, set);
+							}
+							set.add(new PathOperation(pathUri, method, op, array, null));
 						}
-						set.add(new PathOperation(pathUri, method, op, array));
 					}
 				} else {
-					noContentOperations.add(new PathOperation(pathUri, method, op, false));
+					noContentOperations.add(new PathOperation(pathUri, method, op, false, null));
 				}
 			}
 		}
@@ -254,6 +257,14 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
 		if (useMessageBasedApi) {
 			createOperationWrapper(noContentOperations, httpRequest, httpMethodEnum, httpRequestParameters, httpParameterLocationEnum);
 		}
+		for (PathOperation op : inlineSchemaOperations) {
+			Schema<?> schema = op.inlineSchema;
+			schema.setName(op.path.substring(1) + "_body");
+			DataType dataType = translate(schema, "", messageBody);
+			if (useMessageBasedApi) {
+				createOperationWrapper(Collections.singleton(op), httpRequest, httpMethodEnum, httpRequestParameters, httpParameterLocationEnum);
+			}
+		}
 		for (String schemaName : model.getComponents().getSchemas().keySet()) {
 			Schema<?> schema = model.getComponents().getSchemas().get(schemaName);
 			schema.setName(schemaName);
@@ -267,11 +278,21 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
 		}
 
 		if (generateJavaMappings && mappingsPackage!=null)
-			addMappings(filename, mappingsPackage, drmTarget, javaPackage);
+			addMappings(filename, mappingsPackage, drmTarget, javaPackage, mappingNameAnnot);
 
 		ensureUniqueNames(getGeneratedPackage());
 	}
 	
+	private String getSchemaType(Schema<?> schema) {
+		String type = schema.getType();
+		if (type == null) {
+			Set<String> types = schema.getTypes();
+			if (types != null && !types.isEmpty())
+				type = types.iterator().next();
+		}
+		return type;
+	}
+	
 	private void createOperationWrapper(Set<PathOperation> ops, StructuredDataType httpRequest,
 			EnumDataType httpMethodEnum, CollectionDataType httpRequestParameters,
 			EnumDataType httpParameterLocationEnum) {
@@ -394,7 +415,7 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
 			if (resourceClass.getSimpleName().equals("XtextResource")) {
 				isXtext = true;
 				break;
-			}
+	}
 			resourceClass = resourceClass.getSuperclass();
 		} while (resourceClass != null);
 
@@ -404,12 +425,11 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
 
 	private void addMapping(Schema<?> schema, DataType dataType, String sourceMappingTag, String targetMappingTag) {
 		DataElementMapping sourceMapping = addDataElementMapping("#/components/schemas/" + schema.getName() + "",
-				dataType, sourceMappingTag);
+				dataType, sourceMappingTag, drm);
 
 		// TODO: make configurable?
 		DataElementMapping targetMapping = addDataElementMapping("" + schema.getName() + "", dataType,
-				targetMappingTag);
-		targetMapping.setDataResourceMapping(drmTarget);
+				targetMappingTag, drmTarget);
 
 		if (dataType instanceof StructuredDataType) {
 			for (Member m : ((StructuredDataType) dataType).getMember()) {
@@ -418,9 +438,28 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
 			}
 		}
 	}
+	
+	private void getAllProperties(Schema<?> schema, Map<String, Schema> properties) {
+		String reference = schema.get$ref();
+		if (reference != null)
+			schema = ModelUtils.getReferencedSchema(model, schema);
+		List<Schema> xOf = schema.getAllOf();
+		if (xOf == null)
+			xOf = schema.getAnyOf();
+		if (xOf == null)
+			xOf = schema.getOneOf();
+		if (xOf != null) {
+			for (Schema ofSchema : xOf)
+				this.getAllProperties(ofSchema, properties);
+		}
+		if (schema.getProperties() != null)
+			properties.putAll(schema.getProperties());
+	}
 
 	private DataType translate(Schema<?> schema, String prefix, DataType superType) {
-		if (schema.getType() == null && (schema.getProperties() == null || schema.getProperties().isEmpty())) {
+		Map<String, Schema> properties = new Hashtable<>();
+		this.getAllProperties(schema, properties);
+		if (getSchemaType(schema) == null && properties.isEmpty()) {
 			if (schema.getName() == null) {
 				System.out.println("Why?");
 			}
@@ -430,12 +469,11 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
 			if (schema.getName() == null) {
 				name = prefix + "___item";
 			}
-			if (schema.getProperties() != null && !schema.getProperties().isEmpty()
-					|| schema.getType().equals("object")) {
+			if (!properties.isEmpty() || getSchemaType(schema).equals("object")) {
 				DataType t = translateObject(schema, name);
 				addSuperType(t, superType);
 				return t;
-			} else if (schema.getType().equals("array")) {
+			} else if (getSchemaType(schema).equals("array")) {
 				return translateArray(schema, name);
 			} else {
 				return translateSimpleType(schema, superType);
@@ -446,7 +484,8 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
 	private DataType translateSimpleType(Schema<?> schema, DataType superType) {
 		String name = schema.getName();
 		if (name == null)
-			name = schema.getType();
+			name = getSchemaType(schema);
+		
 
 		if (this.theTdlPackage != null) {
 			if (name.equals("string") || name.equals("integer") || name.equals("boolean")) {
@@ -462,13 +501,19 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
 			EnumDataType t = getEnumDataTypeFor(name);
 			if (t.getValue().isEmpty())
 				for (Object literal : schema.getEnum()) {
-					if (literal instanceof String) {
-						SimpleDataInstance literalData = tdlFactory.eINSTANCE.createSimpleDataInstance();
-						literalData.setName(getCleanName((String) literal));
-						literalData.setDataType(t);
-						t.getValue().add(literalData);
-					}
-					// TODO what if enum literals are not Strings?
+					String literalName;
+					if (literal instanceof String)
+						literalName = (String)literal;
+					else if (literal instanceof Integer)
+						literalName = name + "_" + ((Integer)literal).toString();
+					else
+						// TODO what if enum literals are not Strings or Integers?
+						continue;
+
+					SimpleDataInstance literalData = tdlFactory.eINSTANCE.createSimpleDataInstance();
+					literalData.setName(getCleanName(literalName));
+					literalData.setDataType(t);
+					t.getValue().add(literalData);
 				}
 			return t;
 
@@ -479,38 +524,15 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
 		}
 	}
 
-	private <T extends DataType> void addSuperType(T type, T superType) {
-		if (superType == null)
-			return;
-		List<Extension> ext = null;
-		if (type instanceof SimpleDataType) {
-			Extension extension = ((SimpleDataType) type).getExtension();
-			if (extension != null)
-				ext = Collections.singletonList(extension);
-		}
-		if (type instanceof StructuredDataType)
-			ext = ((StructuredDataType) type).getExtension();
-		if (ext == null)
-			return;
-		for (Extension e : ext) {
-			if (e.getExtending().equals(superType))
-				return;
-		}
-		Extension e = tdlFactory.eINSTANCE.createExtension();
-		e.setExtending(superType);
-		if (type instanceof SimpleDataType)
-			((SimpleDataType) type).setExtension(e);
-		if (type instanceof StructuredDataType)
-			((StructuredDataType) type).getExtension().add(e);
-	}
-
 	private DataType translateObject(Schema<?> schema, String name) {
+		Map<String, Schema> properties = new Hashtable<>();
+		this.getAllProperties(schema, properties);
 		StructuredDataType dataType = getStructuredDataTypeFor(name);
-		if (schema.getProperties() == null || !dataType.getMember().isEmpty()) {
+		if (properties.isEmpty() || !dataType.getMember().isEmpty()) {
 			return dataType;
 		}
-		for (Object propertyName : schema.getProperties().keySet()) {
-			Schema<?> propertySchema = (Schema<?>) schema.getProperties().get(propertyName);
+		for (Object propertyName : properties.keySet()) {
+			Schema<?> propertySchema = (Schema<?>) properties.get(propertyName);
 			String reference = propertySchema.get$ref();
 			DataType memberType = null;
 			if (reference != null) {
@@ -545,7 +567,7 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
 		collectionType.setItemType(itemType);
 		return collectionType;
 	}
-
+	
 	public String getCleanName(String name) {
 		
 		String replacement = name;
@@ -562,32 +584,6 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
 		return replacement;
 	}
 	
-	public void ensureUniqueNames(Package p) {
-		Set<String> names = new HashSet<>();
-		for (PackageableElement pe: p.getPackagedElement()) {
-			makeUnique(pe, names);
-			if (pe instanceof EnumDataType)
-				for (PackageableElement l: ((EnumDataType) pe).getValue()) 
-					makeUnique(l, names);
-			else if (pe instanceof Package) {
-				ensureUniqueNames((Package) pe);
-			}
-		}
-		
-	}
-	
-	private void makeUnique(NamedElement e, Set<String> names) {
-		String name = e.getName();
-		int i = 1;
-		String newName = name;
-		while (names.contains(newName)) {
-			newName = name + "_" + i++;
-		}
-		if (!newName.equals(name))
-			e.setName(newName);
-		names.add(newName);
-	}
-
 	/**
 	 * Helper method for parsing specs into an intermediary OpenAPI structure for
 	 * pre-processing.
@@ -600,9 +596,13 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
 	 *
 	 * @param specFilePath The path to the specification file
 	 * @return A "raw" OpenAPI document
+	 * @throws Exception 
 	 */
-	public static OpenAPI parseSpec(String specFilePath, Boolean processInline) {
+	public static OpenAPI parseSpec(String specFilePath, Boolean processInline) throws Exception {
 		OpenAPI openAPI = new OpenAPIParser().readLocation(specFilePath, null, new ParseOptions()).getOpenAPI();
+		
+		if (openAPI == null)
+			throw new Exception("Failed to parse '" + specFilePath + "', make sure it's valid ");
 		// Invoke helper function to get the original swagger version.
 		// See https://github.com/swagger-api/swagger-parser/pull/1374
 		// Also see https://github.com/swagger-api/swagger-parser/issues/1369.
@@ -621,21 +621,23 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
 		String path;
 		HttpMethod method;
 		Operation operation;
+		Schema<?> inlineSchema;
 		boolean array;
-		public PathOperation(String path, HttpMethod method, Operation operation, boolean array) {
+		public PathOperation(String path, HttpMethod method, Operation operation, boolean array, Schema<?> inlineSchema) {
 			this.path = path;
 			this.method = method;
 			this.operation = operation;
+			this.inlineSchema = inlineSchema;
 			this.array = array;
 		}
 	}
 
-	public void addMappings(String filename, Package mappingsPackage, DataResourceMapping resourceMapping, Package javaPackage) {
+	public void addMappings(String filename, Package mappingsPackage, DataResourceMapping resourceMapping, Package javaPackage, AnnotationType mappingNameAnnot) {
 		
 		CodegenConfigurator configurator = new CodegenConfigurator();
 		// We create our own but the setting is required by the configurator
 		configurator.setGeneratorName("java");
-		configurator.setInputSpec(filename);
+		configurator.setInputSpec(filename.replaceAll("\\\\", "/"));
 		// Set rest of configuration options directly to config (JavaClientCodegen)
 
 		// Originally...
@@ -682,12 +684,27 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
 					
 					if (type instanceof EnumDataType) {
 						
+						DataResourceMapping eResourceMapping = tdlFactory.eINSTANCE.createDataResourceMapping();
+						mappingsPackage.getPackagedElement().add(eResourceMapping);
+						eResourceMapping.setName(getCleanName(name) + "_ResourceMapping");
+						eResourceMapping.setResourceURI(resourceMapping.getResourceURI() + "." + codeGen.getClassname());
+						ca = tdlFactory.eINSTANCE.createAnnotation();
+						ca.setKey(classAnnotation);
+						eResourceMapping.getAnnotation().add(ca);
+						Annotation mna = tdlFactory.eINSTANCE.createAnnotation();
+						mna.setKey(mappingNameAnnot);
+						mna.setValue("Java");
+						eResourceMapping.getAnnotation().add(mna);
+						
 						List<Map<String, String>> enumVars = (List<Map<String, String>>) codeGen.getAllowableValues().get("enumVars");
 						for (Map<String, String> enumVar : enumVars) {
 							String javaName = enumVar.get("name");
 							String modelName = enumVar.get("value");
 							// Wrapped in ""
-							modelName = modelName.substring(1, modelName.length() - 1);
+							if (modelName.startsWith("\""))
+								modelName = modelName.substring(1, modelName.length() - 1);
+							else
+								modelName = name + "_" + modelName;
 							
 							SimpleDataInstance literal = null;
 							for (SimpleDataInstance l: ((EnumDataType) type).getValue()) {
@@ -704,11 +721,11 @@ public class OpenAPI2TDLTranslatorNext extends AbstractTranslator {
 							lMapping.setName(getCleanName(name) + "_" + getCleanName(modelName) + "_Mapping");
 							lMapping.setMappableDataElement(literal);
 							lMapping.setElementURI(javaName);
-							lMapping.setDataResourceMapping(resourceMapping);
+							lMapping.setDataResourceMapping(eResourceMapping);
 						}
 						
 					} else  if (type instanceof StructuredDataType) {
-						for (CodegenProperty var: codeGen.getVars()) {
+						for (CodegenProperty var: codeGen.getAllVars()) {
 							String vName = var.getBaseName();
 							Member member = null;
 							for (Member m: ((StructuredDataType) type).allMembers()) {
diff --git a/plugins/org.etsi.mts.tdl.openapi2tdl/.project b/plugins/org.etsi.mts.tdl.openapi2tdl/.project
index 7336176b0d424370ccc6e446d41208e0df0e5695..5cbc827267c6c8d4ac136ea92adccd17c9266fc3 100644
--- a/plugins/org.etsi.mts.tdl.openapi2tdl/.project
+++ b/plugins/org.etsi.mts.tdl.openapi2tdl/.project
@@ -25,4 +25,15 @@
 		<nature>org.eclipse.pde.PluginNature</nature>
 		<nature>org.eclipse.jdt.core.javanature</nature>
 	</natures>
+	<filteredResources>
+		<filter>
+			<id>1705077780112</id>
+			<name></name>
+			<type>30</type>
+			<matcher>
+				<id>org.eclipse.core.resources.regexFilterMatcher</id>
+				<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
 </projectDescription>
diff --git a/plugins/org.etsi.mts.tdl.project/.project b/plugins/org.etsi.mts.tdl.project/.project
index 953b7fc27c88cd41cb186b72eeb8b8ad4f72213a..fdd75f3372ca13f7c50a55878eebf2895b01afd2 100644
--- a/plugins/org.etsi.mts.tdl.project/.project
+++ b/plugins/org.etsi.mts.tdl.project/.project
@@ -31,4 +31,15 @@
 		<nature>org.eclipse.pde.PluginNature</nature>
 		<nature>org.eclipse.jdt.core.javanature</nature>
 	</natures>
+	<filteredResources>
+		<filter>
+			<id>1705077780115</id>
+			<name></name>
+			<type>30</type>
+			<matcher>
+				<id>org.eclipse.core.resources.regexFilterMatcher</id>
+				<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
 </projectDescription>
diff --git a/plugins/org.etsi.mts.tdl.rt.ui/src/org/etsi/mts/tdl/tools/rt/ui/handlers/TranslationHandler.java b/plugins/org.etsi.mts.tdl.rt.ui/src/org/etsi/mts/tdl/tools/rt/ui/handlers/TranslationHandler.java
index c64d5860351dcf52e3400dcce671bc3c05ed02b9..fb6e8c9099c4ad92a75b507afce50d7edc6eb37e 100644
--- a/plugins/org.etsi.mts.tdl.rt.ui/src/org/etsi/mts/tdl/tools/rt/ui/handlers/TranslationHandler.java
+++ b/plugins/org.etsi.mts.tdl.rt.ui/src/org/etsi/mts/tdl/tools/rt/ui/handlers/TranslationHandler.java
@@ -2,6 +2,7 @@ package org.etsi.mts.tdl.tools.rt.ui.handlers;
 
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Optional;
@@ -28,9 +29,13 @@ import org.eclipse.ui.dialogs.ElementListSelectionDialog;
 import org.eclipse.ui.handlers.HandlerUtil;
 import org.eclipse.ui.part.FileEditorInput;
 import org.eclipse.xtext.EcoreUtil2;
+import org.eclipse.xtext.resource.IResourceServiceProvider;
+import org.eclipse.xtext.resource.SaveOptions;
+import org.eclipse.xtext.resource.XtextResource;
 import org.eclipse.xtext.resource.XtextResourceSet;
 import org.eclipse.xtext.ui.resource.IResourceSetProvider;
 
+import com.google.common.collect.Maps;
 import com.google.inject.Guice;
 import com.google.inject.Inject;
 import com.google.inject.Injector;
@@ -108,9 +113,13 @@ public class TranslationHandler extends AbstractHandler {
 		
 		if (file !=null) {
 			URI uri = URI.createPlatformResourceURI(file.getFullPath().toString(), true);
-			ResourceSet rs = new ResourceSetImpl();
+			Injector injector = Guice.createInjector();
+			XtextResourceSet resourceSet = injector.getInstance(XtextResourceSet.class);
+//			ResourceSet rs = new ResourceSetImpl();
+			XtextResourceSet rs = resourceSet;
 			Resource r = rs.getResource(uri, true);
-			
+			EcoreUtil.resolveAll(r);
+
 			ElementListSelectionDialog dialog = new ElementListSelectionDialog(Display.getDefault().getActiveShell(), new LabelProvider());
 			dialog.setTitle("Translation Configuration");
 			dialog.setMessage("Translating "+file.getName()
@@ -123,16 +132,19 @@ public class TranslationHandler extends AbstractHandler {
 			if (dialog.open() != Window.OK) {
 				return false;
 			} else {
-				Injector injector = Guice.createInjector();
+//				Injector injector = Guice.createInjector();
 				Object[] result = dialog.getResult();
 				String selected = (String)result[0];
 				TranslationHandler.translationTarget = selected;
 				String extension = targetFormats.get(selected);
 				URI targetURI = URI.createURI(uri.toString()+"."+extension);
-				XtextResourceSet resourceSet = injector.getInstance(XtextResourceSet.class);
+//				XtextResourceSet resourceSet = injector.getInstance(XtextResourceSet.class);
+//				resourceSet = rs;
 				Resource tr = resourceSet.createResource(targetURI);
 				
 				tr.getContents().addAll(EcoreUtil.copyAll(r.getContents()));
+//				tr.getContents().addAll(r.getContents());
+//				tr.getContents().add(EcoreUtil2.cloneWithProxies(r.getContents().get(0)));
 				
 				//post-process StructuredTestObjectives
 				if (file.getName().endsWith("tplan2") && extension.startsWith("tdltx")) {
@@ -158,9 +170,14 @@ public class TranslationHandler extends AbstractHandler {
 				}
 				
 				try {
+					EcoreUtil.resolveAll(tr);
+//					EcoreUtil2.resolveAll(r, null);
+//				    HashMap<Object,Object> options = Maps.newHashMap();
+//				    options.put(XtextResource.OPTION_RESOLVE_ALL, true);
 					tr.save(null);
 				} catch (Exception e1) {
 					System.err.println("  Translation: "+e1.getMessage());
+					e1.printStackTrace();
 					//TODO: provide an error dialog, fall back to XF, indicate approximate location based on error message / details
 				}
 			}
diff --git a/plugins/org.etsi.mts.tdl.standalone/.project b/plugins/org.etsi.mts.tdl.standalone/.project
index 75f62ec98d5e313b00ac11df71ec04ff9103da56..4774c44a3d48a41158b031900d8d46655fcbef27 100644
--- a/plugins/org.etsi.mts.tdl.standalone/.project
+++ b/plugins/org.etsi.mts.tdl.standalone/.project
@@ -31,4 +31,15 @@
 		<nature>org.eclipse.pde.PluginNature</nature>
 		<nature>org.eclipse.jdt.core.javanature</nature>
 	</natures>
+	<filteredResources>
+		<filter>
+			<id>1705077780116</id>
+			<name></name>
+			<type>30</type>
+			<matcher>
+				<id>org.eclipse.core.resources.regexFilterMatcher</id>
+				<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
 </projectDescription>
diff --git a/plugins/org.etsi.mts.tdl.standalone/pom.xml b/plugins/org.etsi.mts.tdl.standalone/pom.xml
index 8e97c3d5d265cb1157416cfc9e01c8c10431c9e4..91f9c9b1f5f3bb8ef1d64101bd61b1532409cd4d 100644
--- a/plugins/org.etsi.mts.tdl.standalone/pom.xml
+++ b/plugins/org.etsi.mts.tdl.standalone/pom.xml
@@ -13,7 +13,13 @@
 		<extras.package.addjars>package</extras.package.addjars>
 		<extras.package.shade>package</extras.package.shade>
 	</properties>
-
+    <dependencies>
+        <dependency>
+            <groupId>org.eclipse.emf</groupId>
+            <artifactId>org.eclipse.emf.ecore</artifactId>
+            <version>2.35.0</version>
+        </dependency>
+    </dependencies>
 	<build>
 		<plugins>
  <plugin>
diff --git a/plugins/org.etsi.mts.tdl.standalone/src/org/etsi/mts/tdl/standalone/Standalone.java b/plugins/org.etsi.mts.tdl.standalone/src/org/etsi/mts/tdl/standalone/Standalone.java
index 4d1bc5cfb532d0c4b44ca29fa4bd31e6cf086637..d956cb35cf37bfd729c1c099548a871c959b8c5e 100644
--- a/plugins/org.etsi.mts.tdl.standalone/src/org/etsi/mts/tdl/standalone/Standalone.java
+++ b/plugins/org.etsi.mts.tdl.standalone/src/org/etsi/mts/tdl/standalone/Standalone.java
@@ -11,6 +11,7 @@ import java.security.CodeSource;
 import java.security.ProtectionDomain;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Comparator;
 import java.util.List;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
@@ -18,6 +19,7 @@ import java.util.stream.Collectors;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.epsilon.evl.execute.UnsatisfiedConstraint;
@@ -26,14 +28,28 @@ import org.eclipse.ocl.pivot.utilities.OCL;
 import org.eclipse.ocl.pivot.utilities.ParserException;
 import org.eclipse.ocl.pivot.utilities.Query;
 import org.eclipse.xtext.EcoreUtil2;
+import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
+import org.etsi.mts.tdl.ComponentInstance;
+import org.etsi.mts.tdl.ComponentInstanceRole;
 import org.etsi.mts.tdl.Extension;
 import org.etsi.mts.tdl.GateType;
 import org.etsi.mts.tdl.Package;
+import org.etsi.mts.tdl.Behaviour;
+import org.etsi.mts.tdl.CompoundBehaviour;
+import org.etsi.mts.tdl.BoundedLoopBehaviour;
+import org.etsi.mts.tdl.AlternativeBehaviour;
+import org.etsi.mts.tdl.ConditionalBehaviour;
+import org.etsi.mts.tdl.ProcedureCall;
+import org.etsi.mts.tdl.Interaction;
+import org.etsi.mts.tdl.Message;
 import org.etsi.mts.tdl.StructuredDataType;
+import org.etsi.mts.tdl.TestConfiguration;
+import org.etsi.mts.tdl.TestDescription;
 import org.etsi.mts.tdl.tdlPackage;
 import org.etsi.mts.tdl.asn2tdl.ASN2TDLTranslator;
 import org.etsi.mts.tdl.constraints.evl.Validator;
 import org.etsi.mts.tdl.helper.TDLHelper;
+import org.etsi.mts.tdl.impl.CompoundBehaviourImpl;
 import org.etsi.mts.tdl.json2tdl.JSON2TDLTranslator;
 import org.etsi.mts.tdl.json2tdl.TDL2JSONTranslator;
 import org.etsi.mts.tdl.openapi2tdl.next.OpenAPI2TDLTranslatorNext;
@@ -58,7 +74,7 @@ public class Standalone {
 		validateOCL, validate, 
 		translate, exportDoc, exportJSON,
 		importOpenAPI, importASN1, importJSON,
-		openAPIDoc,exportTTCN3
+		openAPIDoc,exportTTCN3,generateDiagrams
 	}
 	
 	public static void main(String[] args) throws Exception {
@@ -74,11 +90,35 @@ public class Standalone {
 //		app.path = "examples/json/model.json";
 		app.path = "examples/validation/Naming.tdltx";
 		app.path = "examples/validation/Example.tdltx";
+		
+		if (args.length < 1) {
+			System.out.println("Usage: standalone [path] [modes]\n"
+					+"  path\tPath to the source(s) to process\n"
+					+"  modes\tOne or more modes to apply\n"
+					+"Modes supported: "+Arrays.asList(MODE.values()));
+			return;
+		}
+		app.path = args[0];
+
+		if (args.length == 2) {
+			for (String a : args[1].split(",")) {
+				try {
+					app.modes.add(MODE.valueOf(MODE.class, a));
+				} catch (Exception e) {
+					System.err.println("ERROR: "+e.getLocalizedMessage());
+				}
+			}
+		} else {
+			System.err.println("ERROR: No mode selected!");
+			return;
+		}
+		
 		app.recursive = false;
-		app.modes.add(MODE.list);
-		app.modes.add(MODE.validate);
-		app.modes.add(MODE.exportDoc);
-		app.modes.add(MODE.exportTTCN3);
+//		app.modes.add(MODE.list);
+//		app.modes.add(MODE.validate);
+//		app.modes.add(MODE.exportDoc);
+		
+//		app.modes.add(MODE.exportTTCN3);
 //		targetExtension = "tdl";
 //		app.modes.add(MODE.translate);
 		
@@ -154,6 +194,12 @@ public class Standalone {
 			app.processElements(path, asnExtension, app::importASN1);
 		}
 
+		if (app.selected(MODE.generateDiagrams)) {
+			String path = pathOrDefault(app.path, "examples/validation/Example.tdltx");
+			app.processElements(path, asnExtension, app::generateDiagrams);
+		}
+
+		
 		if (app.selected(MODE.debug)) {
 			//individual file without dependencies
 			app.processElements("examples/basics/Sample.tdltx", app::listElements);
@@ -301,7 +347,7 @@ public class Standalone {
 		try {
 			Resource target = TDLHelper.create(resource.getURI().path() + "." + targetExtension);
 			target.getContents().addAll(EcoreUtil.copyAll(resource.getContents()));
-			TDLHelper.store(target);
+			TDLHelper.store(target, true);
 		} catch (Exception e) {
 			// TODO Auto-generated catch block
 			e.printStackTrace();
@@ -314,7 +360,7 @@ public class Standalone {
 			translator.setTargetResource(TDLHelper.create(source.getAbsolutePath()+"-generated."+targetExtension));
 			translator.initTargetResource(translator.cleanName(source.getName()));
 			translator.translate(source.getAbsolutePath());
-			TDLHelper.store(translator.getTargetResource());
+			TDLHelper.store(translator.getTargetResource(), true);
 		} catch (Exception e) {
 			// TODO Auto-generated catch block
 			e.printStackTrace();
@@ -338,6 +384,183 @@ public class Standalone {
 		}
 	}
 
+	private void generateDiagrams(String path) {
+		Resource resource = TDLHelper.load(path);
+		//export to external generator
+		EObject model = resource.getContents().get(0);
+		generateConfiguration(path, model);
+        System.out.println();
+        generateBehaviour(path, model);
+
+		/*
+		 *  @startuml
+            component Tester {
+            portout p1c
+            portout p2c
+            portout p3c
+            }
+
+            component SUT {
+            portin p1d
+            portin p2d
+            portin p3d
+            }
+            p1c <--> p1d
+            p2c <--> p2d
+            p3c <--> p3d
+            @enduml
+
+		 */
+	}
+
+    private void generateConfiguration(String path, EObject model) {
+        List<TestConfiguration> testConfigurations = EcoreUtil2.getAllContentsOfType(model, TestConfiguration.class);
+		String d = "@startuml\n";
+		for (TestConfiguration tc : testConfigurations) {
+			d += "rectangle \"Test Configuration\\n"+tc.getName()+"\" {\n";
+			for (var i : tc.getComponentInstance()) {
+				if (i.getRole() == ComponentInstanceRole.TESTER) {
+					d += processComponentInstance(i);
+				}
+			}
+			for (var i : tc.getComponentInstance()) {
+				if (i.getRole() == ComponentInstanceRole.SUT) {
+					d += processComponentInstance(i);
+				}
+			}
+			for (var i : tc.getConnection()) {
+				var e0 = i.getEndPoint().get(0);
+				var e1 = i.getEndPoint().get(1);
+				if (e0.getComponent().getRole().equals(ComponentInstanceRole.SUT)) {
+					var e = e1;
+					e1 = e0;
+					e0 = e;
+				}
+				//TODO: ports need to be configuration prefixed if only one diagram
+				String c = ""+e0.getComponent().getName()+"_"+e0.getGate().getName()+""
+						+" <--> "
+						+""+e1.getComponent().getName()+"_"+e1.getGate().getName()+""
+						+"\n";
+				d+=c;
+			}
+			d +="\n}\n";
+		}
+		d += "@enduml";
+		System.out.println(d);
+		try {
+			//TODO: make configurable
+			Files.writeString(Path.of(path+"-config.md"), d);
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+    }
+
+    private void generateBehaviour(String path, EObject model) {
+        List<TestDescription> testDescriptions = EcoreUtil2.getAllContentsOfType(model, TestDescription.class);
+
+        String d = "";
+		for (TestDescription td : testDescriptions) {
+			d += "@startuml\n";
+            d += "hide footbox\n";
+            d += "title "+td.getName()+"\n";
+            TestConfiguration tc = td.getTestConfiguration();
+			for (var i : tc.getComponentInstance()) {
+				if (i.getRole() == ComponentInstanceRole.TESTER) {
+                    d+="participant "+tc.getName()+"_"+i.getName()+" [\n  == "
+                    +i.getRole().toString()
+                    +"\n  ----\n  \"\""
+                    +i.getName()
+                    +" : "
+                    +i.getType().getName()
+                    +"\"\"\n]\n\n";
+				}
+			}
+			for (var i : tc.getComponentInstance()) {
+				if (i.getRole() == ComponentInstanceRole.SUT) {
+                    d+="participant "+tc.getName()+"_"+i.getName()+" [\n  == "
+                    +i.getRole().toString()
+                    +"\n  ----\n  \"\""
+                    +i.getName()
+                    +" : "
+                    +i.getType().getName()
+                    +"\"\"\n]\n\n";
+				}
+			}
+            
+            if (td.getBehaviourDescription()!= null) {
+                var b = td.getBehaviourDescription().getBehaviour();
+				d += processBehaviour(b);
+            }
+
+            d += "@enduml\n";
+            //TODO: need to split behaviours..
+		}
+		System.out.println(d);
+		try {
+			//TODO: make configurable
+			Files.writeString(Path.of(path+"-behaviour.md"), d);
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+    }
+
+    private <T> T castObject(Class<T> clazz, Object object) {
+        return (T) object;
+    }
+
+    private String processBehaviour(Behaviour b) {
+    	String d = "' Not supported yet: "+b.getClass().getName();
+    	switch (b.eClass().getClassifierID()) {
+		case tdlPackage.COMPOUND_BEHAVIOUR:
+			d = processBehaviour((CompoundBehaviour)b);
+			break;
+		case tdlPackage.MESSAGE:
+			d = processBehaviour((Message)b);
+			break;
+		default:
+			break;
+		}
+        return d;
+    }
+
+    private String processBehaviour(CompoundBehaviour b) {
+        String d = "";
+        for (var nested : b.getBlock().getBehaviour()) {
+            d += processBehaviour(nested);
+        }
+        //TODO: handle prefixes and indentation?
+        return d;
+    }
+
+    private String processBehaviour(Message b) {
+        var sc = b.getSourceGate().getComponent();
+        var c = sc.container().getName()+"_"+sc.getName();
+        var tc = b.getTarget().get(0).getTargetGate().getComponent();
+        var t = tc.container().getName()+"_"+tc.getName();
+        var a = b.getArgument();
+        String d = "";
+        String at = NodeModelUtils.findActualNodeFor(a).getText();
+        //TODO: use node model untils to get text (needs processing)
+        d += c+" -> "+t+" : "+at.replaceAll("\n", "\\n")+"\n";
+        return d;
+    }
+
+
+	private String processComponentInstance(ComponentInstance i) {
+		String c = "component \"<<"+i.getRole().getName()+">>\\n"+i.getName()+":"+i.getType().getName()+"\" { \n";
+		String portType = "portout";
+		if (i.getRole().equals(ComponentInstanceRole.SUT)) {
+			portType = "portin";
+		}
+		for (var g : i.getType().getGateInstance()) {
+			c+="  "+portType+" \""+g.getName()+":"+g.getType().getName()+"\" as "+i.getName()+"_"+g.getName()+"\n";
+		}
+		c+="\n}\n";
+		return c;
+	}
+
 	
 	private void importASN1(String path) {
 		importData(path, new ASN2TDLTranslator());
diff --git a/plugins/org.etsi.mts.tdl.to2tdl/src/org/etsi/mts/tdl/to2tdl/TO2TDLTranslator.java b/plugins/org.etsi.mts.tdl.to2tdl/src/org/etsi/mts/tdl/to2tdl/TO2TDLTranslator.java
index 014904cfd852feccc8d6cbd563cf8437577e8d8c..ee7fc34a652c46a822bc7d65b42be60e426355cf 100644
--- a/plugins/org.etsi.mts.tdl.to2tdl/src/org/etsi/mts/tdl/to2tdl/TO2TDLTranslator.java
+++ b/plugins/org.etsi.mts.tdl.to2tdl/src/org/etsi/mts/tdl/to2tdl/TO2TDLTranslator.java
@@ -475,6 +475,6 @@ public class TO2TDLTranslator extends AbstractTranslator {
 		initTargetResource("generated_from_"+p.getName());
 		addImports(p);
 		transform(p);
-		TDLHelper.store(tr);
+		TDLHelper.store(tr, false);
 	}
 }
diff --git a/plugins/org.etsi.mts.tdl.tools.to.docx.poi/META-INF/MANIFEST.MF b/plugins/org.etsi.mts.tdl.tools.to.docx.poi/META-INF/MANIFEST.MF
index 84a83b475965c2fa8b1e955f7f3e38850ba76ae4..05827653c48c482f27f16484488d4fdfb82a1742 100644
--- a/plugins/org.etsi.mts.tdl.tools.to.docx.poi/META-INF/MANIFEST.MF
+++ b/plugins/org.etsi.mts.tdl.tools.to.docx.poi/META-INF/MANIFEST.MF
@@ -17,7 +17,8 @@ Require-Bundle: org.eclipse.core.runtime,
  org.apache.poi,
  org.apache.poi.ooxml,
  org.apache.poi.ooxml.schemas,
- org.apache.xmlbeans
+ org.apache.xmlbeans,
+ org.apache.commons.compress
 Bundle-RequiredExecutionEnvironment: JavaSE-11
 Automatic-Module-Name: org.etsi.mts.tdl.tools.to.docx.poi
 Bundle-ActivationPolicy: lazy
diff --git a/plugins/org.etsi.mts.tdl.tools.to.docx.poi/src/org/etsi/mts/tdl/tools/to/docx/poi/Generator.java b/plugins/org.etsi.mts.tdl.tools.to.docx.poi/src/org/etsi/mts/tdl/tools/to/docx/poi/Generator.java
index 9fbb491620adeb22c9045c281e471456ba351dd1..be66ca43d72e395b99da33997b33bbd61c43b1dc 100644
--- a/plugins/org.etsi.mts.tdl.tools.to.docx.poi/src/org/etsi/mts/tdl/tools/to/docx/poi/Generator.java
+++ b/plugins/org.etsi.mts.tdl.tools.to.docx.poi/src/org/etsi/mts/tdl/tools/to/docx/poi/Generator.java
@@ -28,18 +28,30 @@ import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.xtext.EcoreUtil2;
+import org.eclipse.xtext.TerminalRule;
+import org.eclipse.xtext.XtextPackage;
+import org.eclipse.xtext.nodemodel.ICompositeNode;
 import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
 import org.etsi.mts.tdl.Behaviour;
 import org.etsi.mts.tdl.Block;
+import org.etsi.mts.tdl.CombinedBehaviour;
 import org.etsi.mts.tdl.CompoundBehaviour;
+import org.etsi.mts.tdl.ConditionalBehaviour;
+import org.etsi.mts.tdl.LocalExpression;
 import org.etsi.mts.tdl.Package;
+import org.etsi.mts.tdl.SingleCombinedBehaviour;
 import org.etsi.mts.tdl.TestConfiguration;
 import org.etsi.mts.tdl.TestDescription;
 import org.etsi.mts.tdl.resources.ResourceHandler;
 import org.etsi.mts.tdl.structuredobjectives.StructuredTestObjective;
 import org.etsi.mts.tdl.structuredobjectives.TestObjectiveVariant;
 import org.etsi.mts.tdl.structuredobjectives.VariantBinding;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRPr;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSimpleField;
 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTText;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.STOnOff;
 
 public class Generator {
 
@@ -73,15 +85,16 @@ public class Generator {
 		createTitle(title, document);
 		
 		int hLevel = 3;
+		String prefix = "X.Y"; //TODO: export to configuration
 		if (hierarchical ) {
-			String prefix = "X.Y";
 			generatePackageHeadings(resource, document, prefix, hLevel);
 		} else {
 			//flat generation
 			EObject p = resource.getContents().get(0);
 			List<StructuredTestObjective> stos = EcoreUtil2.getAllContentsOfType(p, StructuredTestObjective.class);
-			generateSTOs(document, stos);
-			generateTPDs(document, EcoreUtil2.getAllContentsOfType(p, TestDescription.class));
+			generateSTOs(document, stos, prefix);
+			List<TestDescription> tpds = EcoreUtil2.getAllContentsOfType(p, TestDescription.class);
+			generateTPDs(document, tpds, prefix);
 		}
 		
 		storeDocument(filename, document);
@@ -99,35 +112,51 @@ public class Generator {
 		for (Package p : packages) {
 			generatePackageHeading(document, prefix, i, p, hLevel);
 			List<StructuredTestObjective> stos = getContentsOfType(p, StructuredTestObjective.class);
-			generateSTOs(document, stos);
-			generateTPDs(document, getContentsOfType(p, TestDescription.class));
-			generatePackageHeadings(document, getContentsOfType(p, Package.class), prefix+"."+i, hLevel+1);
+			String localPrefix = prefix+"."+i;
+			generateSTOs(document, stos, localPrefix);
+			generateTPDs(document, getContentsOfType(p, TestDescription.class), localPrefix);
+			generatePackageHeadings(document, getContentsOfType(p, Package.class), localPrefix, hLevel+1);
 			i++;
 		}
 	}
 
-	private void generateSTOs(XWPFDocument document, List<StructuredTestObjective> stos) {
+	private void generateSTOs(XWPFDocument document, List<StructuredTestObjective> stos, String prefix) {
+		int i = 1;
 		for (StructuredTestObjective sto : stos) {
 			String sectionTitle = sto.getName();
 			LinkedHashMap<String, String> map = getSTOReplacementMap(sto);
-			generateTable(document, sectionTitle, map);
+			generateTable(document, sectionTitle, map, prefix, i);
 			LinkedHashMap<String, LinkedHashMap<String,String>> variants = getSTOVariantsMap(sto);
-			generateVariants(document, variants);
+			generateVariants(document, variants, sectionTitle, prefix, i);
+			i++;
 		}
 	}
 
-	private void generateTPDs(XWPFDocument document, List<TestDescription> tpds) {
+	private void generateTPDs(XWPFDocument document, List<TestDescription> tpds, String prefix) {
+		int i = 1;
 		for (TestDescription tpd : tpds) {
 			if (tpd.getAnnotation().stream().anyMatch(a -> a.getKey().getName().startsWith("Test Purpose"))) {
 				//TODO: add constraints and validation, e.g. Objective present, etc.
 				String sectionTitle = tpd.getName();
 				LinkedHashMap<String, String> map = getTPDReplacementMap(tpd);
-				generateTable(document, sectionTitle, map);
+				generateTable(document, sectionTitle, map, prefix, i);
 				//TODO: variants? reuse?
 	//			LinkedHashMap<String, LinkedHashMap<String,String>> variants = getSTOVariantsMap(sto);
 	//			generateVariants(document, variants);
+				i++;
 			}
 		}
+		
+		//createTableToCtoUpdateFields(document);
+	}
+
+	private void createTableToCtoUpdateFields(XWPFDocument document) {
+//		Create table of figures field. Word will updating that field while opening the file.
+		XWPFParagraph paragraph = document.createParagraph();
+		CTSimpleField toc = paragraph.getCTP().addNewFldSimple();
+		toc.setInstr("TOC \\c \"tab\" \\* MERGEFORMAT");
+		toc.setDirty(STOnOff.TRUE); // set dirty to forcing update
+//		TODO: remove again? or move to top?
 	}
 
 	
@@ -165,12 +194,14 @@ public class Generator {
 	
 	//TODO: cleanup and restructure
 	private void generateVariants(XWPFDocument document,
-			LinkedHashMap<String, LinkedHashMap<String, String>> variants) {
+			LinkedHashMap<String, LinkedHashMap<String, String>> variants, String sectionTitle, String prefix, int v) {
 		LinkedHashSet<String> headers = new LinkedHashSet<>();
 		for (LinkedHashMap<String, String> e : variants.values()) {
 			headers.addAll(e.keySet());
 		}
 		if (headers.size() > 0) {
+			createCaption("Variants for "+sectionTitle, document, prefix, v);
+			
 			XWPFTable table = loadTemplate(template, selectedTemplate+"_VARIANT");
 			if (table == null) {
 				return;
@@ -275,11 +306,11 @@ public class Generator {
 		loadStyles(document, template);
 		
 		createTitle(title, document);
-		
+		String prefix = "X.Y.1";
 		for (int i = 0; i < 5; i++) {
 			String sectionTitle = "Test "+i;
 			LinkedHashMap<String, String> map = getReplacementMap();
-			generateTable(document, sectionTitle, map);
+			generateTable(document, sectionTitle, map, prefix, i);
 		}
 		
 		storeDocument(filename, document);
@@ -293,7 +324,12 @@ public class Generator {
 	}
 
 	private void generateTable(XWPFDocument document, String sectionTitle,
-			LinkedHashMap<String, String> map) {
+			LinkedHashMap<String, String> map, String prefix, int i) {
+
+		//TODO: make configurable
+		//TODO: include caption in template?
+		createCaption("Test Purpose "+sectionTitle, document, prefix, i);
+//		createCaptionWithFieldCodes("Test Purpose "+sectionTitle, document, prefix, i);
 		//clone table
 		XWPFTable table = loadTemplate(template, selectedTemplate);
 
@@ -391,7 +427,10 @@ public class Generator {
 			for (TestObjectiveVariant v : sto.getVariants().getVariants()) {
 				variants.put(v.getName(), new LinkedHashMap<>());
 				if (v.getDescription() != null) {
-					variants.get(v.getName()).put("Description", v.getDescription());
+					variants.get(v.getName()).put("Description", v.getDescription()
+							.replaceAll("\"", "")
+							.replaceAll("\\s*\n\\s+", " ")
+							);
 				}
 				if (!v.getObjectiveURI().isEmpty()) {
 					variants.get(v.getName()).put("Reference", String.join("\n",v.getObjectiveURI()));
@@ -423,8 +462,12 @@ public class Generator {
 		map.put(Placeholders.NAME, tpd.getName());
 		//TODO: what if 0? what if more than 1?
 		//TODO: make more robust
+		//DONE: remove formatting spaces?
 		if (tpd.getTestObjective().size() == 1) {
-			map.put(Placeholders.DESCRIPTION, tpd.getTestObjective().get(0).getDescription().replaceAll("\"", ""));
+			map.put(Placeholders.DESCRIPTION, tpd.getTestObjective().get(0).getDescription()
+					.replaceAll("\"", "")
+					.replaceAll("\\s*\n\\s+", " ")
+					);
 			String uri = String.join("\n", tpd.getTestObjective().get(0).getObjectiveURI()).trim();
 			map.put(Placeholders.URI, uri.replaceAll("\"",""));
 		} else {
@@ -443,6 +486,16 @@ public class Generator {
 		map.put(Placeholders.CONFIGURATION, config);
 		//TODO: how is this addressed? annotations? what about and/or? -> not supported yet
 		String pics = "N/A";
+		//TODO: make more robust
+		SingleCombinedBehaviour tpdBehaviour = (SingleCombinedBehaviour) tpd.getBehaviourDescription().getBehaviour();
+		EList<LocalExpression> guard = tpdBehaviour.getBlock().getGuard();
+		if (!guard.isEmpty()) {
+			ICompositeNode guardNode = NodeModelUtils.findActualNodeFor(guard.get(0));
+			String tokenText = NodeModelUtils.getTokenText(guardNode);
+			pics = tokenText
+//					.replaceAll("\\(|\\)", "")
+					;
+		}
 //		String pics = String.join(" ", tpd.getPicsReference()
 //				.stream()
 //				.map(p -> NodeModelUtils.getNode(p).getText())
@@ -459,39 +512,51 @@ public class Generator {
 		if (behaviour instanceof CompoundBehaviour) {
 			Block block = ((CompoundBehaviour) behaviour).getBlock();
 			for (Behaviour b : block.getBehaviour()) {
-				if (b.getAnnotation().get(0).getKey().getName().startsWith("Initial")) {
-					//TODO: filter extra new line
-					String initialConditions = NodeModelUtils.getNode(b).getText();
-					initialConditions = initialConditions.replaceAll("\\s*Initial conditions", "");
-					initialConditions = filterSource(initialConditions, "\n", "\\w").trim();
-					map.put(Placeholders.INITIAL, initialConditions);
-				} else if  (b.getAnnotation().get(0).getKey().getName().startsWith("Expected")) {
-					String expected = NodeModelUtils.getNode(b).getText();
-					expected = expected.replaceAll("\\s*Expected behaviour", "");
-					expected = filterSource(expected, "\n", "ensure").trim();
-					map.put(Placeholders.EXPECTED, expected);
-					
-					EList<Behaviour> expectedBehaviours = ((CompoundBehaviour) b).getBlock().getBehaviour();
-					if (expectedBehaviours.size() == 2) {
-						String when = NodeModelUtils.getNode(expectedBehaviours.get(0)).getText();
-						String then = NodeModelUtils.getNode(expectedBehaviours.get(1)).getText();
-						//TODO: a bit of a hack
-						when = filterSource(when, "\n", "\\s\\s\\s\\s\\w");
-						//then = filterSource(then, "\n", "\\s+\\w");
-						//then = filterSource(then, "\n", "\\s+\\w");
-						then = filterSource(then, "\n", "\\s\\s\\s\\s\\w");
-				
-						map.put(Placeholders.WHEN, "when {"+when+"\n}");
-						map.put(Placeholders.THEN, "then {"+then+"\n}");
+				if (!b.getAnnotation().isEmpty()) { //TODO: skip altogether if no annotations found?
+					if (b.getAnnotation().get(0).getKey().getName().startsWith("Initial")) {
+						//TODO: filter extra new line
+						ICompositeNode node = NodeModelUtils.getNode(b);
+						String initialConditions = node.getText();
+						initialConditions = initialConditions.replaceAll("\\s*Initial conditions", "");
+						initialConditions = filterSource(initialConditions, "\n", "\\w").trim();
+						initialConditions = filterComments(node, initialConditions);
+
+						map.put(Placeholders.INITIAL, initialConditions);
+					} else if  (b.getAnnotation().get(0).getKey().getName().startsWith("Expected")) {
+						ICompositeNode node = NodeModelUtils.getNode(b);
+						String expected = node.getText();
+						expected = expected.replaceAll("\\s*Expected behaviour", "");
+						expected = filterSource(expected, "\n", "ensure").trim();
+						expected = filterComments(node, expected);
+						map.put(Placeholders.EXPECTED, expected);
+						
+						EList<Behaviour> expectedBehaviours = ((CompoundBehaviour) b).getBlock().getBehaviour();
+						if (expectedBehaviours.size() == 2) {
+							String when = NodeModelUtils.getNode(expectedBehaviours.get(0)).getText();
+							String then = NodeModelUtils.getNode(expectedBehaviours.get(1)).getText();
+							//TODO: a bit of a hack
+							when = filterSource(when, "\n", "\\s\\s\\s\\s\\w");
+							when = filterComments(node, when);
+							//then = filterSource(then, "\n", "\\s+\\w");
+							//then = filterSource(then, "\n", "\\s+\\w");
+							then = filterSource(then, "\n", "\\s\\s\\s\\s\\w");
+							then = filterComments(node, then);
+
+							map.put(Placeholders.WHEN, "when {"+when+"\n}");
+							map.put(Placeholders.THEN, "then {"+then+"\n}");
+						}
+					} else if  (b.getAnnotation().get(0).getKey().getName().startsWith("Final")) {
+						ICompositeNode node = NodeModelUtils.getNode(b);
+						String finalConditions = node.getText();
+						finalConditions = finalConditions.replaceAll("\\s*Final conditions", "");
+						finalConditions = filterSource(finalConditions, "\n", "\\w").trim();
+						finalConditions = filterComments(node, finalConditions);
+
+						map.put(Placeholders.FINAL, finalConditions);
+						//TODO: filter extra new line
+					} else {
+						//TODO: Handle other unknown blocks
 					}
-				} else if  (b.getAnnotation().get(0).getKey().getName().startsWith("Final")) {
-					String finalConditions = NodeModelUtils.getNode(b).getText();
-					finalConditions = finalConditions.replaceAll("\\s*Final conditions", "");
-					finalConditions = filterSource(finalConditions, "\n", "\\w").trim();
-					map.put(Placeholders.FINAL, finalConditions);
-					//TODO: filter extra new line
-				} else {
-					//TODO: Handle other unknown blocks
 				}
 			}
 		}
@@ -499,6 +564,27 @@ public class Generator {
 		return map;
 	}
 
+	private String filterComments(ICompositeNode node, String expected) {
+		//DONE: filter empty lines?
+		//DONE: export to method 
+		//TODO: update, expose
+		String filterPrefix = "//!";
+		ArrayList<String> filteredComments = new ArrayList<>();
+		for (var n : node.getLeafNodes()) {
+			if (n.getGrammarElement() instanceof TerminalRule && ((TerminalRule) n.getGrammarElement()).getName().equals("SL_COMMENT")) {
+				if (n.getText().trim().startsWith(filterPrefix)) {
+					filteredComments.add(n.getText().trim());
+				}
+			}
+		}
+		for (var c : filteredComments) {
+			expected = expected.replace(c, ""); 
+		}
+		expected = expected.replaceAll("\n[\\s\\t]+\n", "\n");
+		System.out.println(expected);
+		return expected;
+	}
+
 	
 	private LinkedHashMap<String, String> getSTOReplacementMap(StructuredTestObjective sto) {
 		//map
@@ -506,7 +592,10 @@ public class Generator {
 		//TODO: transfer to variants as well
 		LinkedHashMap<String,String> map = new LinkedHashMap<>();
 		map.put(Placeholders.NAME, sto.getName());
-		map.put(Placeholders.DESCRIPTION, sto.getDescription().replaceAll("\"", ""));
+		map.put(Placeholders.DESCRIPTION, sto.getDescription()
+				.replaceAll("\"", "")
+				.replaceAll("\\s*\n\\s+", " ")
+				);
 		String uri = String.join("\n", sto.getObjectiveURI()).trim();
 		map.put(Placeholders.URI, uri.replaceAll("\"",""));
 		TestConfiguration configuration = sto.getConfiguration();
@@ -527,16 +616,21 @@ public class Generator {
 		map.put(Placeholders.INITIAL, "");
 		if (sto.getInitialConditions()!=null) {
 			//TODO: filter extra new line
-			String initialConditions = NodeModelUtils.getNode(sto.getInitialConditions()).getText();
+			ICompositeNode node = NodeModelUtils.getNode(sto.getInitialConditions());
+			String initialConditions = node.getText();
 			initialConditions = initialConditions.replaceAll("\\s*Initial conditions", "");
 			initialConditions = filterSource(initialConditions, "\n", "\\w").trim();
+			initialConditions = filterComments(node, initialConditions);
+
 			map.put(Placeholders.INITIAL, initialConditions);
 		}
 		
 		if (sto.getExpectedBehaviour()!=null) {
-			String expected = NodeModelUtils.getNode(sto.getExpectedBehaviour()).getText();
+			ICompositeNode node = NodeModelUtils.getNode(sto.getExpectedBehaviour());
+			String expected = node.getText();
 			expected = expected.replaceAll("\\s*Expected behaviour", "");
 			expected = filterSource(expected, "\n", "ensure").trim();
+			expected = filterComments(node, expected);
 			map.put(Placeholders.EXPECTED, expected);
 		} else {
 			map.put(Placeholders.EXPECTED, "");
@@ -545,9 +639,11 @@ public class Generator {
 		map.put(Placeholders.FINAL, "");
 		if (sto.getFinalConditions()!=null) {
 			//TODO: filter extra new line
-			String finalConditions = NodeModelUtils.getNode(sto.getFinalConditions()).getText();
+			ICompositeNode node = NodeModelUtils.getNode(sto.getFinalConditions());
+			String finalConditions = node.getText();
 			finalConditions = finalConditions.replaceAll("\\s*Final conditions", "");
 			finalConditions = filterSource(finalConditions, "\n", "\\w").trim();
+			finalConditions = filterComments(node, finalConditions);
 			map.put(Placeholders.FINAL, finalConditions);
 		}
 
@@ -585,7 +681,7 @@ public class Generator {
 				.replaceAll(" entity ", " ") //shall be optional
 				.replaceAll("\\^", "") //shall be optional
 				.replaceAll(";", "") //shall be optional
-				.replaceAll("\\(|\\)", "") //shall be optional
+//				.replaceAll("\\(|\\)", "") //shall be optional
 				;
 		return source;
 	}
@@ -658,6 +754,52 @@ public class Generator {
 		titleRun.setFontSize(20);
 	}
 
+	public void createCaption(String text, XWPFDocument report, String prefix, int i) {
+		//implementation without field codes and automated numbering
+		XWPFParagraph paragraph = report.createParagraph();
+	    paragraph.setStyle("TH");
+	    paragraph.setSpacingAfter(0); // Set spacing after to 0. So caption will follow immediately under the figure.
+	    XWPFRun run = paragraph.createRun();
+	    run.setText("Table "+prefix+"-"+i+": " + text);
+	}
+	
+	
+	public void createCaptionWithFieldCodes(String text, XWPFDocument report, String prefix, int i) {
+		//implementation with field codes if needed, more complex and requires 
+		XWPFParagraph paragraph = report.createParagraph();
+	    paragraph.setStyle("TH");
+	    paragraph.setSpacingAfter(0); // Set spacing after to 0. So caption will follow immediately under the figure.
+	    XWPFRun run = paragraph.createRun();
+	    run.setText("Table ");
+	    CTR ctr;
+	    CTRPr ctrpr;
+	    CTText ctText;
+
+	    CTSimpleField seq = paragraph.getCTP().addNewFldSimple();
+	    String sectionNumberPrefix = " Heading 3 2 \\s "; // TODO: Does not quite work yet, updating references causes error, probably needs headings to use field codes as well
+	    seq.setInstr(sectionNumberPrefix);
+	    ctr = seq.addNewR();
+	    ctrpr = ctr.addNewRPr();
+	    ctrpr.addNewNoProof();
+	    ctText = ctr.addNewT();
+	    ctText.setStringValue(""+prefix); //set numbers manually? alternatively need to manually or automatically force update
+
+	    ctr = paragraph.getCTP().addNewR();
+	    ctr.addNewNoBreakHyphen();
+
+	    seq = paragraph.getCTP().addNewFldSimple();
+	    String tableNumberText = " SEQ tab \\* ARABIC \\s 2 ";
+	    seq.setInstr(tableNumberText);
+	    ctr = seq.addNewR();
+	    ctrpr = ctr.addNewRPr();
+	    ctrpr.addNewNoProof();
+	    ctText = ctr.addNewT();
+	    ctText.setStringValue(""+i); //set numbers manually? alternatively need to manually or automatically force update
+
+	    run = paragraph.createRun(); // needed or numbers are at end, ie Figure : some text1.1
+	    run.setText(": " + text);
+	}
+
 	private void loadStyles(XWPFDocument report, XWPFDocument templateDocument) {
 		XWPFStyles newStyles = report.createStyles();
 		try {
diff --git a/plugins/org.etsi.mts.tdl.tools.to.docx/.classpath b/plugins/org.etsi.mts.tdl.tools.to.docx/.classpath
index 6dc14ee945ebcd86968ebb800e9036ad7d9742f2..49b9e43e079148598748d91ee49b0dd5cb43fd3a 100644
--- a/plugins/org.etsi.mts.tdl.tools.to.docx/.classpath
+++ b/plugins/org.etsi.mts.tdl.tools.to.docx/.classpath
@@ -1,17 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry exported="true" kind="lib" path="lib/docx4j-3.2.1.jar"/>
-	<classpathentry exported="true" kind="lib" path="lib/jaxb-xmldsig-core-1.0.0.jar"/>
-	<classpathentry exported="true" kind="lib" path="lib/jaxb-xslfo-1.0.1.jar"/>
-	<classpathentry exported="true" kind="lib" path="lib/log4j-1.2.17.jar"/>
-	<classpathentry exported="true" kind="lib" path="lib/serializer.jar"/>
-	<classpathentry exported="true" kind="lib" path="lib/slf4j-api-1.7.12.jar"/>
-	<classpathentry exported="true" kind="lib" path="lib/slf4j-log4j12-1.7.12.jar"/>
-	<classpathentry exported="true" kind="lib" path="lib/xalan.jar"/>
-	<classpathentry exported="true" kind="lib" path="lib/xercesImpl.jar"/>
-	<classpathentry exported="true" kind="lib" path="lib/xml-apis.jar"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11">
+		<attributes>
+			<attribute name="module" value="true"/>
+		</attributes>
+	</classpathentry>
 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
 	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="lib" path="lib/docx4j-1.0-jar-with-dependencies.jar"/>
 	<classpathentry kind="output" path="target/classes"/>
 </classpath>
diff --git a/plugins/org.etsi.mts.tdl.tools.to.docx/META-INF/MANIFEST.MF b/plugins/org.etsi.mts.tdl.tools.to.docx/META-INF/MANIFEST.MF
index b72961c56e96b5dabc8c168e073d55949dd81c45..227774f7ff0a5bf3cc752db3f56fe5c5c79860ed 100644
--- a/plugins/org.etsi.mts.tdl.tools.to.docx/META-INF/MANIFEST.MF
+++ b/plugins/org.etsi.mts.tdl.tools.to.docx/META-INF/MANIFEST.MF
@@ -14,14 +14,5 @@ Require-Bundle: org.eclipse.core.runtime,
  org.etsi.mts.tdl.TPLan2.ui,
  org.etsi.mts.tdl.TPLan2
 Export-Package: org.etsi.mts.tdl.tools.to.docx
-Bundle-ClassPath: lib/docx4j-3.2.1.jar,
- lib/jaxb-xmldsig-core-1.0.0.jar,
- lib/jaxb-xslfo-1.0.1.jar,
- lib/log4j-1.2.17.jar,
- lib/serializer.jar,
- lib/slf4j-api-1.7.12.jar,
- lib/slf4j-log4j12-1.7.12.jar,
- lib/xalan.jar,
- lib/xercesImpl.jar,
- lib/xml-apis.jar,
- .
+Bundle-ClassPath: .,
+ lib/docx4j-1.0-jar-with-dependencies.jar
diff --git a/plugins/org.etsi.mts.tdl.tools.to.docx/build.properties b/plugins/org.etsi.mts.tdl.tools.to.docx/build.properties
index 7f5d3a538a8b0a6ac17863716824dd7a8a2c441a..2ef4e6f3b4ea335d3a2e39c9bcc54f0093995d88 100644
--- a/plugins/org.etsi.mts.tdl.tools.to.docx/build.properties
+++ b/plugins/org.etsi.mts.tdl.tools.to.docx/build.properties
@@ -2,17 +2,8 @@ source.. = src/
 output.. = target/classes/
 bin.includes = META-INF/,\
                .,\
-               lib/docx4j-3.2.1.jar,\
-               lib/jaxb-xmldsig-core-1.0.0.jar,\
-               lib/jaxb-xslfo-1.0.1.jar,\
-               lib/log4j-1.2.17.jar,\
-               lib/serializer.jar,\
-               lib/slf4j-api-1.7.12.jar,\
-               lib/slf4j-log4j12-1.7.12.jar,\
-               lib/xalan.jar,\
-               lib/xercesImpl.jar,\
-               lib/xml-apis.jar,\
                TO_TableTemplatesR1.docx,\
-               empty.docx
+               empty.docx,\
+               lib/docx4j-1.0-jar-with-dependencies.jar
 src.includes = TO_TableTemplatesR1.docx,\
                empty.docx
diff --git a/plugins/org.etsi.mts.tdl.ttcn3.ui/.project b/plugins/org.etsi.mts.tdl.ttcn3.ui/.project
index c1038bc1b106b12ed90b673effb3525e59fe9d14..4127ece9de1fce837a8cb5184df37359044cf2e2 100644
--- a/plugins/org.etsi.mts.tdl.ttcn3.ui/.project
+++ b/plugins/org.etsi.mts.tdl.ttcn3.ui/.project
@@ -31,4 +31,15 @@
 		<nature>org.eclipse.pde.PluginNature</nature>
 		<nature>org.eclipse.jdt.core.javanature</nature>
 	</natures>
+	<filteredResources>
+		<filter>
+			<id>1705077780125</id>
+			<name></name>
+			<type>30</type>
+			<matcher>
+				<id>org.eclipse.core.resources.regexFilterMatcher</id>
+				<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
 </projectDescription>
diff --git a/plugins/org.etsi.mts.tdl.ttcn3/.project b/plugins/org.etsi.mts.tdl.ttcn3/.project
index 341788c7fab9e36496640ecec2c45b0b50742ae7..78dae0c73e77e347473d38873c347d8266197834 100644
--- a/plugins/org.etsi.mts.tdl.ttcn3/.project
+++ b/plugins/org.etsi.mts.tdl.ttcn3/.project
@@ -31,4 +31,15 @@
 		<nature>org.eclipse.pde.PluginNature</nature>
 		<nature>org.eclipse.jdt.core.javanature</nature>
 	</natures>
+	<filteredResources>
+		<filter>
+			<id>1705077780118</id>
+			<name></name>
+			<type>30</type>
+			<matcher>
+				<id>org.eclipse.core.resources.regexFilterMatcher</id>
+				<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
 </projectDescription>
diff --git a/plugins/org.etsi.mts.tdl.tx.ui/build.properties b/plugins/org.etsi.mts.tdl.tx.ui/build.properties
index 183cbda20fb0c86f1a623e495acfbaa55e6a3434..4624bb6f8e34df9ac83bdb6cfcd3430e114accec 100644
--- a/plugins/org.etsi.mts.tdl.tx.ui/build.properties
+++ b/plugins/org.etsi.mts.tdl.tx.ui/build.properties
@@ -5,5 +5,6 @@ bin.includes = .,\
                META-INF/,\
                plugin.xml,\
                templates/,\
+               css/,\
                icons/
 bin.excludes = **/*.xtend
diff --git a/plugins/org.etsi.mts.tdl.tx.ui/css/e4-dark_tdltx_syntaxhighlighting.css b/plugins/org.etsi.mts.tdl.tx.ui/css/e4-dark_tdltx_syntaxhighlighting.css
new file mode 100644
index 0000000000000000000000000000000000000000..8cff1302e9baa4b99c48452c12d4d9ee309cf4b7
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.tx.ui/css/e4-dark_tdltx_syntaxhighlighting.css
@@ -0,0 +1,20 @@
+IEclipsePreferences#org_etsi_mts_tdl_tx_ui {
+	preferences:
+		'org.etsi.mts.tdl.TDLtx.syntaxColorer.tokenStyles.comment.color=246,146,246'
+		'syntaxColorer.comment.color=246,246,146'
+}
+
+IEclipsePreferences#org_etsi_mts_TDLtx {
+	preferences:
+		'org.etsi.mts.tdl.TDLtx.syntaxColorer.tokenStyles.comment.color=246,146,246'
+		'org.etsi.mts.tdl.TDLtx.syntaxColorer.comment.color=246,146,146'
+		'syntaxColorer.comment.color=146,246,146'
+		'syntaxColorer.property_ref.color=222,225,248'
+		'syntaxColorer.tokenStyles.comment.color=225,140,147'
+		'syntaxColorer.property_ref.style=2' /* SWT.ITALIC */
+		'syntaxColorer.feature_ref.color=18,144,195'
+		'syntaxColorer.string_prop_ref.color=167,236,33'
+		'syntaxColorer.string_prop_ref.style=1' /* SWT.BOLD */
+		'syntaxColorer.deprecated_element.color=171,31,54'
+		'syntaxColorer.deprecated_element.style=536870912' /* TextAttribute.STRIKETHROUGH */
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.tx.ui/src/org/etsi/mts/tdl/ui/wizard/TDLtxFileTemplateProvider.xtend b/plugins/org.etsi.mts.tdl.tx.ui/src/org/etsi/mts/tdl/ui/wizard/TDLtxFileTemplateProvider.xtend
index 3c68a8f9cc1fd7c6b355d489dbe596cf5955df27..b2bc99e88e6f80ead8c97dca54590a128c5b0780 100644
--- a/plugins/org.etsi.mts.tdl.tx.ui/src/org/etsi/mts/tdl/ui/wizard/TDLtxFileTemplateProvider.xtend
+++ b/plugins/org.etsi.mts.tdl.tx.ui/src/org/etsi/mts/tdl/ui/wizard/TDLtxFileTemplateProvider.xtend
@@ -50,8 +50,8 @@ final class TDLtxFile {
 final class TDLtxLibrary {
 	//TODO: make it more sensible
 	//TODO: name should not be asked for...
-	val name = text("Name:", "Standard")
-	val packageName = combo("Library:", #["Standard", "HTTP"], "The library to be added.")
+	val name = text("Name:", "TDL")
+	val packageName = combo("Library:", #["TDL", "HTTP"], "The library to be added.")
 	var validated = false
 
 	override protected updateVariables() {
diff --git a/plugins/org.etsi.mts.tdl.tx.ui/src/org/etsi/mts/tdl/ui/wizard/TDLtxProject.xtend b/plugins/org.etsi.mts.tdl.tx.ui/src/org/etsi/mts/tdl/ui/wizard/TDLtxProject.xtend
index 3c46619d8a8e4e366f53e4dbbe6bdf3338cd0655..755d37647fca9f7e12e7b666f0cc06434423a2df 100644
--- a/plugins/org.etsi.mts.tdl.tx.ui/src/org/etsi/mts/tdl/ui/wizard/TDLtxProject.xtend
+++ b/plugins/org.etsi.mts.tdl.tx.ui/src/org/etsi/mts/tdl/ui/wizard/TDLtxProject.xtend
@@ -29,7 +29,7 @@ final class TDLtxProject {
     val name = text("Main Package Name:", "Main", "The name of the main package")
 	val path = text("Path:", "tdl", "The package path to place the files in", advancedGroup)
 	//TODO: add other options
-	val importStandard = check("Import Standard Library", true, "Import TDL standard library definitions.", advancedGroup)
+	val importStandard = check("Import TDL Library", true, "Import TDL standard library definitions.", advancedGroup)
 	val importHTTP = check("Import HTTP Library", false, "Import TDL HTTP library definitions.", advancedGroup)
 	val extendedNature = check("Add additional natures", false, "Add Eclipse Plug-in and Java natures", advancedGroup)
 
@@ -64,7 +64,7 @@ final class TDLtxProject {
 		generator.generate(new PluginProjectFactory => [
 			projectName = projectInfo.projectName
 			location = projectInfo.locationPath
-			projectNatures += #[XtextProjectHelper.NATURE_ID]
+			projectNatures += #[XtextProjectHelper.NATURE_ID, "org.etsi.mts.tdl.nature"]
 			builderIds += #[XtextProjectHelper.BUILDER_ID]
 			if (extendedNature.value) {
 	            projectNatures += #[JavaCore.NATURE_ID, "org.eclipse.pde.PluginNature"]
@@ -74,8 +74,8 @@ final class TDLtxProject {
 			//TODO: remove hardcoded import
 			var imports = ""
 			if (importStandard.value) {
-	            addFile('''src/«path»/Standard.tdltx''', TemplateHelper.getLibrary("Standard"))
-	            imports += "Import all from Standard\n"
+	            addFile('''src/«path»/TDL.tdltx''', TemplateHelper.getLibrary("TDL"))
+	            imports += "Import all from TDL\n"
 			}
 			if (importHTTP.value) {
 				addFile('''src/«path»/HTTP.tdltx''', TemplateHelper.getLibrary("HTTP"))
diff --git a/plugins/org.etsi.mts.tdl.tx.ui/src/org/etsi/mts/tdl/ui/wizard/TDLtxProjectBase.xtend b/plugins/org.etsi.mts.tdl.tx.ui/src/org/etsi/mts/tdl/ui/wizard/TDLtxProjectBase.xtend
index 465b544fff1b99b0706176f6e64406a1bf6200a0..4f384274921f0bf5b75b0f3204e7bddb8443bdf6 100644
--- a/plugins/org.etsi.mts.tdl.tx.ui/src/org/etsi/mts/tdl/ui/wizard/TDLtxProjectBase.xtend
+++ b/plugins/org.etsi.mts.tdl.tx.ui/src/org/etsi/mts/tdl/ui/wizard/TDLtxProjectBase.xtend
@@ -29,7 +29,7 @@ final class TDLtxProjectBase {
     val name = text("Main Package Name:", "Main", "The name of the main package")
 	val path = text("Path:", "tdl", "The package path to place the files in", advancedGroup)
 	//TODO: add other options
-	val importStandard = check("Import Standard Library", true, "Import TDL standard library definitions.", advancedGroup)
+	val importStandard = check("Import TDL Library", true, "Import TDL standard library definitions.", advancedGroup)
 	val importHTTP = check("Import HTTP Library", false, "Import TDL HTTP library definitions.", advancedGroup)
 	val extendedNature = check("Add additional natures", false, "Add Eclipse Plug-in and Java natures", advancedGroup)
 
@@ -74,8 +74,8 @@ final class TDLtxProjectBase {
 			//TODO: remove hardcoded import
 			var imports = ""
 			if (importStandard.value) {
-	            addFile('''src/«path»/Standard.tdltx''', TemplateHelper.getLibrary("Standard"))
-	            imports += "Import all from Standard\n"
+	            addFile('''src/«path»/TDL.tdltx''', TemplateHelper.getLibrary("TDL"))
+	            imports += "Import all from TDL\n"
 			}
 			if (importHTTP.value) {
 				addFile('''src/«path»/HTTP.tdltx''', TemplateHelper.getLibrary("HTTP"))
diff --git a/plugins/org.etsi.mts.tdl.tx.ui/src/org/etsi/mts/tdl/ui/wizard/TDLtxProjectWithOpenAPI.xtend b/plugins/org.etsi.mts.tdl.tx.ui/src/org/etsi/mts/tdl/ui/wizard/TDLtxProjectWithOpenAPI.xtend
index 35fb43aa9af42e848f3db830a2a4fa52513c2442..9059ebdc5c180e3a1bf27738a7c6374868f4e7fb 100644
--- a/plugins/org.etsi.mts.tdl.tx.ui/src/org/etsi/mts/tdl/ui/wizard/TDLtxProjectWithOpenAPI.xtend
+++ b/plugins/org.etsi.mts.tdl.tx.ui/src/org/etsi/mts/tdl/ui/wizard/TDLtxProjectWithOpenAPI.xtend
@@ -34,18 +34,19 @@ final class TDLtxProjectWithOpenAPI {
     val lastUsed = "LAST_USED"
     //TODO: file prompt?
     //TODO: remove after testing
-	val advanced = check("Advanced:", false)
+	val advanced = check("Advanced:", true)
 	val advancedGroup = group("Properties")
 //	val name = combo("Package Name:", #["Example", "Sample", "Tutorial", "Pack"], "The name of the package", advancedGroup)
     val name = text("Main Package Name:", "Main", "The name of the main package")
 	//TODO: add other options
-	val importStandard = check("Import Standard Library", true, "Import TDL standard library definitions.", advancedGroup)
-	val importHTTP = check("Import HTTP Library", false, "Import TDL HTTP library definitions.", advancedGroup)
+	val importStandard = check("Import TDL Library", true, "Import TDL standard library definitions.", advancedGroup)
+	val importHTTP = check("Import HTTP Library", true, "Import TDL HTTP library definitions.", advancedGroup)
+	val importJava = check("Import Java mapping libraries", false, "Import TDL Java mappings.", advancedGroup)
 	val extendedNature = check("Add additional natures", false, "Add Eclipse Plug-in and Java natures", advancedGroup)
     val path = text("Path:", "tdl", "The package path to place the files in", advancedGroup)
-    val dataDefinitionsPath = text("Data DefinitionsPath:", s.getString(lastUsed), "The data definitions path to import from", advancedGroup)
-    val sourceMapping = text("Source mapping tag:", "SOURCE_MAPPING", "The source mapping tag to be used for the data mappings", advancedGroup)
-    val targetMapping = text("Target mapping tag:", "TARGET_MAPPING", "The target mapping tag to be used for the data mappings", advancedGroup)
+//    val dataDefinitionsPath = text("Data DefinitionsPath:", s.getString(lastUsed), "The data definitions path to import from", advancedGroup)
+//    val sourceMapping = text("Source mapping tag:", "SOURCE_MAPPING", "The source mapping tag to be used for the data mappings", advancedGroup)
+//    val targetMapping = text("Target mapping tag:", "TARGET_MAPPING", "The target mapping tag to be used for the data mappings", advancedGroup)
 
     @Inject
     PluginImageHelper pluginImageHelper
@@ -57,20 +58,21 @@ final class TDLtxProjectWithOpenAPI {
 		importHTTP.enabled = advanced.value
 		extendedNature.enabled = advanced.value
         
-        dataDefinitionsPath.enabled = advanced.value
-        sourceMapping.enabled = advanced.value
-        targetMapping.enabled = advanced.value
+//        dataDefinitionsPath.enabled = advanced.value
+//        sourceMapping.enabled = advanced.value
+//        targetMapping.enabled = advanced.value
         
         if (!advanced.value) {
             name.value = "Main"
             path.value = "tdl"
 			importStandard.value = true
-			importHTTP.value = false
+			importHTTP.value = true
+			importJava.value = false
 			extendedNature.value = false
             
-            dataDefinitionsPath.value = s.getString(lastUsed)
-	        sourceMapping.value = "SOURCE_MAPPING"
-	        targetMapping.value = "TARGET_MAPPING"
+//            dataDefinitionsPath.value = s.getString(lastUsed)
+//	        sourceMapping.value = "SOURCE_MAPPING"
+//	        targetMapping.value = "TARGET_MAPPING"
         }
     }
 
@@ -88,6 +90,7 @@ final class TDLtxProjectWithOpenAPI {
             projectName = projectInfo.projectName
             location = projectInfo.locationPath
             projectNatures += #[XtextProjectHelper.NATURE_ID]
+            projectNatures += #["org.etsi.mts.tdl.nature"]
 			builderIds += #[XtextProjectHelper.BUILDER_ID]            
 			if (extendedNature.value) {
 	            projectNatures += #[JavaCore.NATURE_ID, "org.eclipse.pde.PluginNature"]
@@ -99,30 +102,37 @@ final class TDLtxProjectWithOpenAPI {
 			//TODO: remove hardcoded import
 			var imports = ""
 			if (importStandard.value) {
-	            addFile('''src/«path»/Standard.tdltx''', TemplateHelper.getLibrary("Standard"))
-	            imports += "Import all from Standard\n"
+	            addFile('''src/«path»/TDL.tdltx''', TemplateHelper.getLibrary("TDL"))
+	            imports += "Import all from TDL\n"
 			}
 			if (importHTTP.value) {
 				addFile('''src/«path»/HTTP.tdltx''', TemplateHelper.getLibrary("HTTP"))
 				imports += "Import all from HTTP\n"
 				imports += "Import all from HTTP.MessageBased\n"
 			}
+			if (importJava.value) {
+				addFile('''src/«path»/Java.tdltx''', TemplateHelper.getLibrary("Java"))
+				addFile('''src/«path»/TdlRuntime.tdltx''', TemplateHelper.getLibrary("TdlRuntime"))
+				if (importHTTP.value) {
+					addFile('''src/«path»/HttpJavaMappings.tdltx''', TemplateHelper.getLibrary("HttpJavaMappings"))
+					imports += "Import all from HttpJavaMappings\n"
+				}
+				imports += "Import all from Java\n"
+			}
             //TODO: make target package name configurable? i.e. based on name
-            addFile('''src/«path»/imported.tdltx''', 
-            	ConverterNext.processToString(dataDefinitionsPath.value, 
-					"src/"+path.value+"/Imported.tdltx", 
-					sourceMapping.value, 
-					targetMapping.value
-			))
-			val importsName = "generated_from_"+ConverterNext.getTargetPackageName(dataDefinitionsPath.value)
+//            addFile('''src/«path»/imported.tdltx''', 
+//            	ConverterNext.processToString(dataDefinitionsPath.value, 
+//					"src/"+path.value+"/Imported.tdltx", 
+//					sourceMapping.value, 
+//					targetMapping.value
+//			))
+			// val importsName = "generated_from_"+ConverterNext.getTargetPackageName(dataDefinitionsPath.value)
 			addFile('''src/«path»/«name».tdltx''', '''
                 /*
                  * This is an example package
                  */
                 Package «name» {
-                    Import all from Standard
-                    Import all from «importsName»
-                    Type simple
+                	«imports»
                 }
             ''')
              
diff --git a/plugins/org.etsi.mts.tdl.tx.ui/templates/HTTP.tdltx b/plugins/org.etsi.mts.tdl.tx.ui/templates/HTTP.tdltx
index b1a4f2f0302a374641989f934db04e6e73cee91d..aca535db244f3fb74b3bfbaa18e744acf3cf5581 100644
--- a/plugins/org.etsi.mts.tdl.tx.ui/templates/HTTP.tdltx
+++ b/plugins/org.etsi.mts.tdl.tx.ui/templates/HTTP.tdltx
@@ -1,126 +1,172 @@
-Package HTTP { 
+@Version: "1.0.0"
+Package HTTP {
+	
 	Package MessageBasedConfiguration {
-        Import all from MessageBased
-        Message Gate HTTPGate accepts Request,Response
-        Component API {
-            //Add variables and timers here or define new component types and configurations 
-            gate HTTPGate http
-        }
-        Configuration BasicClientServer {
-            API client as Tester,
-            API server as SUT,
-            connect client::http to server::http
-        }
-    
-	} Note : "Message based types and instances"
+		Import all from MessageBased
+		Message Gate HTTPGate accepts Request,Response
+		Message Gate HTTPSGate accepts Request,Response
+		Component API {
+			// Add variables and timers here or define new component types and configurations 
+			gate HTTPGate http
+			gate HTTPSGate https
+		}
+		Configuration BasicClientServer {
+			API client as Tester,
+			API poller as Tester,
+			API server as SUT,
+			connect client::http to server::http
+		}
+	}
 	
+	Note : "Message based types and instances"
 	Package MessageBased {
-        Import all from Standard
-        
-        //Generic Method type -> required for generation!!!
-        Enumerated Method {
-	        Method GET,
-	        Method POST,
-	        Method PUT,
-	        Method PATCH,
-	        Method DELETE
-        }
-
-        //Generic Request type    
-        Structure Request (
-            String uri,
-            optional Method method,
-            optional Headers headers,
-            optional Parameters parameters,
-            optional Body body
-        )
-        
-        //Generic Request instances
-        Request GET ( )
-        Request POST ( )
-        Request PUT ( )
-        Request PATCH ( )
-        Request DELETE ( )
-        
-        //Generic Response type    
-        Structure Response (
-            optional Integer status,
-            optional String statusMessage,
-            optional Headers headers,
-            optional Body body
-        )
-        
-        //Generic Response instances, name = status code
-        
-        Response r200 (statusMessage = "OK")
-        Response r201 (statusMessage = "Created")
-        Response r204 (statusMessage = "No Content")
-        Response r400 (statusMessage = "Bad Request")
-        Response r401 (statusMessage = "Not Found")
-        Response r403 (statusMessage = "Not Authorized")
-        Response r404 (statusMessage = "Forbidden")
-
-        //Generic Response instances, name = status message        
-        Response OK (status = "200")
-        Response Created (status = "201")
-        Response NoContent (status = "204")
-        Response BadRequest (status = "400")
-        Response NotFound (status = "404")
-        Response NotAuthorized (status = "401")
-        Response Forbidden (status = "403")
-        
-        //supporting types
-        Collection Parameters of Parameter
-        Structure Parameter (
-            Location location,
-            String ^name,
-            String ^value
-        )
-        Type Location
-        Location path
-        Location query
-
-        //may need a structure, not necessarily relevant in standardized testing
-        Location cookie
-        
-        //separate headers -> not necessary
-        //Location header;
-        Collection Headers of Header
-        Structure Header (
-            String ^name,
-            String ^value
-            //not relevant in TDL? 
-            //optional contentLength of type Integer,
-            //optional contentType of type String 
-        )
-        
-        //Base body for extension
-        Structure Body ( )
-        
-        //Basic string body
-        Structure StringBody extends Body (
-            String text
-        )
-        
-        //Basic wrapper for collection responses
-        Structure CollectionBody extends Body (
-            Bodies items
-        )
-        
-        //Any body can be included
-        //If consistent type is needed, a custom subtype shall be defined and used 
-        Collection Bodies of Body
-        
-        //Custom collection data instances can be defined
-        //  - inline in the responses 
-        //  - predefined as a separate data element
-        //Custom collection data instances can be defined 
-        //to enforce type consistency specific for API 
+		Import all from TDL
+		
+		// HTTP methods
+		Enumerated Method {
+			Method GET,
+			Method POST,
+			Method PUT,
+			Method PATCH,
+			Method DELETE
+		}
+		
+		// Generic Request type    
+		Structure Request (
+			String uri,
+			optional Method method,
+			optional Headers headers,
+			optional Parameters parameters,
+			optional QueryParameters queryParameters,
+			optional PathParameters pathParameters,
+			optional Body body
+		)
+		
+		// Generic Response type    
+		Structure Response (
+			optional Integer status,
+			optional String statusMessage,
+			optional Headers headers,
+			optional Body body
+		)
+		
+		// Supporting types
+		Collection Parameters of Parameter
+		Structure Parameter (
+			Location location,
+			String ^name,
+			String ^value
+		)
+		Enumerated Location {
+			Location path,
+			Location query,
+			// TODO may need a structure, not necessarily relevant in standardized testing
+			Location cookie
+		}
+		
+		Structure PathParameters ()
+		Structure QueryParameters ()
+		
+		Collection Headers of Header
+		Structure Header (
+			String ^name,
+			String ^value
+		)
+		
+		// Base body for extension
+		Structure Body ()
+		
+		// Basic string body
+		Structure StringBody extends Body (
+			String text
+		)
+		
+		// Basic wrapper for collection responses
+		Structure CollectionBody extends Body (
+			Bodies items
+		)
+		
+		// Any body can be included
+		// If consistent type is needed, a custom subtype shall be defined and used 
+		Collection Bodies of Body
+		// Custom collection data instances can be defined
+		// - inline in the responses 
+		// - predefined as a separate data element
+		
+		// Custom collection data instances can be defined 
+		// to enforce type consistency specific for API 
+		
+		// Basic form body    
+		Structure FormBody extends Body (
+			String field,
+			String content
+		)
+	} 
     
-        //Basic form body    
-        Structure FormBody extends Body (
-            String field,
-            String content
-        )
-    } 
+    Package Templates {
+		Import all from MessageBased
+		
+		// Generic Request instances
+		Request rGET (
+			method = GET
+		)
+		Request rPOST (
+			method = POST
+		)
+		Request rPUT (
+			method = PUT
+		)
+		Request rPATCH (
+			method = PATCH
+		)
+		Request rDELETE (
+			method = DELETE
+		)
+		
+		// Generic Response instances, name = status code        
+		Response r200 (
+			statusMessage = "OK"
+		)
+		Response r201 (
+			statusMessage = "Created"
+		)
+		Response r204 (
+			statusMessage = "No Content"
+		)
+		Response r400 (
+			statusMessage = "Bad Request"
+		)
+		Response r401 (
+			statusMessage = "Unauthorized"
+		)
+		Response r403 (
+			statusMessage = "Forbidden"
+		)
+		Response r404 (
+			statusMessage = "Not Found"
+		)
+		
+		// Generic Response instances, name = status message        
+		Response OK (
+			status = 200
+		)
+		Response Created (
+			status = 201
+		)
+		Response NoContent (
+			status = 204
+		)
+		Response BadRequest (
+			status = 400
+		)
+		Response NotFound (
+			status = 404
+		)
+		Response NotAuthorized (
+			status = 401
+		)
+		Response Forbidden (
+			status = 403
+		)
+	}
 }
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.tx.ui/templates/HttpJavaMappings.tdltx b/plugins/org.etsi.mts.tdl.tx.ui/templates/HttpJavaMappings.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..01512a7b66716533df28e675444570846f6cc99d
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.tx.ui/templates/HttpJavaMappings.tdltx
@@ -0,0 +1,59 @@
+@Version: "1.0.0"
+Package HttpJavaMappings {
+	Import all from TDL
+	Import all from Java
+	Import all from HTTP.MessageBased
+	
+	@[JavaPackage,
+    	MappingName : "Java"]
+	Use "org.etsi.mts.tdl.execution.java.adapters.http" as HttpAdapter
+	
+    @JavaClass
+	Map Request to "HttpRequestData" in HttpAdapter as Request_Mapping {
+		uri -> "uri",
+		method -> "method",
+		headers -> "headers",
+		parameters -> "parameters",
+		body -> "body"
+    }
+    @JavaClass
+	Map Response to "HttpResponseData" in HttpAdapter as Response_Mapping {
+		status -> "status",
+		statusMessage -> "statusMessage",
+		headers -> "headers",
+		body -> "body"
+    }
+    @JavaClass
+	Map Header to "HttpHeader" in HttpAdapter as Header_Mapping {
+		^name -> "name",
+		^value -> "value"
+    }
+    @JavaClass
+	Map Parameter to "HttpRequestParameter" in HttpAdapter as Parameter_Mapping {
+		location -> "location",
+		^name -> "name",
+		^value -> "value"
+    }
+    @JavaClass
+	Map Location to "HttpParameterLocation" in HttpAdapter as Location_Mapping
+	
+    @[JavaClass,
+    	MappingName : "Java"]
+	Use "org.etsi.mts.tdl.execution.java.adapters.http.HttpParameterLocation" as HttpParameterLocation
+	Map path to "path" in HttpParameterLocation as path_mapping
+	Map query to "query" in HttpParameterLocation as query_mapping
+	Map cookie to "cookie" in HttpParameterLocation as cookie_mapping
+	
+	
+    @JavaClass
+	Map Method to "HttpMethod" in HttpAdapter as Method_Mapping
+	
+    @[JavaClass,
+    	MappingName : "Java"]
+	Use "org.etsi.mts.tdl.execution.java.adapters.http.HttpMethod" as HttpMethod
+	Map GET to "GET" in HttpMethod as GET_mapping
+	Map POST to "POST" in HttpMethod as POST_mapping
+	Map PUT to "PUT" in HttpMethod as PUT_mapping
+	Map PATCH to "PATCH" in HttpMethod as PATCH_mapping
+	Map DELETE to "DELETE" in HttpMethod as DELETE_mapping
+}
diff --git a/plugins/org.etsi.mts.tdl.tx.ui/templates/Java.tdltx b/plugins/org.etsi.mts.tdl.tx.ui/templates/Java.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..929f7967484be4d4f53538e3a8b1fc9580c51419
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.tx.ui/templates/Java.tdltx
@@ -0,0 +1,59 @@
+@Version: "1.0.0"
+Package Java {
+	Import all from TDL
+	
+	/* Applied to a DataResourceMapping to specify a package  */
+	Annotation JavaPackage
+	/* Applied to a DataElementMapping to specify an instance method  */
+	Annotation JavaMethod
+	/* Applied to a DataElementMapping to specify an class method  */
+	Annotation JavaStaticMethod
+	/* Applied to a DataResourceMapping or DataElementMapping to specify a class  */
+	Annotation JavaClass
+	/* Applied to a DataElementMapping to specify a field (of a class)  */
+	Annotation JavaField
+	/* Applied to a DataElementMapping to specify a static field (of a class)  */
+	Annotation JavaStaticField
+	/* Applied to a ParameterMapping to specify an instance method that returns the value of a field  */
+	Annotation JavaGetter
+	/* Applied to a ParameterMapping to specify an instance method that sets the field value  */
+	Annotation JavaSetter
+	
+	
+    @[
+    	JavaPackage,
+    	MappingName : "Java"
+    ]
+    Use "java.lang" as JavaLang
+	Map Boolean to "Boolean" in JavaLang as Boolean_mapping
+	Map Integer to "Integer" in JavaLang as Integer_mapping
+	Map String to "String" in JavaLang as String_mapping
+	
+	
+	
+    @[JavaPackage,
+    	MappingName : "Java"]
+    Use "org.etsi.mts.tdl.execution.java.tri" as Tri
+    
+    @JavaClass
+	Map Verdict to "Verdict" in Tri as Verdict_Mapping
+	
+    @[JavaClass,
+    	MappingName : "Java"]
+	Use "org.etsi.mts.tdl.execution.java.tri.Verdict" as VerdictClass
+	Map pass to "pass" in VerdictClass as pass_mapping
+	Map fail to "fail" in VerdictClass as fail_mapping
+	Map inconclusive to "inconclusive" in VerdictClass as inconclusive_mapping
+	
+	
+    @[JavaPackage,
+    	MappingName : "Java"]
+    Use "org.etsi.mts.tdl.execution.java.rt.core" as RuntimeCore
+    
+    @[JavaClass,
+    	MappingName : "Java"]
+	Use "org.etsi.mts.tdl.execution.java.rt.core.TimeUnit" as TimeUnitClass
+	Map second to "Second" in TimeUnitClass as second_mapping
+	
+	
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.tx.ui/templates/TDL.tdltx b/plugins/org.etsi.mts.tdl.tx.ui/templates/TDL.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..d063a4c43d63b296fc10fe667643080402009915
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.tx.ui/templates/TDL.tdltx
@@ -0,0 +1,59 @@
+@Version: "1.8.1"
+Package TDL {
+	Constraint length
+	Constraint minLength
+	Constraint maxLength
+	Constraint range
+	Constraint format
+	Constraint union
+	Constraint uniontype
+	
+	Type Boolean
+	Type Integer
+	Type String
+	Type Verdict
+	
+	Boolean ^true
+	Boolean ^false
+	Boolean True
+	Boolean False
+	
+	Verdict pass
+	Verdict fail
+	Verdict inconclusive
+	
+	Time second
+	
+	Annotation Master
+	Annotation MappingName
+	Annotation Version
+	Annotation check
+	Annotation where
+	Annotation PICS
+
+    //standard annotations for STO
+    Annotation Initial conditions
+    Annotation Expected behaviour
+    Annotation Final conditions
+    Annotation Test Purpose Description
+    Annotation when
+    Annotation then
+	
+	Predefined == returns Boolean
+	Predefined != returns Boolean
+	Predefined and returns Boolean
+	Predefined or returns Boolean
+	Predefined xor returns Boolean
+	Predefined not returns Boolean
+	Predefined < returns Boolean
+	Predefined > returns Boolean
+	Predefined <= returns Boolean
+	Predefined >= returns Boolean
+	Predefined +
+	Predefined -
+	Predefined *
+	Predefined /
+	Predefined mod
+	Predefined size returns Integer
+	
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.tx.ui/templates/TdlRuntime.tdltx b/plugins/org.etsi.mts.tdl.tx.ui/templates/TdlRuntime.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..4b0da7db3ac72adab8663191417ef0fdcf7c1fab
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.tx.ui/templates/TdlRuntime.tdltx
@@ -0,0 +1,5 @@
+@Version: "1.0.0"
+Package TdlRuntime {
+	Import all from TDL
+	Annotation Language
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.tx.ui/templates/templates.xml b/plugins/org.etsi.mts.tdl.tx.ui/templates/templates.xml
index 9b51117ffec6756058d9675a07b4cc111228a476..fa5eee19c7925bcc1dffad0429695846c4a3c8eb 100644
--- a/plugins/org.etsi.mts.tdl.tx.ui/templates/templates.xml
+++ b/plugins/org.etsi.mts.tdl.tx.ui/templates/templates.xml
@@ -128,8 +128,8 @@ with {
 	}
 }
 	
-</template><template autoinsert="true" context="org.etsi.mts.tdl.TDLtx.Package" deleted="false" description="Empty Package including import from Standard" enabled="true" id="org.etsi.mts.tdl.tx.templates.Package.-.Include.Standard.import" name="Package - Include Standard import">Package ${packageName} {
-    Import all from Standard
+</template><template autoinsert="true" context="org.etsi.mts.tdl.TDLtx.Package" deleted="false" description="Empty Package including import from TDL" enabled="true" id="org.etsi.mts.tdl.tx.templates.Package.-.Include.TDL.import" name="Package - Include TDL import">Package ${packageName} {
+    Import all from TDL
     ${cursor}
 }</template><template autoinsert="true" context="org.etsi.mts.tdl.TDLtx.ParallelBehaviour" deleted="false" description="Parallel Behaviour with three or more Blocks" enabled="true" id="org.etsi.mts.tdl.tx.templates.Parallel.Behaviour.with.three.or.more.Blocks" name="Parallel Behaviour with three or more Blocks">run {
 	${sourceGate:CrossReference(Interaction.sourceGate)} sends ${dataElement:CrossReference(DataElementUse.dataElement)} to ${targetGate:CrossReference(Target.targetGate)}
diff --git a/plugins/org.etsi.mts.tdl.tx.ui/templates/templates.xmlback b/plugins/org.etsi.mts.tdl.tx.ui/templates/templates.xmlback
index 9801be16b2852be02bc72285e8ad5d2fee8a5f9b..90997a7d37251934dbb670d7772d530f71d453c9 100644
--- a/plugins/org.etsi.mts.tdl.tx.ui/templates/templates.xmlback
+++ b/plugins/org.etsi.mts.tdl.tx.ui/templates/templates.xmlback
@@ -128,8 +128,8 @@ with {
 	}
 }
 	
-</template><template autoinsert="true" context="org.etsi.mts.tdl.TDLtx.Package" deleted="false" description="Empty Package including import from Standard" enabled="true" name="Package - Include Standard import">Package ${packageName} {
-    Import all from Standard
+</template><template autoinsert="true" context="org.etsi.mts.tdl.TDLtx.Package" deleted="false" description="Empty Package including import from TDL" enabled="true" name="Package - Include TDL import">Package ${packageName} {
+    Import all from TDL
     ${cursor}
 }</template><template autoinsert="true" context="org.etsi.mts.tdl.TDLtx.ParallelBehaviour" deleted="false" description="Parallel Behaviour with three or more Blocks" enabled="true" name="Parallel Behaviour with three or more Blocks">run {
 	${sourceGate:CrossReference(Interaction.sourceGate)} sends ${dataElement:CrossReference(DataElementUse.dataElement)} to ${targetGate:CrossReference(Target.targetGate)}
diff --git a/plugins/org.etsi.mts.tdl.tx/.launch/TDL.tx and TDL.txi.launch b/plugins/org.etsi.mts.tdl.tx/.launch/TDL.tx and TDL.txi.launch
index 88e42895a23415ee8f02f3e578b79c70d840e8c2..8050582620d5b9838de4eb3152d6b51df9d3faef 100644
--- a/plugins/org.etsi.mts.tdl.tx/.launch/TDL.tx and TDL.txi.launch	
+++ b/plugins/org.etsi.mts.tdl.tx/.launch/TDL.tx and TDL.txi.launch	
@@ -23,22 +23,19 @@
     <booleanAttribute key="org.eclipse.jdt.launching.ATTR_ATTR_USE_ARGFILE" value="false"/>
     <booleanAttribute key="org.eclipse.jdt.launching.ATTR_SHOW_CODEDETAILS_IN_EXCEPTION_MESSAGES" value="true"/>
     <booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
-    <stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.launching.macosx.MacOSXType/Zulu 17.30.15 [17.0.1]"/>
+    <stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk-18"/>
     <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl}"/>
     <stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
     <stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xms40m -Xmx512m"/>
     <stringAttribute key="pde.version" value="3.3"/>
     <stringAttribute key="product" value="org.eclipse.platform.ide"/>
     <setAttribute key="selected_target_bundles">
-        <setEntry value="com.google.guava@default:default"/>
+        <setEntry value="com.google.guava*32.1.3.jre@default:default"/>
         <setEntry value="com.google.inject@default:default"/>
         <setEntry value="com.ibm.icu@default:default"/>
         <setEntry value="com.jcraft.jsch@default:default"/>
         <setEntry value="com.sun.jna.platform@default:default"/>
         <setEntry value="com.sun.jna@default:default"/>
-        <setEntry value="de.libutzki.xtext.nodemodeloutline.ui@default:default"/>
-        <setEntry value="de.libutzki.xtext.semanticmodeloutline.ui@default:default"/>
-        <setEntry value="io.github.classgraph@default:default"/>
         <setEntry value="jakarta.servlet-api@default:default"/>
         <setEntry value="javax.annotation@default:default"/>
         <setEntry value="javax.inject@default:default"/>
@@ -57,8 +54,6 @@
         <setEntry value="org.apache.felix.gogo.shell@default:default"/>
         <setEntry value="org.apache.felix.scr@1:true"/>
         <setEntry value="org.apache.log4j@default:default"/>
-        <setEntry value="org.apache.lucene.analyzers-common@default:default"/>
-        <setEntry value="org.apache.lucene.analyzers-smartcn@default:default"/>
         <setEntry value="org.apache.lucene.core@default:default"/>
         <setEntry value="org.apache.xmlgraphics@default:default"/>
         <setEntry value="org.eclipse.ant.core@default:default"/>
@@ -71,7 +66,6 @@
         <setEntry value="org.eclipse.core.databinding@default:default"/>
         <setEntry value="org.eclipse.core.expressions@default:default"/>
         <setEntry value="org.eclipse.core.filebuffers@default:default"/>
-        <setEntry value="org.eclipse.core.filesystem.macosx@default:false"/>
         <setEntry value="org.eclipse.core.filesystem@default:default"/>
         <setEntry value="org.eclipse.core.jobs@default:default"/>
         <setEntry value="org.eclipse.core.net@default:default"/>
@@ -99,7 +93,6 @@
         <setEntry value="org.eclipse.e4.ui.services@default:default"/>
         <setEntry value="org.eclipse.e4.ui.widgets@default:default"/>
         <setEntry value="org.eclipse.e4.ui.workbench.addons.swt@default:default"/>
-        <setEntry value="org.eclipse.e4.ui.workbench.renderers.swt.cocoa@default:false"/>
         <setEntry value="org.eclipse.e4.ui.workbench.renderers.swt@default:default"/>
         <setEntry value="org.eclipse.e4.ui.workbench.swt@default:default"/>
         <setEntry value="org.eclipse.e4.ui.workbench3@default:default"/>
@@ -155,15 +148,12 @@
         <setEntry value="org.eclipse.equinox.p2.updatesite@default:default"/>
         <setEntry value="org.eclipse.equinox.preferences@default:default"/>
         <setEntry value="org.eclipse.equinox.registry@default:default"/>
-        <setEntry value="org.eclipse.equinox.security.macosx@default:false"/>
         <setEntry value="org.eclipse.equinox.security@default:default"/>
         <setEntry value="org.eclipse.equinox.simpleconfigurator.manipulator@default:default"/>
         <setEntry value="org.eclipse.equinox.simpleconfigurator@1:true"/>
         <setEntry value="org.eclipse.help.base@default:default"/>
         <setEntry value="org.eclipse.help.ui@default:default"/>
         <setEntry value="org.eclipse.help@default:default"/>
-        <setEntry value="org.eclipse.jdt.compiler.apt@default:false"/>
-        <setEntry value="org.eclipse.jdt.compiler.tool@default:false"/>
         <setEntry value="org.eclipse.jdt.core.manipulation@default:default"/>
         <setEntry value="org.eclipse.jdt.core@default:default"/>
         <setEntry value="org.eclipse.jdt.debug@default:default"/>
@@ -202,13 +192,11 @@
         <setEntry value="org.eclipse.pde.core@default:default"/>
         <setEntry value="org.eclipse.platform@default:default"/>
         <setEntry value="org.eclipse.search@default:default"/>
-        <setEntry value="org.eclipse.swt.cocoa.macosx.aarch64@default:false"/>
         <setEntry value="org.eclipse.swt@default:default"/>
         <setEntry value="org.eclipse.team.core@default:default"/>
         <setEntry value="org.eclipse.team.ui@default:default"/>
         <setEntry value="org.eclipse.text@default:default"/>
         <setEntry value="org.eclipse.ui.cheatsheets@default:default"/>
-        <setEntry value="org.eclipse.ui.cocoa@default:false"/>
         <setEntry value="org.eclipse.ui.console@default:default"/>
         <setEntry value="org.eclipse.ui.editors@default:default"/>
         <setEntry value="org.eclipse.ui.forms@default:default"/>
@@ -263,6 +251,11 @@
         <setEntry value="org.w3c.dom.svg@default:default"/>
     </setAttribute>
     <setAttribute key="selected_workspace_bundles">
+        <setEntry value="de.ugoe.cs.swe.T3Q@default:default"/>
+        <setEntry value="de.ugoe.cs.swe.TTCN3.tests@default:default"/>
+        <setEntry value="de.ugoe.cs.swe.TTCN3.ui@default:default"/>
+        <setEntry value="de.ugoe.cs.swe.TTCN3@default:default"/>
+        <setEntry value="de.ugoe.cs.swe.TTCN3Configuration@default:default"/>
         <setEntry value="org.etsi.mts.tdl.TDLan2.ide@default:default"/>
         <setEntry value="org.etsi.mts.tdl.TDLan2.ui@default:default"/>
         <setEntry value="org.etsi.mts.tdl.TDLan2@default:default"/>
@@ -275,18 +268,20 @@
         <setEntry value="org.etsi.mts.tdl.constraints.ui@default:default"/>
         <setEntry value="org.etsi.mts.tdl.constraints@default:default"/>
         <setEntry value="org.etsi.mts.tdl.execution.java@default:default"/>
+        <setEntry value="org.etsi.mts.tdl.extras.openapi.generator.wrapper@default:default"/>
+        <setEntry value="org.etsi.mts.tdl.extras.yang.tools.wrapper@default:default"/>
         <setEntry value="org.etsi.mts.tdl.graphical.labels.data.ui@default:default"/>
         <setEntry value="org.etsi.mts.tdl.graphical.labels.data@default:default"/>
         <setEntry value="org.etsi.mts.tdl.graphical.viewpoint@default:default"/>
         <setEntry value="org.etsi.mts.tdl.helper@default:default"/>
         <setEntry value="org.etsi.mts.tdl.importers.ui@default:default"/>
         <setEntry value="org.etsi.mts.tdl.json2tdl@default:default"/>
+        <setEntry value="org.etsi.mts.tdl.library@default:default"/>
         <setEntry value="org.etsi.mts.tdl.model@default:default"/>
         <setEntry value="org.etsi.mts.tdl.openapi.generator.ui@default:default"/>
-        <setEntry value="org.etsi.mts.tdl.openapi.generator.wrapper@default:default"/>
         <setEntry value="org.etsi.mts.tdl.openapi2tdl.next@default:default"/>
-        <setEntry value="org.etsi.mts.tdl.openapi2tdl@default:default"/>
         <setEntry value="org.etsi.mts.tdl.perspective@default:default"/>
+        <setEntry value="org.etsi.mts.tdl.project@default:default"/>
         <setEntry value="org.etsi.mts.tdl.rt.ui@default:default"/>
         <setEntry value="org.etsi.mts.tdl.standalone@default:default"/>
         <setEntry value="org.etsi.mts.tdl.to2tdl@default:default"/>
@@ -303,6 +298,7 @@
         <setEntry value="org.etsi.mts.tdl.txi.ui@default:default"/>
         <setEntry value="org.etsi.mts.tdl.txi@default:default"/>
         <setEntry value="org.etsi.mts.tdl.wizards@default:default"/>
+        <setEntry value="org.etsi.mts.tdl.yang2tdl@default:default"/>
     </setAttribute>
     <booleanAttribute key="show_selected_only" value="false"/>
     <stringAttribute key="templateConfig" value="${target_home}/configuration/config.ini"/>
diff --git a/plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/RDS.xtend b/plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/RDS.xtend
new file mode 100644
index 0000000000000000000000000000000000000000..0f891f3d67219327f0a12a498eeb45766275aa6a
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/RDS.xtend
@@ -0,0 +1,35 @@
+package org.etsi.mts.tdl;
+
+import com.google.inject.Inject
+import java.util.HashMap
+import org.eclipse.xtext.naming.QualifiedName
+import org.eclipse.xtext.resource.EObjectDescription
+import org.eclipse.xtext.resource.IEObjectDescription
+import org.eclipse.xtext.resource.impl.DefaultResourceDescriptionStrategy
+import org.eclipse.xtext.scoping.impl.ImportUriResolver
+import org.eclipse.xtext.util.IAcceptor
+import org.eclipse.emf.ecore.EObject
+
+class RDS extends DefaultResourceDescriptionStrategy {
+	public static final String INCLUDES = "includes"
+	@Inject
+	ImportUriResolver uriResolver
+
+	override createEObjectDescriptions(EObject eObject, IAcceptor<IEObjectDescription> acceptor) {
+		if(eObject instanceof Package) {
+			this.createEObjectDescriptionForPackage(eObject, acceptor)
+			return true
+		}
+		else {
+			super.createEObjectDescriptions(eObject, acceptor)
+		}
+	}
+
+	def void createEObjectDescriptionForPackage(Package model, IAcceptor<IEObjectDescription> acceptor) {
+		val uris = newArrayList()
+		model.import.forEach[uris.add(uriResolver.apply(it.importedPackage))]
+		val userData = new HashMap<String,String>
+		userData.put(INCLUDES, uris.join(","))
+		acceptor.accept(EObjectDescription.create(QualifiedName.create(model.eResource.URI.toString), model, userData))
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/TDLtx.xtext b/plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/TDLtx.xtext
index 6d1f229f3c71ee5ff2c72dfae46478fdb89d2c38..fd0c28f1274489b9d35602982a05fb1e0a48755f 100644
--- a/plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/TDLtx.xtext
+++ b/plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/TDLtx.xtext
@@ -50,22 +50,40 @@ PackageableElement returns tdl::PackageableElement:
 //Element : Abstract
 
 fragment AnnotationFragment returns tdl::Element:
-    (annotation+=Annotation)*
+	'@' 
+	//Workaround for upstream issue
+	( 
+		annotation+=Annotation
+		| 
+		('[' annotation+=Annotation (',' annotation+=Annotation)+ ']')
+	)
 ;
 
+fragment CommentFragment returns tdl::Element:
+	'Note' 
+	//Workaround for upstream issue
+	( 
+		comment+=SingleComment
+		| 
+		('[' comment+=MultiComment (',' comment+=MultiComment)+ ']')
+	)
+;
+
+
 fragment AnnotationCommentFragment returns tdl::Element:
-    (comment+=Comment)*
-    (annotation+=Annotation)*
+    CommentFragment?
+    AnnotationFragment?
+    //(annotation+=Annotation)*
 ;
 
 fragment NameFragment returns tdl::Element:
-    'Name:' name=Identifier
+    'Name' ':' name=Identifier
 ;
 
 fragment WithCommentFragment returns tdl::Element:
     'with'
     BEGIN
-        (comment+=Comment)+
+        CommentFragment
     END
 ;
 
@@ -89,16 +107,28 @@ ElementImport returns tdl::ElementImport:
     'from' importedPackage=[tdl::Package|QIdentifier]
 ;
 
-Comment returns tdl::Comment:
-    'Note' (name=NIdentifier)? 
+SingleComment returns tdl::Comment:
+    (name=NIdentifier)? 
     ':' body=EString
 ;
 
+MultiComment returns tdl::Comment:
+    (name=NIdentifier ':')? 
+    body=EString
+;
+
+
 Annotation returns tdl::Annotation:
-    '@' key=[tdl::AnnotationType|AIdentifier]
+    key=[tdl::AnnotationType|AIdentifier]
     (':' value=EString)?
 ;
 
+CheckAnnotation returns tdl::Annotation:
+    key=[tdl::AnnotationType|CheckIdentifier]
+    (':' value=EString)
+;
+
+
 AnnotationType returns tdl::AnnotationType:
     AnnotationCommentFragment
     'Annotation' name = AIdentifier
@@ -109,8 +139,8 @@ TestObjective returns tdl::TestObjective:
     AnnotationCommentFragment
     'Objective' name=Identifier
     (BEGIN
-        ('Description:' description=EString)?
-        ('References:' objectiveURI+=EString (',' objectiveURI+=EString)*)?
+        ('Description' ':' description=EString)?
+        ('References' ':' objectiveURI+=EString (',' objectiveURI+=EString)*)?
     END)?
 ;
 
@@ -179,6 +209,15 @@ SimpleDataInstance returns tdl::SimpleDataInstance:
     name=Identifier 
 ;
 
+EnumDataInstance returns tdl::SimpleDataInstance:
+    AnnotationCommentFragment
+    dataType=[tdl::DataType|Identifier]?
+    //for backwards compatibility -> Predefined Booleans now True and False
+    //(name=Identifier | name=BOOLEANNAME)
+    name=Identifier 
+;
+
+
 StructuredDataType returns tdl::StructuredDataType:
     AnnotationCommentFragment
     'Structure' name=Identifier
@@ -231,7 +270,7 @@ ProcedureSignature returns tdl::ProcedureSignature:
 ;
 
 ProcedureParameter returns tdl::ProcedureParameter:
-    AnnotationFragment
+    AnnotationFragment?
     kind=ParameterKind
     dataType=[tdl::DataType|Identifier]
     name=Identifier
@@ -242,7 +281,7 @@ enum ParameterKind returns tdl::ParameterKind:
     In = 'in' | Out = 'out' | Exception = 'exception';
 
 FormalParameter returns tdl::FormalParameter:
-    AnnotationFragment
+    AnnotationFragment?
     dataType=[tdl::DataType|Identifier]
     name=Identifier
     WithCommentFragment?
@@ -301,7 +340,7 @@ EnumDataType returns tdl::EnumDataType:
     AnnotationCommentFragment
     'Enumerated' name=Identifier
     BEGIN
-        value+=SimpleDataInstance (',' value+=SimpleDataInstance)*
+        value+=EnumDataInstance (',' value+=EnumDataInstance)*
     END
 ;
 
@@ -311,12 +350,12 @@ EnumDataType returns tdl::EnumDataType:
 DataUse returns tdl::DataUse:
     //NOTE: No name, annotations or comments
     //Remove static and dynamic eventually in favour of the sub-rules 
-    DataElementUse
+    =>DataElementUse
 //    | LiteralValueUse
 //    | SpecialValueUse
 //    | VariableUse
 //    | PredefinedFunctionCall
-    | (StaticDataUse)
+    | =>(StaticDataUse)
     | (DynamicDataUse)
 ;
 
@@ -329,12 +368,24 @@ fragment ParameterBindingFragment returns tdl::DataUse:
     LParen (argument+=ParameterBinding ( ',' argument+=ParameterBinding)*)? RParen
 ;
 
+fragment CheckFragment returns tdl::DataUse:
+    LBrace (annotation+=CheckAnnotation)  RBrace
+;
+
 
 ParameterBinding returns tdl::ParameterBinding:
     parameter=[tdl::Parameter|Identifier]
+//    ('.' parameter+=[tdl::Parameter|Identifier])*
+    ParameterReductionFragment
     '=' dataUse=DataUse
 ;
 
+fragment ParameterReductionFragment returns tdl::ParameterBinding:
+    (->reduction+=CollectionReference)?
+    ('.' reduction+=MemberReference)*
+;
+
+
 MemberReference returns tdl::MemberReference:
     member=[tdl::Member|Identifier] 
     (->'[' collectionIndex=DataUse ']')? 
@@ -348,6 +399,7 @@ StaticDataUse returns tdl::StaticDataUse:
     DataInstanceUse
     | SpecialValueUse
     | LiteralValueUse
+    | CastDataUse
 ;
 
 DataInstanceUse returns tdl::DataInstanceUse:
@@ -386,10 +438,12 @@ SpecialValueUse returns tdl::SpecialValueUse:
 AnyValue returns tdl::AnyValue:
     name='?'
     (LBrace dataType=[tdl::DataType|Identifier] RBrace)?
+    CheckFragment?
 ;
 
 AnyValueOrOmit returns tdl::AnyValueOrOmit:
     name='*'
+    CheckFragment?
 ;
 
 OmitValue returns tdl::OmitValue:
@@ -403,8 +457,19 @@ LiteralValueUse returns tdl::LiteralValueUse:
 		LBrace dataType=[tdl::DataType|Identifier] RBrace
 		(ParameterBindingFragment | ReductionFragment)
 	)?
+	CheckFragment?
+;
+
+CastDataUse returns tdl::CastDataUse:
+	LParen
+	dataUse=DataUse
+    'as' 
+    dataType=[tdl::DataType|Identifier] 
+    RParen
+	(ParameterBindingFragment | ReductionFragment)
 ;
 
+
 DynamicDataUse returns tdl::DynamicDataUse:
     FunctionCall 
     | FormalParameterUse
@@ -413,12 +478,14 @@ DynamicDataUse returns tdl::DynamicDataUse:
     | TimeLabelUse 
 ;
 
+//TODO: deprecated?
 FunctionCall returns tdl::FunctionCall:
     'instance' 'returned' 'from' function=[tdl::Function|Identifier] 
     ParameterBindingFragment
     ReductionFragment
 ;
 
+//TODO: deprecated?
 FormalParameterUse returns tdl::FormalParameterUse:
     'parameter' parameter=[tdl::FormalParameter|Identifier]
     (ParameterBindingFragment | ReductionFragment)
@@ -472,6 +539,7 @@ DataElementUse returns tdl::DataElementUse:
         UnassignedFragmentNamedElement?
         ParameterBindingFragment?
         ReductionFragment
+        CheckFragment?
     ) | (
         //type / anonymous (simplified, avoid duplication, otherwise remove "?")
         //DONE: empty parameters / collections? -> added
@@ -481,10 +549,12 @@ DataElementUse returns tdl::DataElementUse:
         (
         	//DONE: do we really need different ways? -> not for now!
         	//name=('new' | 'a' | 'an' | 'the')
+        	//TODO: is this still used?
         	'new' dataElement=[tdl::DataType|Identifier]
         )?
         UnassignedFragmentNamedElement?
         (ParameterBindingFragment | CollectionItemFragment)
+        CheckFragment?
     )
 ;
 
@@ -659,7 +729,7 @@ fragment TDPrefixFragment returns tdl::TestDescription:
 ;
 
 fragment TDObjectiveFragment returns tdl::TestDescription:
-    'Objective:' testObjective+=[tdl::TestObjective|Identifier] 
+    'Objective' ':' testObjective+=[tdl::TestObjective|Identifier] 
     ( ',' testObjective+=[tdl::TestObjective|Identifier])*
 ;
 
@@ -683,18 +753,22 @@ fragment WithBehaviourFragment returns tdl::Behaviour:
     BEGIN
         NameFragment?
         ObjectiveFragment?
-        (comment+=Comment)*
+        CommentFragment?
     END
 ;
 
 fragment ObjectiveFragment returns tdl::Behaviour:
-    'Objective:' testObjective+=[tdl::TestObjective|Identifier] ( ',' testObjective+=[tdl::TestObjective|Identifier])*
+    'Objective' ':' testObjective+=[tdl::TestObjective|Identifier] ( ',' testObjective+=[tdl::TestObjective|Identifier])*
 ;
 
 
 Block returns tdl::Block:
     //NOTE: No annotations or comments
-    ('[' guard+=LocalExpression ( ',' guard+=LocalExpression)* ']' )?
+    ('[' 
+//    	('@' annotation+=PICSAnnotation)? //TODO: Exception for PICS? seems not enough
+		AnnotationFragment?
+    	guard+=LocalExpression ( ',' guard+=LocalExpression)* 
+	']')?
     BEGIN
         behaviour+=Behaviour+ 
     END
@@ -723,7 +797,7 @@ fragment WithCombinedFragment returns tdl::CombinedBehaviour:
     BEGIN
         NameFragment?
         ObjectiveFragment?
-        (comment+=Comment)*
+        CommentFragment?
         (periodic+=PeriodicBehaviour //)*
         | exceptional+=ExceptionalBehaviour)*
     END
@@ -738,23 +812,23 @@ SingleCombinedBehaviour returns tdl::SingleCombinedBehaviour:
 ;
 
 CompoundBehaviour returns tdl::CompoundBehaviour:
-    AnnotationFragment
+    AnnotationFragment?
     block=Block
 ;
 
 BoundedLoopBehaviour returns tdl::BoundedLoopBehaviour:
-    AnnotationFragment
+    AnnotationFragment?
     'repeat' numIteration+=LocalLoopExpression (',' numIteration+=LocalLoopExpression)*
     block=Block
 ;
 
 UnboundedLoopBehaviour returns tdl::UnboundedLoopBehaviour:
-    AnnotationFragment
+    AnnotationFragment?
     'while' block=Block
 ;
 
 OptionalBehaviour returns tdl::OptionalBehaviour:
-    AnnotationFragment
+    AnnotationFragment?
     'optionally' block=Block
 ;
 
@@ -765,7 +839,7 @@ MultipleCombinedBehaviour returns tdl::MultipleCombinedBehaviour:
 ;
 
 ConditionalBehaviour returns tdl::ConditionalBehaviour:
-    AnnotationFragment
+    AnnotationFragment?
     'if' block+=Block
     (=>('else' block+=Block)
     | (('else' 'if' block+=Block)* 
@@ -773,13 +847,13 @@ ConditionalBehaviour returns tdl::ConditionalBehaviour:
 ;
 
 AlternativeBehaviour returns tdl::AlternativeBehaviour:
-    AnnotationFragment
+    AnnotationFragment?
     'alternatively' block+=Block
     ('or' block+=Block)+ 
 ;
 
 ParallelBehaviour returns tdl::ParallelBehaviour:
-    AnnotationFragment
+    AnnotationFragment?
     'run' block+=Block 
     ('in' 'parallel' 'to' block+=Block)
     ('and' block+=Block)*
@@ -790,7 +864,7 @@ ExceptionalBehaviour returns tdl::ExceptionalBehaviour:
 ;
 
 DefaultBehaviour returns tdl::DefaultBehaviour:
-    AnnotationFragment
+    AnnotationFragment?
     'default' 
     ('on' guardedComponent=[tdl::ComponentInstance|Identifier])?
     block=Block
@@ -798,7 +872,7 @@ DefaultBehaviour returns tdl::DefaultBehaviour:
 ;
 
 InterruptBehaviour returns tdl::InterruptBehaviour:
-    AnnotationFragment
+    AnnotationFragment?
     'interrupt'
     ('on' guardedComponent=[tdl::ComponentInstance|Identifier])?
     block=Block
@@ -806,7 +880,7 @@ InterruptBehaviour returns tdl::InterruptBehaviour:
 ;
 
 PeriodicBehaviour returns tdl::PeriodicBehaviour:
-    AnnotationFragment
+    AnnotationFragment?
     'every'
     (period+=LocalExpression (',' period+=LocalExpression)*)
     block=Block
@@ -1028,7 +1102,7 @@ EString:
 Identifier:
     ID 
     //implementation specific
-    | 'name' | 'type' //TODO: exclude other keywords to the extent possible?
+    | 'name' | 'type' | 'value'//TODO: exclude other keywords to the extent possible?
 ;
 
 AIdentifier:    
@@ -1038,7 +1112,14 @@ AIdentifier:
     | FinalBlockName 
     | TestPurposeDescriptionName
     | When
-    | Then    
+    | Then
+    | PICSName
+    | CheckIdentifier
+;
+
+CheckIdentifier:    
+    Check
+    | Where    
 ;
 
 GRIdentifier:
@@ -1067,7 +1148,7 @@ LParen:
 ;
 
 RParen:
-    ')'
+	')'
 ;
 
 
@@ -1120,9 +1201,17 @@ Event returns to::Event:
 
 PICS returns to::PICS:
     AnnotationCommentFragment
-    'PICS' name=Identifier
+    PICSName name=Identifier
 ;
 
+//PICS as data instance
+//PICS returns tdl::SimpleDataInstance:
+//    AnnotationCommentFragment
+//    dataType=[tdl::DataType|PICSName] 
+//    name=Identifier
+//;
+
+
 //# Comments as Qualifiers
 
 //DONE: Group by context? -> no
@@ -1245,6 +1334,10 @@ ThenAnnotation returns tdl::Annotation:
     key=[tdl::AnnotationType|Then]
 ;
 
+PICSAnnotation returns tdl::Annotation:
+    key=[tdl::AnnotationType|PICSName]
+;
+
 
 //## Element: Abstract 
 fragment InitialConditionsFragment returns tdl::Element:
@@ -1280,10 +1373,11 @@ fragment ElementAndOrPrefix returns tdl::Element:
 StructuredTestObjective returns to::StructuredTestObjective:
     'Test' 'Purpose' name=Identifier
     BEGIN
-        ('Objective:' description=EString)? 
-        ('Reference:' objectiveURI+=EString (',' objectiveURI+=EString )*)?
-        ('Configuration:' configuration=[tdl::TestConfiguration|Identifier])? 
-        ('PICS:' picsReference+=FirstPICSReference (picsReference+=PICSReference)*)? 
+        ('Objective' ':' description=EString)? 
+        ('Reference' ':' objectiveURI+=EString (',' objectiveURI+=EString )*)?
+        ('Configuration' ':' configuration=[tdl::TestConfiguration|Identifier])? 
+        ('PICS' ':' picsReference+=FirstPICSReference (picsReference+=PICSReference)*)?
+        //('Guard:' guard+=DataUse)? //Substitute for PICS eventually?
         (initialConditions=InitialConditions)?
         (expectedBehaviour=ExpectedBehaviour)?
         (finalConditions=FinalConditions)?
@@ -1426,7 +1520,7 @@ fragment EventOccurrenceSpecificationFragment returns to::EventOccurrenceSpecifi
         (',' oppositeEntityReference+=OppositeEntityReference)*
     )?
     EventTimingSuffix?
-    (comment+=Comment)*
+    CommentFragment?
 ;
 
 EntityReference returns to::EntityReference:
@@ -1638,7 +1732,7 @@ fragment EventTemplateOccurrenceFragment returns to::EventTemplateOccurrence:
         ('argument' 'replaced' 'by' occurrenceArgument=Argument)?
     END
     )?
-    (comment+=Comment)*
+    CommentFragment?
 ;
 
 EntityBinding returns to::EntityBinding:
@@ -1653,9 +1747,10 @@ EntityBinding returns to::EntityBinding:
 Variant returns to::TestObjectiveVariant:
     'Variant' name=Identifier
     BEGIN
-        ('Objective:' description=EString)? 
-        ('Reference:' objectiveURI+=EString (',' objectiveURI+=EString)*)?  
-        ('PICS:' picsReference+=FirstPICSReference (picsReference+=PICSReference)*)?
+        ('Objective' ':' description=EString)? 
+        ('Reference' ':' objectiveURI+=EString (',' objectiveURI+=EString)*)?  
+        ('PICS' ':' picsReference+=FirstPICSReference (picsReference+=PICSReference)*)?
+        //('Guard:' guard+=DataUse)? //Substitute for PICS eventually? 
         ('Bindings' 
             BEGIN
                 bindings+=VariantBinding (',' bindings+=VariantBinding)*
@@ -1707,7 +1802,7 @@ TestPurposeDescription returns tdl::TestDescription:
     //TODO: Reference, PICS?, Objective reference vs Objective inline (all annotations?) or simply defer to objective
     BEGIN
         TDObjectiveFragment?
-        'Configuration:' testConfiguration=[tdl::TestConfiguration|Identifier]
+        'Configuration' ':' testConfiguration=[tdl::TestConfiguration|Identifier]
         (behaviourDescription=TPDBehaviourDescription)
     END
 ;
@@ -1717,6 +1812,7 @@ TPDBehaviourDescription returns tdl::BehaviourDescription:
 ;
 
 TPDCompoundBehaviour returns tdl::CompoundBehaviour:
+    //(annotation+=PICSAnnotation ':')?
     block=TPDBlock
 ;
 
@@ -1755,7 +1851,9 @@ ThenBehaviour returns tdl::CompoundBehaviour:
 ;
 
 TPDBlock returns tdl::Block:
-    //NOTE: No guard
+    //NOTE: No guard -> guard is PICS
+    //TODO: annotation has to be pulled up? or pushed down?
+    (annotation+=PICSAnnotation ':' guard+=LocalExpression)?
     (behaviour+=InitialConditionsBehaviour)? 
     (behaviour+=ExpectedBehaviourBehaviour)? 
     (behaviour+=FinalConditionsBehaviour)? 
@@ -1879,6 +1977,10 @@ TestPurposeDescriptionName:
     'Test' 'Purpose' 'Description'
 ;
 
+PICSName:
+    'PICS'
+;
+
 When:
     'when'
 ;
@@ -1887,6 +1989,15 @@ Then:
     'then'
 ;
 
+Check:
+    'check'
+;
+
+Where:
+    'where'
+;
+
+
 KIdentifier:
     ID | 'sends' | 'receives' | 'triggers' | 'in'
 ;
diff --git a/plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/TDLtxDerivedStateComputer.java b/plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/TDLtxDerivedStateComputer.java
new file mode 100644
index 0000000000000000000000000000000000000000..bbe330a48dc321415d085771006c2e53ae1216d8
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/TDLtxDerivedStateComputer.java
@@ -0,0 +1,36 @@
+package org.etsi.mts.tdl;
+
+import java.util.List;
+
+import org.eclipse.xtext.EcoreUtil2;
+import org.eclipse.xtext.resource.DerivedStateAwareResource;
+import org.eclipse.xtext.resource.IDerivedStateComputer;
+
+//TODO: move upstream
+class TDLtxDerivedStateComputer implements IDerivedStateComputer {
+	
+	@Override
+	public void installDerivedState(DerivedStateAwareResource resource, boolean preLinkingPhase) {
+		List<EnumDataType> enums = EcoreUtil2.getAllContentsOfType(resource.getContents().get(0), EnumDataType.class);
+		enums.forEach(e-> {
+			e.getValue().forEach(v -> v.setDataType(e));
+		});
+//		//TODO: also for gate references (instead of in scope?)
+//		List<GateReference> grs = EcoreUtil2.getAllContentsOfType(resource.getContents().get(0), GateReference.class);
+//		grs.forEach(e-> e.setName(e.getName()==null ? 
+//				null //e.getComponent().getName()+"_"+e.getGate().getName() 
+//				: e.getName()));
+//		grs.forEach(e-> System.out.println(e.getName()));
+	}
+
+	@Override
+	public void discardDerivedState(DerivedStateAwareResource resource) {
+		List<EnumDataType> enums = EcoreUtil2.getAllContentsOfType(resource.getContents().get(0), EnumDataType.class);
+		enums.forEach(e-> {
+			e.getValue().forEach(v -> v.setDataType(null));
+		});
+//		//TODO: also for gate references (instead of in scope?)
+//		List<GateReference> grs = EcoreUtil2.getAllContentsOfType(resource.getContents().get(0), GateReference.class);
+//		grs.forEach(e-> e.setName(null));
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/TDLtxRuntimeModule.java b/plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/TDLtxRuntimeModule.java
index 7147cf327b0acad484bd948fea8292dcc225eacb..52eed3de91b3a177459f652e2ef38f1ddafac672 100644
--- a/plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/TDLtxRuntimeModule.java
+++ b/plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/TDLtxRuntimeModule.java
@@ -6,6 +6,13 @@ package org.etsi.mts.tdl;
 import org.eclipse.xtext.conversion.IValueConverterService;
 import org.eclipse.xtext.naming.IQualifiedNameConverter;
 import org.eclipse.xtext.naming.IQualifiedNameProvider;
+import org.eclipse.xtext.resource.DerivedStateAwareResource;
+import org.eclipse.xtext.resource.DerivedStateAwareResourceDescriptionManager;
+import org.eclipse.xtext.resource.IDefaultResourceDescriptionStrategy;
+import org.eclipse.xtext.resource.IDerivedStateComputer;
+import org.eclipse.xtext.resource.IResourceDescription;
+import org.eclipse.xtext.resource.XtextResource;
+import org.eclipse.xtext.scoping.IGlobalScopeProvider;
 import org.etsi.mts.tdl.scoping.TDLQualifiedNameConverter;
 import org.etsi.mts.tdl.scoping.TdlQualifiedNameProvider;
 
@@ -24,4 +31,29 @@ public class TDLtxRuntimeModule extends AbstractTDLtxRuntimeModule {
 	public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() {
 		return TdlQualifiedNameProvider.class;
 	}
+
+	public Class<? extends IDerivedStateComputer> bindIDerivedStateComputer() {
+		return TDLtxDerivedStateComputer.class;
+	}
+
+	// Not needed for Xbase-projects
+	@Override
+	public Class<? extends XtextResource> bindXtextResource() {
+		return DerivedStateAwareResource.class;
+	}
+
+	// Not needed for Xbase-projects
+	public Class<? extends IResourceDescription.Manager> bindIResourceDescriptionManager() {
+		return DerivedStateAwareResourceDescriptionManager.class;
+	}
+
+//	public Class<? extends IDefaultResourceDescriptionStrategy> bindIDefaultResourceDescriptionStrategy() {
+//		return RDS.class;
+//	}
+	
+//	@Override
+//	public Class<? extends IGlobalScopeProvider> bindIGlobalScopeProvider() {
+//		return TDLtxGlobalScopeProvider.class;
+//	}
+
 }
diff --git a/plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/formatting2/TDLtxFormatter.java b/plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/formatting2/TDLtxFormatter.java
index d4d505f7481e2f37b9adb85829106096f6aa1dc1..fadeb0bab98fd8d225260a3c79afc04ac8f1fe60 100644
--- a/plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/formatting2/TDLtxFormatter.java
+++ b/plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/formatting2/TDLtxFormatter.java
@@ -381,21 +381,55 @@ public class TDLtxFormatter extends AbstractJavaFormatter {
 		//withKeyword.getNextSemanticRegion();
 		//		var rbs = this.textRegionExtensions.regionFor(e).ruleCallTo(this._grammarAccess.());
 			
+		
+		ISemanticRegion noteKeyword = this.textRegionExtensions.regionFor(e).keyword("Note");
+		if (noteKeyword!=null) {
+			doc.prepend(noteKeyword, newLine());
+		}
+		ISemanticRegion atKeyword = this.textRegionExtensions.regionFor(e).keyword("@");
+		if (atKeyword!=null) {
+			doc.prepend(atKeyword, newLine());
+		}
 		for (Comment c : e.getComment()) {
-			if (!(e instanceof Member)) {
+			if (e.getComment().size() > 1) {
+				doc.prepend(c, newLine());
 				doc.surround(c, indent());
-			}
-			if (!(e instanceof EntityReference)) {
-				doc.append(c, newLine());
+			} else {
+				if (!(e instanceof Member)) {
+					doc.surround(c, indent());
+				}
+				if (!(e instanceof EntityReference)) {
+					doc.append(c, newLine());
+				}
 			}
 			doc.format(c);
 		}
 		
 		for (Annotation a : e.getAnnotation()) {
-			doc.append(a, newLine());
-			doc.format(a);
+			if (e.getAnnotation().size() > 1) {
+				doc.prepend(a, newLine());
+				doc.surround(a, indent());
+			} else {
+				doc.append(a, newLine());
+			}
+			doc.format(a); 
 		}
 		
+
+		List<ISemanticRegion> closeItems = this.textRegionExtensions.allRegionsFor(e).keywords("]");
+		for (ISemanticRegion r : closeItems) {
+			doc.surround(r, newLine());
+		}
+		
+//		List<ISemanticRegion> comments = this.textRegionExtensions.regionFor(e).ruleCallsTo(this._grammarAccess.get);
+//		if (!comments.isEmpty()) {
+//			doc.append(comments.get(0), newLine());
+//		}
+//		List<ISemanticRegion> annotations = this.textRegionExtensions.regionFor(e).ruleCallsTo(this._grammarAccess.getAnnotationFragmentRule());
+//		if (!annotations.isEmpty()) {
+//			doc.surround(annotations.get(0), newLine());
+//		}
+		
 	}
 
 	protected void format(org.etsi.mts.tdl.TestDescription e, IFormattableDocument doc) {
diff --git a/plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/scoping/TDLtxGlobalScopeProvider.xtend b/plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/scoping/TDLtxGlobalScopeProvider.xtend
new file mode 100644
index 0000000000000000000000000000000000000000..a1358fa081f415db1f957dbfc4a71e387709384c
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/scoping/TDLtxGlobalScopeProvider.xtend
@@ -0,0 +1,59 @@
+package org.etsi.mts.tdl.scoping
+
+import com.google.common.base.Splitter
+import com.google.inject.Inject
+import com.google.inject.Provider
+import java.util.LinkedHashSet
+import org.eclipse.emf.common.util.URI
+import org.eclipse.emf.ecore.resource.Resource
+import org.eclipse.xtext.EcoreUtil2
+import org.eclipse.xtext.resource.IResourceDescription
+import org.eclipse.xtext.scoping.impl.ImportUriGlobalScopeProvider
+import org.eclipse.xtext.util.IResourceScopeCache
+import org.etsi.mts.tdl.RDS
+import org.etsi.mts.tdl.tdlPackage
+
+class TDLtxGlobalScopeProvider extends ImportUriGlobalScopeProvider {
+	private static final Splitter SPLITTER = Splitter.on(',');
+
+	@Inject
+	IResourceDescription.Manager descriptionManager;
+
+	@Inject
+	IResourceScopeCache cache;
+
+	override protected getImportedUris(Resource resource) {
+		return cache.get(TDLtxGlobalScopeProvider.getSimpleName(), resource, new Provider<LinkedHashSet<URI>>() {
+			override get() {
+				val uniqueImportURIs = collectImportUris(resource, new LinkedHashSet<URI>(5))
+
+				val uriIter = uniqueImportURIs.iterator()
+				while(uriIter.hasNext()) {
+					if (!EcoreUtil2.isValidUri(resource, uriIter.next()))
+						uriIter.remove()
+				}
+				return uniqueImportURIs
+			}
+
+			def LinkedHashSet<URI> collectImportUris(Resource resource, LinkedHashSet<URI> uniqueImportURIs) {
+				val resourceDescription = descriptionManager.getResourceDescription(resource)
+				val models = resourceDescription.getExportedObjectsByType(tdlPackage.Literals.PACKAGE)
+				
+				models.forEach[
+					val userData = getUserData(RDS.INCLUDES)
+					if(userData !== null) {
+						SPLITTER.split(userData).forEach[uri |
+							var includedUri = URI.createURI(uri)
+							includedUri = includedUri.resolve(resource.URI)
+							if(uniqueImportURIs.add(includedUri)) {
+								collectImportUris(resource.getResourceSet().getResource(includedUri, true), uniqueImportURIs)
+							}
+						]
+					}
+				]
+				
+				return uniqueImportURIs
+			}
+		});
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2json/.classpath b/plugins/org.etsi.mts.tdl.yang2json/.classpath
new file mode 100644
index 0000000000000000000000000000000000000000..685a6999c9acba0d0158b0929d7a4d384644452e
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/.classpath
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11">
+		<attributes>
+			<attribute name="module" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/plugins/org.etsi.mts.tdl.yang2json/.project b/plugins/org.etsi.mts.tdl.yang2json/.project
new file mode 100644
index 0000000000000000000000000000000000000000..fddbeab362734370061b92ac94b505ef3ed73af4
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/.project
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.etsi.mts.tdl.yang2json</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>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+	<filteredResources>
+		<filter>
+			<id>1705077780129</id>
+			<name></name>
+			<type>30</type>
+			<matcher>
+				<id>org.eclipse.core.resources.regexFilterMatcher</id>
+				<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
+</projectDescription>
diff --git a/plugins/org.etsi.mts.tdl.yang2json/.settings/org.eclipse.core.resources.prefs b/plugins/org.etsi.mts.tdl.yang2json/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000000000000000000000000000000000000..99f26c0203a7844de00dbfc56e6a35d8ed3c022c
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/plugins/org.etsi.mts.tdl.yang2json/.settings/org.eclipse.jdt.core.prefs b/plugins/org.etsi.mts.tdl.yang2json/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000000000000000000000000000000000..c9545f06a4120d5b4a1228fb19f67a1171bc0f5b
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,9 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.compliance=11
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
diff --git a/plugins/org.etsi.mts.tdl.yang2json/.settings/org.eclipse.m2e.core.prefs b/plugins/org.etsi.mts.tdl.yang2json/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000000000000000000000000000000000000..f897a7f1cb2389f85fe6381425d29f0a9866fb65
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/plugins/org.etsi.mts.tdl.yang2json/META-INF/MANIFEST.MF b/plugins/org.etsi.mts.tdl.yang2json/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..402c0e48965cdd39bd62af7ea20d36ce0c4c641d
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/META-INF/MANIFEST.MF
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: YANG to JSON Translator and Validator
+Bundle-SymbolicName: org.etsi.mts.tdl.yang2json;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Vendor: European Telecommunications Standards Institute (ETSI)
+Export-Package: org.etsi.mts.tdl.yang2json
+Require-Bundle: org.etsi.mts.tdl.extras.yang.tools.wrapper.mvn
+Automatic-Module-Name: org.etsi.mts.tdl.yang2json
+Bundle-ClassPath: .
diff --git a/plugins/org.etsi.mts.tdl.yang2json/build.properties b/plugins/org.etsi.mts.tdl.yang2json/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..110a2d2dcf728557f3b95feaadcbceec80f8c351
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = target/classes/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml
diff --git a/plugins/org.etsi.mts.tdl.yang2json/plugin.xml b/plugins/org.etsi.mts.tdl.yang2json/plugin.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2b3b5c01bb4633a31bc5bb291526e1c190e306d9
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/plugin.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+   <extension
+         point="org.eclipse.ui.propertyPages">
+      <page
+            category="org.etsi.mts.tdl.projectPropertyPage"
+            class="org.etsi.mts.tdl.yang2json.PropertyPage"
+            id="org.etsi.mts.tdl.yang2json.propertyPage"
+            name="YANG JSON Validation, Export and Import"
+            objectClass="org.eclipse.core.resources.IProject">
+      </page>
+   </extension>
+
+</plugin>
diff --git a/plugins/org.etsi.mts.tdl.yang2json/pom.xml b/plugins/org.etsi.mts.tdl.yang2json/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9216060d8f05a11ef9b14fd16dfe6d32f3493bac
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/pom.xml
@@ -0,0 +1,21 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.etsi.mts.tdl</groupId>
+		<artifactId>org.etsi.mts.tdl.parent</artifactId>
+		<version>1.0.0-SNAPSHOT</version>
+		<relativePath>../../org.etsi.mts.tdl.parent</relativePath>
+
+	</parent>
+	<artifactId>org.etsi.mts.tdl.yang2json</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<build>
+		<plugins>
+			<plugin>
+				<artifactId>maven-compiler-plugin</artifactId>
+			</plugin>
+		</plugins>
+	</build>
+</project>
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/ietf/ietf-inet-types@2013-07-15.yang b/plugins/org.etsi.mts.tdl.yang2json/samples/ietf/ietf-inet-types@2013-07-15.yang
new file mode 100644
index 0000000000000000000000000000000000000000..eacefb6363de1beb543567a0fa705571b7dc57a2
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/ietf/ietf-inet-types@2013-07-15.yang
@@ -0,0 +1,458 @@
+module ietf-inet-types {
+
+  namespace "urn:ietf:params:xml:ns:yang:ietf-inet-types";
+  prefix "inet";
+
+  organization
+   "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+  contact
+   "WG Web:   <http://tools.ietf.org/wg/netmod/>
+    WG List:  <mailto:netmod@ietf.org>
+
+    WG Chair: David Kessens
+              <mailto:david.kessens@nsn.com>
+
+    WG Chair: Juergen Schoenwaelder
+              <mailto:j.schoenwaelder@jacobs-university.de>
+
+    Editor:   Juergen Schoenwaelder
+              <mailto:j.schoenwaelder@jacobs-university.de>";
+
+  description
+   "This module contains a collection of generally useful derived
+    YANG data types for Internet addresses and related things.
+
+    Copyright (c) 2013 IETF Trust and the persons identified as
+    authors of the code.  All rights reserved.
+
+    Redistribution and use in source and binary forms, with or
+    without modification, is permitted pursuant to, and subject
+    to the license terms contained in, the Simplified BSD License
+    set forth in Section 4.c of the IETF Trust's Legal Provisions
+    Relating to IETF Documents
+    (http://trustee.ietf.org/license-info).
+
+    This version of this YANG module is part of RFC 6991; see
+    the RFC itself for full legal notices.";
+
+  revision 2013-07-15 {
+    description
+     "This revision adds the following new data types:
+      - ip-address-no-zone
+      - ipv4-address-no-zone
+      - ipv6-address-no-zone";
+    reference
+     "RFC 6991: Common YANG Data Types";
+  }
+
+  revision 2010-09-24 {
+    description
+     "Initial revision.";
+    reference
+     "RFC 6021: Common YANG Data Types";
+  }
+
+  /*** collection of types related to protocol fields ***/
+
+  typedef ip-version {
+    type enumeration {
+      enum unknown {
+        value "0";
+        description
+         "An unknown or unspecified version of the Internet
+          protocol.";
+      }
+      enum ipv4 {
+        value "1";
+        description
+         "The IPv4 protocol as defined in RFC 791.";
+      }
+      enum ipv6 {
+        value "2";
+        description
+         "The IPv6 protocol as defined in RFC 2460.";
+      }
+    }
+    description
+     "This value represents the version of the IP protocol.
+
+      In the value set and its semantics, this type is equivalent
+      to the InetVersion textual convention of the SMIv2.";
+    reference
+     "RFC  791: Internet Protocol
+      RFC 2460: Internet Protocol, Version 6 (IPv6) Specification
+      RFC 4001: Textual Conventions for Internet Network Addresses";
+  }
+
+  typedef dscp {
+    type uint8 {
+      range "0..63";
+    }
+    description
+     "The dscp type represents a Differentiated Services Code Point
+      that may be used for marking packets in a traffic stream.
+      In the value set and its semantics, this type is equivalent
+      to the Dscp textual convention of the SMIv2.";
+    reference
+     "RFC 3289: Management Information Base for the Differentiated
+                Services Architecture
+      RFC 2474: Definition of the Differentiated Services Field
+                (DS Field) in the IPv4 and IPv6 Headers
+      RFC 2780: IANA Allocation Guidelines For Values In
+                the Internet Protocol and Related Headers";
+  }
+
+  typedef ipv6-flow-label {
+    type uint32 {
+      range "0..1048575";
+    }
+    description
+     "The ipv6-flow-label type represents the flow identifier or Flow
+      Label in an IPv6 packet header that may be used to
+      discriminate traffic flows.
+
+      In the value set and its semantics, this type is equivalent
+      to the IPv6FlowLabel textual convention of the SMIv2.";
+    reference
+     "RFC 3595: Textual Conventions for IPv6 Flow Label
+      RFC 2460: Internet Protocol, Version 6 (IPv6) Specification";
+  }
+
+  typedef port-number {
+    type uint16 {
+      range "0..65535";
+    }
+    description
+     "The port-number type represents a 16-bit port number of an
+      Internet transport-layer protocol such as UDP, TCP, DCCP, or
+      SCTP.  Port numbers are assigned by IANA.  A current list of
+      all assignments is available from <http://www.iana.org/>.
+
+      Note that the port number value zero is reserved by IANA.  In
+      situations where the value zero does not make sense, it can
+      be excluded by subtyping the port-number type.
+      In the value set and its semantics, this type is equivalent
+      to the InetPortNumber textual convention of the SMIv2.";
+    reference
+     "RFC  768: User Datagram Protocol
+      RFC  793: Transmission Control Protocol
+      RFC 4960: Stream Control Transmission Protocol
+      RFC 4340: Datagram Congestion Control Protocol (DCCP)
+      RFC 4001: Textual Conventions for Internet Network Addresses";
+  }
+
+  /*** collection of types related to autonomous systems ***/
+
+  typedef as-number {
+    type uint32;
+    description
+     "The as-number type represents autonomous system numbers
+      which identify an Autonomous System (AS).  An AS is a set
+      of routers under a single technical administration, using
+      an interior gateway protocol and common metrics to route
+      packets within the AS, and using an exterior gateway
+      protocol to route packets to other ASes.  IANA maintains
+      the AS number space and has delegated large parts to the
+      regional registries.
+
+      Autonomous system numbers were originally limited to 16
+      bits.  BGP extensions have enlarged the autonomous system
+      number space to 32 bits.  This type therefore uses an uint32
+      base type without a range restriction in order to support
+      a larger autonomous system number space.
+
+      In the value set and its semantics, this type is equivalent
+      to the InetAutonomousSystemNumber textual convention of
+      the SMIv2.";
+    reference
+     "RFC 1930: Guidelines for creation, selection, and registration
+                of an Autonomous System (AS)
+      RFC 4271: A Border Gateway Protocol 4 (BGP-4)
+      RFC 4001: Textual Conventions for Internet Network Addresses
+      RFC 6793: BGP Support for Four-Octet Autonomous System (AS)
+                Number Space";
+  }
+
+  /*** collection of types related to IP addresses and hostnames ***/
+
+  typedef ip-address {
+    type union {
+      type inet:ipv4-address;
+      type inet:ipv6-address;
+    }
+    description
+     "The ip-address type represents an IP address and is IP
+      version neutral.  The format of the textual representation
+      implies the IP version.  This type supports scoped addresses
+      by allowing zone identifiers in the address format.";
+    reference
+     "RFC 4007: IPv6 Scoped Address Architecture";
+  }
+
+  typedef ipv4-address {
+    type string {
+      pattern
+        '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+      +  '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
+      + '(%[\p{N}\p{L}]+)?';
+    }
+    description
+      "The ipv4-address type represents an IPv4 address in
+       dotted-quad notation.  The IPv4 address may include a zone
+       index, separated by a % sign.
+
+       The zone index is used to disambiguate identical address
+       values.  For link-local addresses, the zone index will
+       typically be the interface index number or the name of an
+       interface.  If the zone index is not present, the default
+       zone of the device will be used.
+
+       The canonical format for the zone index is the numerical
+       format";
+  }
+
+  typedef ipv6-address {
+    type string {
+      pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+            + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+            + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
+            + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
+            + '(%[\p{N}\p{L}]+)?';
+      pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+            + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
+            + '(%.+)?';
+    }
+    description
+     "The ipv6-address type represents an IPv6 address in full,
+      mixed, shortened, and shortened-mixed notation.  The IPv6
+      address may include a zone index, separated by a % sign.
+
+      The zone index is used to disambiguate identical address
+      values.  For link-local addresses, the zone index will
+      typically be the interface index number or the name of an
+      interface.  If the zone index is not present, the default
+      zone of the device will be used.
+
+      The canonical format of IPv6 addresses uses the textual
+      representation defined in Section 4 of RFC 5952.  The
+      canonical format for the zone index is the numerical
+      format as described in Section 11.2 of RFC 4007.";
+    reference
+     "RFC 4291: IP Version 6 Addressing Architecture
+      RFC 4007: IPv6 Scoped Address Architecture
+      RFC 5952: A Recommendation for IPv6 Address Text
+                Representation";
+  }
+
+  typedef ip-address-no-zone {
+    type union {
+      type inet:ipv4-address-no-zone;
+      type inet:ipv6-address-no-zone;
+    }
+    description
+     "The ip-address-no-zone type represents an IP address and is
+      IP version neutral.  The format of the textual representation
+      implies the IP version.  This type does not support scoped
+      addresses since it does not allow zone identifiers in the
+      address format.";
+    reference
+     "RFC 4007: IPv6 Scoped Address Architecture";
+  }
+
+  typedef ipv4-address-no-zone {
+    type inet:ipv4-address {
+      pattern '[0-9\.]*';
+    }
+    description
+      "An IPv4 address without a zone index.  This type, derived from
+       ipv4-address, may be used in situations where the zone is
+       known from the context and hence no zone index is needed.";
+  }
+
+  typedef ipv6-address-no-zone {
+    type inet:ipv6-address {
+      pattern '[0-9a-fA-F:\.]*';
+    }
+    description
+      "An IPv6 address without a zone index.  This type, derived from
+       ipv6-address, may be used in situations where the zone is
+       known from the context and hence no zone index is needed.";
+    reference
+     "RFC 4291: IP Version 6 Addressing Architecture
+      RFC 4007: IPv6 Scoped Address Architecture
+      RFC 5952: A Recommendation for IPv6 Address Text
+                Representation";
+  }
+
+  typedef ip-prefix {
+    type union {
+      type inet:ipv4-prefix;
+      type inet:ipv6-prefix;
+    }
+    description
+     "The ip-prefix type represents an IP prefix and is IP
+      version neutral.  The format of the textual representations
+      implies the IP version.";
+  }
+
+  typedef ipv4-prefix {
+    type string {
+      pattern
+         '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+       +  '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
+       + '/(([0-9])|([1-2][0-9])|(3[0-2]))';
+    }
+    description
+     "The ipv4-prefix type represents an IPv4 address prefix.
+      The prefix length is given by the number following the
+      slash character and must be less than or equal to 32.
+
+      A prefix length value of n corresponds to an IP address
+      mask that has n contiguous 1-bits from the most
+      significant bit (MSB) and all other bits set to 0.
+
+      The canonical format of an IPv4 prefix has all bits of
+      the IPv4 address set to zero that are not part of the
+      IPv4 prefix.";
+  }
+
+  typedef ipv6-prefix {
+    type string {
+      pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+            + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+            + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
+            + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
+            + '(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))';
+      pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+            + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
+            + '(/.+)';
+    }
+
+    description
+     "The ipv6-prefix type represents an IPv6 address prefix.
+      The prefix length is given by the number following the
+      slash character and must be less than or equal to 128.
+
+      A prefix length value of n corresponds to an IP address
+      mask that has n contiguous 1-bits from the most
+      significant bit (MSB) and all other bits set to 0.
+
+      The IPv6 address should have all bits that do not belong
+      to the prefix set to zero.
+
+      The canonical format of an IPv6 prefix has all bits of
+      the IPv6 address set to zero that are not part of the
+      IPv6 prefix.  Furthermore, the IPv6 address is represented
+      as defined in Section 4 of RFC 5952.";
+    reference
+     "RFC 5952: A Recommendation for IPv6 Address Text
+                Representation";
+  }
+
+  /*** collection of domain name and URI types ***/
+
+  typedef domain-name {
+    type string {
+      pattern
+        '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*'
+      + '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)'
+      + '|\.';
+      length "1..253";
+    }
+    description
+     "The domain-name type represents a DNS domain name.  The
+      name SHOULD be fully qualified whenever possible.
+
+      Internet domain names are only loosely specified.  Section
+      3.5 of RFC 1034 recommends a syntax (modified in Section
+      2.1 of RFC 1123).  The pattern above is intended to allow
+      for current practice in domain name use, and some possible
+      future expansion.  It is designed to hold various types of
+      domain names, including names used for A or AAAA records
+      (host names) and other records, such as SRV records.  Note
+      that Internet host names have a stricter syntax (described
+      in RFC 952) than the DNS recommendations in RFCs 1034 and
+      1123, and that systems that want to store host names in
+      schema nodes using the domain-name type are recommended to
+      adhere to this stricter standard to ensure interoperability.
+
+      The encoding of DNS names in the DNS protocol is limited
+      to 255 characters.  Since the encoding consists of labels
+      prefixed by a length bytes and there is a trailing NULL
+      byte, only 253 characters can appear in the textual dotted
+      notation.
+
+      The description clause of schema nodes using the domain-name
+      type MUST describe when and how these names are resolved to
+      IP addresses.  Note that the resolution of a domain-name value
+      may require to query multiple DNS records (e.g., A for IPv4
+      and AAAA for IPv6).  The order of the resolution process and
+      which DNS record takes precedence can either be defined
+      explicitly or may depend on the configuration of the
+      resolver.
+
+      Domain-name values use the US-ASCII encoding.  Their canonical
+      format uses lowercase US-ASCII characters.  Internationalized
+      domain names MUST be A-labels as per RFC 5890.";
+    reference
+     "RFC  952: DoD Internet Host Table Specification
+      RFC 1034: Domain Names - Concepts and Facilities
+      RFC 1123: Requirements for Internet Hosts -- Application
+                and Support
+      RFC 2782: A DNS RR for specifying the location of services
+                (DNS SRV)
+      RFC 5890: Internationalized Domain Names in Applications
+                (IDNA): Definitions and Document Framework";
+  }
+
+  typedef host {
+    type union {
+      type inet:ip-address;
+      type inet:domain-name;
+    }
+    description
+     "The host type represents either an IP address or a DNS
+      domain name.";
+  }
+
+  typedef uri {
+    type string;
+    description
+     "The uri type represents a Uniform Resource Identifier
+      (URI) as defined by STD 66.
+
+      Objects using the uri type MUST be in US-ASCII encoding,
+      and MUST be normalized as described by RFC 3986 Sections
+      6.2.1, 6.2.2.1, and 6.2.2.2.  All unnecessary
+      percent-encoding is removed, and all case-insensitive
+      characters are set to lowercase except for hexadecimal
+      digits, which are normalized to uppercase as described in
+      Section 6.2.2.1.
+
+      The purpose of this normalization is to help provide
+      unique URIs.  Note that this normalization is not
+      sufficient to provide uniqueness.  Two URIs that are
+      textually distinct after this normalization may still be
+      equivalent.
+
+      Objects using the uri type may restrict the schemes that
+      they permit.  For example, 'data:' and 'urn:' schemes
+      might not be appropriate.
+
+      A zero-length URI is not a valid URI.  This can be used to
+      express 'URI absent' where required.
+
+      In the value set and its semantics, this type is equivalent
+      to the Uri SMIv2 textual convention defined in RFC 5017.";
+    reference
+     "RFC 3986: Uniform Resource Identifier (URI): Generic Syntax
+      RFC 3305: Report from the Joint W3C/IETF URI Planning Interest
+                Group: Uniform Resource Identifiers (URIs), URLs,
+                and Uniform Resource Names (URNs): Clarifications
+                and Recommendations
+      RFC 5017: MIB Textual Conventions for Uniform Resource
+                Identifiers (URIs)";
+  }
+
+}
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/ietf/ietf-restconf@2017-01-26.yang b/plugins/org.etsi.mts.tdl.yang2json/samples/ietf/ietf-restconf@2017-01-26.yang
new file mode 100644
index 0000000000000000000000000000000000000000..1370ed54800db12c4c20327e56bb5ac3362407b8
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/ietf/ietf-restconf@2017-01-26.yang
@@ -0,0 +1,278 @@
+module ietf-restconf {
+  yang-version 1.1;
+  namespace "urn:ietf:params:xml:ns:yang:ietf-restconf";
+  prefix "rc";
+
+  organization
+    "IETF NETCONF (Network Configuration) Working Group";
+
+  contact
+    "WG Web:   <https://datatracker.ietf.org/wg/netconf/>
+     WG List:  <mailto:netconf@ietf.org>
+
+     Author:   Andy Bierman
+               <mailto:andy@yumaworks.com>
+
+     Author:   Martin Bjorklund
+               <mailto:mbj@tail-f.com>
+
+     Author:   Kent Watsen
+               <mailto:kwatsen@juniper.net>";
+
+  description
+    "This module contains conceptual YANG specifications
+     for basic RESTCONF media type definitions used in
+     RESTCONF protocol messages.
+
+     Note that the YANG definitions within this module do not
+     represent configuration data of any kind.
+     The 'restconf-media-type' YANG extension statement
+     provides a normative syntax for XML and JSON
+     message-encoding purposes.
+
+     Copyright (c) 2017 IETF Trust and the persons identified as
+     authors of the code.  All rights reserved.
+
+     Redistribution and use in source and binary forms, with or
+     without modification, is permitted pursuant to, and subject
+     to the license terms contained in, the Simplified BSD License
+     set forth in Section 4.c of the IETF Trust's Legal Provisions
+     Relating to IETF Documents
+     (http://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC 8040; see
+     the RFC itself for full legal notices.";
+
+  revision 2017-01-26 {
+    description
+      "Initial revision.";
+    reference
+      "RFC 8040: RESTCONF Protocol.";
+  }
+
+  extension yang-data {
+    argument name {
+      yin-element true;
+    }
+    description
+      "This extension is used to specify a YANG data template that
+       represents conceptual data defined in YANG.  It is
+       intended to describe hierarchical data independent of
+       protocol context or specific message-encoding format.
+       Data definition statements within a yang-data extension
+       specify the generic syntax for the specific YANG data
+       template, whose name is the argument of the 'yang-data'
+       extension statement.
+
+       Note that this extension does not define a media type.
+       A specification using this extension MUST specify the
+       message-encoding rules, including the content media type.
+
+       The mandatory 'name' parameter value identifies the YANG
+       data template that is being defined.  It contains the
+       template name.
+
+       This extension is ignored unless it appears as a top-level
+       statement.  It MUST contain data definition statements
+       that result in exactly one container data node definition.
+       An instance of a YANG data template can thus be translated
+       into an XML instance document, whose top-level element
+       corresponds to the top-level container.
+       The module name and namespace values for the YANG module using
+       the extension statement are assigned to instance document data
+       conforming to the data definition statements within
+       this extension.
+
+       The substatements of this extension MUST follow the
+       'data-def-stmt' rule in the YANG ABNF.
+
+       The XPath document root is the extension statement itself,
+       such that the child nodes of the document root are
+       represented by the data-def-stmt substatements within
+       this extension.  This conceptual document is the context
+       for the following YANG statements:
+
+         - must-stmt
+         - when-stmt
+         - path-stmt
+         - min-elements-stmt
+         - max-elements-stmt
+         - mandatory-stmt
+         - unique-stmt
+         - ordered-by
+         - instance-identifier data type
+
+       The following data-def-stmt substatements are constrained
+       when used within a 'yang-data' extension statement.
+
+         - The list-stmt is not required to have a key-stmt defined.
+         - The if-feature-stmt is ignored if present.
+         - The config-stmt is ignored if present.
+         - The available identity values for any 'identityref'
+           leaf or leaf-list nodes are limited to the module
+           containing this extension statement and the modules
+           imported into that module.
+      ";
+  }
+
+  rc:yang-data yang-errors {
+    uses errors;
+  }
+
+  rc:yang-data yang-api {
+    uses restconf;
+  }
+
+  grouping errors {
+    description
+      "A grouping that contains a YANG container
+       representing the syntax and semantics of a
+       YANG Patch error report within a response message.";
+
+    container errors {
+      description
+        "Represents an error report returned by the server if
+         a request results in an error.";
+
+      list error {
+        description
+          "An entry containing information about one
+           specific error that occurred while processing
+           a RESTCONF request.";
+        reference
+          "RFC 6241, Section 4.3.";
+
+        leaf error-type {
+          type enumeration {
+            enum transport {
+              description
+                "The transport layer.";
+            }
+            enum rpc {
+              description
+                "The rpc or notification layer.";
+            }
+            enum protocol {
+              description
+                "The protocol operation layer.";
+            }
+            enum application {
+              description
+                "The server application layer.";
+            }
+          }
+          mandatory true;
+          description
+            "The protocol layer where the error occurred.";
+        }
+
+        leaf error-tag {
+          type string;
+          mandatory true;
+          description
+            "The enumerated error-tag.";
+        }
+
+        leaf error-app-tag {
+          type string;
+          description
+            "The application-specific error-tag.";
+        }
+
+        leaf error-path {
+          type instance-identifier;
+          description
+            "The YANG instance identifier associated
+             with the error node.";
+        }
+
+        leaf error-message {
+          type string;
+          description
+            "A message describing the error.";
+        }
+
+//        anydata error-info {
+//           description
+//             "This anydata value MUST represent a container with
+//              zero or more data nodes representing additional
+//              error information.";
+//        }
+      }
+    }
+  }
+
+  grouping restconf {
+    description
+      "Conceptual grouping representing the RESTCONF
+       root resource.";
+
+    container restconf {
+      description
+        "Conceptual container representing the RESTCONF
+         root resource.";
+
+      container data {
+        description
+          "Container representing the datastore resource.
+           Represents the conceptual root of all state data
+           and configuration data supported by the server.
+           The child nodes of this container can be any data
+           resources that are defined as top-level data nodes
+           from the YANG modules advertised by the server in
+           the 'ietf-yang-library' module.";
+      }
+
+      container operations {
+        description
+          "Container for all operation resources.
+
+           Each resource is represented as an empty leaf with the
+           name of the RPC operation from the YANG 'rpc' statement.
+
+           For example, the 'system-restart' RPC operation defined
+           in the 'ietf-system' module would be represented as
+           an empty leaf in the 'ietf-system' namespace.  This is
+           a conceptual leaf and will not actually be found in
+           the module:
+
+              module ietf-system {
+                leaf system-reset {
+                  type empty;
+                }
+              }
+
+           To invoke the 'system-restart' RPC operation:
+
+              POST /restconf/operations/ietf-system:system-restart
+
+           To discover the RPC operations supported by the server:
+
+              GET /restconf/operations
+
+           In XML, the YANG module namespace identifies the module:
+
+             <system-restart
+                xmlns='urn:ietf:params:xml:ns:yang:ietf-system'/>
+
+           In JSON, the YANG module name identifies the module:
+
+             { 'ietf-system:system-restart' : [null] }
+          ";
+      }
+      leaf yang-library-version {
+        type string {
+          pattern '\d{4}-\d{2}-\d{2}';
+        }
+        config false;
+        mandatory true;
+        description
+          "Identifies the revision date of the 'ietf-yang-library'
+           module that is implemented by this RESTCONF server.
+           Indicates the year, month, and day in YYYY-MM-DD
+           numeric format.";
+      }
+    }
+  }
+
+}
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/ietf/ietf-yang-types@2013-07-15.yang b/plugins/org.etsi.mts.tdl.yang2json/samples/ietf/ietf-yang-types@2013-07-15.yang
new file mode 100644
index 0000000000000000000000000000000000000000..ee58fa3ab0042120d5607b8713d21fa0ba845895
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/ietf/ietf-yang-types@2013-07-15.yang
@@ -0,0 +1,474 @@
+module ietf-yang-types {
+
+  namespace "urn:ietf:params:xml:ns:yang:ietf-yang-types";
+  prefix "yang";
+
+  organization
+   "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+  contact
+   "WG Web:   <http://tools.ietf.org/wg/netmod/>
+    WG List:  <mailto:netmod@ietf.org>
+
+    WG Chair: David Kessens
+              <mailto:david.kessens@nsn.com>
+
+    WG Chair: Juergen Schoenwaelder
+              <mailto:j.schoenwaelder@jacobs-university.de>
+
+    Editor:   Juergen Schoenwaelder
+              <mailto:j.schoenwaelder@jacobs-university.de>";
+
+  description
+   "This module contains a collection of generally useful derived
+    YANG data types.
+
+    Copyright (c) 2013 IETF Trust and the persons identified as
+    authors of the code.  All rights reserved.
+
+    Redistribution and use in source and binary forms, with or
+    without modification, is permitted pursuant to, and subject
+    to the license terms contained in, the Simplified BSD License
+    set forth in Section 4.c of the IETF Trust's Legal Provisions
+    Relating to IETF Documents
+    (http://trustee.ietf.org/license-info).
+
+    This version of this YANG module is part of RFC 6991; see
+    the RFC itself for full legal notices.";
+
+  revision 2013-07-15 {
+    description
+     "This revision adds the following new data types:
+      - yang-identifier
+      - hex-string
+      - uuid
+      - dotted-quad";
+    reference
+     "RFC 6991: Common YANG Data Types";
+  }
+
+  revision 2010-09-24 {
+    description
+     "Initial revision.";
+    reference
+     "RFC 6021: Common YANG Data Types";
+  }
+
+  /*** collection of counter and gauge types ***/
+
+  typedef counter32 {
+    type uint32;
+    description
+     "The counter32 type represents a non-negative integer
+      that monotonically increases until it reaches a
+      maximum value of 2^32-1 (4294967295 decimal), when it
+      wraps around and starts increasing again from zero.
+
+      Counters have no defined 'initial' value, and thus, a
+      single value of a counter has (in general) no information
+      content.  Discontinuities in the monotonically increasing
+      value normally occur at re-initialization of the
+      management system, and at other times as specified in the
+      description of a schema node using this type.  If such
+      other times can occur, for example, the creation of
+      a schema node of type counter32 at times other than
+      re-initialization, then a corresponding schema node
+      should be defined, with an appropriate type, to indicate
+      the last discontinuity.
+
+      The counter32 type should not be used for configuration
+      schema nodes.  A default statement SHOULD NOT be used in
+      combination with the type counter32.
+
+      In the value set and its semantics, this type is equivalent
+      to the Counter32 type of the SMIv2.";
+    reference
+     "RFC 2578: Structure of Management Information Version 2
+                (SMIv2)";
+  }
+
+  typedef zero-based-counter32 {
+    type yang:counter32;
+    default "0";
+    description
+     "The zero-based-counter32 type represents a counter32
+      that has the defined 'initial' value zero.
+
+      A schema node of this type will be set to zero (0) on creation
+      and will thereafter increase monotonically until it reaches
+      a maximum value of 2^32-1 (4294967295 decimal), when it
+      wraps around and starts increasing again from zero.
+
+      Provided that an application discovers a new schema node
+      of this type within the minimum time to wrap, it can use the
+      'initial' value as a delta.  It is important for a management
+      station to be aware of this minimum time and the actual time
+      between polls, and to discard data if the actual time is too
+      long or there is no defined minimum time.
+
+      In the value set and its semantics, this type is equivalent
+      to the ZeroBasedCounter32 textual convention of the SMIv2.";
+    reference
+      "RFC 4502: Remote Network Monitoring Management Information
+                 Base Version 2";
+  }
+
+  typedef counter64 {
+    type uint64;
+    description
+     "The counter64 type represents a non-negative integer
+      that monotonically increases until it reaches a
+      maximum value of 2^64-1 (18446744073709551615 decimal),
+      when it wraps around and starts increasing again from zero.
+
+      Counters have no defined 'initial' value, and thus, a
+      single value of a counter has (in general) no information
+      content.  Discontinuities in the monotonically increasing
+      value normally occur at re-initialization of the
+      management system, and at other times as specified in the
+      description of a schema node using this type.  If such
+      other times can occur, for example, the creation of
+      a schema node of type counter64 at times other than
+      re-initialization, then a corresponding schema node
+      should be defined, with an appropriate type, to indicate
+      the last discontinuity.
+
+      The counter64 type should not be used for configuration
+      schema nodes.  A default statement SHOULD NOT be used in
+      combination with the type counter64.
+
+      In the value set and its semantics, this type is equivalent
+      to the Counter64 type of the SMIv2.";
+    reference
+     "RFC 2578: Structure of Management Information Version 2
+                (SMIv2)";
+  }
+
+  typedef zero-based-counter64 {
+    type yang:counter64;
+    default "0";
+    description
+     "The zero-based-counter64 type represents a counter64 that
+      has the defined 'initial' value zero.
+
+      A schema node of this type will be set to zero (0) on creation
+      and will thereafter increase monotonically until it reaches
+      a maximum value of 2^64-1 (18446744073709551615 decimal),
+      when it wraps around and starts increasing again from zero.
+
+      Provided that an application discovers a new schema node
+      of this type within the minimum time to wrap, it can use the
+      'initial' value as a delta.  It is important for a management
+      station to be aware of this minimum time and the actual time
+      between polls, and to discard data if the actual time is too
+      long or there is no defined minimum time.
+
+      In the value set and its semantics, this type is equivalent
+      to the ZeroBasedCounter64 textual convention of the SMIv2.";
+    reference
+     "RFC 2856: Textual Conventions for Additional High Capacity
+                Data Types";
+  }
+
+  typedef gauge32 {
+    type uint32;
+    description
+     "The gauge32 type represents a non-negative integer, which
+      may increase or decrease, but shall never exceed a maximum
+      value, nor fall below a minimum value.  The maximum value
+      cannot be greater than 2^32-1 (4294967295 decimal), and
+      the minimum value cannot be smaller than 0.  The value of
+      a gauge32 has its maximum value whenever the information
+      being modeled is greater than or equal to its maximum
+      value, and has its minimum value whenever the information
+      being modeled is smaller than or equal to its minimum value.
+      If the information being modeled subsequently decreases
+      below (increases above) the maximum (minimum) value, the
+      gauge32 also decreases (increases).
+
+      In the value set and its semantics, this type is equivalent
+      to the Gauge32 type of the SMIv2.";
+    reference
+     "RFC 2578: Structure of Management Information Version 2
+                (SMIv2)";
+  }
+
+  typedef gauge64 {
+    type uint64;
+    description
+     "The gauge64 type represents a non-negative integer, which
+      may increase or decrease, but shall never exceed a maximum
+      value, nor fall below a minimum value.  The maximum value
+      cannot be greater than 2^64-1 (18446744073709551615), and
+      the minimum value cannot be smaller than 0.  The value of
+      a gauge64 has its maximum value whenever the information
+      being modeled is greater than or equal to its maximum
+      value, and has its minimum value whenever the information
+      being modeled is smaller than or equal to its minimum value.
+      If the information being modeled subsequently decreases
+      below (increases above) the maximum (minimum) value, the
+      gauge64 also decreases (increases).
+
+      In the value set and its semantics, this type is equivalent
+      to the CounterBasedGauge64 SMIv2 textual convention defined
+      in RFC 2856";
+    reference
+     "RFC 2856: Textual Conventions for Additional High Capacity
+                Data Types";
+  }
+
+  /*** collection of identifier-related types ***/
+
+  typedef object-identifier {
+    type string {
+      pattern '(([0-1](\.[1-3]?[0-9]))|(2\.(0|([1-9]\d*))))'
+            + '(\.(0|([1-9]\d*)))*';
+    }
+    description
+     "The object-identifier type represents administratively
+      assigned names in a registration-hierarchical-name tree.
+
+      Values of this type are denoted as a sequence of numerical
+      non-negative sub-identifier values.  Each sub-identifier
+      value MUST NOT exceed 2^32-1 (4294967295).  Sub-identifiers
+      are separated by single dots and without any intermediate
+      whitespace.
+
+      The ASN.1 standard restricts the value space of the first
+      sub-identifier to 0, 1, or 2.  Furthermore, the value space
+      of the second sub-identifier is restricted to the range
+      0 to 39 if the first sub-identifier is 0 or 1.  Finally,
+      the ASN.1 standard requires that an object identifier
+      has always at least two sub-identifiers.  The pattern
+      captures these restrictions.
+
+      Although the number of sub-identifiers is not limited,
+      module designers should realize that there may be
+      implementations that stick with the SMIv2 limit of 128
+      sub-identifiers.
+
+      This type is a superset of the SMIv2 OBJECT IDENTIFIER type
+      since it is not restricted to 128 sub-identifiers.  Hence,
+      this type SHOULD NOT be used to represent the SMIv2 OBJECT
+      IDENTIFIER type; the object-identifier-128 type SHOULD be
+      used instead.";
+    reference
+     "ISO9834-1: Information technology -- Open Systems
+      Interconnection -- Procedures for the operation of OSI
+      Registration Authorities: General procedures and top
+      arcs of the ASN.1 Object Identifier tree";
+  }
+
+  typedef object-identifier-128 {
+    type object-identifier {
+      pattern '\d*(\.\d*){1,127}';
+    }
+    description
+     "This type represents object-identifiers restricted to 128
+      sub-identifiers.
+
+      In the value set and its semantics, this type is equivalent
+      to the OBJECT IDENTIFIER type of the SMIv2.";
+    reference
+     "RFC 2578: Structure of Management Information Version 2
+                (SMIv2)";
+  }
+
+  typedef yang-identifier {
+    type string {
+      length "1..max";
+      pattern '[a-zA-Z_][a-zA-Z0-9\-_.]*';
+      pattern '.|..|[^xX].*|.[^mM].*|..[^lL].*';
+    }
+    description
+      "A YANG identifier string as defined by the 'identifier'
+       rule in Section 12 of RFC 6020.  An identifier must
+       start with an alphabetic character or an underscore
+       followed by an arbitrary sequence of alphabetic or
+       numeric characters, underscores, hyphens, or dots.
+
+       A YANG identifier MUST NOT start with any possible
+       combination of the lowercase or uppercase character
+       sequence 'xml'.";
+    reference
+      "RFC 6020: YANG - A Data Modeling Language for the Network
+                 Configuration Protocol (NETCONF)";
+  }
+
+  /*** collection of types related to date and time***/
+
+  typedef date-and-time {
+    type string {
+      pattern '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?'
+            + '(Z|[\+\-]\d{2}:\d{2})';
+    }
+    description
+     "The date-and-time type is a profile of the ISO 8601
+      standard for representation of dates and times using the
+      Gregorian calendar.  The profile is defined by the
+      date-time production in Section 5.6 of RFC 3339.
+
+      The date-and-time type is compatible with the dateTime XML
+      schema type with the following notable exceptions:
+
+      (a) The date-and-time type does not allow negative years.
+
+      (b) The date-and-time time-offset -00:00 indicates an unknown
+          time zone (see RFC 3339) while -00:00 and +00:00 and Z
+          all represent the same time zone in dateTime.
+
+      (c) The canonical format (see below) of data-and-time values
+          differs from the canonical format used by the dateTime XML
+          schema type, which requires all times to be in UTC using
+          the time-offset 'Z'.
+
+      This type is not equivalent to the DateAndTime textual
+      convention of the SMIv2 since RFC 3339 uses a different
+      separator between full-date and full-time and provides
+      higher resolution of time-secfrac.
+
+      The canonical format for date-and-time values with a known time
+      zone uses a numeric time zone offset that is calculated using
+      the device's configured known offset to UTC time.  A change of
+      the device's offset to UTC time will cause date-and-time values
+      to change accordingly.  Such changes might happen periodically
+      in case a server follows automatically daylight saving time
+      (DST) time zone offset changes.  The canonical format for
+      date-and-time values with an unknown time zone (usually
+      referring to the notion of local time) uses the time-offset
+      -00:00.";
+    reference
+     "RFC 3339: Date and Time on the Internet: Timestamps
+      RFC 2579: Textual Conventions for SMIv2
+      XSD-TYPES: XML Schema Part 2: Datatypes Second Edition";
+  }
+
+  typedef timeticks {
+    type uint32;
+    description
+     "The timeticks type represents a non-negative integer that
+      represents the time, modulo 2^32 (4294967296 decimal), in
+      hundredths of a second between two epochs.  When a schema
+      node is defined that uses this type, the description of
+      the schema node identifies both of the reference epochs.
+
+      In the value set and its semantics, this type is equivalent
+      to the TimeTicks type of the SMIv2.";
+    reference
+     "RFC 2578: Structure of Management Information Version 2
+                (SMIv2)";
+  }
+
+  typedef timestamp {
+    type yang:timeticks;
+    description
+     "The timestamp type represents the value of an associated
+      timeticks schema node at which a specific occurrence
+      happened.  The specific occurrence must be defined in the
+      description of any schema node defined using this type.  When
+      the specific occurrence occurred prior to the last time the
+      associated timeticks attribute was zero, then the timestamp
+      value is zero.  Note that this requires all timestamp values
+      to be reset to zero when the value of the associated timeticks
+      attribute reaches 497+ days and wraps around to zero.
+
+      The associated timeticks schema node must be specified
+      in the description of any schema node using this type.
+
+      In the value set and its semantics, this type is equivalent
+      to the TimeStamp textual convention of the SMIv2.";
+    reference
+     "RFC 2579: Textual Conventions for SMIv2";
+  }
+
+  /*** collection of generic address types ***/
+
+  typedef phys-address {
+    type string {
+      pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
+    }
+
+    description
+     "Represents media- or physical-level addresses represented
+      as a sequence octets, each octet represented by two hexadecimal
+      numbers.  Octets are separated by colons.  The canonical
+      representation uses lowercase characters.
+
+      In the value set and its semantics, this type is equivalent
+      to the PhysAddress textual convention of the SMIv2.";
+    reference
+     "RFC 2579: Textual Conventions for SMIv2";
+  }
+
+  typedef mac-address {
+    type string {
+      pattern '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}';
+    }
+    description
+     "The mac-address type represents an IEEE 802 MAC address.
+      The canonical representation uses lowercase characters.
+
+      In the value set and its semantics, this type is equivalent
+      to the MacAddress textual convention of the SMIv2.";
+    reference
+     "IEEE 802: IEEE Standard for Local and Metropolitan Area
+                Networks: Overview and Architecture
+      RFC 2579: Textual Conventions for SMIv2";
+  }
+
+  /*** collection of XML-specific types ***/
+
+  typedef xpath1.0 {
+    type string;
+    description
+     "This type represents an XPATH 1.0 expression.
+
+      When a schema node is defined that uses this type, the
+      description of the schema node MUST specify the XPath
+      context in which the XPath expression is evaluated.";
+    reference
+     "XPATH: XML Path Language (XPath) Version 1.0";
+  }
+
+  /*** collection of string types ***/
+
+  typedef hex-string {
+    type string {
+      pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
+    }
+    description
+     "A hexadecimal string with octets represented as hex digits
+      separated by colons.  The canonical representation uses
+      lowercase characters.";
+  }
+
+  typedef uuid {
+    type string {
+      pattern '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-'
+            + '[0-9a-fA-F]{4}-[0-9a-fA-F]{12}';
+    }
+    description
+     "A Universally Unique IDentifier in the string representation
+      defined in RFC 4122.  The canonical representation uses
+      lowercase characters.
+
+      The following is an example of a UUID in string representation:
+      f81d4fae-7dec-11d0-a765-00a0c91e6bf6
+      ";
+    reference
+     "RFC 4122: A Universally Unique IDentifier (UUID) URN
+                Namespace";
+  }
+
+  typedef dotted-quad {
+    type string {
+      pattern
+        '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+      + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])';
+    }
+    description
+      "An unsigned 32-bit number expressed in the dotted-quad
+       notation, i.e., four octets written as decimal numbers
+       and separated with the '.' (full stop) character.";
+  }
+}
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/json/acme.system.json b/plugins/org.etsi.mts.tdl.yang2json/samples/json/acme.system.json
new file mode 100644
index 0000000000000000000000000000000000000000..59751e6c532603639a984753a492cfb7e3cb0183
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/json/acme.system.json
@@ -0,0 +1,13 @@
+            {
+                "acme-system:system" : {
+                    "login" : {
+                        "user" : [
+                            {
+                                "name" : "Jim",
+                                "full-name" : "Jim Jeffries",
+                                "class" : "comedian"
+                            }
+                        ]
+                    }
+                }
+            }
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/json/acme.system.login.json b/plugins/org.etsi.mts.tdl.yang2json/samples/json/acme.system.login.json
new file mode 100644
index 0000000000000000000000000000000000000000..70c1d88778507be836516af4840c23d6b2e71e67
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/json/acme.system.login.json
@@ -0,0 +1,10 @@
+            {
+                        "acme-system:user" : [
+                            {
+                                "name" : "Jim",
+                                "full-name" : "Jim Jeffries",
+                                "class" : "comedian"
+                            }
+
+                        ]
+            }
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/json/acme.system.login.user.json b/plugins/org.etsi.mts.tdl.yang2json/samples/json/acme.system.login.user.json
new file mode 100644
index 0000000000000000000000000000000000000000..5b0fc1a1849d7ba1e2d44aad873b97628ecfcabd
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/json/acme.system.login.user.json
@@ -0,0 +1,14 @@
+            {
+                        "acme-system:user" : [
+                            {
+                                "name" : "Jim",
+                                "full-name" : "Jim Jeffries",
+                                "class" : "comedian"
+                            },
+                            {
+                                "name" : "Jeff",
+                                "full-name" : "Jeff Peters",
+                                "class" : "comedian"
+                            }
+                        ]
+            }
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/json/model.json b/plugins/org.etsi.mts.tdl.yang2json/samples/json/model.json
new file mode 100644
index 0000000000000000000000000000000000000000..9f9f33b054d838035714977f83039eaa30bd3311
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/json/model.json
@@ -0,0 +1,39 @@
+{
+  "authors": [
+    {
+      "name": "Alfonso"
+    },
+    {
+      "name": "Alfred"
+    }
+  ],
+  "books": [
+    {
+      "title": "Book One",
+      "authors": [
+        {
+          "name": "Author One"
+        },
+        {
+          "name": "Author Two"
+        }
+      ]
+    },
+    {
+      "title": "Book Two",
+      "authors": [
+        {
+          "name": "Alfonso"
+        }
+      ]
+    },
+    {
+      "title": "Book Three",
+      "authors": [
+        {
+          "name": "Alfred"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/mwt/iana-if-type@2023-01-26.yang b/plugins/org.etsi.mts.tdl.yang2json/samples/mwt/iana-if-type@2023-01-26.yang
new file mode 100644
index 0000000000000000000000000000000000000000..036e1f9145d2092f6218b85f7d8553cfed1d6c95
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/mwt/iana-if-type@2023-01-26.yang
@@ -0,0 +1,1852 @@
+module iana-if-type {
+  yang-version 1.1;
+  namespace "urn:ietf:params:xml:ns:yang:iana-if-type";
+  prefix ianaift;
+
+  import ietf-interfaces {
+    prefix if;
+  }
+
+  organization "IANA";
+  contact
+    "        Internet Assigned Numbers Authority
+
+     Postal: ICANN
+             12025 Waterfront Drive, Suite 300
+             Los Angeles, CA 90094-2536
+             United States
+
+     Tel:    +1 310 301 5800
+     <mailto:iana@iana.org>";
+  description
+    "This YANG module defines YANG identities for IANA-registered
+     interface types.
+
+     This YANG module is maintained by IANA and reflects the
+     'ifType definitions' registry.
+
+     The latest revision of this YANG module can be obtained from
+     the IANA web site.
+
+     Requests for new values should be made to IANA via
+     email (iana@iana.org).
+
+     Copyright (c) 2014 IETF Trust and the persons identified as
+     authors of the code.  All rights reserved.
+
+     Redistribution and use in source and binary forms, with or
+     without modification, is permitted pursuant to, and subject
+     to the license terms contained in, the Simplified BSD License
+     set forth in Section 4.c of the IETF Trust's Legal Provisions
+     Relating to IETF Documents
+     (http://trustee.ietf.org/license-info).
+
+     The initial version of this YANG module is part of RFC 7224;
+     see the RFC itself for full legal notices.";
+  reference
+    "IANA 'ifType definitions' registry.
+     <http://www.iana.org/assignments/smi-numbers>";
+
+  revision 2023-01-26 {
+    description
+      "Fix incorrect quotation for previous 3 revision statements.";
+  }
+  
+  revision 2022-08-24 {
+    description
+      "Updated reference for ifType 303.";
+  }
+
+  revision 2022-08-17 {
+    description
+      "Changed gpon description to refer to G.984.";
+  }
+
+  revision 2022-03-07 {
+    description
+      "Coalesced revision history entries for 2018-06-28.";
+  }
+
+  revision 2021-06-21 {
+    description
+      "Corrected reference for ifType 303.";
+  }
+
+  revision 2021-05-17 {
+    description
+      "Registered ifType 303.";
+  }
+
+  revision 2021-04-22 {
+    description
+      "Registered ifType 302.";
+  }
+
+  revision 2021-04-01 {
+    description
+      "Updated reference for 301.";
+  }
+
+  revision 2021-02-18 {
+    description
+      "Registered ifType 301.";
+  }
+
+  revision 2020-08-27 {
+    description
+      "Added missing references.";
+  }
+
+  revision 2020-07-13 {
+    description
+      "Added identity cpri.";
+  }
+
+  revision 2020-07-10 {
+    description
+      "Registered ifType 300.";
+  }
+
+  revision 2020-01-10 {
+    description
+      "Registered ifType 299.";
+  }
+
+  revision 2019-10-16 {
+    description
+      "Registered ifType 298.";
+  }
+  revision 2019-07-16 {
+    description
+      "Registered ifType 297.";
+  }
+  revision 2019-06-21 {
+    description
+      "Updated reference associated with ifTypes 295-296.";
+  }
+  
+  revision 2019-02-08 {
+    description
+      "Corrected formatting issue.";
+  }
+
+  revision 2019-01-31 {
+    description
+      "Registered ifTypes 295-296.";
+  }
+
+  revision 2018-07-03 {
+    description
+      "Corrected revision date.";
+  }
+
+  revision 2018-06-29 {
+    description
+      "Corrected formatting issue.";
+  }
+
+  revision 2018-06-28 {
+    description
+      "Registered ifTypes 293 and 294.";
+  }
+
+  revision 2018-06-22 {
+    description
+      "Registered ifType 292.";
+  }
+
+  revision 2018-06-21 {
+    description
+      "Registered ifType 291.";
+  }
+
+  revision 2017-03-30 {
+    description
+      "Registered ifType 290.";
+  }
+
+  revision 2017-01-19 {
+    description
+      "Registered ifType 289.";
+  }
+
+  revision 2016-11-23 {
+    description
+      "Registered ifTypes 283-288.";
+  }
+
+  revision 2016-06-09 {
+    description
+      "Registered ifType 282.";
+  }
+  revision 2016-05-03 {
+    description
+      "Registered ifType 281.";
+  }
+  revision 2015-06-12 {
+    description
+      "Corrected formatting issue.";
+  }  
+  revision 2014-09-24 {
+    description
+      "Registered ifType 280.";
+  }
+  revision 2014-09-19 {
+    description
+      "Registered ifType 279.";
+  }
+  revision 2014-07-03 {
+    description
+      "Registered ifTypes 277-278.";
+  }
+  revision 2014-05-19 {
+    description
+      "Updated the contact address.";
+  }
+  revision 2014-05-08 {
+    description
+      "Initial revision.";
+    reference
+      "RFC 7224: IANA Interface Type YANG Module";
+  }
+
+  identity iana-interface-type {
+    base if:interface-type;
+    description
+      "This identity is used as a base for all interface types
+       defined in the 'ifType definitions' registry.";
+  }
+
+  identity other {
+    base iana-interface-type;
+  }
+  identity regular1822 {
+    base iana-interface-type;
+  }
+  identity hdh1822 {
+    base iana-interface-type;
+  }
+  identity ddnX25 {
+    base iana-interface-type;
+  }
+  identity rfc877x25 {
+    base iana-interface-type;
+    reference
+      "RFC 1382 - SNMP MIB Extension for the X.25 Packet Layer";
+  }
+  identity ethernetCsmacd {
+    base iana-interface-type;
+    description
+      "For all Ethernet-like interfaces, regardless of speed,
+       as per RFC 3635.";
+    reference
+      "RFC 3635 - Definitions of Managed Objects for the
+                  Ethernet-like Interface Types";
+  }
+  identity iso88023Csmacd {
+    base iana-interface-type;
+    status deprecated;
+    description
+      "Deprecated via RFC 3635.
+       Use ethernetCsmacd(6) instead.";
+    reference
+      "RFC 3635 - Definitions of Managed Objects for the
+                  Ethernet-like Interface Types";
+  }
+  identity iso88024TokenBus {
+    base iana-interface-type;
+  }
+  identity iso88025TokenRing {
+    base iana-interface-type;
+  }
+  identity iso88026Man {
+    base iana-interface-type;
+  }
+  identity starLan {
+    base iana-interface-type;
+    status deprecated;
+    description
+      "Deprecated via RFC 3635.
+       Use ethernetCsmacd(6) instead.";
+    reference
+      "RFC 3635 - Definitions of Managed Objects for the
+                  Ethernet-like Interface Types";
+  }
+  identity proteon10Mbit {
+    base iana-interface-type;
+  }
+  identity proteon80Mbit {
+    base iana-interface-type;
+  }
+  identity hyperchannel {
+    base iana-interface-type;
+  }
+  identity fddi {
+    base iana-interface-type;
+    reference
+      "RFC 1512 - FDDI Management Information Base";
+  }
+  identity lapb {
+    base iana-interface-type;
+    reference
+      "RFC 1381 - SNMP MIB Extension for X.25 LAPB";
+  }
+  identity sdlc {
+    base iana-interface-type;
+  }
+  identity ds1 {
+    base iana-interface-type;
+    description
+      "DS1-MIB.";
+    reference
+      "RFC 4805 - Definitions of Managed Objects for the
+                  DS1, J1, E1, DS2, and E2 Interface Types";
+  }
+  identity e1 {
+    base iana-interface-type;
+    status obsolete;
+    description
+      "Obsolete; see DS1-MIB.";
+    reference
+      "RFC 4805 - Definitions of Managed Objects for the
+                  DS1, J1, E1, DS2, and E2 Interface Types";
+  }
+  identity basicISDN {
+    base iana-interface-type;
+    description
+      "No longer used.  See also RFC 2127.";
+  }
+  identity primaryISDN {
+    base iana-interface-type;
+    description
+      "No longer used.  See also RFC 2127.";
+  }
+  identity propPointToPointSerial {
+    base iana-interface-type;
+    description
+      "Proprietary serial.";
+  }
+  identity ppp {
+    base iana-interface-type;
+  }
+  identity softwareLoopback {
+    base iana-interface-type;
+  }
+  identity eon {
+    base iana-interface-type;
+    description
+      "CLNP over IP.";
+  }
+  identity ethernet3Mbit {
+    base iana-interface-type;
+  }
+  identity nsip {
+    base iana-interface-type;
+    description
+      "XNS over IP.";
+  }
+  identity slip {
+    base iana-interface-type;
+    description
+      "Generic SLIP.";
+  }
+  identity ultra {
+    base iana-interface-type;
+    description
+      "Ultra Technologies.";
+  }
+  identity ds3 {
+    base iana-interface-type;
+    description
+      "DS3-MIB.";
+    reference
+      "RFC 3896 - Definitions of Managed Objects for the
+                  DS3/E3 Interface Type";
+  }
+  identity sip {
+    base iana-interface-type;
+    description
+      "SMDS, coffee.";
+    reference
+      "RFC 1694 - Definitions of Managed Objects for SMDS
+                  Interfaces using SMIv2";
+  }
+  identity frameRelay {
+    base iana-interface-type;
+    description
+      "DTE only.";
+    reference
+      "RFC 2115 - Management Information Base for Frame Relay
+                  DTEs Using SMIv2";
+  }
+  identity rs232 {
+    base iana-interface-type;
+    reference
+      "RFC 1659 - Definitions of Managed Objects for RS-232-like
+                  Hardware Devices using SMIv2";
+  }
+  identity para {
+    base iana-interface-type;
+    description
+      "Parallel-port.";
+    reference
+      "RFC 1660 - Definitions of Managed Objects for
+                  Parallel-printer-like Hardware Devices using
+                  SMIv2";
+  }
+  identity arcnet {
+    base iana-interface-type;
+    description
+      "ARCnet.";
+  }
+  identity arcnetPlus {
+    base iana-interface-type;
+    description
+      "ARCnet Plus.";
+  }
+  identity atm {
+    base iana-interface-type;
+    description
+      "ATM cells.";
+  }
+  identity miox25 {
+    base iana-interface-type;
+    reference
+      "RFC 1461 - SNMP MIB extension for Multiprotocol
+                  Interconnect over X.25";
+  }
+  identity sonet {
+    base iana-interface-type;
+    description
+      "SONET or SDH.";
+  }
+  identity x25ple {
+    base iana-interface-type;
+    reference
+      "RFC 2127 - ISDN Management Information Base using SMIv2";
+  }
+  identity iso88022llc {
+    base iana-interface-type;
+  }
+  identity localTalk {
+    base iana-interface-type;
+  }
+  identity smdsDxi {
+    base iana-interface-type;
+  }
+  identity frameRelayService {
+    base iana-interface-type;
+    description
+      "FRNETSERV-MIB.";
+    reference
+      "RFC 2954 - Definitions of Managed Objects for Frame
+                  Relay Service";
+  }
+  identity v35 {
+    base iana-interface-type;
+  }
+  identity hssi {
+    base iana-interface-type;
+  }
+  identity hippi {
+    base iana-interface-type;
+  }
+  identity modem {
+    base iana-interface-type;
+    description
+      "Generic modem.";
+  }
+  identity aal5 {
+    base iana-interface-type;
+    description
+      "AAL5 over ATM.";
+  }
+  identity sonetPath {
+    base iana-interface-type;
+  }
+  identity sonetVT {
+    base iana-interface-type;
+  }
+  identity smdsIcip {
+    base iana-interface-type;
+    description
+      "SMDS InterCarrier Interface.";
+  }
+  identity propVirtual {
+    base iana-interface-type;
+    description
+      "Proprietary virtual/internal.";
+    reference
+      "RFC 2863 - The Interfaces Group MIB";
+  }
+  identity propMultiplexor {
+    base iana-interface-type;
+    description
+      "Proprietary multiplexing.";
+    reference
+      "RFC 2863 - The Interfaces Group MIB";
+  }
+  identity ieee80212 {
+    base iana-interface-type;
+    description
+      "100BaseVG.";
+  }
+  identity fibreChannel {
+    base iana-interface-type;
+    description
+      "Fibre Channel.";
+  }
+  identity hippiInterface {
+    base iana-interface-type;
+    description
+      "HIPPI interfaces.";
+  }
+  identity frameRelayInterconnect {
+    base iana-interface-type;
+    status obsolete;
+    description
+      "Obsolete; use either
+       frameRelay(32) or frameRelayService(44).";
+  }
+  identity aflane8023 {
+    base iana-interface-type;
+    description
+      "ATM Emulated LAN for 802.3.";
+  }
+  identity aflane8025 {
+    base iana-interface-type;
+    description
+      "ATM Emulated LAN for 802.5.";
+  }
+  identity cctEmul {
+    base iana-interface-type;
+    description
+      "ATM Emulated circuit.";
+  }
+  identity fastEther {
+    base iana-interface-type;
+    status deprecated;
+    description
+      "Obsoleted via RFC 3635.
+       ethernetCsmacd(6) should be used instead.";
+    reference
+      "RFC 3635 - Definitions of Managed Objects for the
+                  Ethernet-like Interface Types";
+  }
+  identity isdn {
+    base iana-interface-type;
+    description
+      "ISDN and X.25.";
+    reference
+      "RFC 1356 - Multiprotocol Interconnect on X.25 and ISDN
+                  in the Packet Mode";
+  }
+  identity v11 {
+    base iana-interface-type;
+    description
+      "CCITT V.11/X.21.";
+  }
+  identity v36 {
+    base iana-interface-type;
+    description
+      "CCITT V.36.";
+  }
+  identity g703at64k {
+    base iana-interface-type;
+    description
+      "CCITT G703 at 64Kbps.";
+  }
+  identity g703at2mb {
+    base iana-interface-type;
+    status obsolete;
+    description
+      "Obsolete; see DS1-MIB.";
+  }
+  identity qllc {
+    base iana-interface-type;
+    description
+      "SNA QLLC.";
+  }
+  identity fastEtherFX {
+    base iana-interface-type;
+    status deprecated;
+    description
+      "Obsoleted via RFC 3635.
+       ethernetCsmacd(6) should be used instead.";
+    reference
+      "RFC 3635 - Definitions of Managed Objects for the
+                  Ethernet-like Interface Types";
+  }
+  identity channel {
+    base iana-interface-type;
+    description
+      "Channel.";
+  }
+  identity ieee80211 {
+    base iana-interface-type;
+    description
+      "Radio spread spectrum.";
+  }
+  identity ibm370parChan {
+    base iana-interface-type;
+    description
+      "IBM System 360/370 OEMI Channel.";
+  }
+  identity escon {
+    base iana-interface-type;
+    description
+      "IBM Enterprise Systems Connection.";
+  }
+  identity dlsw {
+    base iana-interface-type;
+    description
+      "Data Link Switching.";
+  }
+  identity isdns {
+    base iana-interface-type;
+    description
+      "ISDN S/T interface.";
+  }
+  identity isdnu {
+    base iana-interface-type;
+    description
+      "ISDN U interface.";
+  }
+  identity lapd {
+    base iana-interface-type;
+    description
+      "Link Access Protocol D.";
+  }
+  identity ipSwitch {
+    base iana-interface-type;
+    description
+      "IP Switching Objects.";
+  }
+  identity rsrb {
+    base iana-interface-type;
+    description
+      "Remote Source Route Bridging.";
+  }
+  identity atmLogical {
+    base iana-interface-type;
+    description
+      "ATM Logical Port.";
+    reference
+      "RFC 3606 - Definitions of Supplemental Managed Objects
+                  for ATM Interface";
+  }
+  identity ds0 {
+    base iana-interface-type;
+    description
+      "Digital Signal Level 0.";
+    reference
+      "RFC 2494 - Definitions of Managed Objects for the DS0
+                  and DS0 Bundle Interface Type";
+  }
+  identity ds0Bundle {
+    base iana-interface-type;
+    description
+      "Group of ds0s on the same ds1.";
+    reference
+      "RFC 2494 - Definitions of Managed Objects for the DS0
+                  and DS0 Bundle Interface Type";
+  }
+  identity bsc {
+    base iana-interface-type;
+    description
+      "Bisynchronous Protocol.";
+  }
+  identity async {
+    base iana-interface-type;
+    description
+      "Asynchronous Protocol.";
+  }
+  identity cnr {
+    base iana-interface-type;
+    description
+      "Combat Net Radio.";
+  }
+  identity iso88025Dtr {
+    base iana-interface-type;
+    description
+      "ISO 802.5r DTR.";
+  }
+  identity eplrs {
+    base iana-interface-type;
+    description
+      "Ext Pos Loc Report Sys.";
+  }
+  identity arap {
+    base iana-interface-type;
+    description
+      "Appletalk Remote Access Protocol.";
+  }
+  identity propCnls {
+    base iana-interface-type;
+    description
+      "Proprietary Connectionless Protocol.";
+  }
+  identity hostPad {
+    base iana-interface-type;
+    description
+      "CCITT-ITU X.29 PAD Protocol.";
+  }
+  identity termPad {
+    base iana-interface-type;
+    description
+      "CCITT-ITU X.3 PAD Facility.";
+  }
+  identity frameRelayMPI {
+    base iana-interface-type;
+    description
+      "Multiproto Interconnect over FR.";
+  }
+  identity x213 {
+    base iana-interface-type;
+    description
+      "CCITT-ITU X213.";
+  }
+  identity adsl {
+    base iana-interface-type;
+    description
+      "Asymmetric Digital Subscriber Loop.";
+  }
+  identity radsl {
+    base iana-interface-type;
+    description
+      "Rate-Adapt. Digital Subscriber Loop.";
+  }
+  identity sdsl {
+    base iana-interface-type;
+    description
+      "Symmetric Digital Subscriber Loop.";
+  }
+  identity vdsl {
+    base iana-interface-type;
+    description
+      "Very H-Speed Digital Subscrib. Loop.";
+  }
+  identity iso88025CRFPInt {
+    base iana-interface-type;
+    description
+      "ISO 802.5 CRFP.";
+  }
+  identity myrinet {
+    base iana-interface-type;
+    description
+      "Myricom Myrinet.";
+  }
+  identity voiceEM {
+    base iana-interface-type;
+    description
+      "Voice recEive and transMit.";
+  }
+  identity voiceFXO {
+    base iana-interface-type;
+    description
+      "Voice Foreign Exchange Office.";
+  }
+  identity voiceFXS {
+    base iana-interface-type;
+    description
+      "Voice Foreign Exchange Station.";
+  }
+  identity voiceEncap {
+    base iana-interface-type;
+    description
+      "Voice encapsulation.";
+  }
+  identity voiceOverIp {
+    base iana-interface-type;
+    description
+      "Voice over IP encapsulation.";
+  }
+  identity atmDxi {
+    base iana-interface-type;
+    description
+      "ATM DXI.";
+  }
+  identity atmFuni {
+    base iana-interface-type;
+    description
+      "ATM FUNI.";
+  }
+  identity atmIma {
+    base iana-interface-type;
+    description
+      "ATM IMA.";
+  }
+  identity pppMultilinkBundle {
+    base iana-interface-type;
+    description
+      "PPP Multilink Bundle.";
+  }
+  identity ipOverCdlc {
+    base iana-interface-type;
+    description
+      "IBM ipOverCdlc.";
+  }
+  identity ipOverClaw {
+    base iana-interface-type;
+    description
+      "IBM Common Link Access to Workstn.";
+  }
+  identity stackToStack {
+    base iana-interface-type;
+    description
+      "IBM stackToStack.";
+  }
+  identity virtualIpAddress {
+    base iana-interface-type;
+    description
+      "IBM VIPA.";
+  }
+  identity mpc {
+    base iana-interface-type;
+    description
+      "IBM multi-protocol channel support.";
+  }
+  identity ipOverAtm {
+    base iana-interface-type;
+    description
+      "IBM ipOverAtm.";
+    reference
+      "RFC 2320 - Definitions of Managed Objects for Classical IP
+                  and ARP Over ATM Using SMIv2 (IPOA-MIB)";
+  }
+  identity iso88025Fiber {
+    base iana-interface-type;
+    description
+      "ISO 802.5j Fiber Token Ring.";
+  }
+  identity tdlc {
+    base iana-interface-type;
+    description
+      "IBM twinaxial data link control.";
+  }
+  identity gigabitEthernet {
+    base iana-interface-type;
+    status deprecated;
+    description
+      "Obsoleted via RFC 3635.
+       ethernetCsmacd(6) should be used instead.";
+    reference
+      "RFC 3635 - Definitions of Managed Objects for the
+                  Ethernet-like Interface Types";
+  }
+  identity hdlc {
+    base iana-interface-type;
+    description
+      "HDLC.";
+  }
+  identity lapf {
+    base iana-interface-type;
+    description
+      "LAP F.";
+  }
+  identity v37 {
+    base iana-interface-type;
+    description
+      "V.37.";
+  }
+  identity x25mlp {
+    base iana-interface-type;
+    description
+      "Multi-Link Protocol.";
+  }
+  identity x25huntGroup {
+    base iana-interface-type;
+    description
+      "X25 Hunt Group.";
+  }
+  identity transpHdlc {
+    base iana-interface-type;
+    description
+      "Transp HDLC.";
+  }
+  identity interleave {
+    base iana-interface-type;
+    description
+      "Interleave channel.";
+  }
+  identity fast {
+    base iana-interface-type;
+    description
+      "Fast channel.";
+  }
+  identity ip {
+    base iana-interface-type;
+    description
+      "IP (for APPN HPR in IP networks).";
+  }
+  identity docsCableMaclayer {
+    base iana-interface-type;
+    description
+      "CATV Mac Layer.";
+  }
+  identity docsCableDownstream {
+    base iana-interface-type;
+    description
+      "CATV Downstream interface.";
+  }
+  identity docsCableUpstream {
+    base iana-interface-type;
+    description
+      "CATV Upstream interface.";
+  }
+  identity a12MppSwitch {
+    base iana-interface-type;
+    description
+      "Avalon Parallel Processor.";
+  }
+  identity tunnel {
+    base iana-interface-type;
+    description
+      "Encapsulation interface.";
+  }
+  identity coffee {
+    base iana-interface-type;
+    description
+      "Coffee pot.";
+    reference
+      "RFC 2325 - Coffee MIB";
+  }
+  identity ces {
+    base iana-interface-type;
+    description
+      "Circuit Emulation Service.";
+  }
+  identity atmSubInterface {
+    base iana-interface-type;
+    description
+      "ATM Sub Interface.";
+  }
+  identity l2vlan {
+    base iana-interface-type;
+    description
+      "Layer 2 Virtual LAN using 802.1Q.";
+  }
+  identity l3ipvlan {
+    base iana-interface-type;
+    description
+      "Layer 3 Virtual LAN using IP.";
+  }
+  identity l3ipxvlan {
+    base iana-interface-type;
+    description
+      "Layer 3 Virtual LAN using IPX.";
+  }
+  identity digitalPowerline {
+    base iana-interface-type;
+    description
+      "IP over Power Lines.";
+  }
+  identity mediaMailOverIp {
+    base iana-interface-type;
+    description
+      "Multimedia Mail over IP.";
+  }
+  identity dtm {
+    base iana-interface-type;
+    description
+      "Dynamic synchronous Transfer Mode.";
+  }
+  identity dcn {
+    base iana-interface-type;
+    description
+      "Data Communications Network.";
+  }
+  identity ipForward {
+    base iana-interface-type;
+    description
+      "IP Forwarding Interface.";
+  }
+  identity msdsl {
+    base iana-interface-type;
+    description
+      "Multi-rate Symmetric DSL.";
+  }
+  identity ieee1394 {
+    base iana-interface-type;
+
+    description
+      "IEEE1394 High Performance Serial Bus.";
+  }
+  identity if-gsn {
+    base iana-interface-type;
+    description
+      "HIPPI-6400.";
+  }
+  identity dvbRccMacLayer {
+    base iana-interface-type;
+    description
+      "DVB-RCC MAC Layer.";
+  }
+  identity dvbRccDownstream {
+    base iana-interface-type;
+    description
+      "DVB-RCC Downstream Channel.";
+  }
+  identity dvbRccUpstream {
+    base iana-interface-type;
+    description
+      "DVB-RCC Upstream Channel.";
+  }
+  identity atmVirtual {
+    base iana-interface-type;
+    description
+      "ATM Virtual Interface.";
+  }
+  identity mplsTunnel {
+    base iana-interface-type;
+    description
+      "MPLS Tunnel Virtual Interface.";
+  }
+  identity srp {
+    base iana-interface-type;
+    description
+      "Spatial Reuse Protocol.";
+  }
+  identity voiceOverAtm {
+    base iana-interface-type;
+    description
+      "Voice over ATM.";
+  }
+  identity voiceOverFrameRelay {
+    base iana-interface-type;
+    description
+      "Voice Over Frame Relay.";
+  }
+  identity idsl {
+    base iana-interface-type;
+    description
+      "Digital Subscriber Loop over ISDN.";
+  }
+  identity compositeLink {
+    base iana-interface-type;
+    description
+      "Avici Composite Link Interface.";
+  }
+  identity ss7SigLink {
+    base iana-interface-type;
+    description
+      "SS7 Signaling Link.";
+  }
+  identity propWirelessP2P {
+    base iana-interface-type;
+    description
+      "Prop. P2P wireless interface.";
+  }
+  identity frForward {
+    base iana-interface-type;
+    description
+      "Frame Forward Interface.";
+  }
+  identity rfc1483 {
+    base iana-interface-type;
+    description
+      "Multiprotocol over ATM AAL5.";
+    reference
+      "RFC 1483 - Multiprotocol Encapsulation over ATM
+                  Adaptation Layer 5";
+  }
+  identity usb {
+    base iana-interface-type;
+    description
+      "USB Interface.";
+  }
+  identity ieee8023adLag {
+    base iana-interface-type;
+    description
+      "IEEE 802.3ad Link Aggregate.";
+  }
+  identity bgppolicyaccounting {
+    base iana-interface-type;
+    description
+      "BGP Policy Accounting.";
+  }
+  identity frf16MfrBundle {
+    base iana-interface-type;
+    description
+      "FRF.16 Multilink Frame Relay.";
+  }
+  identity h323Gatekeeper {
+    base iana-interface-type;
+    description
+      "H323 Gatekeeper.";
+  }
+  identity h323Proxy {
+    base iana-interface-type;
+    description
+      "H323 Voice and Video Proxy.";
+  }
+  identity mpls {
+    base iana-interface-type;
+    description
+      "MPLS.";
+  }
+  identity mfSigLink {
+    base iana-interface-type;
+    description
+      "Multi-frequency signaling link.";
+  }
+  identity hdsl2 {
+    base iana-interface-type;
+    description
+      "High Bit-Rate DSL - 2nd generation.";
+  }
+  identity shdsl {
+    base iana-interface-type;
+    description
+      "Multirate HDSL2.";
+  }
+  identity ds1FDL {
+    base iana-interface-type;
+    description
+      "Facility Data Link (4Kbps) on a DS1.";
+  }
+  identity pos {
+    base iana-interface-type;
+    description
+      "Packet over SONET/SDH Interface.";
+  }
+  identity dvbAsiIn {
+    base iana-interface-type;
+    description
+      "DVB-ASI Input.";
+  }
+  identity dvbAsiOut {
+    base iana-interface-type;
+    description
+      "DVB-ASI Output.";
+  }
+  identity plc {
+    base iana-interface-type;
+    description
+      "Power Line Communications.";
+  }
+  identity nfas {
+    base iana-interface-type;
+    description
+      "Non-Facility Associated Signaling.";
+  }
+  identity tr008 {
+    base iana-interface-type;
+    description
+      "TR008.";
+  }
+  identity gr303RDT {
+    base iana-interface-type;
+    description
+      "Remote Digital Terminal.";
+  }
+  identity gr303IDT {
+    base iana-interface-type;
+    description
+      "Integrated Digital Terminal.";
+  }
+  identity isup {
+    base iana-interface-type;
+    description
+      "ISUP.";
+  }
+  identity propDocsWirelessMaclayer {
+    base iana-interface-type;
+    description
+      "Cisco proprietary Maclayer.";
+  }
+  identity propDocsWirelessDownstream {
+    base iana-interface-type;
+    description
+      "Cisco proprietary Downstream.";
+  }
+  identity propDocsWirelessUpstream {
+    base iana-interface-type;
+    description
+      "Cisco proprietary Upstream.";
+  }
+  identity hiperlan2 {
+    base iana-interface-type;
+    description
+      "HIPERLAN Type 2 Radio Interface.";
+  }
+  identity propBWAp2Mp {
+    base iana-interface-type;
+    description
+      "PropBroadbandWirelessAccesspt2Multipt (use of this value
+       for IEEE 802.16 WMAN interfaces as per IEEE Std 802.16f
+       is deprecated, and ieee80216WMAN(237) should be used
+       instead).";
+  }
+  identity sonetOverheadChannel {
+    base iana-interface-type;
+    description
+      "SONET Overhead Channel.";
+  }
+  identity digitalWrapperOverheadChannel {
+    base iana-interface-type;
+    description
+      "Digital Wrapper.";
+  }
+  identity aal2 {
+    base iana-interface-type;
+    description
+      "ATM adaptation layer 2.";
+  }
+  identity radioMAC {
+    base iana-interface-type;
+    description
+      "MAC layer over radio links.";
+  }
+  identity atmRadio {
+    base iana-interface-type;
+    description
+      "ATM over radio links.";
+  }
+  identity imt {
+    base iana-interface-type;
+    description
+      "Inter-Machine Trunks.";
+  }
+  identity mvl {
+    base iana-interface-type;
+    description
+      "Multiple Virtual Lines DSL.";
+  }
+  identity reachDSL {
+    base iana-interface-type;
+    description
+      "Long Reach DSL.";
+  }
+  identity frDlciEndPt {
+    base iana-interface-type;
+    description
+      "Frame Relay DLCI End Point.";
+  }
+  identity atmVciEndPt {
+    base iana-interface-type;
+    description
+      "ATM VCI End Point.";
+  }
+  identity opticalChannel {
+    base iana-interface-type;
+    description
+      "Optical Channel.";
+  }
+  identity opticalTransport {
+    base iana-interface-type;
+    description
+      "Optical Transport.";
+  }
+  identity propAtm {
+    base iana-interface-type;
+    description
+      "Proprietary ATM.";
+  }
+  identity voiceOverCable {
+    base iana-interface-type;
+    description
+      "Voice Over Cable Interface.";
+  }
+  identity infiniband {
+    base iana-interface-type;
+    description
+      "Infiniband.";
+  }
+  identity teLink {
+    base iana-interface-type;
+    description
+      "TE Link.";
+  }
+  identity q2931 {
+    base iana-interface-type;
+    description
+      "Q.2931.";
+  }
+  identity virtualTg {
+    base iana-interface-type;
+    description
+      "Virtual Trunk Group.";
+  }
+  identity sipTg {
+    base iana-interface-type;
+    description
+      "SIP Trunk Group.";
+  }
+  identity sipSig {
+    base iana-interface-type;
+    description
+      "SIP Signaling.";
+  }
+  identity docsCableUpstreamChannel {
+    base iana-interface-type;
+    description
+      "CATV Upstream Channel.";
+  }
+  identity econet {
+    base iana-interface-type;
+    description
+      "Acorn Econet.";
+  }
+  identity pon155 {
+    base iana-interface-type;
+    description
+      "FSAN 155Mb Symetrical PON interface.";
+  }
+  identity pon622 {
+    base iana-interface-type;
+    description
+      "FSAN 622Mb Symetrical PON interface.";
+  }
+  identity bridge {
+    base iana-interface-type;
+    description
+      "Transparent bridge interface.";
+  }
+  identity linegroup {
+    base iana-interface-type;
+    description
+      "Interface common to multiple lines.";
+  }
+  identity voiceEMFGD {
+    base iana-interface-type;
+    description
+      "Voice E&M Feature Group D.";
+  }
+  identity voiceFGDEANA {
+    base iana-interface-type;
+    description
+      "Voice FGD Exchange Access North American.";
+  }
+  identity voiceDID {
+    base iana-interface-type;
+    description
+      "Voice Direct Inward Dialing.";
+  }
+  identity mpegTransport {
+    base iana-interface-type;
+    description
+      "MPEG transport interface.";
+  }
+  identity sixToFour {
+    base iana-interface-type;
+    status deprecated;
+    description
+      "6to4 interface (DEPRECATED).";
+    reference
+      "RFC 4087 - IP Tunnel MIB";
+  }
+  identity gtp {
+    base iana-interface-type;
+    description
+      "GTP (GPRS Tunneling Protocol).";
+  }
+  identity pdnEtherLoop1 {
+    base iana-interface-type;
+    description
+      "Paradyne EtherLoop 1.";
+  }
+  identity pdnEtherLoop2 {
+    base iana-interface-type;
+    description
+      "Paradyne EtherLoop 2.";
+  }
+  identity opticalChannelGroup {
+    base iana-interface-type;
+    description
+      "Optical Channel Group.";
+  }
+  identity homepna {
+    base iana-interface-type;
+    description
+      "HomePNA ITU-T G.989.";
+  }
+  identity gfp {
+    base iana-interface-type;
+    description
+      "Generic Framing Procedure (GFP).";
+  }
+  identity ciscoISLvlan {
+    base iana-interface-type;
+    description
+      "Layer 2 Virtual LAN using Cisco ISL.";
+  }
+  identity actelisMetaLOOP {
+    base iana-interface-type;
+    description
+      "Acteleis proprietary MetaLOOP High Speed Link.";
+  }
+  identity fcipLink {
+    base iana-interface-type;
+    description
+      "FCIP Link.";
+  }
+  identity rpr {
+    base iana-interface-type;
+    description
+      "Resilient Packet Ring Interface Type.";
+  }
+  identity qam {
+    base iana-interface-type;
+    description
+      "RF Qam Interface.";
+  }
+  identity lmp {
+    base iana-interface-type;
+    description
+      "Link Management Protocol.";
+    reference
+      "RFC 4327 - Link Management Protocol (LMP) Management
+                  Information Base (MIB)";
+  }
+  identity cblVectaStar {
+    base iana-interface-type;
+    description
+      "Cambridge Broadband Networks Limited VectaStar.";
+  }
+  identity docsCableMCmtsDownstream {
+    base iana-interface-type;
+    description
+      "CATV Modular CMTS Downstream Interface.";
+  }
+  identity adsl2 {
+    base iana-interface-type;
+    status deprecated;
+    description
+      "Asymmetric Digital Subscriber Loop Version 2
+       (DEPRECATED/OBSOLETED - please use adsl2plus(238)
+       instead).";
+    reference
+      "RFC 4706 - Definitions of Managed Objects for Asymmetric
+                  Digital Subscriber Line 2 (ADSL2)";
+  }
+  identity macSecControlledIF {
+    base iana-interface-type;
+    description
+      "MACSecControlled.";
+  }
+  identity macSecUncontrolledIF {
+    base iana-interface-type;
+    description
+      "MACSecUncontrolled.";
+  }
+  identity aviciOpticalEther {
+    base iana-interface-type;
+    description
+      "Avici Optical Ethernet Aggregate.";
+  }
+  identity atmbond {
+    base iana-interface-type;
+    description
+      "atmbond.";
+  }
+  identity voiceFGDOS {
+    base iana-interface-type;
+    description
+      "Voice FGD Operator Services.";
+  }
+  identity mocaVersion1 {
+    base iana-interface-type;
+    description
+      "MultiMedia over Coax Alliance (MoCA) Interface
+       as documented in information provided privately to IANA.";
+  }
+  identity ieee80216WMAN {
+    base iana-interface-type;
+    description
+      "IEEE 802.16 WMAN interface.";
+  }
+  identity adsl2plus {
+    base iana-interface-type;
+    description
+      "Asymmetric Digital Subscriber Loop Version 2 -
+       Version 2 Plus and all variants.";
+  }
+  identity dvbRcsMacLayer {
+    base iana-interface-type;
+    description
+      "DVB-RCS MAC Layer.";
+    reference
+      "RFC 5728 - The SatLabs Group DVB-RCS MIB";
+  }
+  identity dvbTdm {
+    base iana-interface-type;
+    description
+      "DVB Satellite TDM.";
+    reference
+      "RFC 5728 - The SatLabs Group DVB-RCS MIB";
+  }
+  identity dvbRcsTdma {
+    base iana-interface-type;
+    description
+      "DVB-RCS TDMA.";
+    reference
+      "RFC 5728 - The SatLabs Group DVB-RCS MIB";
+  }
+  identity x86Laps {
+    base iana-interface-type;
+    description
+      "LAPS based on ITU-T X.86/Y.1323.";
+  }
+  identity wwanPP {
+    base iana-interface-type;
+    description
+      "3GPP WWAN.";
+  }
+  identity wwanPP2 {
+    base iana-interface-type;
+    description
+      "3GPP2 WWAN.";
+  }
+  identity voiceEBS {
+    base iana-interface-type;
+    description
+      "Voice P-phone EBS physical interface.";
+  }
+  identity ifPwType {
+    base iana-interface-type;
+    description
+      "Pseudowire interface type.";
+    reference
+      "RFC 5601 - Pseudowire (PW) Management Information Base (MIB)";
+  }
+  identity ilan {
+    base iana-interface-type;
+    description
+      "Internal LAN on a bridge per IEEE 802.1ap.";
+  }
+  identity pip {
+    base iana-interface-type;
+    description
+      "Provider Instance Port on a bridge per IEEE 802.1ah PBB.";
+  }
+  identity aluELP {
+    base iana-interface-type;
+    description
+      "Alcatel-Lucent Ethernet Link Protection.";
+  }
+  identity gpon {
+    base iana-interface-type;
+    description
+      "Gigabit-capable passive optical networks (G-PON) as per
+       ITU-T G.984.";
+  }
+  identity vdsl2 {
+    base iana-interface-type;
+    description
+      "Very high speed digital subscriber line Version 2
+       (as per ITU-T Recommendation G.993.2).";
+    reference
+      "RFC 5650 - Definitions of Managed Objects for Very High
+                  Speed Digital Subscriber Line 2 (VDSL2)";
+  }
+  identity capwapDot11Profile {
+    base iana-interface-type;
+    description
+      "WLAN Profile Interface.";
+    reference
+      "RFC 5834 - Control and Provisioning of Wireless Access
+                  Points (CAPWAP) Protocol Binding MIB for
+                  IEEE 802.11";
+  }
+  identity capwapDot11Bss {
+    base iana-interface-type;
+    description
+      "WLAN BSS Interface.";
+    reference
+      "RFC 5834 - Control and Provisioning of Wireless Access
+                  Points (CAPWAP) Protocol Binding MIB for
+                  IEEE 802.11";
+  }
+  identity capwapWtpVirtualRadio {
+    base iana-interface-type;
+    description
+      "WTP Virtual Radio Interface.";
+    reference
+      "RFC 5833 - Control and Provisioning of Wireless Access
+                  Points (CAPWAP) Protocol Base MIB";
+  }
+  identity bits {
+    base iana-interface-type;
+    description
+      "bitsport.";
+  }
+  identity docsCableUpstreamRfPort {
+    base iana-interface-type;
+    description
+      "DOCSIS CATV Upstream RF Port.";
+  }
+  identity cableDownstreamRfPort {
+    base iana-interface-type;
+    description
+      "CATV downstream RF Port.";
+  }
+  identity vmwareVirtualNic {
+    base iana-interface-type;
+    description
+      "VMware Virtual Network Interface.";
+  }
+  identity ieee802154 {
+    base iana-interface-type;
+    description
+      "IEEE 802.15.4 WPAN interface.";
+    reference
+      "IEEE 802.15.4-2006";
+  }
+  identity otnOdu {
+    base iana-interface-type;
+    description
+      "OTN Optical Data Unit.";
+  }
+  identity otnOtu {
+    base iana-interface-type;
+    description
+      "OTN Optical channel Transport Unit.";
+  }
+  identity ifVfiType {
+    base iana-interface-type;
+    description
+      "VPLS Forwarding Instance Interface Type.";
+  }
+  identity g9981 {
+    base iana-interface-type;
+    description
+      "G.998.1 bonded interface.";
+  }
+  identity g9982 {
+    base iana-interface-type;
+    description
+      "G.998.2 bonded interface.";
+  }
+  identity g9983 {
+    base iana-interface-type;
+    description
+      "G.998.3 bonded interface.";
+  }
+
+  identity aluEpon {
+    base iana-interface-type;
+    description
+      "Ethernet Passive Optical Networks (E-PON).";
+  }
+  identity aluEponOnu {
+    base iana-interface-type;
+    description
+      "EPON Optical Network Unit.";
+  }
+  identity aluEponPhysicalUni {
+    base iana-interface-type;
+    description
+      "EPON physical User to Network interface.";
+  }
+  identity aluEponLogicalLink {
+    base iana-interface-type;
+    description
+      "The emulation of a point-to-point link over the EPON
+       layer.";
+  }
+  identity aluGponOnu {
+    base iana-interface-type;
+    description
+      "GPON Optical Network Unit.";
+    reference
+      "ITU-T G.984.2";
+  }
+  identity aluGponPhysicalUni {
+    base iana-interface-type;
+    description
+      "GPON physical User to Network interface.";
+    reference
+      "ITU-T G.984.2";
+  }
+  identity vmwareNicTeam {
+    base iana-interface-type;
+    description
+      "VMware NIC Team.";
+  }
+  identity docsOfdmDownstream {
+    base iana-interface-type;
+    description
+      "CATV Downstream OFDM interface.";
+    reference
+      "Cable Modem Operations Support System Interface 
+       Specification";
+  }
+  identity docsOfdmaUpstream {
+    base iana-interface-type;
+    description
+      "CATV Upstream OFDMA interface.";
+    reference
+      "Cable Modem Operations Support System Interface 
+       Specification";
+  }
+  identity gfast {
+    base iana-interface-type;
+    description
+      "G.fast port.";
+    reference
+      "ITU-T G.9701";
+  }
+  identity sdci {
+    base iana-interface-type;
+    description
+      "SDCI (IO-Link).";
+    reference
+      "IEC 61131-9 Edition 1.0 2013-09";
+  }
+  identity xboxWireless {
+    base iana-interface-type;
+    description
+      "Xbox wireless.";
+  }
+  identity fastdsl {
+    base iana-interface-type;
+    description
+      "FastDSL.";
+    reference
+      "BBF TR-355";
+  }
+  identity docsCableScte55d1FwdOob {
+    base iana-interface-type;
+    description
+      "Cable SCTE 55-1 OOB Forward Channel.";
+    reference
+      "ANSI/SCTE 55-1 2009";
+  }
+  identity docsCableScte55d1RetOob {
+    base iana-interface-type;
+    description
+      "Cable SCTE 55-1 OOB Return Channel.";
+    reference
+      "ANSI/SCTE 55-1 2009";
+  }
+  identity docsCableScte55d2DsOob {
+    base iana-interface-type;
+    description
+      "Cable SCTE 55-2 OOB Downstream Channel.";
+    reference
+      "ANSI/SCTE 55-2 2008";
+  }
+  identity docsCableScte55d2UsOob {
+    base iana-interface-type;
+    description
+      "Cable SCTE 55-2 OOB Upstream Channel.";
+    reference
+      "ANSI/SCTE 55-2 2008";
+  }
+  identity docsCableNdf {
+    base iana-interface-type;
+    description
+      "Cable Narrowband Digital Forward.";
+  }
+  identity docsCableNdr {
+    base iana-interface-type;
+    description
+      "Cable Narrowband Digital Return.";
+  }
+  identity ptm {
+    base iana-interface-type;
+    description
+      "Packet Transfer Mode.";
+    reference
+      "IEEE G.993.1, Annex H; IEEE G.993.2; IEEE G.9701";
+  }
+  identity ghn {
+    base iana-interface-type;
+    description
+      "G.hn port.";
+    reference
+      "IEEE G.9961";
+  }
+  identity otnOtsi {
+    base iana-interface-type;
+    description
+      "Optical Tributary Signal.";
+    reference
+      "ITU-T G.959.1";
+  }
+  identity otnOtuc {
+    base iana-interface-type;
+    description
+      "OTN OTUCn.";
+    reference
+      "ITU-T G.709/Y.1331";
+  }
+  identity otnOduc {
+    base iana-interface-type;
+    description
+      "OTN ODUC.";
+    reference
+      "ITU-T G.709";
+  }
+  identity otnOtsig {
+    base iana-interface-type;
+    description
+      "OTN OTUC Signal.";
+    reference
+      "ITU-T G.709";
+  }
+  identity microwaveCarrierTermination {
+    base iana-interface-type;
+    description
+      "air interface of a single microwave carrier.";
+    reference
+      "RFC 8561 - A YANG Data Model for Microwave Radio Link";
+  }
+  identity microwaveRadioLinkTerminal {
+    base iana-interface-type;
+    description
+      "radio link interface for one or several aggregated microwave carriers.";
+    reference
+      "RFC 8561 - A YANG Data Model for Microwave Radio Link";
+  }
+  identity ieee8021axDrni {
+    base iana-interface-type;
+    description
+      "IEEE 802.1AX Distributed Resilient Network Interface.";
+    reference
+      "IEEE 802.1AX-Rev-d2-0";
+  }
+  identity ax25 {
+    base iana-interface-type;
+    description
+      "AX.25 network interfaces.";
+    reference
+      "AX.25 Link Access Protocol for Amateur Packet Radio version 2.2";
+  }
+  identity ieee19061nanocom {
+    base iana-interface-type;
+    description
+      "Nanoscale and Molecular Communication.";
+    reference
+      "IEEE 1906.1-2015";
+  }
+  identity cpri {
+    base iana-interface-type;
+    description
+      "Common Public Radio Interface.";
+    reference
+      "CPRI v7.0";
+  }
+  identity omni {
+    base iana-interface-type;
+    description
+      "Overlay Multilink Network Interface (OMNI).";
+    reference
+      "draft-templin-6man-omni-00";
+  }
+  identity roe {
+    base iana-interface-type;
+    description
+      "Radio over Ethernet Interface.";
+    reference
+      "1914.3-2018 - IEEE Standard for Radio over Ethernet Encapsulations and Mappings";
+  }
+  identity p2pOverLan {
+    base iana-interface-type;
+    description
+      "Point to Point over LAN interface.";
+    reference
+      "RFC 9296 - ifStackTable for the Point-to-Point (P2P) Interface over a LAN Type: Definition and Examples";
+  }
+}
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/mwt/ieee802-dot1q-bridge.yang b/plugins/org.etsi.mts.tdl.yang2json/samples/mwt/ieee802-dot1q-bridge.yang
new file mode 100644
index 0000000000000000000000000000000000000000..2c7d9f9d55ee877fbd50739a15c7f799d8cb735f
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/mwt/ieee802-dot1q-bridge.yang
@@ -0,0 +1,1795 @@
+module ieee802-dot1q-bridge {
+  yang-version "1.1";
+  namespace urn:ieee:std:802.1Q:yang:ieee802-dot1q-bridge;
+  prefix dot1q;
+  import ieee802-types {
+    prefix ieee;
+  }
+  import ietf-yang-types {
+    prefix yang;
+  }
+  import ietf-interfaces {
+    prefix if;
+  }
+  import iana-if-type {
+    prefix ianaif;
+  }
+  import ieee802-dot1q-types {
+    prefix dot1qtypes;
+  }
+  organization
+    "IEEE 802.1 Working Group";
+  contact
+    "WG-URL: http://ieee802.org/1/
+    WG-EMail: stds-802-1-l@ieee.org
+    
+    Contact: IEEE 802.1 Working Group Chair
+    Postal: C/O IEEE 802.1 Working Group
+            IEEE Standards Association
+            445 Hoes Lane
+            Piscataway, NJ 08854
+            USA
+    
+    E-mail: stds-802-1-chairs@ieee.org";
+  description
+    "This YANG module describes the bridge configuration model for the
+    following IEEE 802.1Q Bridges:
+       1) Two Port MAC Relays
+       2) Customer VLAN Bridges
+       3) Provider Bridges.
+    
+    Copyright (C) IEEE (2022).
+    
+    This version of this YANG module is part of IEEE Std 802.1Q; see the
+    standard itself for full legal notices.";
+  revision 2022-05-06 {
+    description
+      "Rebase Qrev with Qcw updates.";
+    reference
+      "IEEE Std 802.1Q-2022, Bridges and Bridged Networks.";
+  }
+  revision 2022-01-19 {
+    description
+      "Published as part of IEEE Std 802.1Q-2022.";
+    reference
+      "IEEE Std 802.1Q-2022, Bridges and Bridged Networks.";
+  }
+  revision 2020-11-06 {
+    description
+      "Published as part of IEEE Std 802.1Qcr-2020. Third version.";
+    reference
+      "IEEE Std 802.1Qcr-2020, Bridges and Bridged Networks -
+      Asynchronous Traffic Shaping.";
+  }
+  revision 2020-06-04 {
+    description
+      "Published as part of IEEE Std 802.1Qcx-2020. Second version.";
+    reference
+      "IEEE Std 802.1Qcx-2020, Bridges and Bridged Networks - YANG Data
+      Model for Connectivity Fault Management.";
+  }
+  revision 2018-03-07 {
+    description
+      "Published as part of IEEE Std 802.1Q-2018. Initial version.";
+    reference
+      "IEEE Std 802.1Q-2018, Bridges and Bridged Networks.";
+  }
+  feature ingress-filtering {
+    description
+      "Each Port may support an Enable Ingress Filtering parameter. A
+      frame received on a Port that is not in the member set (8.8.10)
+      associated with the frames VID shall be discarded if this
+      parameter is set. The default value for this parameter is reset,
+      i.e., Disable Ingress Filtering, for all Ports. Any Port that
+      supports setting this parameter shall also support resetting it.
+      The parameter may be configured by the management operations
+      defined in Clause 12.";
+    reference
+      "8.6.2 of IEEE Std 802.1Q-2022";
+  }
+  feature extended-filtering-services {
+    description
+      "Extended Filtering Services support the filtering behavior
+      required for regions of a network in which potential recipients of
+      multicast frames exist, and where both the potential recipients of
+      frames and the Bridges are able to support dynamic configuration
+      of filtering information for group MAC addresses. In order to
+      integrate this extended filtering behavior with the needs of
+      regions of the network that support only Basic Filtering Services,
+      Bridges that support Extended Filtering Services can be statically
+      and dynamically configured to modify their filtering behavior on a
+      per-group MAC address basis, and also on the basis of the overall
+      filtering service provided by each outbound Port with regard to
+      multicast frames. The latter capability permits configuration of
+      the Ports default forwarding or filtering behavior with regard to
+      group MAC addresses for which no specific static or dynamic
+      filtering information has been configured.";
+    reference
+      "8.8.4, Clause 10 of IEEE Std 802.1Q-2022";
+  }
+  feature port-and-protocol-based-vlan {
+    description
+      "A VLAN-aware bridge component implementation in conformance to
+      the provisions of this standard for Port-and-Protocol-based VLAN
+      classification (5.4.1) shall 1) Support one or more of the
+      following Protocol Classifications and Protocol Template formats:
+      Ethernet, RFC_1042, SNAP_8021H, SNAP_Other, or LLC_Other (6.12);
+      and may 2) Support configuration of the contents of the Protocol
+      Group Database.";
+    reference
+      "5.4.1.2 of IEEE Std 802.1Q-2022";
+  }
+  feature flow-filtering {
+    description
+      "Flow filtering support enables Bridges to distinguish frames
+      belonging to different client flows and to use this information in
+      the forwarding process. Information related to client flows may be
+      used at the boundary of an SPT Domain to generate a flow hash
+      value. The flow hash, carried in an F-TAG, serves to distinguish
+      frames belonging to different flows and can be used in the
+      forwarding process to distribute frames over equal cost paths.
+      This provides for finer granularity load spreading while
+      maintaining frame order for each client flow.";
+    reference
+      "44.2 of IEEE Std 802.1Q-2022";
+  }
+  feature simple-bridge-port {
+    description
+      "A simple bridge port allows underlying (MAC) layers to share the
+      same Interface as the Bridge Port.";
+  }
+  feature flexible-bridge-port {
+    description
+      "A flexible bridge port supports an Interface that is a Bridge
+      Port to be a separate Interface from the underlying (MAC) layer.";
+  }
+  identity type-of-bridge {
+    description
+      "Represents the configured Bridge type.";
+  }
+  identity customer-vlan-bridge {
+    base type-of-bridge;
+    description
+      "Base identity for a Customer VLAN Bridge.";
+  }
+  identity provider-bridge {
+    base type-of-bridge;
+    description
+      "Base identity for a Provider Bridge (PB).";
+  }
+  identity provider-edge-bridge {
+    base type-of-bridge;
+    description
+      "Base identity for a Provider Edge Bridge (PEB).";
+  }
+  identity two-port-mac-relay-bridge {
+    base type-of-bridge;
+    description
+      "Base identity for a Two Port MAC Relay (TPMR).";
+  }
+  identity type-of-component {
+    description
+      "Represents the type of Component.";
+  }
+  identity c-vlan-component {
+    base type-of-component;
+    description
+      "Base identity for a C-VLAN component.";
+  }
+  identity s-vlan-component {
+    base type-of-component;
+    description
+      "Base identity for a S-VLAN component.";
+  }
+  identity d-bridge-component {
+    base type-of-component;
+    description
+      "Base identity for a VLAN unaware component.";
+  }
+  identity edge-relay-component {
+    base type-of-component;
+    description
+      "Base identity for an EVB station ER component.";
+  }
+  identity type-of-port {
+    description
+      "Represents the type of Bridge port.";
+  }
+  identity c-vlan-bridge-port {
+    base type-of-port;
+    description
+      "Indicates the port can be a C-TAG aware port of an enterprise
+      VLAN aware Bridge.";
+  }
+  identity provider-network-port {
+    base type-of-port;
+    description
+      "Indicates the port can be an S-TAG aware port of a Provider
+      Bridge or Backbone Edge Bridge used for connections within a PBN
+      (Provider Bridged Network) or PBBN (Provider Backbone Bridged
+      Network).";
+  }
+  identity customer-network-port {
+    base type-of-port;
+    description
+      "Indicates the port can be an S-TAG aware port of a Provider
+      Bridge or Backbone Edge Bridge used for connections to the
+      exterior of a PBN (Provider Bridged Network) or PBBN (Provider
+      Backbone Bridged Network).";
+  }
+  identity customer-edge-port {
+    base type-of-port;
+    description
+      "Indicates the port can be a C-TAG aware port of a Provider Bridge
+      used for connections to the exterior of a PBN (Provider Bridged
+      Network) or PBBN (Provider Backbone Bridged Network).";
+  }
+  identity d-bridge-port {
+    base type-of-port;
+    description
+      "Indicates the port can be a VLAN-unaware member of an 802.1Q
+      Bridge.";
+  }
+  identity remote-customer-access-port {
+    base type-of-port;
+    description
+      "Indicates the port can be an S-TAG aware port of a Provider
+      Bridge capable of providing Remote Customer Service Interfaces.";
+  }
+  identity bridge-interface {
+    description
+      "Generic interface property that represents any interface that can
+      be associated with an IEEE 802.1Q compliant Bridge component. Any
+      new Interface types would derive from this identity to
+      automatically pick up Bridge related configuration or operational
+      data.";
+  }
+  container bridges {
+    description
+      "Contains the Bridge(s) configuration information.";
+    list bridge {
+      key "name";
+      unique "address";
+      description
+        "Provides configuration data in support of the Bridge
+        Configuration resources. There is a single bridge data node per
+        Bridge.";
+      leaf name {
+        type dot1qtypes:name-type;
+        description
+          "A text string associated with the Bridge, of locally
+          determined significance.";
+        reference
+          "12.4 of IEEE Std 802.1Q-2022";
+      }
+      leaf address {
+        type ieee:mac-address;
+        mandatory true;
+        description
+          "The MAC address for the Bridge from which the Bridge
+          Identifiers used by the STP, RSTP, and MSTP are derived.";
+        reference
+          "12.4 of IEEE Std 802.1Q-2022";
+      }
+      leaf bridge-type {
+        type identityref {
+          base type-of-bridge;
+        }
+        mandatory true;
+        description
+          "The type of Bridge.";
+      }
+      leaf ports {
+        type uint16 {
+          range "1..4095";
+        }
+        config false;
+        description
+          "The number of Bridge Ports (MAC Entities)";
+        reference
+          "12.4 of IEEE Std 802.1Q-2022";
+      }
+      leaf up-time {
+        type yang:zero-based-counter32;
+        units "seconds";
+        config false;
+        description
+          "The count in seconds of the time elapsed since the Bridge was
+          last reset or initialized.";
+        reference
+          "12.4 of IEEE Std 802.1Q-2022";
+      }
+      leaf components {
+        type uint32;
+        config false;
+        description
+          "The number of components associated with the Bridge.";
+      }
+      list component {
+        key "name";
+        description
+          "The set of components associated with a given Bridge. For
+          example, - A TPMR is associated with a single VLAN unaware
+          component. - A Customer VLAN Bridge is associated with a
+          single VLAN aware component. - A Provider Bridge is associated
+          with a single S-VLAN component and zero or more C-VLAN
+          components.";
+        reference
+          "Item 1)a in 12.4.1.5 of IEEE Std 802.1Q-2022";
+        leaf name {
+          type string;
+          description
+            "The name of the Component.";
+        }
+        leaf id {
+          type uint32;
+          description
+            "Unique identifier for a particular Bridge component within
+            the system.";
+          reference
+            "Item l) in 12.3 of IEEE Std 802.1Q-2022";
+        }
+        leaf type {
+          type identityref {
+            base type-of-component;
+          }
+          mandatory true;
+          description
+            "The type of component used to classify a particular Bridge
+            component within a Bridge system comprising multiple
+            components.";
+          reference
+            "Item m) in 12.3 of IEEE Std 802.1Q-2022";
+        }
+        leaf address {
+          type ieee:mac-address;
+          description
+            "Unique EUI-48 Universally Administered MAC address assigned
+            to a Bridge component.";
+          reference
+            "13.24, 8.13.8 of IEEE Std 802.1Q-2022";
+        }
+        leaf traffic-class-enabled {
+          type boolean;
+          default "true";
+          description
+            "Indication of Traffic Classes enablement associated with
+            the Bridge Component. A value of True indicates that Traffic
+            Classes are enabled on this Bridge Component. A value of
+            False indicates that the Bridge Component operates with a
+            single priority level for all traffic.";
+          reference
+            "12.4.1.5.1 of IEEE Std 802.1Q-2022";
+        }
+        leaf ports {
+          type uint16 {
+            range "1..4095";
+          }
+          config false;
+          description
+            "The number of Bridge Ports associated with the Bridge
+            Component.";
+          reference
+            "Item c) in 12.4.1.1.3 of IEEE Std 802.1Q-2022";
+        }
+        leaf-list bridge-port {
+          type if:interface-ref;
+          config false;
+          description
+            "List of bridge-port references.";
+        }
+        container capabilities {
+          config false;
+          description
+            "Array of Boolean values of the feature capabilities
+            associated with a given Bridge Component.";
+          reference
+            "Item b) in 12.10.1.1.3, 12.4.1.5.2 of IEEE Std 802.1Q-2022";
+          leaf extended-filtering {
+            type boolean;
+            default "false";
+            description
+              "Can perform filtering on individual multicast addresses
+              controlled by MMRP.";
+            reference
+              "12.4.1.5.2 of IEEE Std 802.1Q-2022";
+          }
+          leaf traffic-classes {
+            type boolean;
+            default "false";
+            description
+              "Can map priority to multiple traffic classes.";
+            reference
+              "12.4.1.5.2 of IEEE Std 802.1Q-2022";
+          }
+          leaf static-entry-individual-port {
+            type boolean;
+            default "false";
+            description
+              "Static entries per port.";
+            reference
+              "12.4.1.5.2 of IEEE Std 802.1Q-2022";
+          }
+          leaf ivl-capable {
+            type boolean;
+            default "true";
+            description
+              "Independent VLAN Learning (IVL).";
+            reference
+              "12.4.1.5.2 of IEEE Std 802.1Q-2022";
+          }
+          leaf svl-capable {
+            type boolean;
+            default "false";
+            description
+              "Shared VLAN Learning (SVL).";
+            reference
+              "12.4.1.5.2 of IEEE Std 802.1Q-2022";
+          }
+          leaf hybrid-capable {
+            type boolean;
+            default "false";
+            description
+              "Both IVL and SVL simultaneously.";
+            reference
+              "12.4.1.5.2 of IEEE Std 802.1Q-2022";
+          }
+          leaf configurable-pvid-tagging {
+            type boolean;
+            default "false";
+            description
+              "Whether the implementation supports the ability to
+              override the default PVID setting and its egress status
+              (VLAN-tagged or Untagged) on each port.";
+            reference
+              "12.4.1.5.2 of IEEE Std 802.1Q-2022";
+          }
+          leaf local-vlan-capable {
+            type boolean;
+            default "false";
+            description
+              "Can support multiple local Bridges, outside the scope of
+              802.1Q defined VLANs.";
+            reference
+              "12.4.1.5.2 of IEEE Std 802.1Q-2022";
+          }
+        }
+        container filtering-database {
+          when
+            "not(derived-from-or-self(../../bridge-type, "+
+            "'two-port-mac-relay-bridge'))" {
+            description
+              "Applies to non TPMRs.";
+          }
+          description
+            "Contains filtering information used by the Forwarding
+            Process in deciding through which Ports of the Bridge frames
+            should be forwarded.";
+          reference
+            "12.7 of IEEE Std 802.1Q-2022";
+          leaf aging-time {
+            type uint32 {
+              range "10..10000000";
+            }
+            units "seconds";
+            default "300";
+            description
+              "The timeout period in seconds for aging out
+              dynamically-learned forwarding information.";
+            reference
+              "12.7, 8.8.3 of IEEE Std 802.1Q-2022";
+          }
+          leaf size {
+            type yang:gauge32;
+            config false;
+            description
+              "The maximum number of entries that can be held in the
+              FDB.";
+            reference
+              "12.7 of IEEE Std 802.1Q-2022";
+          }
+          leaf static-entries {
+            type yang:gauge32;
+            config false;
+            description
+              "The number of Static Filtering entries currently in the
+              FDB.";
+            reference
+              "12.7, 8.8.1 of IEEE Std 802.1Q-2022";
+          }
+          leaf dynamic-entries {
+            type yang:gauge32;
+            config false;
+            description
+              "The number of Dynamic Filtering entries currently in the
+              FDB.";
+            reference
+              "12.7, 8.8.3 of IEEE Std 802.1Q-2022";
+          }
+          leaf static-vlan-registration-entries {
+            type yang:gauge32;
+            config false;
+            description
+              "The number of Static VLAN Registration entries currently
+              in the FDB.";
+            reference
+              "12.7, 8.8.2 of IEEE Std 802.1Q-2022";
+          }
+          leaf dynamic-vlan-registration-entries {
+            type yang:gauge32;
+            config false;
+            description
+              "The number of Dynamic VLAN Registration entries currently
+              in the FDB.";
+            reference
+              "12.7, 8.8.5 of IEEE Std 802.1Q-2022";
+          }
+          leaf mac-address-registration-entries {
+            if-feature "extended-filtering-services";
+            type yang:gauge32;
+            config false;
+            description
+              "The number of MAC Address Registration entries currently
+              in the FDB.";
+            reference
+              "12.7, 8.8.4 of IEEE Std 802.1Q-2022";
+          }
+          list filtering-entry {
+            key "database-id vids address";
+            description
+              "Information for the entries associated with the Permanent
+              Database.";
+            leaf database-id {
+              type uint32;
+              description
+                "The identity of this Filtering Database.";
+              reference
+                "12.7.7 of IEEE Std 802.1Q-2022";
+            }
+            leaf address {
+              type ieee:mac-address;
+              description
+                "A MAC address (unicast, multicast, broadcast) for which
+                the device has forwarding and/or filtering information.";
+              reference
+                "12.7.7 of IEEE Std 802.1Q-2022";
+            }
+            leaf vids {
+              type dot1qtypes:vid-range-type;
+              description
+                "The set of VLAN identifiers to which this entry
+                applies.";
+              reference
+                "12.7.7 of IEEE Std 802.1Q-2022";
+            }
+            leaf entry-type {
+              type enumeration {
+                enum static {
+                  description
+                    "Static entry type";
+                }
+                enum dynamic {
+                  description
+                    "Dynamic/learnt entry type";
+                }
+              }
+              description
+                "The type of filtering entry. Whether static or dynamic.
+                Static entries can be created, deleted, and retrieved.
+                However, dynamic entries can only be deleted or
+                retrieved by the management entity. Consequently, a
+                Bridge is not required to accept a command that can
+                alter the dynamic entries except delete a dynamic entry.";
+              reference
+                "12.7.7 of IEEE Std 802.1Q-2022";
+            }
+            uses dot1qtypes:port-map-grouping;
+            leaf status {
+              type enumeration {
+                enum other {
+                  description
+                    "None of the following. This may include the case
+                    where some other object is being used to determine
+                    if and how frames addressed to the value of the
+                    corresponding instance of 'address' are being
+                    forwarded.";
+                }
+                enum invalid {
+                  description
+                    "This entry is no longer valid (e.g., it was learned
+                    but has since aged out), but has not yet been
+                    flushed from the table.";
+                }
+                enum learned {
+                  description
+                    "The value of the corresponding instance of the port
+                    node was learned and is being used.";
+                }
+                enum self {
+                  description
+                    "The value of the corresponding instance of the
+                    address node representing one of the devices
+                    address.";
+                }
+                enum mgmt {
+                  description
+                    "The value of the corresponding instance of address
+                    node that is also the value of an existing instance.";
+                }
+              }
+              config false;
+              description
+                "The status of this entry.";
+            }
+          }
+          list vlan-registration-entry {
+            key "database-id vids";
+            description
+              "The VLAN Registration Entries models the operations that
+              can be performed on a single VLAN Registration Entry in
+              the FDB. The set of VLAN Registration Entries within the
+              FDB changes under management control and also as a result
+              of MVRP exchanges";
+            reference
+              "12.7.5 of IEEE Std 802.1Q-2022";
+            leaf database-id {
+              type uint32;
+              description
+                "The identity of this Filtering Database.";
+              reference
+                "12.7.7 of IEEE Std 802.1Q-2022";
+            }
+            leaf vids {
+              type dot1qtypes:vid-range-type;
+              description
+                "The set of VLAN identifiers to which this entry
+                applies.";
+              reference
+                "12.7.7 of IEEE Std 802.1Q-2022";
+            }
+            leaf entry-type {
+              type enumeration {
+                enum static {
+                  description
+                    "Static entry type";
+                }
+                enum dynamic {
+                  description
+                    "Dynamic/learnt entry type";
+                }
+              }
+              description
+                "The type of filtering entry. Whether static or dynamic.
+                Static entries can be created, deleted, and retrieved.
+                However, dynamic entries can only be deleted or
+                retrieved by the management entity. Consequently, a
+                Bridge is not required to accept a command that can
+                alter the dynamic entries except delete a dynamic entry.";
+              reference
+                "12.7.7 of IEEE Std 802.1Q-2022";
+            }
+            uses dot1qtypes:port-map-grouping;
+          }
+        }
+        container permanent-database {
+          description
+            "The Permanent Database container models the operations that
+            can be performed on, or affect, the Permanent Database.
+            There is a single Permanent Database per FDB.";
+          leaf size {
+            type yang:gauge32;
+            config false;
+            description
+              "The maximum number of entries that can be held in the
+              FDB.";
+            reference
+              "12.7.6 of IEEE Std 802.1Q-2022";
+          }
+          leaf static-entries {
+            type yang:gauge32;
+            config false;
+            description
+              "The number of Static Filtering entries currently in the
+              FDB.";
+            reference
+              "12.7.6 of IEEE Std 802.1Q-2022";
+          }
+          leaf static-vlan-registration-entries {
+            type yang:gauge32;
+            config false;
+            description
+              "The number of Static VLAN Registration entries currently
+              in the FDB.";
+            reference
+              "12.7.6 of IEEE Std 802.1Q-2022";
+          }
+          list filtering-entry {
+            key "database-id vids address";
+            description
+              "Information for the entries associated with the Permanent
+              Database.";
+            leaf database-id {
+              type uint32;
+              description
+                "The identity of this Filtering Database.";
+              reference
+                "12.7.7 of IEEE Std 802.1Q-2022";
+            }
+            leaf address {
+              type ieee:mac-address;
+              description
+                "A MAC address (unicast, multicast, broadcast) for which
+                the device has forwarding and/or filtering information.";
+              reference
+                "12.7.7 of IEEE Std 802.1Q-2022";
+            }
+            leaf vids {
+              type dot1qtypes:vid-range-type;
+              description
+                "The set of VLAN identifiers to which this entry
+                applies.";
+              reference
+                "12.7.7 of IEEE Std 802.1Q-2022";
+            }
+            leaf status {
+              type enumeration {
+                enum other {
+                  description
+                    "None of the following. This may include the case
+                    where some other object is being used to determine
+                    if and how frames addressed to the value of the
+                    corresponding instance of 'address' are being
+                    forwarded.";
+                }
+                enum invalid {
+                  description
+                    "This entry is no longer valid (e.g., it was learned
+                    but has since aged out), but has not yet been
+                    flushed from the table.";
+                }
+                enum learned {
+                  description
+                    "The value of the corresponding instance of the port
+                    node was learned and is being used.";
+                }
+                enum self {
+                  description
+                    "The value of the corresponding instance of the
+                    address node representing one of the devices
+                    address.";
+                }
+                enum mgmt {
+                  description
+                    "The value of the corresponding instance of address
+                    node that is also the value of an existing instance.";
+                }
+              }
+              config false;
+              description
+                "The status of this entry.";
+            }
+            uses dot1qtypes:port-map-grouping;
+          }
+        }
+        container bridge-vlan {
+          when
+            "not(derived-from-or-self(../../bridge-type, "+
+            "'two-port-mac-relay-bridge'))" {
+            description
+              "Applies to non TPMRs.";
+          }
+          description
+            "The Bridge VLAN container models configuration information
+            that modify, or inquire about, the overall configuration of
+            the Bridges VLAN resources. There is a single Bridge VLAN
+            Configuration managed object per Bridge.";
+          reference
+            "12.10 of IEEE Std 802.1Q-2022";
+          leaf version {
+            type uint16;
+            config false;
+            description
+              "The version number supported.";
+            reference
+              "12.10.1.3 of IEEE Std 802.1Q-2022";
+          }
+          leaf max-vids {
+            type uint16;
+            config false;
+            description
+              "The maximum number of VIDs supported.";
+            reference
+              "12.10.1.3 of IEEE Std 802.1Q-2022";
+          }
+          leaf override-default-pvid {
+            type boolean;
+            default "false";
+            config false;
+            description
+              "Indicates if the default PVID can be overridden, and its
+              egress status (VLAN-tagged or untagged) on each port.";
+            reference
+              "12.10.1.3 of IEEE Std 802.1Q-2022";
+          }
+          leaf protocol-template {
+            if-feature "port-and-protocol-based-vlan";
+            type dot1qtypes:protocol-frame-format-type;
+            config false;
+            description
+              "The data-link encapsulation format or the
+              detagged_frame_type in a Protocol Template";
+            reference
+              "12.10.1.7 of IEEE Std 802.1Q-2022";
+          }
+          leaf max-msti {
+            type uint16;
+            config false;
+            description
+              "The maximum number of MSTIs supported within an MST
+              region (i.e., the number of spanning tree instances that
+              can be supported in addition to the CIST), for MST
+              Bridges. For SST Bridges, this parameter may be either
+              omitted or reported as 0.";
+            reference
+              "12.10.1.7 of IEEE Std 802.1Q-2022";
+          }
+          list vlan {
+            key "vid";
+            description
+              "List of VLAN related configuration nodes associated with
+              the Bridge.";
+            reference
+              "12.10.2 of IEEE Std 802.1Q-2022";
+            leaf vid {
+              type dot1qtypes:vlan-index-type;
+              description
+                "The VLAN identifier to which this entry applies.";
+              reference
+                "12.10.2 of IEEE Std 802.1Q-2022";
+            }
+            leaf name {
+              type dot1qtypes:name-type;
+              description
+                "A text string of up to 32 characters of locally
+                determined significance.";
+              reference
+                "12.10.2 of IEEE Std 802.1Q-2022";
+            }
+            leaf-list untagged-ports {
+              type if:interface-ref;
+              config false;
+              description
+                "The set of ports in the untagged set for this VID.";
+              reference
+                "12.10.2.1.3, 8.8.2 of IEEE Std 802.1Q-2022";
+            }
+            leaf-list egress-ports {
+              type if:interface-ref;
+              config false;
+              description
+                "The set of egress ports in the member set for this VID.";
+              reference
+                "12.10.2.1.3, 8.8.10 of IEEE Std 802.1Q-2022";
+            }
+          }
+          list protocol-group-database {
+            if-feature "port-and-protocol-based-vlan";
+            key "db-index";
+            description
+              "List of the protocol group database entries.";
+            reference
+              "12.10.1.7, 6.12.3 of IEEE Std 802.1Q-2022";
+            leaf db-index {
+              type uint16;
+              description
+                "The protocol group database index.";
+            }
+            leaf frame-format-type {
+              type dot1qtypes:protocol-frame-format-type;
+              description
+                "The data-link encapsulation format or the
+                detagged_frame_type in a Protocol Template";
+              reference
+                "12.10.1.7 of IEEE Std 802.1Q-2022";
+            }
+            choice frame-format {
+              description
+                "The identification of the protocol above the data-link
+                layer in a Protocol Template. Depending on the frame
+                type, the octet string will have one of the following
+                values: - For ethernet, rfc1042 and snap8021H, this is
+                the 16-bit (2-octet) IEEE 802 Clause 9.3 EtherType
+                field. - For snapOther, this is the 40-bit (5-octet)
+                PID. - For llcOther, this is the 2-octet IEEE 802.2 Link
+                Service Access Point (LSAP) pair: first octet for
+                Destination Service Access Point (DSAP) and second octet
+                for Source Service Access Point (SSAP).";
+              reference
+                "12.10.1.7 of IEEE Std 802.1Q-2022";
+              case ethernet-rfc1042-snap8021H {
+                when
+                  "frame-format-type = 'Ethernet' or "+
+                  "frame-format-type = 'rfc1042' or frame-format-type "+
+                  "= 'snap8021H'" {
+                  description
+                    "Applies to Ethernet, RFC 1042, SNAP 8021H frame
+                    formats.";
+                }
+                description
+                  "Identifier used if Ethenet, RFC1042, or SNAP 8021H.";
+                leaf ethertype {
+                  type dot1qtypes:ethertype-type;
+                  description
+                    "Format containing the 16-bit IEEE 802 EtherType
+                    field.";
+                  reference
+                    "9.3 of IEEE Std 802-2014";
+                }
+              }
+              case snap-other {
+                when
+                  "frame-format-type = 'snapOther'" {
+                  description
+                    "Applies to Snap Other frame formats.";
+                }
+                description
+                  "Identifier used if SNAP other.";
+                leaf protocol-id {
+                  type string {
+                    pattern "[0-9a-fA-F]{2}(-[0-9a-fA-F]{2}){4}";
+                  }
+                  description
+                    "Format containing the 40-bit protocol identifier
+                    (PID). The canonical representation uses uppercase
+                    characters.";
+                  reference
+                    "12.10.1.7.1 of IEEE Std 802.1Q-2022";
+                }
+              }
+              case llc-other {
+                when
+                  "frame-format-type = 'llcOther'" {
+                  description
+                    "Applies to LLC Other frame formats";
+                }
+                description
+                  "Identifier used if LLC other.";
+                container dsap-ssap-pairs {
+                  description
+                    "A pair of ISO/IEC 8802-2 DSAP and SSAP address
+                    field values, for matching frame formats of
+                    LLC_Other.";
+                  leaf llc-address {
+                    type string {
+                      pattern "[0-9a-fA-F]{2}-[0-9a-fA-F]{2}";
+                    }
+                    description
+                      "A pair of ISO/IEC 8802-2 DSAP and SSAP address
+                      field values, for matching frame formats of
+                      LLC_Other. The canonical representation uses
+                      uppercase characters.";
+                    reference
+                      "12.10.1.7.1 of IEEE Std 802.1Q-2022";
+                  }
+                }
+              }
+            }
+            leaf group-id {
+              type uint32;
+              description
+                "Designates a group of protocols in the Protocol Group
+                Database.";
+              reference
+                "6.12.2 of IEEE Std 802.1Q-2022";
+            }
+          }
+          list vid-to-fid-allocation {
+            key "vids";
+            description
+              "This list allows inquiries about VID to FID allocations.";
+            leaf vids {
+              type dot1qtypes:vid-range-type;
+              description
+                "Range of VLAN identifiers.";
+              reference
+                "12.10.3 of IEEE Std 802.1Q-2022";
+            }
+            leaf fid {
+              type uint32;
+              config false;
+              description
+                "The Filtering Database used by a set of VIDs.";
+              reference
+                "12.10.3 of IEEE Std 802.1Q-2022";
+            }
+            leaf allocation-type {
+              type enumeration {
+                enum undefined {
+                  description
+                    "No allocation defined.";
+                }
+                enum fixed {
+                  description
+                    "A fixed allocation to FID is defined.";
+                }
+                enum dynamic {
+                  description
+                    "A dynamic allocation to FID is defined.";
+                }
+              }
+              config false;
+              description
+                "The type of allocation used";
+              reference
+                "12.10.3 of IEEE Std 802.1Q-2022";
+            }
+          }
+          list fid-to-vid-allocation {
+            key "fid";
+            description
+              "The FID to VID allocations managed object models
+              operations that inquire about FID to VID allocations.";
+            leaf fid {
+              type uint32;
+              description
+                "The Filtering Database used by a set of VIDs.";
+              reference
+                "12.10.3 of IEEE Std 802.1Q-2022";
+            }
+            leaf allocation-type {
+              type enumeration {
+                enum undefined {
+                  description
+                    "No allocation defined.";
+                }
+                enum fixed {
+                  description
+                    "A fixed allocation to FID is defined.";
+                }
+                enum dynamic {
+                  description
+                    "A dynamic allocation to FID is defined.";
+                }
+              }
+              config false;
+              description
+                "The type of allocation used";
+              reference
+                "12.10.3 of IEEE Std 802.1Q-2022";
+            }
+            leaf-list vid {
+              type dot1qtypes:vlan-index-type;
+              config false;
+              description
+                "The VLAN identifier to which this entry applies.";
+              reference
+                "12.7.7 of IEEE Std 802.1Q-2022";
+            }
+          }
+          list vid-to-fid {
+            key "vid";
+            description
+              "Fixed allocation of a VID to an FID. The underlying
+              system will ensure that subsequent commands that make
+              changes to the VID to FID mapping can override previous
+              associations.";
+            reference
+              "12.10.3.4, 12.10.3.5 of IEEE Std 802.1Q-2022";
+            leaf vid {
+              type dot1qtypes:vlan-index-type;
+              description
+                "A list of VLAN identifier associated with a given
+                database identifier (i.e., FID).";
+              reference
+                "12.7.7 of IEEE Std 802.1Q-2022";
+            }
+            leaf fid {
+              type uint32;
+              description
+                "The Filtering Database used by this VLAN";
+              reference
+                "12.10.3 of IEEE Std 802.1Q-2022";
+            }
+          }
+        }
+        container bridge-mst {
+          when
+            "not(derived-from-or-self(../../bridge-type, "+
+            "'two-port-mac-relay-bridge'))" {
+            description
+              "Applies to non TPMRs.";
+          }
+          description
+            "The Bridge MST container models configuration information
+            that modify, or inquire about, the overall configuration of
+            the Bridges MST resources.";
+          reference
+            "12.12 of IEEE Std 802.1Q-2022";
+          leaf-list mstid {
+            type dot1qtypes:mstid-type;
+            description
+              "The list of MSTID values that are currently supported by
+              the Bridge";
+          }
+          list fid-to-mstid {
+            key "fid";
+            description
+              "The FID to MSTID allocation table.";
+            reference
+              "12.12.2 of IEEE Std 802.1Q-2022";
+            leaf fid {
+              type uint32;
+              description
+                "The Filtering Database identifier.";
+              reference
+                "12.12.2 of IEEE Std 802.1Q-2022";
+            }
+            leaf mstid {
+              type dot1qtypes:mstid-type;
+              description
+                "The MSTID to which the FID is to be allocated.";
+              reference
+                "12.12.2 of IEEE Std 802.1Q-2022";
+            }
+          }
+          list fid-to-mstid-allocation {
+            key "fids";
+            description
+              "The FID to MSTID allocation table";
+            leaf fids {
+              type dot1qtypes:vid-range-type;
+              description
+                "Range of FIDs.";
+              reference
+                "12.12.2 of IEEE Std 802.1Q-2022";
+            }
+            leaf mstid {
+              type dot1qtypes:mstid-type;
+              description
+                "The MSTID to which the FID is allocated.";
+              reference
+                "12.12.2 of IEEE Std 802.1Q-2022";
+            }
+          }
+        }
+      }
+    }
+  }
+  augment "/if:interfaces/if:interface" {
+    when
+      "derived-from-or-self(if:type,'ianaif:bridge') or "+
+      "derived-from-or-self(if:type,'ianaif:ethernetCsmacd') or "+
+      "derived-from-or-self(if:type,'ianaif:ieee8023adLag') or "+
+      "derived-from-or-self(if:type,'ianaif:ilan')" {
+      description
+        "Applies when a Bridge interface.";
+    }
+    description
+      "Augment the interface model with the Bridge Port";
+    container bridge-port {
+      description
+        "Bridge Port is an extension of the IETF Interfaces model
+        (RFC7223).";
+      leaf bridge-name {
+        type leafref {
+          path "/dot1q:bridges/dot1q:bridge/dot1q:name";
+        }
+        // mandatory true; yang 1.1 only
+        description
+          "Used to reference configured Bridge node.";
+      }  
+      leaf component-name {
+        type leafref {
+          path "/dot1q:bridges/dot1q:bridge[dot1q:name=current()/../bridge-name]/dot1q:component/dot1q:name";
+        }
+        // mandatory true; yang 1.1 only
+        description
+          "Used to reference configured Component node.";
+      }
+      leaf port-type {
+        type identityref {
+          base type-of-port;
+        }
+        description
+          "The port type. Indicates the capabilities of this port.";
+        reference
+          "12.4.2.1 of IEEE Std 802.1Q-2022";
+      }
+      leaf pvid {
+        when "/dot1q:bridges/dot1q:bridge[dot1q:name=current()"+
+          "/../dot1q:bridge-name]/dot1q:component[name=current()"+
+          "/../dot1q:component-name]/dot1q:type != 'dot1q:d-bridge-component'" {  
+          description
+            "Applies to non TPMRs";
+        }
+        type dot1qtypes:vlan-index-type;
+        default "1";
+        description
+          "The primary (default) VID assigned to a specific Bridge Port.";
+        reference
+          "12.10.1, 5.4, item m) of IEEE Std 802.1Q-2022";
+      }
+      leaf default-priority {
+        type dot1qtypes:priority-type;
+        default "0";
+        description
+          "The default priority assigned to a specific Bridge Port.";
+        reference
+          "12.6.2 of IEEE Std 802.1Q-2022";
+      }
+      container priority-regeneration {
+        description
+          "The Priority Regeneration Table parameters associated with a
+          specific Bridge Port. A list of Regenerated User Priorities
+          for each received priority on each port of a Bridge. The
+          regenerated priority value may be used to index the Traffic
+          Class Table for each input port. This only has effect on media
+          that support native priority. The default values for
+          Regenerated User Priorities are the same as the User
+          Priorities";
+        reference
+          "12.6.2, 6.9.4 of IEEE Std 802.1Q-2022";
+        uses dot1qtypes:priority-regeneration-table-grouping;
+      }
+      leaf pcp-selection {
+        type dot1qtypes:pcp-selection-type;
+        default "8P0D";
+        description
+          "The Priority Code Point selection assigned to a specific
+          Bridge Port. This object identifies the rows in the PCP
+          encoding and decoding tables that are used to remark frames on
+          this port if this remarking is enabled";
+        reference
+          "12.6.2, 6.9.3 of IEEE Std 802.1Q-2022";
+      }
+      container pcp-decoding-table {
+        description
+          "The Priority Code Point Decoding Table parameters associated
+          with a specific Bridge Port.";
+        uses dot1qtypes:pcp-decoding-table-grouping;
+      }
+      container pcp-encoding-table {
+        description
+          "The Priority Code Point Encoding Table parameters associated
+          with a specific Bridge Port.";
+        uses dot1qtypes:pcp-encoding-table-grouping;
+      }
+      leaf use-dei {
+        type boolean;
+        default "false";
+        description
+          "The Drop Eligible Indicator. If it is set to True, then the
+          drop_eligible parameter is encoded in the DEI of transmitted
+          frames, and the drop_eligible parameter shall be true(1) for a
+          received frame if the DEI is set in the VLAN tag or the
+          Priority Code Point Decoding Table indicates drop_eligible
+          True for the received PCP value. If this parameter is False,
+          the DEI shall be transmitted as zero and ignored on receipt.";
+        reference
+          "12.6.2, 6.9.3 of IEEE Std 802.1Q-2022";
+      }
+      leaf drop-encoding {
+        type boolean;
+        default "false";
+        description
+          "The Drop Encoding parameter. If a Bridge supports encoding or
+          decoding of drop_eligible from the PCP field of a VLAN tag
+          (6.7.3) on any of its Ports, then it shall implement a Boolean
+          parameter Require Drop Encoding on each of its Ports with
+          default value False. If Require Drop Encoding is True and the
+          Bridge Port cannot encode particular priorities with
+          drop_eligible, then frames queued with those priorities and
+          drop_eligible True shall be discarded and not transmitted.";
+        reference
+          "12.6.2, 6.9.3 of IEEE Std 802.1Q-2022";
+      }
+      leaf service-access-priority-selection {
+        type boolean;
+        default "false";
+        description
+          "The Service Access Priority selection. Indication of whether
+          the Service Access Priority Selection function is supported on
+          the Customer Bridge Port to request priority handling of the
+          frame from a Port-based service interface.";
+        reference
+          "12.6.2, 6.13 of IEEE Std 802.1Q-2022";
+      }
+      container service-access-priority {
+        description
+          "The Service Access Priority table parameters. A table that
+          contains information about the Service Access Priority
+          Selection function for a Provider Bridge. The use of this
+          table enables a mechanism for a Customer Bridge attached to a
+          Provider Bridged Network to request priority handling of
+          frames.";
+        reference
+          "12.6.2, 6.13.1 of IEEE Std 802.1Q-2022";
+        uses dot1qtypes:service-access-priority-table-grouping;
+      }
+      container traffic-class {
+        description
+          "The Traffic Class table parameters. A table mapping evaluated
+          priority to Traffic Class, for forwarding by the Bridge";
+        reference
+          "12.6.3, 8.6.6 of IEEE Std 802.1Q-2022";
+        uses dot1qtypes:traffic-class-table-grouping;
+      }
+      container transmission-selection-algorithm-table {
+        description
+          "The Transmission Selection Algorithm Table for a given Port
+          assigns, for each traffic class that the Port supports, the
+          transmission selection algorithm that is to be used to select
+          frames for transmission from the corresponding queue.
+          Transmission Selection Algorithm Tables may be managed, and
+          allow the identification of vendor-specific transmission
+          selection algorithms. The transmission selection algorithms
+          are identified in the Transmission Selection Algorithm Table
+          by means of integer identifiers.";
+        reference
+          "12.20.2, 8.6.8 of IEEE Std 802.1Q-2022";
+        uses dot1qtypes:transmission-selection-table-grouping;
+      }
+      leaf acceptable-frame {
+        when "/dot1q:bridges/dot1q:bridge[dot1q:name=current()"+
+          "/../dot1q:bridge-name]/dot1q:component[name=current()"+
+          "/../dot1q:component-name]/dot1q:type != 'dot1q:d-bridge-component'" {  
+          description
+            "Applies to non TPMRs";
+        }
+        type enumeration {
+          enum admit-only-VLAN-tagged-frames {
+            description
+              "Admit only VLAN-tagged frames.";
+          }
+          enum admit-only-untagged-and-priority-tagged {
+            description
+              "Admit only untagged and priority-tagged frames.";
+          }
+          enum admit-all-frames {
+            description
+              "Admit all frames.";
+          }
+        }
+        default "admit-all-frames";
+        description
+          "To configure the Acceptable Frame Types parameter associated
+          with one or more Ports";
+        reference
+          "12.10.1.3, 6.9 of IEEE Std 802.1Q-2022";
+      }
+      leaf enable-ingress-filtering {
+        when "/dot1q:bridges/dot1q:bridge[dot1q:name=current()"+
+          "/../dot1q:bridge-name]/dot1q:component[name=current()"+
+          "/../dot1q:component-name]/dot1q:type != 'dot1q:d-bridge-component'" {  
+          description
+            "Applies to non TPMRs";
+        }
+        type boolean;
+        default "false";
+        description
+          "To enable the Ingress Filtering feature associated with one
+          or more Ports.";
+        reference
+          "12.10.1.4, 8.6.2 of IEEE Std 802.1Q-2022";
+      }
+      leaf enable-restricted-vlan-registration {
+        when "/dot1q:bridges/dot1q:bridge[dot1q:name=current()"+
+          "/../dot1q:bridge-name]/dot1q:component[name=current()"+
+          "/../dot1q:component-name]/dot1q:type != 'dot1q:d-bridge-component'" {  
+          description
+            "Applies to non TPMRs";
+        }
+        type boolean;
+        default "false";
+        description
+          "To enable the Restricted VLAN Registration associated with
+          one or more Ports.";
+        reference
+          "11.2.3.2.3, 12.10.1.6 of IEEE Std 802.1Q-2022";
+      }
+      leaf enable-vid-translation-table {
+        when "/dot1q:bridges/dot1q:bridge[dot1q:name=current()"+
+          "/../dot1q:bridge-name]/dot1q:component[name=current()"+
+          "/../dot1q:component-name]/dot1q:type != 'dot1q:d-bridge-component'" {  
+          description
+            "Applies to non TPMRs";
+        }
+        type boolean;
+        default "false";
+        description
+          "To enable VID Translation table associated with a Bridge
+          Port. This is not applicable to Bridge Ports that do no
+          support a VID Translation Table.";
+        reference
+          "12.10.1.8, 6.9 of IEEE Std 802.1Q-2022";
+      }
+      leaf enable-egress-vid-translation-table {
+        when "/dot1q:bridges/dot1q:bridge[dot1q:name=current()"+
+          "/../dot1q:bridge-name]/dot1q:component[name=current()"+
+          "/../dot1q:component-name]/dot1q:type != 'dot1q:d-bridge-component'" {  
+          description
+            "Applies to non TPMRs";
+        }
+        type boolean;
+        default "false";
+        description
+          "To enable Egress VID Translation table associated with a
+          Bridge Port. This is not applicable to Ports that do not
+          support an Egress VID Translation table.";
+        reference
+          "12.10.1.8, 6.9 of IEEE Std 802.1Q-2022";
+      }
+      list protocol-group-vid-set {
+        when "/dot1q:bridges/dot1q:bridge[dot1q:name=current()"+
+          "/../dot1q:bridge-name]/dot1q:component[name=current()"+
+          "/../dot1q:component-name]/dot1q:type != 'dot1q:d-bridge-component'" {  
+          description
+            "Applies to non TPMRs";
+        }
+        if-feature "port-and-protocol-based-vlan";
+        key "group-id";
+        description
+          "The list of VID values associated with the Protocol Group
+          Identifier for this port.";
+        reference
+          "12.10.1.1.3 of IEEE Std 802.1Q-2022";
+        leaf group-id {
+          type uint32;
+          description
+            "The protocol group identifier";
+          reference
+            "12.10.1.7 of IEEE Std 802.1Q-2022";
+        }
+        leaf-list vid {
+          type dot1qtypes:vlanid;
+          description
+            "The VLAN identifier to which this entry applies.";
+          reference
+            "12.10.2 of IEEE Std 802.1Q-2022";
+        }
+      }
+      leaf admin-point-to-point {
+        type enumeration {
+          enum force-true {
+            value 1;
+            description
+              "Indicates that this port should always be treated as if
+              it is connected to a point-to-point link.";
+          }
+          enum force-false {
+            value 2;
+            description
+              "Indicates that this port should be treated as having a
+              shared media connection.";
+          }
+          enum auto {
+            value 3;
+            description
+              "Indicates that this port is considered to have a
+              point-to-point link if it is an Aggregator and all of its
+              members are aggregatable, or if the MAC entity is
+              configured for full duplex operation, either through
+              auto-negotiation or by management means.";
+          }
+        }
+        description
+          "For a port running spanning tree, this object represents the
+          administrative point-to-point status of the LAN segment
+          attached to this port, using the enumeration values of IEEE
+          Std 802.1AC. A value of forceTrue(1) indicates that this port
+          should always be treated as if it is connected to a
+          point-to-point link. A value of forceFalse(2) indicates that
+          this port should be treated as having a shared media
+          connection. A value of auto(3) indicates that this port is
+          considered to have a point-to-point link if it is an
+          Aggregator and all of its members are aggregatable, or if the
+          MAC entity is configured for full duplex operation, either
+          through auto-negotiation or by management means. Manipulating
+          this object changes the underlying adminPointToPointMAC.";
+        reference
+          "12.4.2, 6.8.2 of IEEE Std 802.1Q-2022";
+      }
+      leaf protocol-based-vlan-classification {
+        when "/dot1q:bridges/dot1q:bridge[dot1q:name=current()"+
+          "/../dot1q:bridge-name]/dot1q:component[name=current()"+
+          "/../dot1q:component-name]/dot1q:type != 'dot1q:d-bridge-component'" {  
+          description
+            "Applies to non TPMRs";
+        }
+        if-feature "port-and-protocol-based-vlan";
+        type boolean;
+        config false;
+        description
+          "A boolean indication indicating if Port-and-Protocol-based
+          VLAN classification is supported on a given Port.";
+        reference
+          "5.4.1.2 of IEEE Std 802.1Q-2022";
+      }
+      leaf max-vid-set-entries {
+        when "/dot1q:bridges/dot1q:bridge[dot1q:name=current()"+
+          "/../dot1q:bridge-name]/dot1q:component[name=current()"+
+          "/../dot1q:component-name]/dot1q:type != 'dot1q:d-bridge-component'" {  
+          description
+            "Applies to non TPMRs";
+        }
+        if-feature "port-and-protocol-based-vlan";
+        type uint16;
+        config false;
+        description
+          "The maximum number of entries supported in the VID set on a
+          given Port.";
+        reference
+          "12.10.1.1.3 of IEEE Std 802.1Q-2022";
+      }
+      leaf port-number {
+        type dot1qtypes:port-number-type;
+        config false;
+        description
+          "An integer that uniquely identifies a Bridge Port.";
+        reference
+          "Item i) in 12.3, 17.3.2.2 of IEEE Std 802.1Q-2022";
+      }
+      leaf address {
+        type ieee:mac-address;
+        config false;
+        description
+          "The specific MAC address of the individual MAC Entity
+          associated with the Port.";
+        reference
+          "12.4.2, Item a) in 12.4.2.1.1.3 of IEEE Std 802.1Q-2022";
+      }
+      leaf capabilities {
+        type bits {
+          bit tagging {
+            position 0;
+            description
+              "Supports 802.1Q VLAN tagging of frames and MVRP.";
+          }
+          bit configurable-acceptable-frame-type {
+            position 1;
+            description
+              "Allows modified values of acceptable frame types";
+          }
+          bit ingress-filtering {
+            position 2;
+            description
+              "Supports the discarding of any frame received on a Port
+              whose VLAN classification does not include that Port in
+              its member set.";
+          }
+        }
+        config false;
+        description
+          "The feature capabilities associated with port. Indicates the
+          parts of IEEE 802.1Q that are optional on a per-port basis,
+          that are implemented by this device, and that are manageable.";
+        reference
+          "Item c) in 12.10.1.1.3, 12.4.2 of IEEE Std 802.1Q-2022";
+      }
+      leaf type-capabilties {
+        type bits {
+          bit customer-vlan-port {
+            position 0;
+            description
+              "Indicates the port can be a C-TAG aware port of an
+              enterprise VLAN aware Bridge";
+          }
+          bit provider-network-port {
+            position 1;
+            description
+              "Indicates the port can be an S-TAG aware port of a
+              Provider Bridge or Backbone Edge Bridge used for
+              connections within a PBN or PBBN.";
+          }
+          bit customer-network-port {
+            position 2;
+            description
+              "Indicates the port can be an S-TAG aware port of a
+              Provider Bridge or Backbone Edge Bridge used for
+              connections to the exterior of a PBN or PBBN.";
+          }
+          bit customer-edge-port {
+            position 3;
+            description
+              "Indicates the port can be a C-TAG aware port of a
+              Provider Bridge used for connections to the exterior of a
+              PBN or PBBN.";
+          }
+          bit customer-backbone-port {
+            position 4;
+            description
+              "Indicates the port can be a I-TAG aware port of a
+              Backbone Edge Bridge's B-component.";
+          }
+          bit virtual-instance-port {
+            position 5;
+            description
+              "Indicates the port can be a virtual S-TAG aware port
+              within a Backbone Edge Bridge's I-component which is
+              responsible for handling S-tagged traffic for a specific
+              backbone service instance.";
+          }
+          bit d-bridge-port {
+            position 6;
+            description
+              "Indicates the port can be a VLAN-unaware member of an
+              802.1Q Bridge.";
+          }
+          bit remote-customer-access-port {
+            position 7;
+            description
+              "Indicates the port can be an S-TAG aware port of a
+              Provider Bridge capable of providing Remote Customer
+              Service Interfaces.";
+          }
+          bit station-facing-bridge-port {
+            position 8;
+            description
+              "Indicates the station-facing Bridge Port in a EVB Bridge.";
+          }
+          bit uplink-access-port {
+            position 9;
+            description
+              "Indicates the uplink access port in an EVB Bridge or EVB
+              station.";
+          }
+          bit uplink-relay-port {
+            position 10;
+            description
+              "Indicates the uplink relay port in an EVB station.";
+          }
+        }
+        config false;
+        description
+          "The type of feature capabilities supported with port.
+          Indicates the capabilities of this port.";
+        reference
+          "12.4.2 of IEEE Std 802.1Q-2022";
+      }
+      leaf external {
+        type boolean;
+        config false;
+        description
+          "A boolean indicating whether the port is external. A value of
+          True means the port is external. A value of False means the
+          port is internal.";
+        reference
+          "12.4.2 of IEEE Std 802.1Q-2022";
+      }
+      leaf oper-point-to-point {
+        type boolean;
+        config false;
+        description
+          "For a port running spanning tree, this object represents the
+          operational point-to-point status of the LAN segment attached
+          to this port. It indicates whether a port is considered to
+          have a point-to-point connection.
+          
+          If admin-point-to-point is set to auto(2), then the value of
+          oper-point-to-point is determined in accordance with the
+          specific procedures defined for the MAC entity concerned, as
+          defined in IEEE Std 802.1AC.
+          
+          The value is determined dynamically; that is, it is
+          re-evaluated whenever the value of admin-point-to-point
+          changes, and whenever the specific procedures defined for the
+          MAC entity evaluate a change in its point-to-point status.";
+        reference
+          "IEEE Std 802.1AC;" +
+          "12.4.2 of IEEE Std 802.1Q-2022";
+      }
+      leaf media-dependent-overhead {
+        type uint8;
+        units "octets";
+        config false;
+        description
+          "The portMediaDependentOverhead parameter provides the number
+          of additional octets for media-dependent framing. The overhead
+          includes all octets prior the first octet of the Destination
+          Address field and all octets after the last octet of the frame
+          check sequence.";
+        reference
+          "12.4.2 of IEEE Std 802.1Q-2022";
+      }
+      container statistics {
+        config false;
+        description
+          "Container of operational state node information associated
+          with the bridge port.";
+        uses dot1qtypes:bridge-port-statistics-grouping;
+        leaf discard-on-ingress-filtering {
+          when "/dot1q:bridges/dot1q:bridge[dot1q:name=current()"+
+            "/../../dot1q:bridge-name]/dot1q:component[name=current()"+
+            "/../../dot1q:component-name]/dot1q:type != 'dot1q:d-bridge-component'" {  
+            description
+              "Applies to non TPMRs";
+          }
+          if-feature "ingress-filtering";
+          type yang:counter64;
+          description
+            "The number of frames that were discarded as a result of
+            Ingress Filtering being enabled.
+            
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of 'discontinuity-time'.";
+          reference
+            "12.6.1.1.3 of IEEE Std 802.1Q-2022";
+        }
+      }
+      list vid-translations {
+        when "/dot1q:bridges/dot1q:bridge[dot1q:name=current()"+
+          "/../dot1q:bridge-name]/dot1q:component[name=current()"+
+          "/../dot1q:component-name]/dot1q:type != 'dot1q:d-bridge-component'" {  
+          description
+            "Applies to non TPMRs";
+        }
+        key "local-vid";
+        description
+          "To configure the VID Translation Table (6.9) associated with
+          a Port. This object is not applicable to Ports that do not
+          support a VID Translation Table. The default configuration of
+          the table has the value of the Relay VID equal to the value of
+          the Local VID. If no local VID is configured, then it is
+          assumed that the relay VID is the same value as the local VID.
+          
+          If the port supports an Egress VID translation table, the VID
+          Translation Configuration object configures the Local VID to
+          Relay VID mapping on ingress only. If an Egress VID
+          translation is not supported, the VID Translation
+          Configuration object defines a single bidirectional mapping.
+          In this case, the Bridge should not allow multiple keys
+          ('local-vid') mapped to the same 'relay-vid' value.";
+        leaf local-vid {
+          type dot1qtypes:vlanid;
+          description
+            "The Local VID after translation received at the ISS or
+            EISS.";
+          reference
+            "12.10.1.8, 6.9 of IEEE Std 802.1Q-2022";
+        }
+        leaf relay-vid {
+          type dot1qtypes:vlanid;
+          description
+            "The Relay VID received before translation received at ISS
+            or EISS.";
+          reference
+            "12.10.1.8, 6.9 of IEEE Std 802.1Q-2022";
+        }
+      }
+      list egress-vid-translations {
+        when "/dot1q:bridges/dot1q:bridge[dot1q:name=current()"+
+          "/../dot1q:bridge-name]/dot1q:component[name=current()"+
+          "/../dot1q:component-name]/dot1q:type != 'dot1q:d-bridge-component'" {  
+          description
+            "Applies to non TPMRs";
+        }
+        key "relay-vid";
+        description
+          "To configure the Egress VID Translation Table (6.9)
+          associated with a Port. This object is not applicable to Ports
+          that do not support an Egress VID Translation Table. The
+          default configuration of the table has the value of the Local
+          VID equal to the value of the Relay VID. If no Relay VID is
+          configured, then it is assumed that the local VID is the same
+          value as the relay VID.";
+        leaf relay-vid {
+          type dot1qtypes:vlanid;
+          description
+            "The Relay VID received before translation received at ISS
+            or EISS.";
+          reference
+            "12.10.1.9, 6.9 of IEEE Std 802.1Q-2022";
+        }
+        leaf local-vid {
+          type dot1qtypes:vlanid;
+          description
+            "The Local VID after translation received at the ISS or
+            EISS.";
+          reference
+            "12.10.1.9, 6.9 of IEEE Std 802.1Q-2022";
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/mwt/ieee802-dot1q-bridge.yang-generated.tdltx b/plugins/org.etsi.mts.tdl.yang2json/samples/mwt/ieee802-dot1q-bridge.yang-generated.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..8e80b62f95a5bf5cd4d667e9e235711237aeb236
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/mwt/ieee802-dot1q-bridge.yang-generated.tdltx
@@ -0,0 +1,467 @@
+Package generated_from_ieee802_dot1q_bridge_yang {
+    Type String
+    Type TODO_RESOLVE_REFERENCED
+    Use "ieee802-dot1q-bridge.yang" as SOURCE_MAPPING
+    Structure bridge (
+        name_type ^name,
+        mac_address address,
+        identityref bridge_type,
+        uint16 ports,
+        up_time up_time,
+        uint32 components,
+        bridge___component_collection ^component
+    )
+    Type name_type extends string
+    Type string extends string
+    Type mac_address extends string
+    Type identityref
+    Type uint16 extends uint16
+    Type up_time extends zero_based_counter32
+    Type zero_based_counter32
+    Type uint32
+    Structure bridge___component (
+        string ^name,
+        uint32 id,
+        identityref ^type,
+        mac_address address,
+        traffic_class_enabled traffic_class_enabled,
+        uint16 ports,
+        @LeafRefPath : "/if:interfaces/if:interface/if:name"
+        interface_ref_collection bridge_port,
+        component___capabilities capabilities,
+        component___filtering_database filtering_database,
+        component___permanent_database permanent_database,
+        component___bridge_vlan bridge_vlan,
+        component___bridge_mst bridge_mst
+    )
+    Type traffic_class_enabled extends boolean
+    Type boolean
+    Type interface_ref extends leafref
+    Type leafref
+    Collection interface_ref_collection of interface_ref
+    Annotation LeafRefPath
+    Structure component___capabilities (
+        extended_filtering extended_filtering,
+        traffic_classes traffic_classes,
+        static_entry_individual_port static_entry_individual_port,
+        ivl_capable ivl_capable,
+        svl_capable svl_capable,
+        hybrid_capable hybrid_capable,
+        configurable_pvid_tagging configurable_pvid_tagging,
+        local_vlan_capable local_vlan_capable
+    )
+    Type extended_filtering extends boolean
+    Type traffic_classes extends boolean
+    Type static_entry_individual_port extends boolean
+    Type ivl_capable extends boolean
+    Type svl_capable extends boolean
+    Type hybrid_capable extends boolean
+    Type configurable_pvid_tagging extends boolean
+    Type local_vlan_capable extends boolean
+    Structure component___filtering_database (
+        aging_time aging_time,
+        gauge32 ^size,
+        gauge32 static_entries,
+        gauge32 dynamic_entries,
+        gauge32 static_vlan_registration_entries,
+        gauge32 dynamic_vlan_registration_entries,
+        gauge32 mac_address_registration_entries,
+        filtering_database___filtering_entry_collection filtering_entry,
+        filtering_database___vlan_registration_entry_collection vlan_registration_entry
+    )
+    Type aging_time extends uint32
+    Type gauge32 extends uint32
+    Structure filtering_database___filtering_entry (
+        uint32 database_id,
+        mac_address address,
+        vid_range_type vids,
+        enumeration entry_type,
+        filtering_entry___port_map_collection port_map,
+        enumeration status
+    )
+    Type vid_range_type extends string
+    Type enumeration
+    Structure filtering_entry___port_map (
+        port_number_type port_ref,
+        port_map___map_type map_type
+    )
+    Type port_number_type extends uint32
+    Structure port_map___map_type (
+        map_type___static_filtering_entries static_filtering_entries,
+        map_type___static_vlan_registration_entries static_vlan_registration_entries,
+        map_type___mac_address_registration_entries mac_address_registration_entries,
+        map_type___dynamic_vlan_registration_entries dynamic_vlan_registration_entries,
+        map_type___dynamic_reservation_entries dynamic_reservation_entries,
+        map_type___dynamic_filtering_entries dynamic_filtering_entries
+    )
+    Structure map_type___static_filtering_entries (
+        static_filtering_entries___static_filtering_entries static_filtering_entries
+    )
+    Structure static_filtering_entries___static_filtering_entries (
+        enumeration control_element,
+        port_number_type connection_identifier
+    )
+    Structure map_type___static_vlan_registration_entries (
+        static_vlan_registration_entries___static_vlan_registration_entries static_vlan_registration_entries
+    )
+    Structure static_vlan_registration_entries___static_vlan_registration_entries (
+        enumeration registrar_admin_control,
+        enumeration vlan_transmitted
+    )
+    Structure map_type___mac_address_registration_entries (
+        mac_address_registration_entries___mac_address_registration_entries mac_address_registration_entries
+    )
+    Structure mac_address_registration_entries___mac_address_registration_entries (
+        enumeration control_element
+    )
+    Structure map_type___dynamic_vlan_registration_entries (
+        dynamic_vlan_registration_entries___dynamic_vlan_registration_entries dynamic_vlan_registration_entries
+    )
+    Structure dynamic_vlan_registration_entries___dynamic_vlan_registration_entries (
+        enumeration control_element
+    )
+    Structure map_type___dynamic_reservation_entries (
+        dynamic_reservation_entries___dynamic_reservation_entries dynamic_reservation_entries
+    )
+    Structure dynamic_reservation_entries___dynamic_reservation_entries (
+        enumeration control_element
+    )
+    Structure map_type___dynamic_filtering_entries (
+        dynamic_filtering_entries___dynamic_filtering_entries dynamic_filtering_entries
+    )
+    Structure dynamic_filtering_entries___dynamic_filtering_entries (
+        enumeration control_element
+    )
+    Collection filtering_entry___port_map_collection of filtering_entry___port_map
+    Collection filtering_database___filtering_entry_collection of filtering_database___filtering_entry
+    Structure filtering_database___vlan_registration_entry (
+        uint32 database_id,
+        vid_range_type vids,
+        enumeration entry_type,
+        vlan_registration_entry___port_map_collection port_map
+    )
+    Structure vlan_registration_entry___port_map (
+        port_number_type port_ref,
+        port_map___map_type map_type
+    )
+    Collection vlan_registration_entry___port_map_collection of vlan_registration_entry___port_map
+    Collection filtering_database___vlan_registration_entry_collection of filtering_database___vlan_registration_entry
+    Structure component___permanent_database (
+        gauge32 ^size,
+        gauge32 static_entries,
+        gauge32 static_vlan_registration_entries,
+        permanent_database___filtering_entry_collection filtering_entry
+    )
+    Structure permanent_database___filtering_entry (
+        uint32 database_id,
+        mac_address address,
+        vid_range_type vids,
+        enumeration status,
+        filtering_entry___port_map_collection port_map
+    )
+    Collection permanent_database___filtering_entry_collection of permanent_database___filtering_entry
+    Structure component___bridge_vlan (
+        uint16 version,
+        uint16 max_vids,
+        override_default_pvid override_default_pvid,
+        protocol_frame_format_type protocol_template,
+        uint16 max_msti,
+        bridge_vlan___vlan_collection vlan,
+        bridge_vlan___protocol_group_database_collection protocol_group_database,
+        bridge_vlan___vid_to_fid_allocation_collection vid_to_fid_allocation,
+        bridge_vlan___fid_to_vid_allocation_collection fid_to_vid_allocation,
+        bridge_vlan___vid_to_fid_collection vid_to_fid
+    )
+    Type override_default_pvid extends boolean
+    Enumerated protocol_frame_format_type {
+        protocol_frame_format_type Ethernet,
+        protocol_frame_format_type rfc1042,
+        protocol_frame_format_type snap8021H,
+        protocol_frame_format_type snapOther,
+        protocol_frame_format_type llcOther,
+        protocol_frame_format_type Ethernet,
+        protocol_frame_format_type rfc1042,
+        protocol_frame_format_type snap8021H,
+        protocol_frame_format_type snapOther,
+        protocol_frame_format_type llcOther
+    }
+    Structure bridge_vlan___vlan (
+        vlan_index_type vid,
+        name_type ^name,
+        @LeafRefPath : "/if:interfaces/if:interface/if:name"
+        interface_ref_collection untagged_ports,
+        @LeafRefPath : "/if:interfaces/if:interface/if:name"
+        interface_ref_collection egress_ports
+    )
+    Type vlan_index_type extends uint32
+    Collection bridge_vlan___vlan_collection of bridge_vlan___vlan
+    Structure bridge_vlan___protocol_group_database (
+        uint16 db_index,
+        protocol_frame_format_type frame_format_type,
+        protocol_group_database___frame_format frame_format,
+        uint32 group_id
+    )
+    Structure protocol_group_database___frame_format (
+        frame_format___ethernet_rfc1042_snap8021H ethernet_rfc1042_snap8021H,
+        frame_format___snap_other snap_other,
+        frame_format___llc_other llc_other
+    )
+    Structure frame_format___ethernet_rfc1042_snap8021H (
+        ethertype_type ethertype
+    )
+    Type ethertype_type extends string
+    Structure frame_format___snap_other (
+        string protocol_id
+    )
+    Structure frame_format___llc_other (
+        llc_other___dsap_ssap_pairs dsap_ssap_pairs
+    )
+    Structure llc_other___dsap_ssap_pairs (
+        string llc_address
+    )
+    Collection bridge_vlan___protocol_group_database_collection of bridge_vlan___protocol_group_database
+    Structure bridge_vlan___vid_to_fid_allocation (
+        vid_range_type vids,
+        uint32 fid,
+        enumeration allocation_type
+    )
+    Collection bridge_vlan___vid_to_fid_allocation_collection of bridge_vlan___vid_to_fid_allocation
+    Structure bridge_vlan___fid_to_vid_allocation (
+        uint32 fid,
+        enumeration allocation_type,
+        vlan_index_type_collection vid
+    )
+    Collection vlan_index_type_collection of vlan_index_type
+    Collection bridge_vlan___fid_to_vid_allocation_collection of bridge_vlan___fid_to_vid_allocation
+    Structure bridge_vlan___vid_to_fid (
+        vlan_index_type vid,
+        uint32 fid
+    )
+    Collection bridge_vlan___vid_to_fid_collection of bridge_vlan___vid_to_fid
+    Structure component___bridge_mst (
+        mstid_type_collection mstid,
+        bridge_mst___fid_to_mstid_collection fid_to_mstid,
+        bridge_mst___fid_to_mstid_allocation_collection fid_to_mstid_allocation
+    )
+    Type mstid_type extends uint32
+    Collection mstid_type_collection of mstid_type
+    Structure bridge_mst___fid_to_mstid (
+        uint32 fid,
+        mstid_type mstid
+    )
+    Collection bridge_mst___fid_to_mstid_collection of bridge_mst___fid_to_mstid
+    Structure bridge_mst___fid_to_mstid_allocation (
+        vid_range_type fids,
+        mstid_type mstid
+    )
+    Collection bridge_mst___fid_to_mstid_allocation_collection of bridge_mst___fid_to_mstid_allocation
+    Collection bridge___component_collection of bridge___component
+    Collection bridge_collection of bridge
+    Structure interface (
+        string ^name,
+        string description,
+        identityref ^type,
+        enabled enabled,
+        enumeration link_up_down_trap_enable,
+        enumeration admin_status,
+        enumeration oper_status,
+        date_and_time last_change,
+        int32 if_index,
+        phys_address phys_address,
+        @LeafRefPath : "/if:interfaces-state/if:interface/if:name"
+        interface_state_ref_collection higher_layer_if,
+        @LeafRefPath : "/if:interfaces-state/if:interface/if:name"
+        interface_state_ref_collection lower_layer_if,
+        speed speed,
+        interface___statistics statistics,
+        interface___bridge_port bridge_port
+    )
+    Type enabled extends boolean
+    Type date_and_time extends string
+    Type int32 extends int32
+    Type phys_address extends string
+    Type speed extends gauge64
+    Type gauge64
+    Structure interface___statistics (
+        date_and_time discontinuity_time,
+        counter64 in_octets,
+        counter64 in_unicast_pkts,
+        counter64 in_broadcast_pkts,
+        counter64 in_multicast_pkts,
+        counter32 in_discards,
+        counter32 in_errors,
+        counter32 in_unknown_protos,
+        counter64 out_octets,
+        counter64 out_unicast_pkts,
+        counter64 out_broadcast_pkts,
+        counter64 out_multicast_pkts,
+        counter32 out_discards,
+        counter32 out_errors
+    )
+    Type counter64 extends uint64
+    Type uint64
+    Type counter32 extends uint32
+    Structure interface___bridge_port (
+        @LeafRefPath : "/dot1q:bridges/dot1q:bridge/dot1q:name"
+        leafref bridge_name,
+        @LeafRefPath : "/dot1q:bridges/dot1q:bridge[dot1q:name=current()/../bridge-name]/dot1q:component/dot1q:name"
+        leafref component_name,
+        identityref port_type,
+        pvid pvid,
+        default_priority default_priority,
+        bridge_port___priority_regeneration priority_regeneration,
+        pcp_selection pcp_selection,
+        bridge_port___pcp_decoding_map_collection pcp_decoding_table,
+        bridge_port___pcp_encoding_map_collection pcp_encoding_table,
+        use_dei use_dei,
+        drop_encoding drop_encoding,
+        service_access_priority_selection service_access_priority_selection,
+        bridge_port___service_access_priority service_access_priority,
+        bridge_port___traffic_class_map_collection traffic_class,
+        bridge_port___transmission_selection_algorithm_map_collection transmission_selection_algorithm_table,
+        acceptable_frame acceptable_frame,
+        enable_ingress_filtering enable_ingress_filtering,
+        enable_restricted_vlan_registration enable_restricted_vlan_registration,
+        enable_vid_translation_table enable_vid_translation_table,
+        enable_egress_vid_translation_table enable_egress_vid_translation_table,
+        bridge_port___protocol_group_vid_set_collection protocol_group_vid_set,
+        enumeration admin_point_to_point,
+        boolean protocol_based_vlan_classification,
+        uint16 max_vid_set_entries,
+        port_number_type port_number,
+        mac_address address,
+        bits capabilities,
+        bits type_capabilties,
+        boolean external,
+        boolean oper_point_to_point,
+        media_dependent_overhead media_dependent_overhead,
+        bridge_port___statistics statistics,
+        bridge_port___vid_translations_collection vid_translations,
+        bridge_port___egress_vid_translations_collection egress_vid_translations
+    )
+    Type pvid extends vlan_index_type
+    Type default_priority extends priority_type
+    Type priority_type
+    Structure bridge_port___priority_regeneration (
+        priority0 priority0,
+        priority1 priority1,
+        priority2 priority2,
+        priority3 priority3,
+        priority4 priority4,
+        priority5 priority5,
+        priority6 priority6,
+        priority7 priority7
+    )
+    Type priority0
+    Type priority1
+    Type priority2
+    Type priority3
+    Type priority4
+    Type priority5
+    Type priority6
+    Type priority7
+    Enumerated pcp_selection {
+        pcp_selection _1P0D,
+        pcp_selection _1P1D,
+        pcp_selection _1P2D,
+        pcp_selection _1P3D
+    }
+    Structure bridge_port___pcp_decoding_map (
+        pcp_selection_type pcp,
+        pcp_decoding_map___priority_map_collection priority_map
+    )
+    Type pcp_selection_type
+    Structure pcp_decoding_map___priority_map (
+        priority_type priority_code_point,
+        priority_type priority,
+        boolean drop_eligible
+    )
+    Collection pcp_decoding_map___priority_map_collection of pcp_decoding_map___priority_map
+    Collection bridge_port___pcp_decoding_map_collection of bridge_port___pcp_decoding_map
+    Structure bridge_port___pcp_encoding_map (
+        pcp_selection_type pcp,
+        pcp_encoding_map___priority_map_collection priority_map
+    )
+    Structure pcp_encoding_map___priority_map (
+        priority_type priority,
+        boolean dei,
+        priority_type priority_code_point
+    )
+    Collection pcp_encoding_map___priority_map_collection of pcp_encoding_map___priority_map
+    Collection bridge_port___pcp_encoding_map_collection of bridge_port___pcp_encoding_map
+    Type use_dei extends boolean
+    Type drop_encoding extends boolean
+    Type service_access_priority_selection extends boolean
+    Structure bridge_port___service_access_priority (
+        priority0 priority0,
+        priority1 priority1,
+        priority2 priority2,
+        priority3 priority3,
+        priority4 priority4,
+        priority5 priority5,
+        priority6 priority6,
+        priority7 priority7
+    )
+    Structure bridge_port___traffic_class_map (
+        priority_type priority,
+        traffic_class_map___available_traffic_class_collection available_traffic_class
+    )
+    Structure traffic_class_map___available_traffic_class (
+        uint8 num_traffic_class,
+        traffic_class_type traffic_class
+    )
+    Type uint8
+    Type traffic_class_type
+    Collection traffic_class_map___available_traffic_class_collection of traffic_class_map___available_traffic_class
+    Collection bridge_port___traffic_class_map_collection of bridge_port___traffic_class_map
+    Structure bridge_port___transmission_selection_algorithm_map (
+        traffic_class_type traffic_class,
+        identityref transmission_selection_algorithm
+    )
+    Collection bridge_port___transmission_selection_algorithm_map_collection of bridge_port___transmission_selection_algorithm_map
+    Enumerated acceptable_frame {
+        acceptable_frame admit_only_VLAN_tagged_frames,
+        acceptable_frame admit_only_untagged_and_priority_tagged,
+        acceptable_frame admit_all_frames
+    }
+    Type enable_ingress_filtering extends boolean
+    Type enable_restricted_vlan_registration extends boolean
+    Type enable_vid_translation_table extends boolean
+    Type enable_egress_vid_translation_table extends boolean
+    Structure bridge_port___protocol_group_vid_set (
+        uint32 group_id,
+        vlanid_collection vid
+    )
+    Type vlanid extends uint16
+    Collection vlanid_collection of vlanid
+    Collection bridge_port___protocol_group_vid_set_collection of bridge_port___protocol_group_vid_set
+    Type bits
+    Type media_dependent_overhead extends uint8
+    Structure bridge_port___statistics (
+        counter64 discard_on_ingress_filtering,
+        counter64 delay_exceeded_discards,
+        counter64 mtu_exceeded_discards,
+        counter64 frame_rx,
+        counter64 octets_rx,
+        counter64 frame_tx,
+        counter64 octets_tx,
+        counter64 discard_inbound,
+        counter64 forward_outbound,
+        counter64 discard_lack_of_buffers,
+        counter64 discard_transit_delay_exceeded,
+        counter64 discard_on_error
+    )
+    Structure bridge_port___vid_translations (
+        vlanid local_vid,
+        vlanid relay_vid
+    )
+    Collection bridge_port___vid_translations_collection of bridge_port___vid_translations
+    Structure bridge_port___egress_vid_translations (
+        vlanid relay_vid,
+        vlanid local_vid
+    )
+    Collection bridge_port___egress_vid_translations_collection of bridge_port___egress_vid_translations
+    Collection interface_collection of interface
+    Type interface_state_ref extends leafref
+    Collection interface_state_ref_collection of interface_state_ref
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/mwt/ieee802-dot1q-pb.yang b/plugins/org.etsi.mts.tdl.yang2json/samples/mwt/ieee802-dot1q-pb.yang
new file mode 100644
index 0000000000000000000000000000000000000000..e25b7b060b9a64bf4adbe6c120b154b98dd58e17
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/mwt/ieee802-dot1q-pb.yang
@@ -0,0 +1,221 @@
+module ieee802-dot1q-pb {
+  yang-version "1.1";
+  namespace urn:ieee:std:802.1Q:yang:ieee802-dot1q-pb;
+  prefix dot1q-pb;
+  import ieee802-dot1q-bridge {
+    prefix dot1q;
+  }
+  import ieee802-dot1q-types {
+    prefix dot1qtypes;
+  }
+  import ietf-interfaces {
+    prefix if;
+  }
+  organization
+    "IEEE 802.1 Working Group";
+  contact
+    "WG-URL: http://ieee802.org/1/
+    WG-EMail: stds-802-1-l@ieee.org
+    
+    Contact: IEEE 802.1 Working Group Chair
+    Postal: C/O IEEE 802.1 Working Group
+           IEEE Standards Association
+           445 Hoes Lane
+           Piscataway, NJ 08854
+           USA
+    
+    E-mail: stds-802-1-chairs@ieee.org";
+  description
+    "This YANG module describes the bridge configuration model for
+    Provider Bridges.
+    
+    Copyright (C) IEEE (2022).
+    
+    This version of this YANG module is part of IEEE Std 802.1Q; see the
+    standard itself for full legal notices.";
+  revision 2022-05-06 {
+    description
+      "Update to rebase on Qcw";
+    reference
+      "IEEE Std 802.1Q-2022, Bridges and Bridged Networks.";
+  }
+  revision 2022-01-19 {
+    description
+      "Published as part of IEEE Std 802.1Q-2022.";
+    reference
+      "IEEE Std 802.1Q-2022, Bridges and Bridged Networks.";
+  }
+  revision 2020-06-04 {
+    description
+      "Published as part of IEEE Std 802.1Qcx-2020. Second version.";
+    reference
+      "IEEE Std 802.1Qcx-2020, Bridges and Bridged Networks - YANG Data
+      Model for Connectivity Fault Management.";
+  }
+  revision 2018-03-07 {
+    description
+      "Published as part of IEEE Std 802.1Q-2018. Initial version.";
+    reference
+      "IEEE Std 802.1Q-2018, Bridges and Bridged Networks.";
+  }
+  augment "/if:interfaces/if:interface/dot1q:bridge-port" {
+    description
+      "Augment the interface model with 802.1Q Bridge Port configuration
+      specific nodes.";
+    leaf svid {
+      type dot1qtypes:vlanid;
+      description
+        "Service VLAN identifier.";
+      reference
+        "12.13.2.1 of IEEE Std 802.1Q-2022";
+    }
+    list cvid-registration {
+      when "/dot1q:bridges/dot1q:bridge[dot1q:name=current()" +
+        "/../dot1q:bridge-name]/dot1q:component[dot1q:name=current()" +
+        "/../dot1q:component-name]/dot1q:type = 'dot1q:c-vlan-component' and "+
+        "../dot1q:port-type = 'dot1q:customer-edge-port'" {
+        description
+          "Applies when the component associated with this interface is
+          a C-VLAN component and the port-type is a customer edge port.";
+      }
+      key "cvid";
+      description
+        "The C-VID Registration Table, provides a mapping between a
+        C-VID and the service instance represented by an S-VID selected
+        for that C-VLAN. This table provides the equivalent
+        functionality of
+           1) Configuring the PVID of the internal CNP on the S-VLAN
+              component
+           2) Adding the corresponding PEP on the C-VLAN component to
+              the member set of the C-VLAN
+           3) Adding the PEP and/or CEP to the untagged set of the
+              C-VLAN (if it is desired that frames forwarded to that
+              port are transmitted untagged for this C-VLAN).";
+      leaf cvid {
+        type dot1qtypes:vlanid;
+        description
+          "Customer VLAN identifiers associated with this bridge port.";
+        reference
+          "12.13.2.1 of IEEE Std 802.1Q-2022";
+      }
+      leaf svid {
+        type dot1qtypes:vlanid;
+        description
+          "Service VLAN identifier.";
+        reference
+          "12.13.2.1 of IEEE Std 802.1Q-2022";
+      }
+      leaf untagged-pep {
+        type boolean;
+        default "true";
+        description
+          "A boolean indicating frames for this C-VLAN should be
+          forwarded untagged through the Provider Edge Port.";
+        reference
+          "12.13.2.1 of IEEE Std 802.1Q-2022";
+      }
+      leaf untagged-cep {
+        type boolean;
+        default "true";
+        description
+          "A boolean indicating frames for this C-VLAN should be
+          forwarded untagged through the Customer Edge Port.";
+        reference
+          "12.13.2.1 of IEEE Std 802.1Q-2022";
+      }
+    }
+    list service-priority-regeneration {
+      when "/dot1q:bridges/dot1q:bridge[dot1q:name=current() " +
+        "/../dot1q:bridge-name]/dot1q:component[dot1q:name=current() " +
+        "/../dot1q:component-name]/dot1q:type = 'dot1q:c-vlan-component' and "+
+        "../dot1q:port-type = 'dot1q:customer-edge-port'" {
+        description
+          "Applies when the component associated with this interface is
+          a C-VLAN component and the port-type is a customer edge port.";
+      }
+      key "svid";
+      description
+        "The Service Priority Regeneration Table, which provides the
+        Priority Regeneration Table (12.6.2) for each internal CNP
+        connected to the C-VLAN component associated with the CEP.";
+      leaf svid {
+        type dot1qtypes:vlanid;
+        description
+          "Service VLAN identifier.";
+        reference
+          "12.13.2.6 of IEEE Std 802.1Q-2022";
+      }
+      container priority-regeneration {
+        description
+          "Contains Service Priority Regeneration table nodal
+          information.";
+        reference
+          "12.13.2.6 of IEEE Std 802.1Q-2022";
+        uses dot1qtypes:priority-regeneration-table-grouping;
+      }
+    }
+    list rcap-internal-interface {
+      when "/dot1q:bridges/dot1q:bridge[dot1q:name=current() " +
+        "/../dot1q:bridge-name]/dot1q:component[dot1q:name=current() " +
+        "/../dot1q:component-name]/dot1q:type = 'dot1q:s-vlan-component' and "+
+        "../dot1q:port-type = 'dot1q:remote-customer-access-port'" {
+        description
+          "Applies when the component associated with this interface is
+          a C-VLAN component and the port-type is a customer edge port.";
+      }
+      key "external-svid";
+      description
+        "Designating an external port as an RCAP automatically creates a
+        Port-mapping S-VLAN component associated with that port. This
+        Port-mapping S-VLAN component includes one internal PNP.";
+      leaf external-svid {
+        type dot1qtypes:vlanid;
+        description
+          "External Service VLAN identifier.";
+        reference
+          "12.13.3.2 of IEEE Std 802.1Q-2022";
+      }
+      leaf internal-port-number {
+        type dot1qtypes:port-number-type;
+        description
+          "The number of the RCAP.";
+        reference
+          "12.13.3.2 of IEEE Std 802.1Q-2022";
+      }
+      leaf internal-svid {
+        type dot1qtypes:vlanid;
+        description
+          "Internal Service VLAN Identifier (not applicable for a
+          C-tagged RCSI).";
+        reference
+          "12.13.3.2 of IEEE Std 802.1Q-2022";
+      }
+      leaf internal-interface-type {
+        type enumeration {
+          enum port-based-rcsi {
+            description
+              "Port-based RCSI";
+          }
+          enum c-tagged-rcsi {
+            description
+              "C-tagged RCSI";
+          }
+          enum pnp {
+            description
+              "Provider Network Port";
+          }
+          enum discard {
+            description
+              "Discard (external S-VID is not associated with an
+              internal port).";
+          }
+        }
+        description
+          "A value indicating the type of internal interface associated
+          with the external S-VID.";
+        reference
+          "12.13.3.2 of IEEE Std 802.1Q-2022";
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/mwt/ieee802-dot1q-pb.yang-generated.tdltx b/plugins/org.etsi.mts.tdl.yang2json/samples/mwt/ieee802-dot1q-pb.yang-generated.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..5341030cd26ff08da383f4c6affd3d1348ba8da3
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/mwt/ieee802-dot1q-pb.yang-generated.tdltx
@@ -0,0 +1,552 @@
+Package generated_from_ieee802_dot1q_pb_yang {
+    Type String
+    Type TODO_RESOLVE_REFERENCED
+    Use "ieee802-dot1q-pb.yang" as SOURCE_MAPPING
+    Structure bridge (
+        name_type ^name,
+        mac_address address,
+        identityref bridge_type,
+        uint16 ports,
+        up_time up_time,
+        uint32 components,
+        bridge___component_collection ^component
+    )
+    Type name_type { pattern } extends string
+    Type string { pattern } extends string
+    Constraint pattern
+    Type mac_address { pattern : "[0-9a-fA-F]{2}(-[0-9a-fA-F]{2}){5}" } extends string
+    Type identityref
+    Type uint16 extends uint16
+    Type up_time extends zero_based_counter32
+    Type zero_based_counter32
+    Type uint32
+    Structure bridge___component (
+        string ^name,
+        uint32 id,
+        identityref ^type,
+        mac_address address,
+        traffic_class_enabled traffic_class_enabled,
+        uint16 ports,
+        @LeafRefPath : "/if:interfaces/if:interface/if:name"
+        interface_ref_collection bridge_port,
+        component___capabilities capabilities,
+        component___filtering_database filtering_database,
+        component___permanent_database permanent_database,
+        component___bridge_vlan bridge_vlan,
+        component___bridge_mst bridge_mst
+    )
+    Type traffic_class_enabled extends boolean
+    Type boolean
+    Type interface_ref extends leafref
+    Type leafref
+    Collection interface_ref_collection of interface_ref
+    Annotation LeafRefPath
+    Structure component___capabilities (
+        extended_filtering extended_filtering,
+        traffic_classes traffic_classes,
+        static_entry_individual_port static_entry_individual_port,
+        ivl_capable ivl_capable,
+        svl_capable svl_capable,
+        hybrid_capable hybrid_capable,
+        configurable_pvid_tagging configurable_pvid_tagging,
+        local_vlan_capable local_vlan_capable
+    )
+    Type extended_filtering extends boolean
+    Type traffic_classes extends boolean
+    Type static_entry_individual_port extends boolean
+    Type ivl_capable extends boolean
+    Type svl_capable extends boolean
+    Type hybrid_capable extends boolean
+    Type configurable_pvid_tagging extends boolean
+    Type local_vlan_capable extends boolean
+    Structure component___filtering_database (
+        aging_time aging_time,
+        gauge32 ^size,
+        gauge32 static_entries,
+        gauge32 dynamic_entries,
+        gauge32 static_vlan_registration_entries,
+        gauge32 dynamic_vlan_registration_entries,
+        gauge32 mac_address_registration_entries,
+        filtering_database___filtering_entry_collection filtering_entry,
+        filtering_database___vlan_registration_entry_collection vlan_registration_entry
+    )
+    Type aging_time extends uint32
+    Type gauge32 extends uint32
+    Structure filtering_database___filtering_entry (
+        uint32 database_id,
+        mac_address address,
+        vid_range_type vids,
+        filtering_entry___entry_type entry_type,
+        filtering_entry___port_map_collection port_map,
+        filtering_entry___status status
+    )
+    Type vid_range_type { pattern : "([1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?(,[1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?)*)" } extends string
+    Enumerated filtering_entry___entry_type {
+        filtering_entry___entry_type static,
+        filtering_entry___entry_type dynamic
+    }
+    Structure filtering_entry___port_map (
+        port_number_type port_ref,
+        port_map___map_type map_type
+    )
+    Type port_number_type extends uint32
+    Structure port_map___map_type (
+        map_type___static_filtering_entries static_filtering_entries,
+        map_type___static_vlan_registration_entries static_vlan_registration_entries,
+        map_type___mac_address_registration_entries mac_address_registration_entries,
+        map_type___dynamic_vlan_registration_entries dynamic_vlan_registration_entries,
+        map_type___dynamic_reservation_entries dynamic_reservation_entries,
+        map_type___dynamic_filtering_entries dynamic_filtering_entries
+    )
+    Structure map_type___static_filtering_entries (
+        static_filtering_entries___static_filtering_entries static_filtering_entries
+    )
+    Structure static_filtering_entries___static_filtering_entries (
+        enumeration control_element,
+        port_number_type connection_identifier
+    )
+    Type enumeration
+    Structure map_type___static_vlan_registration_entries (
+        static_vlan_registration_entries___static_vlan_registration_entries static_vlan_registration_entries
+    )
+    Structure static_vlan_registration_entries___static_vlan_registration_entries (
+        enumeration registrar_admin_control,
+        enumeration vlan_transmitted
+    )
+    Structure map_type___mac_address_registration_entries (
+        mac_address_registration_entries___mac_address_registration_entries mac_address_registration_entries
+    )
+    Structure mac_address_registration_entries___mac_address_registration_entries (
+        enumeration control_element
+    )
+    Structure map_type___dynamic_vlan_registration_entries (
+        dynamic_vlan_registration_entries___dynamic_vlan_registration_entries dynamic_vlan_registration_entries
+    )
+    Structure dynamic_vlan_registration_entries___dynamic_vlan_registration_entries (
+        enumeration control_element
+    )
+    Structure map_type___dynamic_reservation_entries (
+        dynamic_reservation_entries___dynamic_reservation_entries dynamic_reservation_entries
+    )
+    Structure dynamic_reservation_entries___dynamic_reservation_entries (
+        enumeration control_element
+    )
+    Structure map_type___dynamic_filtering_entries (
+        dynamic_filtering_entries___dynamic_filtering_entries dynamic_filtering_entries
+    )
+    Structure dynamic_filtering_entries___dynamic_filtering_entries (
+        enumeration control_element
+    )
+    Collection filtering_entry___port_map_collection of filtering_entry___port_map
+    Enumerated filtering_entry___status {
+        filtering_entry___status other,
+        filtering_entry___status invalid,
+        filtering_entry___status learned,
+        filtering_entry___status self,
+        filtering_entry___status mgmt
+    }
+    Collection filtering_database___filtering_entry_collection of filtering_database___filtering_entry
+    Structure filtering_database___vlan_registration_entry (
+        uint32 database_id,
+        vid_range_type vids,
+        vlan_registration_entry___entry_type entry_type,
+        vlan_registration_entry___port_map_collection port_map
+    )
+    Enumerated vlan_registration_entry___entry_type {
+        vlan_registration_entry___entry_type static,
+        vlan_registration_entry___entry_type dynamic
+    }
+    Structure vlan_registration_entry___port_map (
+        port_number_type port_ref,
+        port_map___map_type map_type
+    )
+    Collection vlan_registration_entry___port_map_collection of vlan_registration_entry___port_map
+    Collection filtering_database___vlan_registration_entry_collection of filtering_database___vlan_registration_entry
+    Structure component___permanent_database (
+        gauge32 ^size,
+        gauge32 static_entries,
+        gauge32 static_vlan_registration_entries,
+        permanent_database___filtering_entry_collection filtering_entry
+    )
+    Structure permanent_database___filtering_entry (
+        uint32 database_id,
+        mac_address address,
+        vid_range_type vids,
+        filtering_entry___status status,
+        filtering_entry___port_map_collection port_map
+    )
+    Collection permanent_database___filtering_entry_collection of permanent_database___filtering_entry
+    Structure component___bridge_vlan (
+        uint16 version,
+        uint16 max_vids,
+        override_default_pvid override_default_pvid,
+        protocol_frame_format_type protocol_template,
+        uint16 max_msti,
+        bridge_vlan___vlan_collection vlan,
+        bridge_vlan___protocol_group_database_collection protocol_group_database,
+        bridge_vlan___vid_to_fid_allocation_collection vid_to_fid_allocation,
+        bridge_vlan___fid_to_vid_allocation_collection fid_to_vid_allocation,
+        bridge_vlan___vid_to_fid_collection vid_to_fid
+    )
+    Type override_default_pvid extends boolean
+    Enumerated protocol_frame_format_type {
+        protocol_frame_format_type Ethernet,
+        protocol_frame_format_type rfc1042,
+        protocol_frame_format_type snap8021H,
+        protocol_frame_format_type snapOther,
+        protocol_frame_format_type llcOther
+    }
+    Structure bridge_vlan___vlan (
+        vlan_index_type vid,
+        name_type ^name,
+        @LeafRefPath : "/if:interfaces/if:interface/if:name"
+        interface_ref_collection untagged_ports,
+        @LeafRefPath : "/if:interfaces/if:interface/if:name"
+        interface_ref_collection egress_ports
+    )
+    Type vlan_index_type extends uint32
+    Collection bridge_vlan___vlan_collection of bridge_vlan___vlan
+    Structure bridge_vlan___protocol_group_database (
+        uint16 db_index,
+        protocol_frame_format_type frame_format_type,
+        protocol_group_database___frame_format frame_format,
+        uint32 group_id
+    )
+    Structure protocol_group_database___frame_format (
+        frame_format___ethernet_rfc1042_snap8021H ethernet_rfc1042_snap8021H,
+        frame_format___snap_other snap_other,
+        frame_format___llc_other llc_other
+    )
+    Structure frame_format___ethernet_rfc1042_snap8021H (
+        ethertype_type ethertype
+    )
+    Type ethertype_type { pattern : "[0-9a-fA-F]{2}-[0-9a-fA-F]{2}" } extends string
+    Structure frame_format___snap_other (
+        string protocol_id
+    )
+    Structure frame_format___llc_other (
+        llc_other___dsap_ssap_pairs dsap_ssap_pairs
+    )
+    Structure llc_other___dsap_ssap_pairs (
+        string llc_address
+    )
+    Collection bridge_vlan___protocol_group_database_collection of bridge_vlan___protocol_group_database
+    Structure bridge_vlan___vid_to_fid_allocation (
+        vid_range_type vids,
+        uint32 fid,
+        vid_to_fid_allocation___allocation_type allocation_type
+    )
+    Enumerated vid_to_fid_allocation___allocation_type {
+        vid_to_fid_allocation___allocation_type undefined,
+        vid_to_fid_allocation___allocation_type fixed,
+        vid_to_fid_allocation___allocation_type dynamic
+    }
+    Collection bridge_vlan___vid_to_fid_allocation_collection of bridge_vlan___vid_to_fid_allocation
+    Structure bridge_vlan___fid_to_vid_allocation (
+        uint32 fid,
+        fid_to_vid_allocation___allocation_type allocation_type,
+        vlan_index_type_collection vid
+    )
+    Enumerated fid_to_vid_allocation___allocation_type {
+        fid_to_vid_allocation___allocation_type undefined,
+        fid_to_vid_allocation___allocation_type fixed,
+        fid_to_vid_allocation___allocation_type dynamic
+    }
+    Collection vlan_index_type_collection of vlan_index_type
+    Collection bridge_vlan___fid_to_vid_allocation_collection of bridge_vlan___fid_to_vid_allocation
+    Structure bridge_vlan___vid_to_fid (
+        vlan_index_type vid,
+        uint32 fid
+    )
+    Collection bridge_vlan___vid_to_fid_collection of bridge_vlan___vid_to_fid
+    Structure component___bridge_mst (
+        mstid_type_collection mstid,
+        bridge_mst___fid_to_mstid_collection fid_to_mstid,
+        bridge_mst___fid_to_mstid_allocation_collection fid_to_mstid_allocation
+    )
+    Type mstid_type extends uint32
+    Collection mstid_type_collection of mstid_type
+    Structure bridge_mst___fid_to_mstid (
+        uint32 fid,
+        mstid_type mstid
+    )
+    Collection bridge_mst___fid_to_mstid_collection of bridge_mst___fid_to_mstid
+    Structure bridge_mst___fid_to_mstid_allocation (
+        vid_range_type fids,
+        mstid_type mstid
+    )
+    Collection bridge_mst___fid_to_mstid_allocation_collection of bridge_mst___fid_to_mstid_allocation
+    Collection bridge___component_collection of bridge___component
+    Collection bridge_collection of bridge
+    Structure interface (
+        string ^name,
+        string description,
+        identityref ^type,
+        enabled enabled,
+        interface___link_up_down_trap_enable link_up_down_trap_enable,
+        interface___admin_status admin_status,
+        interface___oper_status oper_status,
+        date_and_time last_change,
+        int32 if_index,
+        phys_address phys_address,
+        @LeafRefPath : "/if:interfaces-state/if:interface/if:name"
+        interface_state_ref_collection higher_layer_if,
+        @LeafRefPath : "/if:interfaces-state/if:interface/if:name"
+        interface_state_ref_collection lower_layer_if,
+        speed speed,
+        interface___statistics statistics,
+        interface___bridge_port bridge_port
+    )
+    Type enabled extends boolean
+    Enumerated interface___link_up_down_trap_enable {
+        interface___link_up_down_trap_enable enabled,
+        interface___link_up_down_trap_enable disabled
+    }
+    Enumerated interface___admin_status {
+        interface___admin_status up,
+        interface___admin_status down,
+        interface___admin_status testing
+    }
+    Enumerated interface___oper_status {
+        interface___oper_status up,
+        interface___oper_status down,
+        interface___oper_status testing,
+        interface___oper_status unknown,
+        interface___oper_status dormant,
+        interface___oper_status not_present,
+        interface___oper_status lower_layer_down
+    }
+    Type date_and_time { pattern : "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[\\+\\-]\\d{2}:\\d{2})" } extends string
+    Type int32 extends int32
+    Type phys_address { pattern : "([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?" } extends string
+    Type speed extends gauge64
+    Type gauge64
+    Structure interface___statistics (
+        date_and_time discontinuity_time,
+        counter64 in_octets,
+        counter64 in_unicast_pkts,
+        counter64 in_broadcast_pkts,
+        counter64 in_multicast_pkts,
+        counter32 in_discards,
+        counter32 in_errors,
+        counter32 in_unknown_protos,
+        counter64 out_octets,
+        counter64 out_unicast_pkts,
+        counter64 out_broadcast_pkts,
+        counter64 out_multicast_pkts,
+        counter32 out_discards,
+        counter32 out_errors
+    )
+    Type counter64 extends uint64
+    Type uint64
+    Type counter32 extends uint32
+    Structure interface___bridge_port (
+        @LeafRefPath : "/dot1q:bridges/dot1q:bridge/dot1q:name"
+        leafref bridge_name,
+        @LeafRefPath : "/dot1q:bridges/dot1q:bridge[dot1q:name=current()/../bridge-name]/dot1q:component/dot1q:name"
+        leafref component_name,
+        identityref port_type,
+        pvid pvid,
+        default_priority default_priority,
+        bridge_port___priority_regeneration priority_regeneration,
+        pcp_selection pcp_selection,
+        bridge_port___pcp_decoding_map_collection pcp_decoding_table,
+        bridge_port___pcp_encoding_map_collection pcp_encoding_table,
+        use_dei use_dei,
+        drop_encoding drop_encoding,
+        service_access_priority_selection service_access_priority_selection,
+        bridge_port___service_access_priority service_access_priority,
+        bridge_port___traffic_class_map_collection traffic_class,
+        bridge_port___transmission_selection_algorithm_map_collection transmission_selection_algorithm_table,
+        acceptable_frame acceptable_frame,
+        enable_ingress_filtering enable_ingress_filtering,
+        enable_restricted_vlan_registration enable_restricted_vlan_registration,
+        enable_vid_translation_table enable_vid_translation_table,
+        enable_egress_vid_translation_table enable_egress_vid_translation_table,
+        bridge_port___protocol_group_vid_set_collection protocol_group_vid_set,
+        bridge_port___admin_point_to_point admin_point_to_point,
+        boolean protocol_based_vlan_classification,
+        uint16 max_vid_set_entries,
+        port_number_type port_number,
+        mac_address address,
+        bits capabilities,
+        bits type_capabilties,
+        boolean external,
+        boolean oper_point_to_point,
+        media_dependent_overhead media_dependent_overhead,
+        bridge_port___statistics statistics,
+        bridge_port___vid_translations_collection vid_translations,
+        bridge_port___egress_vid_translations_collection egress_vid_translations,
+        vlanid svid,
+        bridge_port___cvid_registration_collection cvid_registration,
+        bridge_port___service_priority_regeneration_collection service_priority_regeneration,
+        bridge_port___rcap_internal_interface_collection rcap_internal_interface
+    )
+    Type pvid extends vlan_index_type
+    Type default_priority extends priority_type
+    Type priority_type
+    Structure bridge_port___priority_regeneration (
+        priority0 priority0,
+        priority1 priority1,
+        priority2 priority2,
+        priority3 priority3,
+        priority4 priority4,
+        priority5 priority5,
+        priority6 priority6,
+        priority7 priority7
+    )
+    Type priority0
+    Type priority1
+    Type priority2
+    Type priority3
+    Type priority4
+    Type priority5
+    Type priority6
+    Type priority7
+    Enumerated pcp_selection {
+        pcp_selection _1P0D,
+        pcp_selection _1P1D,
+        pcp_selection _1P2D,
+        pcp_selection _1P3D
+    }
+    Structure bridge_port___pcp_decoding_map (
+        pcp_selection_type pcp,
+        pcp_decoding_map___priority_map_collection priority_map
+    )
+    Type pcp_selection_type
+    Structure pcp_decoding_map___priority_map (
+        priority_type priority_code_point,
+        priority_type priority,
+        boolean drop_eligible
+    )
+    Collection pcp_decoding_map___priority_map_collection of pcp_decoding_map___priority_map
+    Collection bridge_port___pcp_decoding_map_collection of bridge_port___pcp_decoding_map
+    Structure bridge_port___pcp_encoding_map (
+        pcp_selection_type pcp,
+        pcp_encoding_map___priority_map_collection priority_map
+    )
+    Structure pcp_encoding_map___priority_map (
+        priority_type priority,
+        boolean dei,
+        priority_type priority_code_point
+    )
+    Collection pcp_encoding_map___priority_map_collection of pcp_encoding_map___priority_map
+    Collection bridge_port___pcp_encoding_map_collection of bridge_port___pcp_encoding_map
+    Type use_dei extends boolean
+    Type drop_encoding extends boolean
+    Type service_access_priority_selection extends boolean
+    Structure bridge_port___service_access_priority (
+        priority0 priority0,
+        priority1 priority1,
+        priority2 priority2,
+        priority3 priority3,
+        priority4 priority4,
+        priority5 priority5,
+        priority6 priority6,
+        priority7 priority7
+    )
+    Structure bridge_port___traffic_class_map (
+        priority_type priority,
+        traffic_class_map___available_traffic_class_collection available_traffic_class
+    )
+    Structure traffic_class_map___available_traffic_class (
+        uint8 num_traffic_class,
+        traffic_class_type traffic_class
+    )
+    Type uint8
+    Type traffic_class_type
+    Collection traffic_class_map___available_traffic_class_collection of traffic_class_map___available_traffic_class
+    Collection bridge_port___traffic_class_map_collection of bridge_port___traffic_class_map
+    Structure bridge_port___transmission_selection_algorithm_map (
+        traffic_class_type traffic_class,
+        identityref transmission_selection_algorithm
+    )
+    Collection bridge_port___transmission_selection_algorithm_map_collection of bridge_port___transmission_selection_algorithm_map
+    Enumerated acceptable_frame {
+        acceptable_frame admit_only_VLAN_tagged_frames,
+        acceptable_frame admit_only_untagged_and_priority_tagged,
+        acceptable_frame admit_all_frames
+    }
+    Type enable_ingress_filtering extends boolean
+    Type enable_restricted_vlan_registration extends boolean
+    Type enable_vid_translation_table extends boolean
+    Type enable_egress_vid_translation_table extends boolean
+    Structure bridge_port___protocol_group_vid_set (
+        uint32 group_id,
+        vlanid_collection vid
+    )
+    Type vlanid extends uint16
+    Collection vlanid_collection of vlanid
+    Collection bridge_port___protocol_group_vid_set_collection of bridge_port___protocol_group_vid_set
+    Enumerated bridge_port___admin_point_to_point {
+        bridge_port___admin_point_to_point force_true,
+        bridge_port___admin_point_to_point force_false,
+        bridge_port___admin_point_to_point auto
+    }
+    Type bits
+    Type media_dependent_overhead extends uint8
+    Structure bridge_port___statistics (
+        counter64 discard_on_ingress_filtering,
+        counter64 delay_exceeded_discards,
+        counter64 mtu_exceeded_discards,
+        counter64 frame_rx,
+        counter64 octets_rx,
+        counter64 frame_tx,
+        counter64 octets_tx,
+        counter64 discard_inbound,
+        counter64 forward_outbound,
+        counter64 discard_lack_of_buffers,
+        counter64 discard_transit_delay_exceeded,
+        counter64 discard_on_error
+    )
+    Structure bridge_port___vid_translations (
+        vlanid local_vid,
+        vlanid relay_vid
+    )
+    Collection bridge_port___vid_translations_collection of bridge_port___vid_translations
+    Structure bridge_port___egress_vid_translations (
+        vlanid relay_vid,
+        vlanid local_vid
+    )
+    Collection bridge_port___egress_vid_translations_collection of bridge_port___egress_vid_translations
+    Structure bridge_port___cvid_registration (
+        vlanid cvid,
+        vlanid svid,
+        untagged_pep untagged_pep,
+        untagged_cep untagged_cep
+    )
+    Type untagged_pep extends boolean
+    Type untagged_cep extends boolean
+    Collection bridge_port___cvid_registration_collection of bridge_port___cvid_registration
+    Structure bridge_port___service_priority_regeneration (
+        vlanid svid,
+        service_priority_regeneration___priority_regeneration priority_regeneration
+    )
+    Structure service_priority_regeneration___priority_regeneration (
+        priority0 priority0,
+        priority1 priority1,
+        priority2 priority2,
+        priority3 priority3,
+        priority4 priority4,
+        priority5 priority5,
+        priority6 priority6,
+        priority7 priority7
+    )
+    Collection bridge_port___service_priority_regeneration_collection of bridge_port___service_priority_regeneration
+    Structure bridge_port___rcap_internal_interface (
+        vlanid external_svid,
+        port_number_type internal_port_number,
+        vlanid internal_svid,
+        rcap_internal_interface___internal_interface_type internal_interface_type
+    )
+    Enumerated rcap_internal_interface___internal_interface_type {
+        rcap_internal_interface___internal_interface_type port_based_rcsi,
+        rcap_internal_interface___internal_interface_type c_tagged_rcsi,
+        rcap_internal_interface___internal_interface_type pnp,
+        rcap_internal_interface___internal_interface_type discard
+    }
+    Collection bridge_port___rcap_internal_interface_collection of bridge_port___rcap_internal_interface
+    Collection interface_collection of interface
+    Type interface_state_ref extends leafref
+    Collection interface_state_ref_collection of interface_state_ref
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/mwt/ieee802-dot1q-types.yang b/plugins/org.etsi.mts.tdl.yang2json/samples/mwt/ieee802-dot1q-types.yang
new file mode 100644
index 0000000000000000000000000000000000000000..cfc46ed9b6c31709268ea4d4fdd7feadef55f760
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/mwt/ieee802-dot1q-types.yang
@@ -0,0 +1,980 @@
+module ieee802-dot1q-types {
+  namespace urn:ieee:std:802.1Q:yang:ieee802-dot1q-types;
+  prefix dot1q-types;
+  import ietf-yang-types {
+    prefix yang;
+  }
+  organization
+    "IEEE 802.1 Working Group";
+  contact
+    "WG-URL: http://ieee802.org/1/
+    WG-EMail: stds-802-1-l@ieee.org
+    
+    Contact: IEEE 802.1 Working Group Chair
+    Postal: C/O IEEE 802.1 Working Group
+           IEEE Standards Association
+           445 Hoes Lane
+           Piscataway, NJ 08854
+           USA
+    
+    E-mail: stds-802-1-chairs@ieee.org";
+  description
+    "Common types used within dot1Q-bridge modules.
+    
+    Copyright (C) IEEE (2022).
+    
+    This version of this YANG module is part of IEEE Std 802.1Q; see the
+    standard itself for full legal notices.";
+  revision 2022-01-19 {
+    description
+      "Published as part of IEEE Std 802.1Q-2022.";
+    reference
+      "IEEE Std 802.1Q-2022, Bridges and Bridged Networks.";
+  }
+  revision 2020-06-04 {
+    description
+      "Published as part of IEEE Std 802.1Qcx-2020. Second version.";
+    reference
+      "IEEE Std 802.1Qcx-2020, Bridges and Bridged Networks - YANG Data
+      Model for Connectivity Fault Management.";
+  }
+  revision 2018-03-07 {
+    description
+      "Published as part of IEEE Std 802.1Q-2018. Initial version.";
+    reference
+      "IEEE Std 802.1Q-2018, Bridges and Bridged Networks.";
+  }
+  identity dot1q-vlan-type {
+    description
+      "Base identity from which all 802.1Q VLAN tag types are derived
+      from.";
+  }
+  identity c-vlan {
+    base dot1q-vlan-type;
+    description
+      "An 802.1Q Customer VLAN, using the 81-00 EtherType";
+    reference
+      "5.5 of IEEE Std 802.1Q-2022";
+  }
+  identity s-vlan {
+    base dot1q-vlan-type;
+    description
+      "An 802.1Q Service VLAN, using the 88-A8 EtherType originally
+      introduced in 802.1ad, and incorporated into 802.1Q (2011)";
+    reference
+      "5.6 of IEEE Std 802.1Q-2022";
+  }
+  identity transmission-selection-algorithm {
+    description
+      "Specify the transmission selection algorithms of IEEE Std
+      802.1Q-2022 Table 8-6";
+  }
+  identity strict-priority {
+    base transmission-selection-algorithm;
+    description
+      "Indicates the strict priority transmission selection algorithm.";
+    reference
+      "Table 8-6 of IEEE Std 802.1Q-2022";
+  }
+  identity credit-based-shaper {
+    base transmission-selection-algorithm;
+    description
+      "Indicates the credit based shaper transmission selection
+      algorithm.";
+    reference
+      "Table 8-6 of IEEE Std 802.1Q-2022";
+  }
+  identity enhanced-transmission-selection {
+    base transmission-selection-algorithm;
+    description
+      "Indicates the enhanced transmission selection algorithm.";
+    reference
+      "Table 8-6 of IEEE Std 802.1Q-2022";
+  }
+  identity asynchronous-traffic-shaping {
+    base transmission-selection-algorithm;
+    description
+      "Indicates the asynchronous transmission selection algorithm.";
+    reference
+      "Table 8-6 of IEEE Std 802.1Q-2022";
+  }
+  identity vendor-specific {
+    base transmission-selection-algorithm;
+    description
+      "Indicates a vendor specific transmission selection algorithm.";
+    reference
+      "Table 8-6 of IEEE Std 802.1Q-2022";
+  }
+  typedef name-type {
+    type string {
+      length "0..32";
+    }
+    description
+      "A text string of up to 32 characters, of locally determined
+      significance.";
+  }
+  typedef port-number-type {
+    type uint32 {
+      range "1..4095";
+    }
+    description
+      "The port number of the Bridge port for which this entry contains
+      Bridge management information.";
+  }
+  typedef priority-type {
+    type uint8 {
+      range "0..7";
+    }
+    description
+      "A range of priorities from 0 to 7 (inclusive). The Priority Code
+      Point (PCP) is a 3-bit field that refers to the class of service
+      associated with an 802.1Q VLAN tagged frame. The field specifies a
+      priority value between 0 and 7, these values can be used by
+      quality of service (QoS) to prioritize different classes of
+      traffic.";
+  }
+  typedef vid-range-type {
+    type string {
+      pattern
+        "([1-9]"+
+        "[0-9]{0,3}"+
+        "(-[1-9][0-9]{0,3})?"+
+        "(,[1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?)*)";
+    }
+    description
+      "A list of VLAN Ids, or non overlapping VLAN ranges, in ascending
+      order, between 1 and 4094.
+      
+      This type is used to match an ordered list of VLAN Ids, or
+      contiguous ranges of VLAN Ids. Valid VLAN Ids must be in the range
+      1 to 4094, and included in the list in non overlapping ascending
+      order.
+      
+      For example: 1,10-100,250,500-1000";
+  }
+  typedef vlanid {
+    type uint16 {
+      range "1..4094";
+    }
+    description
+      "The vlanid type uniquely identifies a VLAN. This is the 12-bit
+      VLAN-ID used in the VLAN Tag header. The range is defined by the
+      referenced specification. This type is in the value set and its
+      semantics equivalent to the VlanId textual convention of the
+      SMIv2.";
+  }
+  typedef vlan-index-type {
+    type uint32 {
+      range "1..4094 | 4096..4294967295";
+    }
+    description
+      "A value used to index per-VLAN tables. Values of 0 and 4095 are
+      not permitted. The range of valid VLAN indices. If the value is
+      greater than 4095, then it represents a VLAN with scope local to
+      the particular agent, i.e., one without a global VLAN-ID assigned
+      to it. Such VLANs are outside the scope of IEEE 802.1Q, but it is
+      convenient to be able to manage them in the same way using this
+      YANG module.";
+    reference
+      "9.6 of IEEE Std 802.1Q-2022";
+  }
+  typedef mstid-type {
+    type uint32 {
+      range "1..4094";
+    }
+    description
+      "In an MSTP Bridge, an MSTID, i.e., a value used to identify a
+      spanning tree (or MST) instance";
+    reference
+      "13.8 of IEEE Std 802.1Q-2022";
+  }
+  typedef pcp-selection-type {
+    type enumeration {
+      enum 8P0D {
+        description
+          "8 priorities, 0 drop eligible";
+      }
+      enum 7P1D {
+        description
+          "7 priorities, 1 drop eligible";
+      }
+      enum 6P2D {
+        description
+          "6 priorities, 2 drop eligible";
+      }
+      enum 5P3D {
+        description
+          "5 priorities, 3 drop eligible";
+      }
+    }
+    description
+      "Priority Code Point selection types.";
+    reference
+      "12.6.2.5.3, 6.9.3 of IEEE Std 802.1Q-2022";
+  }
+  typedef protocol-frame-format-type {
+    type enumeration {
+      enum Ethernet {
+        description
+          "Ethernet frame format";
+      }
+      enum rfc1042 {
+        description
+          "RFC 1042 frame format";
+      }
+      enum snap8021H {
+        description
+          "SNAP 802.1H frame format";
+      }
+      enum snapOther {
+        description
+          "Other SNAP frame format";
+      }
+      enum llcOther {
+        description
+          "Other LLC frame format";
+      }
+    }
+    description
+      "A value representing the frame format to be matched.";
+    reference
+      "12.10.1.7.1 of IEEE Std 802.1Q-2022";
+  }
+  typedef ethertype-type {
+    type string {
+      pattern "[0-9a-fA-F]{2}-[0-9a-fA-F]{2}";
+    }
+    description
+      "The EtherType value represented in the canonical order defined by
+      IEEE 802. The canonical representation uses uppercase characters.";
+    reference
+      "9.2 of IEEE Std 802-2014";
+  }
+  typedef dot1q-tag-type {
+    type identityref {
+      base dot1q-vlan-type;
+    }
+    description
+      "Identifies a specific 802.1Q tag type";
+    reference
+      "9.5 IEEE Std 802.1Q-2022";
+  }
+  typedef traffic-class-type {
+    type uint8 {
+      range "0..7";
+    }
+    description
+      "This is the numerical value associated with a traffic class in a
+      Bridge. Larger values are associated with higher priority traffic
+      classes.";
+    reference
+      "3.273 of IEEE Std 802.1Q-2022";
+  }
+  grouping dot1q-tag-classifier-grouping {
+    description
+      "A grouping which represents an 802.1Q VLAN, matching both the
+      EtherType and a single VLAN Id.";
+    leaf tag-type {
+      type dot1q-tag-type;
+      mandatory true;
+      description
+        "VLAN type";
+    }
+    leaf vlan-id {
+      type vlanid;
+      mandatory true;
+      description
+        "VLAN Id";
+    }
+  }
+  grouping dot1q-tag-or-any-classifier-grouping {
+    description
+      "A grouping which represents an 802.1Q VLAN, matching both the
+      EtherType and a single VLAN Id or 'any' to match on any VLAN Id.";
+    leaf tag-type {
+      type dot1q-tag-type;
+      mandatory true;
+      description
+        "VLAN type";
+    }
+    leaf vlan-id {
+      type union {
+        type vlanid;
+        type enumeration {
+          enum any {
+            value 4095;
+            description
+              "Matches 'any' VLAN in the range 1 to 4094 that is not
+              matched by a more specific VLAN Id match";
+          }
+        }
+      }
+      mandatory true;
+      description
+        "VLAN Id or any";
+    }
+  }
+  grouping dot1q-tag-ranges-classifier-grouping {
+    description
+      "A grouping which represents an 802.1Q VLAN that matches a range
+      of VLAN Ids.";
+    leaf tag-type {
+      type dot1q-tag-type;
+      mandatory true;
+      description
+        "VLAN type";
+    }
+    leaf vlan-ids {
+      type vid-range-type;
+      mandatory true;
+      description
+        "VLAN Ids";
+    }
+  }
+  grouping dot1q-tag-ranges-or-any-classifier-grouping {
+    description
+      "A grouping which represents an 802.1Q VLAN, matching both the
+      EtherType and a single VLAN Id, ordered list of ranges, or 'any'
+      to match on any VLAN Id.";
+    leaf tag-type {
+      type dot1q-tag-type;
+      mandatory true;
+      description
+        "VLAN type";
+    }
+    leaf vlan-id {
+      type union {
+        type vid-range-type;
+        type enumeration {
+          enum any {
+            value 4095;
+            description
+              "Matches 'any' VLAN in the range 1 to 4094.";
+          }
+        }
+      }
+      mandatory true;
+      description
+        "VLAN Ids or any";
+    }
+  }
+  grouping priority-regeneration-table-grouping {
+    description
+      "The priority regeneration table provides the ability to map
+      incoming priority values on a per-Port basis, under management
+      control.";
+    reference
+      "6.9.4 of IEEE Std 802.1Q-2022";
+    leaf priority0 {
+      type priority-type;
+      default "0";
+      description
+        "Priority 0";
+      reference
+        "12.6.2.3, 6.9.4 of IEEE Std 802.1Q-2022";
+    }
+    leaf priority1 {
+      type priority-type;
+      default "1";
+      description
+        "Priority 1";
+      reference
+        "12.6.2.3, 6.9.4 of IEEE Std 802.1Q-2022";
+    }
+    leaf priority2 {
+      type priority-type;
+      default "2";
+      description
+        "Priority 2";
+      reference
+        "12.6.2.3, 6.9.4 of IEEE Std 802.1Q-2022";
+    }
+    leaf priority3 {
+      type priority-type;
+      default "3";
+      description
+        "Priority 3";
+      reference
+        "12.6.2.3, 6.9.4 of IEEE Std 802.1Q-2022";
+    }
+    leaf priority4 {
+      type priority-type;
+      default "4";
+      description
+        "Priority 4";
+      reference
+        "12.6.2.3, 6.9.4 of IEEE Std 802.1Q-2022";
+    }
+    leaf priority5 {
+      type priority-type;
+      default "5";
+      description
+        "Priority 5";
+      reference
+        "12.6.2.3, 6.9.4 of IEEE Std 802.1Q-2022";
+    }
+    leaf priority6 {
+      type priority-type;
+      default "6";
+      description
+        "Priority 6";
+      reference
+        "12.6.2.3, 6.9.4 of IEEE Std 802.1Q-2022";
+    }
+    leaf priority7 {
+      type priority-type;
+      default "7";
+      description
+        "Priority 7";
+      reference
+        "12.6.2.3, 6.9.4 of IEEE Std 802.1Q-2022";
+    }
+  }
+  grouping pcp-decoding-table-grouping {
+    description
+      "The Priority Code Point decoding table enables the decoding of
+      the priority and drop-eligible parameters from the PCP.";
+    reference
+      "6.9.3 of IEEE Std 802.1Q-2022";
+    list pcp-decoding-map {
+      key "pcp";
+      description
+        "This map associates the priority code point field found in the
+        VLAN to a priority and drop eligible value based upon the
+        priority code point selection type.";
+      leaf pcp {
+        type pcp-selection-type;
+        description
+          "The priority code point selection type.";
+        reference
+          "12.6.2.7, 6.9.3 of IEEE Std 802.1Q-2022";
+      }
+      list priority-map {
+        key "priority-code-point";
+        description
+          "This map associated a priority code point value to priority
+          and drop eligible parameters.";
+        leaf priority-code-point {
+          type priority-type;
+          description
+            "Priority associated with the pcp.";
+          reference
+            "12.6.2.7, 6.9.3 of IEEE Std 802.1Q-2022";
+        }
+        leaf priority {
+          type priority-type;
+          description
+            "Priority associated with the pcp.";
+          reference
+            "12.6.2.7, 6.9.3 of IEEE Std 802.1Q-2022";
+        }
+        leaf drop-eligible {
+          type boolean;
+          description
+            "Drop eligible value for pcp";
+          reference
+            "12.6.2.7, 6.9.3 of IEEE Std 802.1Q-2022";
+        }
+      }
+    }
+  }
+  grouping pcp-encoding-table-grouping {
+    description
+      "The Priority Code Point encoding table encodes the priority and
+      drop-eligible parameters in the PCP field of the VLAN tag.";
+    reference
+      "12.6.2.9, 6.9.3 of IEEE Std 802.1Q-2022";
+    list pcp-encoding-map {
+      key "pcp";
+      description
+        "This map associated the priority and drop-eligible parameters
+        to the priority used to encode the PCP of the VLAN based upon
+        the priority code point selection type.";
+      leaf pcp {
+        type pcp-selection-type;
+        description
+          "The priority code point selection type.";
+        reference
+          "12.6.2.7, 6.9.3 of IEEE Std 802.1Q-2022";
+      }
+      list priority-map {
+        key "priority dei";
+        description
+          "This map associated the priority and drop-eligible parameters
+          to the priority code point field of the VLAN tag.";
+        leaf priority {
+          type priority-type;
+          description
+            "Priority associated with the pcp.";
+          reference
+            "12.6.2.7, 6.9.3 of IEEE Std 802.1Q-2022";
+        }
+        leaf dei {
+          type boolean;
+          description
+            "The drop eligible value.";
+          reference
+            "12.6.2, 8.6.6 of IEEE Std 802.1Q-2022";
+        }
+        leaf priority-code-point {
+          type priority-type;
+          description
+            "PCP value for priority when DEI value";
+          reference
+            "12.6.2.9, 6.9.3 of IEEE Std 802.1Q-2022";
+        }
+      }
+    }
+  }
+  grouping service-access-priority-table-grouping {
+    description
+      "The Service Access Priority Table associates a received priority
+      with a serice access priority.";
+    reference
+      "12.6.2.17, 6.13.1 of IEEE Std 802.1Q-2022";
+    leaf priority0 {
+      type priority-type;
+      default "0";
+      description
+        "Service access priority value for priority 0";
+      reference
+        "12.6.2.17, 6.13.1 of IEEE Std 802.1Q-2022";
+    }
+    leaf priority1 {
+      type priority-type;
+      default "1";
+      description
+        "Service access priority value for priority 1";
+      reference
+        "12.6.2.17, 6.13.1 of IEEE Std 802.1Q-2022";
+    }
+    leaf priority2 {
+      type priority-type;
+      default "2";
+      description
+        "Service access priority value for priority 2";
+      reference
+        "12.6.2.17, 6.13.1 of IEEE Std 802.1Q-2022";
+    }
+    leaf priority3 {
+      type priority-type;
+      default "3";
+      description
+        "Service access priority value for priority 3";
+      reference
+        "12.6.2.17, 6.13.1 of IEEE Std 802.1Q-2022";
+    }
+    leaf priority4 {
+      type priority-type;
+      default "4";
+      description
+        "Service access priority value for priority 4";
+      reference
+        "12.6.2.17, 6.13.1 of IEEE Std 802.1Q-2022";
+    }
+    leaf priority5 {
+      type priority-type;
+      default "5";
+      description
+        "Service access priority value for priority 5";
+      reference
+        "12.6.2.17, 6.13.1 of IEEE Std 802.1Q-2022";
+    }
+    leaf priority6 {
+      type priority-type;
+      default "6";
+      description
+        "Service access priority value for priority 6";
+      reference
+        "12.6.2.17, 6.13.1 of IEEE Std 802.1Q-2022";
+    }
+    leaf priority7 {
+      type priority-type;
+      default "7";
+      description
+        "Service access priority value for priority 7";
+      reference
+        "12.6.2.17, 6.13.1 of IEEE Std 802.1Q-2022";
+    }
+  }
+  grouping traffic-class-table-grouping {
+    description
+      "The Traffic Class Table models the operations that can be
+      performed on, or inquire about, the current contents of the
+      Traffic Class Table (8.6.6) for a given Port.";
+    reference
+      "12.6.3, 8.6.6 of IEEE Std 802.1Q-2022";
+    list traffic-class-map {
+      key "priority";
+      description
+        "The priority index into the traffic class table.";
+      leaf priority {
+        type priority-type;
+        description
+          "The priority of the traffic class entry.";
+        reference
+          "8.6.6 of IEEE Std 802.1Q-2022";
+      }
+      list available-traffic-class {
+        key "num-traffic-class";
+        description
+          "The traffic class index associated with a given priority
+          within the traffic class table.";
+        reference
+          "8.6.6 of IEEE Std 802.1Q-2022";
+        leaf num-traffic-class {
+          type uint8 {
+            range "1..8";
+          }
+          description
+            "The available number of traffic classes.";
+          reference
+            "8.6.6 of IEEE Std 802.1Q-2022";
+        }
+        leaf traffic-class {
+          type traffic-class-type;
+          description
+            "The traffic class index associated with a given traffic
+            class entry.";
+          reference
+            "8.6.6 of IEEE Std 802.1Q-2022";
+        }
+      }
+    }
+  }
+  grouping transmission-selection-table-grouping {
+    description
+      "The Transmission Selection Algorithm Table models the operations
+      that can be performed on, or inquire about, the current contents
+      of the Transmission Selection Algorithm Table (12.20.2) for a
+      given Port.";
+    reference
+      "12.20.2, 8.6.8 of IEEE Std 802.1Q-2022";
+    list transmission-selection-algorithm-map {
+      key "traffic-class";
+      description
+        "The traffic class to index into the transmission selection
+        table.";
+      leaf traffic-class {
+        type traffic-class-type;
+        description
+          "The traffic class of the entry.";
+        reference
+          "8.6.6 of IEEE Std 802.1Q-2022";
+      }
+      leaf transmission-selection-algorithm {
+        type identityref {
+          base dot1q-types:transmission-selection-algorithm;
+        }
+        description
+          "Transmission selection algorithm";
+        reference
+          "8.6.8, Table 8-6 of IEEE Std 802.1Q-2022";
+      }
+    }
+  }
+  grouping port-map-grouping {
+    description
+      "A set of control indicators, one for each Port. A Port Map,
+      containing a control element for each outbound Port";
+    reference
+      "8.8.1, 8.8.2 of IEEE Std 802.1Q-2022";
+    list port-map {
+      key "port-ref";
+      description
+        "The list of entries composing the port map.";
+      leaf port-ref {
+        type port-number-type;
+        description
+          "The interface port reference associated with this map.";
+        reference
+          "8.8.1 of IEEE Std 802.1Q-2022";
+      }
+      choice map-type {
+        description
+          "Type of port map";
+        container static-filtering-entries {
+          description
+            "Static filtering entries attributes.";
+          leaf control-element {
+            type enumeration {
+              enum forward {
+                description
+                  "Forwarded, independently of any dynamic filtering
+                  information held by the FDB.";
+              }
+              enum filter {
+                description
+                  "Filtered, independently of any dynamic filtering
+                  information.";
+              }
+              enum forward-filter {
+                description
+                  "Forwarded or filtered on the basis of dynamic
+                  filtering information, or on the basis of the default
+                  Group filtering behavior for the outbound Port (8.8.6)
+                  if no dynamic filtering information is present
+                  specifically for the MAC address.";
+              }
+            }
+            description
+              "containing a control element for each outbound Port,
+              specifying that a frame with a destination MAC address,
+              and in the case of VLAN Bridge components, VID that meets
+              this specification.";
+            reference
+              "8.8.1 of IEEE Std 802.1Q-2022";
+          }
+          leaf connection-identifier {
+            type port-number-type;
+            description
+              "A Port MAP may contain a connection identifier (8.8.12)
+              for each outbound port. The connection identifier may be
+              associated with the Bridge Port value maintained in a
+              Dynamic Filtering Entry of the FDB for Bridge Ports.";
+            reference
+              "8.8.1, 8.8.12 of IEEE Std 802.1Q-2022";
+          }
+        }
+        container static-vlan-registration-entries {
+          description
+            "Static VLAN registration entries.";
+          leaf registrar-admin-control {
+            type enumeration {
+              enum fixed-new-ignored {
+                description
+                  "Registration Fixed (New ignored).";
+              }
+              enum fixed-new-propagated {
+                description
+                  "Registration Fixed (New propagated.";
+              }
+              enum forbidden {
+                description
+                  "Registration Forbidden.";
+              }
+              enum normal {
+                description
+                  "Normal Registration.";
+              }
+            }
+            description
+              "The Registrar Administrative Control values for MVRP and
+              MIRP for the VID.";
+            reference
+              "8.8.2 of IEEE Std 802.1Q-2022";
+          }
+          leaf vlan-transmitted {
+            type enumeration {
+              enum tagged {
+                description
+                  "VLAN-tagged";
+              }
+              enum untagged {
+                description
+                  "VLAN-untagged";
+              }
+            }
+            description
+              "Whether frames are to be VLAN-tagged or untagged when
+              transmitted.";
+            reference
+              "8.8.2 of IEEE Std 802.1Q-2022";
+          }
+        }
+        container mac-address-registration-entries {
+          description
+            "MAC address registration entries attributes.";
+          leaf control-element {
+            type enumeration {
+              enum registered {
+                description
+                  "Forwarded, independently of any dynamic filtering
+                  information held by the FDB.";
+              }
+              enum not-registered {
+                description
+                  "Filtered, independently of any dynamic filtering
+                  information.";
+              }
+            }
+            description
+              "containing a control element for each outbound Port,
+              specifying that a frame with a destination MAC address,
+              and in the case of VLAN Bridge components, VID that meets
+              this specification.";
+            reference
+              "8.8.4 of IEEE Std 802.1Q-2022";
+          }
+        }
+        container dynamic-vlan-registration-entries {
+          description
+            "Dynamic VLAN registration entries attributes.";
+          leaf control-element {
+            type enumeration {
+              enum registered {
+                description
+                  "Forwarded, independently of any dynamic filtering
+                  information held by the FDB.";
+              }
+            }
+            description
+              "containing a control element for each outbound Port,
+              specifying that a frame with a destination MAC address,
+              and in the case of VLAN Bridge components, VID that meets
+              this specification.";
+            reference
+              "8.8.5 of IEEE Std 802.1Q-2022";
+          }
+        }
+        container dynamic-reservation-entries {
+          description
+            "Dynamic reservation entries attributes.";
+          leaf control-element {
+            type enumeration {
+              enum forward {
+                description
+                  "Forwarded, independently of any dynamic filtering
+                  information held by the FDB.";
+              }
+              enum filter {
+                description
+                  "Filtered, independently of any dynamic filtering
+                  information.";
+              }
+            }
+            description
+              "Containing a control element for each outbound Port,
+              specifying that a frame with a destination MAC address,
+              and in the case of VLAN Bridge components, VID that meets
+              this specification.";
+            reference
+              "8.8.7 of IEEE Std 802.1Q-2022";
+          }
+        }
+        container dynamic-filtering-entries {
+          description
+            "Dynamic filtering entries attributes.";
+          leaf control-element {
+            type enumeration {
+              enum forward {
+                description
+                  "Forwarded, independently of any dynamic filtering
+                  information held by the FDB.";
+              }
+            }
+            description
+              "Containing a control element for each outbound Port,
+              specifying that a frame with a destination MAC address,
+              and in the case of VLAN Bridge components, VID that meets
+              this specification.";
+            reference
+              "8.8.3 of IEEE Std 802.1Q-2022";
+          }
+        }
+      }
+    }
+  }
+  grouping bridge-port-statistics-grouping {
+    description
+      "Grouping of bridge port statistics.";
+    reference
+      "12.6.1.1.3 of IEEE Std 802.1Q-2022";
+    leaf delay-exceeded-discards {
+      type yang:counter64;
+      description
+        "The number of frames discarded by this port due to excessive
+        transit delay through the Bridge. It is incremented by both
+        transparent and source route Bridges.";
+      reference
+        "12.6.1.1.3, 8.6.6 of IEEE Std 802.1Q-2022";
+    }
+    leaf mtu-exceeded-discards {
+      type yang:counter64;
+      description
+        "The number of frames discarded by this port due to an excessive
+        size. It is incremented by both transparent and source route
+        Bridges.";
+      reference
+        "Item g) in 12.6.1.1.3 of IEEE Std 802.1Q-2022";
+    }
+    leaf frame-rx {
+      type yang:counter64;
+      description
+        "The number of frames that have been received by this port from
+        its segment. Note that a frame received on the interface
+        corresponding to this port is only counted by this object if and
+        only if it is for a protocol being processed by the local
+        bridging function, including Bridge management frames.";
+      reference
+        "12.6.1.1.3 of IEEE Std 802.1Q-2022";
+    }
+    leaf octets-rx {
+      type yang:counter64;
+      description
+        "The total number of octets in all valid frames received
+        (including BPDUs, frames addressed to the Bridge as an end
+        station, and frames that were submitted to the Forwarding
+        Process).";
+      reference
+        "12.6.1.1.3 of IEEE Std 802.1Q-2022";
+    }
+    leaf frame-tx {
+      type yang:counter64;
+      description
+        "The number of frames that have been transmitted by this port to
+        its segment. Note that a frame transmitted on the interface
+        corresponding to this port is only counted by this object if and
+        only if it is for a protocol being processed by the local
+        bridging function, including Bridge management frames.";
+    }
+    leaf octets-tx {
+      type yang:counter64;
+      description
+        "The total number of octets that have been transmitted by this
+        port to its segment.";
+    }
+    leaf discard-inbound {
+      type yang:counter64;
+      description
+        "Count of received valid frames that were discarded (i.e.,
+        filtered) by the Forwarding Process.";
+      reference
+        "12.6.1.1.3 of IEEE Std 802.1Q-2022";
+    }
+    leaf forward-outbound {
+      type yang:counter64;
+      description
+        "The number of frames forwarded to the associated MAC Entity
+        (8.5).";
+      reference
+        "12.6.1.1.3 of IEEE Std 802.1Q-2022";
+    }
+    leaf discard-lack-of-buffers {
+      type yang:counter64;
+      description
+        "The count of frames that were to be transmitted through the
+        associated Port but were discarded due to lack of buffers.";
+      reference
+        "12.6.1.1.3 of IEEE Std 802.1Q-2022";
+    }
+    leaf discard-transit-delay-exceeded {
+      type yang:counter64;
+      description
+        "The number of frames discarded by this port due to excessive
+        transit delay through the Bridge. It is incremented by both
+        transparent and source route Bridges.";
+      reference
+        "12.6.1.1.3 of IEEE Std 802.1Q-2022";
+    }
+    leaf discard-on-error {
+      type yang:counter64;
+      description
+        "The number of frames that were to be forwarded on the
+        associated MAC but could not be transmitted (e.g., frame would
+        be too large, 6.5.8).";
+      reference
+        "12.6.1.1.3 of IEEE Std 802.1Q-2022";
+    }
+  }
+}
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/mwt/ieee802-dot1q-types.yang-generated.tdltx b/plugins/org.etsi.mts.tdl.yang2json/samples/mwt/ieee802-dot1q-types.yang-generated.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..7076fe4a4b7027f89c9ef97128591a70cb223e81
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/mwt/ieee802-dot1q-types.yang-generated.tdltx
@@ -0,0 +1,5 @@
+Package generated_from_ieee802_dot1q_types_yang {
+    Type String
+    Type TODO_RESOLVE_REFERENCED
+    Use "ieee802-dot1q-types.yang" as SOURCE_MAPPING
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/mwt/ieee802-types.yang b/plugins/org.etsi.mts.tdl.yang2json/samples/mwt/ieee802-types.yang
new file mode 100644
index 0000000000000000000000000000000000000000..f7bce9974e0d04c7dba82729dd3642d349747896
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/mwt/ieee802-types.yang
@@ -0,0 +1,287 @@
+module ieee802-types {
+  namespace urn:ieee:std:802.1Q:yang:ieee802-types;
+  prefix ieee;
+  organization
+    "IEEE 802.1 Working Group";
+  contact
+    "WG-URL: http://ieee802.org/1/
+    WG-EMail: stds-802-1-l@ieee.org
+    
+    Contact: IEEE 802.1 Working Group Chair
+    Postal: C/O IEEE 802.1 Working Group
+           IEEE Standards Association
+           445 Hoes Lane
+           Piscataway, NJ 08854
+           USA
+    
+    E-mail: stds-802-1-chairs@ieee.org";
+  description
+    "This module contains a collection of generally useful derived data
+    types for IEEE YANG models.
+    
+    Copyright (C) IEEE (2022).
+    
+    This version of this YANG module is part of IEEE Std 802.1Q; see the
+    standard itself for full legal notices.";
+  revision 2022-05-19 {
+    description
+      "Published as part of IEEE Std 802.1Q-2022.";
+    reference
+      "IEEE Std 802.1Q-2022, Bridges and Bridged Networks.";
+  }
+  revision 2021-08-25 {
+    description
+      "Published as part of IEEE Std 802.1ABcu";
+    reference
+      "IEEE Std 802.1AB-2016";
+  }
+  revision 2020-06-04 {
+    description
+      "Published as part of IEEE Std 802.1Qcx-2020. Second version.";
+    reference
+      "IEEE Std 802.1Qcx-2020, Bridges and Bridged Networks - YANG Data
+      Model for Connectivity Fault Management.";
+  }
+  revision 2018-03-07 {
+    description
+      "Published as part of IEEE Std 802.1Q-2018. Initial version.";
+    reference
+      "IEEE Std 802.1Q-2018, Bridges and Bridged Networks.";
+  }
+  typedef mac-address {
+    type string {
+      pattern "[0-9a-fA-F]{2}(-[0-9a-fA-F]{2}){5}";
+    }
+    description
+      "The mac-address type represents a MAC address in the canonical
+      format and hexadecimal format specified by IEEE Std 802. The
+      hexidecimal representation uses uppercase characters.";
+    reference
+      "3.1, 8.1 of IEEE Std 802-2014";
+  }
+  typedef chassis-id-subtype-type {
+    type enumeration {
+      enum chassis-component {
+        value 1;
+        description
+          "Represents a chassis identifier based on the value of
+          entPhysicalAlias object (defined in IETF RFC 2737) for a
+          chassis component (i.e., an entPhysicalClass value of
+          chassis(3))";
+      }
+      enum interface-alias {
+        value 2;
+        description
+          "Represents a chassis identifier based on the value of ifAlias
+          object (defined in IETF RFC 2863) for an interface on the
+          containing chassis.";
+      }
+      enum port-component {
+        value 3;
+        description
+          "Represents a chassis identifier based on the value of
+          entPhysicalAlias object (defined in IETF RFC 2737) for a port
+          or backplane component (i.e., entPhysicalClass value of
+          port(10) or backplane(4)), within the containing chassis.";
+      }
+      enum mac-address {
+        value 4;
+        description
+          "Represents a chassis identifier based on the value of a
+          unicast source address (encoded in network byte order and IEEE
+          802.3 canonical bit order), of a port on the containing
+          chassis as defined in IEEE Std 802-2001.";
+      }
+      enum network-address {
+        value 5;
+        description
+          "Represents a chassis identifier based on a network address,
+          associated with a particular chassis. The encoded address is
+          actually composed of two fields. The first field is a single
+          octet, representing the IANA AddressFamilyNumbers value for
+          the specific address type, and the second field is the network
+          address value.";
+      }
+      enum interface-name {
+        value 6;
+        description
+          "Represents a chassis identifier based on the value of ifName
+          object (defined in IETF RFC 2863) for an interface on the
+          containing chassis.";
+      }
+      enum local {
+        value 7;
+        description
+          "Represents a chassis identifier based on a locally defined
+          value.";
+      }
+    }
+    description
+      "The source of a chassis identifier.";
+    reference
+      "IEEE Std 802-2014;" +
+      "IETF RFC 2737;" +
+      "IETF RFC 2863";
+  }
+  typedef chassis-id-type {
+    type string {
+      length "1..255";
+    }
+    description
+      "The format of a chassis identifier string. Objects of this type
+      are always used with an associated lldp-chassis-is-subtype object,
+      which identifies the format of the particular lldp-chassis-id
+      object instance.
+      
+      If the associated lldp-chassis-id-subtype object has a value of
+      chassis-component, then the octet string identifies a particular
+      instance of the entPhysicalAlias object (defined in IETF RFC 2737)
+      for a chassis component (i.e., an entPhysicalClass value of
+      chassis(3)).
+      
+      If the associated lldp-chassis-id-subtype object has a value of
+      interface-alias, then the octet string identifies a particular
+      instance of the ifAlias object (defined in IETF RFC 2863) for an
+      interface on the containing chassis. If the particular ifAlias
+      object does not contain any values, another chassis identifier
+      type should be used.
+      
+      If the associated lldp-chassis-id-subtype object has a value of
+      port-component, then the octet string identifies a particular
+      instance of the entPhysicalAlias object (defined in IETF RFC 2737)
+      for a port or backplane component within the containing chassis.
+      
+      If the associated lldp-chassis-id-subtype object has a value of
+      mac-address, then this string identifies a particular unicast
+      source address (encoded in network byte order and IEEE 802.3
+      canonical bit order), of a port on the containing chassis as
+      defined in IEEE Std 802-2001.
+      
+      If the associated lldp-chassis-id-subtype object has a value of
+      network-address, then this string identifies a particular network
+      address, encoded in network byte order, associated with one or
+      more ports on the containing chassis. The first octet contains the
+      IANA Address Family Numbers enumeration value for the specific
+      address type, and octets 2 through N contain the network address
+      value in network byte order.
+      
+      If the associated lldp-chassis-id-subtype object has a value of
+      interface-name, then the octet string identifies a particular
+      instance of the ifName object (defined in IETF RFC 2863) for an
+      interface on the containing chassis. If the particular ifName
+      object does not contain any values, another chassis identifier
+      type should be used.
+      
+      If the associated lldp-chassis-id-subtype object has a value of
+      local, then this string identifies a locally assigned Chassis ID.";
+    reference
+      "IEEE Std 802-2014;" +
+      "IETF RFC 2737;" +
+      "IETF RFC 2863";
+  }
+  typedef port-id-subtype-type {
+    type enumeration {
+      enum interface-alias {
+        value 1;
+        description
+          "Represents a port identifier based on the ifAlias MIB object,
+          defined in IETF RFC 2863.";
+      }
+      enum port-component {
+        value 2;
+        description
+          "Represents a port identifier based on the value of
+          entPhysicalAlias (defined in IETF RFC 2737) for a port
+          component (i.e., entPhysicalClass value of port(10)), within
+          the containing chassis.";
+      }
+      enum mac-address {
+        value 3;
+        description
+          "Represents a port identifier based on a unicast source
+          address (encoded in network byte order and IEEE 802.3
+          canonical bit order), which has been detected by the agent and
+          associated with a particular port (IEEE Std 802-2001).";
+      }
+      enum network-address {
+        value 4;
+        description
+          "Represents a port identifier based on a network address,
+          detected by the agent and associated with a particular port.";
+      }
+      enum interface-name {
+        value 5;
+        description
+          "Represents a port identifier based on the ifName MIB object,
+          defined in IETF RFC 2863.";
+      }
+      enum agent-circuit-id {
+        value 6;
+        description
+          "Represents a port identifier based on the agent-local
+          identifier of the circuit (defined in RFC 3046), detected by
+          the agent and associated with a particular port.";
+      }
+      enum local {
+        value 7;
+        description
+          "Represents a port identifier based on a value locally
+          assigned.";
+      }
+    }
+    description
+      "The source of a particular type of port identifier used in the
+      LLDP YANG module.";
+  }
+  typedef port-id-type {
+    type string {
+      length "1..255";
+    }
+    description
+      "The format of a port identifier string. Objects of this type are
+      always used with an associated port-id-subtype object, which
+      identifies the format of the particular lldp-port-id object
+      instance.
+      
+      If the associated port-id-subtype object has a value of
+      interface-alias, then the octet string identifies a particular
+      instance of the ifAlias object (defined in IETF RFC 2863). If the
+      particular ifAlias object does not contain any values, another
+      port identifier type should be used.
+      
+      If the associated port-id-subtype object has a value of
+      port-component, then the octet string identifies a particular
+      instance of the entPhysicalAlias object (defined in IETF RFC 2737)
+      for a port or backplane component.
+      
+      If the associated port-id-subtype object has a value of
+      mac-address, then this string identifies a particular unicast
+      source address (encoded in network byte order and IEEE 802.3
+      canonical bit order) associated with the port (IEEE Std 802-2001).
+      
+      If the associated port-id-subtype object has a value of
+      network-address, then this string identifies a network address
+      associated with the port. The first octet contains the IANA
+      AddressFamilyNumbers enumeration value for the specific address
+      type, and octets 2 through N contain the networkAddress address
+      value in network byte order.
+      
+      If the associated port-id-subtype object has a value of
+      interface-name, then the octet string identifies a particular
+      instance of the ifName object (defined in IETF RFC 2863). If the
+      particular ifName object does not contain any values, another port
+      identifier type should be used.
+      
+      If the associated port-id-subtype object has a value of
+      agent-circuit-id, then this string identifies a agent-local
+      identifier of the circuit (defined in RFC 3046).
+      
+      If the associated port-id-subtype object has a value of
+      local, then this string identifies a locally assigned port ID.";
+    reference
+      "IEEE Std 802-2014;" +
+      "IETF RFC 2737;" +
+      "IETF RFC 2863," +
+      "IETF RFC 3046";
+  }
+}
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/mwt/ietf-interfaces@2018-02-20.yang b/plugins/org.etsi.mts.tdl.yang2json/samples/mwt/ietf-interfaces@2018-02-20.yang
new file mode 100644
index 0000000000000000000000000000000000000000..f66c205ce076e65b2ded1d388c944a91829a48b5
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/mwt/ietf-interfaces@2018-02-20.yang
@@ -0,0 +1,1123 @@
+module ietf-interfaces {
+  yang-version 1.1;
+  namespace "urn:ietf:params:xml:ns:yang:ietf-interfaces";
+  prefix if;
+
+  import ietf-yang-types {
+    prefix yang;
+  }
+
+  organization
+    "IETF NETMOD (Network Modeling) Working Group";
+
+  contact
+    "WG Web:   <https://datatracker.ietf.org/wg/netmod/>
+     WG List:  <mailto:netmod@ietf.org>
+
+     Editor:   Martin Bjorklund
+               <mailto:mbj@tail-f.com>";
+
+  description
+    "This module contains a collection of YANG definitions for
+     managing network interfaces.
+
+     Copyright (c) 2018 IETF Trust and the persons identified as
+     authors of the code.  All rights reserved.
+
+     Redistribution and use in source and binary forms, with or
+     without modification, is permitted pursuant to, and subject
+     to the license terms contained in, the Simplified BSD License
+     set forth in Section 4.c of the IETF Trust's Legal Provisions
+     Relating to IETF Documents
+     (https://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC 8343; see
+     the RFC itself for full legal notices.";
+
+  revision 2018-02-20 {
+    description
+      "Updated to support NMDA.";
+    reference
+      "RFC 8343: A YANG Data Model for Interface Management";
+  }
+
+  revision 2014-05-08 {
+    description
+      "Initial revision.";
+    reference
+      "RFC 7223: A YANG Data Model for Interface Management";
+  }
+
+  /*
+   * Typedefs
+   */
+
+  typedef interface-ref {
+    type leafref {
+      path "/if:interfaces/if:interface/if:name";
+    }
+    description
+      "This type is used by data models that need to reference
+       interfaces.";
+  }
+
+  /*
+   * Identities
+   */
+
+  identity interface-type {
+    description
+      "Base identity from which specific interface types are
+       derived.";
+  }
+
+  /*
+   * Features
+   */
+
+  feature arbitrary-names {
+    description
+      "This feature indicates that the device allows user-controlled
+       interfaces to be named arbitrarily.";
+  }
+  feature pre-provisioning {
+    description
+      "This feature indicates that the device supports
+       pre-provisioning of interface configuration, i.e., it is
+       possible to configure an interface whose physical interface
+       hardware is not present on the device.";
+  }
+  feature if-mib {
+    description
+      "This feature indicates that the device implements
+       the IF-MIB.";
+    reference
+      "RFC 2863: The Interfaces Group MIB";
+  }
+
+  /*
+   * Data nodes
+   */
+
+  container interfaces {
+    description
+      "Interface parameters.";
+
+    list interface {
+      key "name";
+
+      description
+        "The list of interfaces on the device.
+
+         The status of an interface is available in this list in the
+         operational state.  If the configuration of a
+         system-controlled interface cannot be used by the system
+         (e.g., the interface hardware present does not match the
+         interface type), then the configuration is not applied to
+         the system-controlled interface shown in the operational
+         state.  If the configuration of a user-controlled interface
+         cannot be used by the system, the configured interface is
+         not instantiated in the operational state.
+
+         System-controlled interfaces created by the system are
+         always present in this list in the operational state,
+         whether or not they are configured.";
+
+     leaf name {
+        type string;
+        description
+          "The name of the interface.
+
+           A device MAY restrict the allowed values for this leaf,
+           possibly depending on the type of the interface.
+           For system-controlled interfaces, this leaf is the
+           device-specific name of the interface.
+
+           If a client tries to create configuration for a
+           system-controlled interface that is not present in the
+           operational state, the server MAY reject the request if
+           the implementation does not support pre-provisioning of
+           interfaces or if the name refers to an interface that can
+           never exist in the system.  A Network Configuration
+           Protocol (NETCONF) server MUST reply with an rpc-error
+           with the error-tag 'invalid-value' in this case.
+
+           If the device supports pre-provisioning of interface
+           configuration, the 'pre-provisioning' feature is
+           advertised.
+
+           If the device allows arbitrarily named user-controlled
+           interfaces, the 'arbitrary-names' feature is advertised.
+
+           When a configured user-controlled interface is created by
+           the system, it is instantiated with the same name in the
+           operational state.
+
+           A server implementation MAY map this leaf to the ifName
+           MIB object.  Such an implementation needs to use some
+           mechanism to handle the differences in size and characters
+           allowed between this leaf and ifName.  The definition of
+           such a mechanism is outside the scope of this document.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifName";
+      }
+
+      leaf description {
+        type string;
+        description
+          "A textual description of the interface.
+
+           A server implementation MAY map this leaf to the ifAlias
+           MIB object.  Such an implementation needs to use some
+           mechanism to handle the differences in size and characters
+           allowed between this leaf and ifAlias.  The definition of
+           such a mechanism is outside the scope of this document.
+
+           Since ifAlias is defined to be stored in non-volatile
+           storage, the MIB implementation MUST map ifAlias to the
+           value of 'description' in the persistently stored
+           configuration.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifAlias";
+      }
+
+      leaf type {
+        type identityref {
+          base interface-type;
+        }
+        mandatory true;
+        description
+          "The type of the interface.
+
+           When an interface entry is created, a server MAY
+           initialize the type leaf with a valid value, e.g., if it
+           is possible to derive the type from the name of the
+           interface.
+
+           If a client tries to set the type of an interface to a
+           value that can never be used by the system, e.g., if the
+           type is not supported or if the type does not match the
+           name of the interface, the server MUST reject the request.
+           A NETCONF server MUST reply with an rpc-error with the
+           error-tag 'invalid-value' in this case.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifType";
+      }
+
+      leaf enabled {
+        type boolean;
+        default "true";
+        description
+          "This leaf contains the configured, desired state of the
+           interface.
+
+           Systems that implement the IF-MIB use the value of this
+           leaf in the intended configuration to set
+           IF-MIB.ifAdminStatus to 'up' or 'down' after an ifEntry
+           has been initialized, as described in RFC 2863.
+
+           Changes in this leaf in the intended configuration are
+           reflected in ifAdminStatus.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifAdminStatus";
+      }
+
+      leaf link-up-down-trap-enable {
+        if-feature if-mib;
+        type enumeration {
+          enum enabled {
+            value 1;
+            description
+              "The device will generate linkUp/linkDown SNMP
+               notifications for this interface.";
+          }
+          enum disabled {
+            value 2;
+            description
+              "The device will not generate linkUp/linkDown SNMP
+               notifications for this interface.";
+          }
+        }
+        description
+          "Controls whether linkUp/linkDown SNMP notifications
+           should be generated for this interface.
+
+           If this node is not configured, the value 'enabled' is
+           operationally used by the server for interfaces that do
+           not operate on top of any other interface (i.e., there are
+           no 'lower-layer-if' entries), and 'disabled' otherwise.";
+        reference
+          "RFC 2863: The Interfaces Group MIB -
+                     ifLinkUpDownTrapEnable";
+      }
+
+      leaf admin-status {
+        if-feature if-mib;
+        type enumeration {
+          enum up {
+            value 1;
+            description
+              "Ready to pass packets.";
+          }
+          enum down {
+            value 2;
+            description
+              "Not ready to pass packets and not in some test mode.";
+          }
+          enum testing {
+            value 3;
+            description
+              "In some test mode.";
+          }
+        }
+        config false;
+        mandatory true;
+        description
+          "The desired state of the interface.
+
+           This leaf has the same read semantics as ifAdminStatus.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifAdminStatus";
+      }
+
+      leaf oper-status {
+        type enumeration {
+          enum up {
+            value 1;
+            description
+              "Ready to pass packets.";
+          }
+          enum down {
+            value 2;
+
+            description
+              "The interface does not pass any packets.";
+          }
+          enum testing {
+            value 3;
+            description
+              "In some test mode.  No operational packets can
+               be passed.";
+          }
+          enum unknown {
+            value 4;
+            description
+              "Status cannot be determined for some reason.";
+          }
+          enum dormant {
+            value 5;
+            description
+              "Waiting for some external event.";
+          }
+          enum not-present {
+            value 6;
+            description
+              "Some component (typically hardware) is missing.";
+          }
+          enum lower-layer-down {
+            value 7;
+            description
+              "Down due to state of lower-layer interface(s).";
+          }
+        }
+        config false;
+        mandatory true;
+        description
+          "The current operational state of the interface.
+
+           This leaf has the same semantics as ifOperStatus.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifOperStatus";
+      }
+
+      leaf last-change {
+        type yang:date-and-time;
+        config false;
+        description
+          "The time the interface entered its current operational
+           state.  If the current state was entered prior to the
+           last re-initialization of the local network management
+           subsystem, then this node is not present.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifLastChange";
+      }
+
+      leaf if-index {
+        if-feature if-mib;
+        type int32 {
+          range "1..2147483647";
+        }
+        config false;
+        mandatory true;
+        description
+          "The ifIndex value for the ifEntry represented by this
+           interface.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifIndex";
+      }
+
+      leaf phys-address {
+        type yang:phys-address;
+        config false;
+        description
+          "The interface's address at its protocol sub-layer.  For
+           example, for an 802.x interface, this object normally
+           contains a Media Access Control (MAC) address.  The
+           interface's media-specific modules must define the bit
+           and byte ordering and the format of the value of this
+           object.  For interfaces that do not have such an address
+           (e.g., a serial line), this node is not present.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifPhysAddress";
+      }
+
+      leaf-list higher-layer-if {
+        type interface-ref;
+        config false;
+        description
+          "A list of references to interfaces layered on top of this
+           interface.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifStackTable";
+      }
+
+      leaf-list lower-layer-if {
+        type interface-ref;
+        config false;
+
+        description
+          "A list of references to interfaces layered underneath this
+           interface.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifStackTable";
+      }
+
+      leaf speed {
+        type yang:gauge64;
+        units "bits/second";
+        config false;
+        description
+            "An estimate of the interface's current bandwidth in bits
+             per second.  For interfaces that do not vary in
+             bandwidth or for those where no accurate estimation can
+             be made, this node should contain the nominal bandwidth.
+             For interfaces that have no concept of bandwidth, this
+             node is not present.";
+        reference
+          "RFC 2863: The Interfaces Group MIB -
+                     ifSpeed, ifHighSpeed";
+      }
+
+      container statistics {
+        config false;
+        description
+          "A collection of interface-related statistics objects.";
+
+        leaf discontinuity-time {
+          type yang:date-and-time;
+          mandatory true;
+          description
+            "The time on the most recent occasion at which any one or
+             more of this interface's counters suffered a
+             discontinuity.  If no such discontinuities have occurred
+             since the last re-initialization of the local management
+             subsystem, then this node contains the time the local
+             management subsystem re-initialized itself.";
+        }
+
+        leaf in-octets {
+          type yang:counter64;
+          description
+            "The total number of octets received on the interface,
+             including framing characters.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifHCInOctets";
+        }
+
+        leaf in-unicast-pkts {
+          type yang:counter64;
+          description
+            "The number of packets, delivered by this sub-layer to a
+             higher (sub-)layer, that were not addressed to a
+             multicast or broadcast address at this sub-layer.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifHCInUcastPkts";
+        }
+
+        leaf in-broadcast-pkts {
+          type yang:counter64;
+          description
+            "The number of packets, delivered by this sub-layer to a
+             higher (sub-)layer, that were addressed to a broadcast
+             address at this sub-layer.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB -
+                       ifHCInBroadcastPkts";
+        }
+
+        leaf in-multicast-pkts {
+          type yang:counter64;
+          description
+            "The number of packets, delivered by this sub-layer to a
+             higher (sub-)layer, that were addressed to a multicast
+             address at this sub-layer.  For a MAC-layer protocol,
+             this includes both Group and Functional addresses.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB -
+                       ifHCInMulticastPkts";
+        }
+
+        leaf in-discards {
+          type yang:counter32;
+          description
+            "The number of inbound packets that were chosen to be
+             discarded even though no errors had been detected to
+             prevent their being deliverable to a higher-layer
+             protocol.  One possible reason for discarding such a
+             packet could be to free up buffer space.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifInDiscards";
+        }
+
+        leaf in-errors {
+          type yang:counter32;
+          description
+            "For packet-oriented interfaces, the number of inbound
+             packets that contained errors preventing them from being
+             deliverable to a higher-layer protocol.  For character-
+             oriented or fixed-length interfaces, the number of
+             inbound transmission units that contained errors
+             preventing them from being deliverable to a higher-layer
+             protocol.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifInErrors";
+        }
+
+        leaf in-unknown-protos {
+          type yang:counter32;
+
+          description
+            "For packet-oriented interfaces, the number of packets
+             received via the interface that were discarded because
+             of an unknown or unsupported protocol.  For
+             character-oriented or fixed-length interfaces that
+             support protocol multiplexing, the number of
+             transmission units received via the interface that were
+             discarded because of an unknown or unsupported protocol.
+             For any interface that does not support protocol
+             multiplexing, this counter is not present.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos";
+        }
+
+        leaf out-octets {
+          type yang:counter64;
+          description
+            "The total number of octets transmitted out of the
+             interface, including framing characters.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifHCOutOctets";
+        }
+
+        leaf out-unicast-pkts {
+          type yang:counter64;
+          description
+            "The total number of packets that higher-level protocols
+             requested be transmitted and that were not addressed
+             to a multicast or broadcast address at this sub-layer,
+             including those that were discarded or not sent.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifHCOutUcastPkts";
+        }
+
+        leaf out-broadcast-pkts {
+          type yang:counter64;
+          description
+            "The total number of packets that higher-level protocols
+             requested be transmitted and that were addressed to a
+             broadcast address at this sub-layer, including those
+             that were discarded or not sent.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB -
+                       ifHCOutBroadcastPkts";
+        }
+
+        leaf out-multicast-pkts {
+          type yang:counter64;
+          description
+            "The total number of packets that higher-level protocols
+             requested be transmitted and that were addressed to a
+             multicast address at this sub-layer, including those
+             that were discarded or not sent.  For a MAC-layer
+             protocol, this includes both Group and Functional
+             addresses.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB -
+                       ifHCOutMulticastPkts";
+        }
+
+        leaf out-discards {
+          type yang:counter32;
+          description
+            "The number of outbound packets that were chosen to be
+             discarded even though no errors had been detected to
+             prevent their being transmitted.  One possible reason
+             for discarding such a packet could be to free up buffer
+             space.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifOutDiscards";
+        }
+
+        leaf out-errors {
+          type yang:counter32;
+          description
+            "For packet-oriented interfaces, the number of outbound
+             packets that could not be transmitted because of errors.
+             For character-oriented or fixed-length interfaces, the
+             number of outbound transmission units that could not be
+             transmitted because of errors.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifOutErrors";
+        }
+      }
+
+    }
+  }
+
+  /*
+   * Legacy typedefs
+   */
+
+  typedef interface-state-ref {
+    type leafref {
+      path "/if:interfaces-state/if:interface/if:name";
+    }
+    status deprecated;
+    description
+      "This type is used by data models that need to reference
+       the operationally present interfaces.";
+  }
+
+  /*
+   * Legacy operational state data nodes
+   */
+
+  container interfaces-state {
+    config false;
+    status deprecated;
+    description
+      "Data nodes for the operational state of interfaces.";
+
+    list interface {
+      key "name";
+      status deprecated;
+
+      description
+        "The list of interfaces on the device.
+
+         System-controlled interfaces created by the system are
+         always present in this list, whether or not they are
+         configured.";
+
+      leaf name {
+        type string;
+        status deprecated;
+        description
+          "The name of the interface.
+
+           A server implementation MAY map this leaf to the ifName
+           MIB object.  Such an implementation needs to use some
+           mechanism to handle the differences in size and characters
+           allowed between this leaf and ifName.  The definition of
+           such a mechanism is outside the scope of this document.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifName";
+      }
+
+      leaf type {
+        type identityref {
+          base interface-type;
+        }
+        mandatory true;
+        status deprecated;
+        description
+          "The type of the interface.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifType";
+      }
+
+      leaf admin-status {
+        if-feature if-mib;
+        type enumeration {
+          enum up {
+            value 1;
+            description
+              "Ready to pass packets.";
+          }
+          enum down {
+            value 2;
+            description
+              "Not ready to pass packets and not in some test mode.";
+          }
+          enum testing {
+            value 3;
+            description
+              "In some test mode.";
+          }
+        }
+        mandatory true;
+        status deprecated;
+        description
+          "The desired state of the interface.
+
+           This leaf has the same read semantics as ifAdminStatus.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifAdminStatus";
+      }
+
+      leaf oper-status {
+        type enumeration {
+          enum up {
+            value 1;
+            description
+              "Ready to pass packets.";
+          }
+          enum down {
+            value 2;
+            description
+              "The interface does not pass any packets.";
+          }
+          enum testing {
+            value 3;
+            description
+              "In some test mode.  No operational packets can
+               be passed.";
+          }
+          enum unknown {
+            value 4;
+            description
+              "Status cannot be determined for some reason.";
+          }
+          enum dormant {
+            value 5;
+            description
+              "Waiting for some external event.";
+          }
+          enum not-present {
+            value 6;
+            description
+              "Some component (typically hardware) is missing.";
+          }
+          enum lower-layer-down {
+            value 7;
+            description
+              "Down due to state of lower-layer interface(s).";
+          }
+        }
+        mandatory true;
+        status deprecated;
+        description
+          "The current operational state of the interface.
+
+           This leaf has the same semantics as ifOperStatus.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifOperStatus";
+      }
+
+      leaf last-change {
+        type yang:date-and-time;
+        status deprecated;
+        description
+          "The time the interface entered its current operational
+           state.  If the current state was entered prior to the
+           last re-initialization of the local network management
+           subsystem, then this node is not present.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifLastChange";
+      }
+
+      leaf if-index {
+        if-feature if-mib;
+        type int32 {
+          range "1..2147483647";
+        }
+        mandatory true;
+        status deprecated;
+        description
+          "The ifIndex value for the ifEntry represented by this
+           interface.";
+
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifIndex";
+      }
+
+      leaf phys-address {
+        type yang:phys-address;
+        status deprecated;
+        description
+          "The interface's address at its protocol sub-layer.  For
+           example, for an 802.x interface, this object normally
+           contains a Media Access Control (MAC) address.  The
+           interface's media-specific modules must define the bit
+           and byte ordering and the format of the value of this
+           object.  For interfaces that do not have such an address
+           (e.g., a serial line), this node is not present.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifPhysAddress";
+      }
+
+      leaf-list higher-layer-if {
+        type interface-state-ref;
+        status deprecated;
+        description
+          "A list of references to interfaces layered on top of this
+           interface.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifStackTable";
+      }
+
+      leaf-list lower-layer-if {
+        type interface-state-ref;
+        status deprecated;
+        description
+          "A list of references to interfaces layered underneath this
+           interface.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifStackTable";
+      }
+
+      leaf speed {
+        type yang:gauge64;
+        units "bits/second";
+        status deprecated;
+        description
+            "An estimate of the interface's current bandwidth in bits
+             per second.  For interfaces that do not vary in
+             bandwidth or for those where no accurate estimation can
+
+             be made, this node should contain the nominal bandwidth.
+             For interfaces that have no concept of bandwidth, this
+             node is not present.";
+        reference
+          "RFC 2863: The Interfaces Group MIB -
+                     ifSpeed, ifHighSpeed";
+      }
+
+      container statistics {
+        status deprecated;
+        description
+          "A collection of interface-related statistics objects.";
+
+        leaf discontinuity-time {
+          type yang:date-and-time;
+          mandatory true;
+          status deprecated;
+          description
+            "The time on the most recent occasion at which any one or
+             more of this interface's counters suffered a
+             discontinuity.  If no such discontinuities have occurred
+             since the last re-initialization of the local management
+             subsystem, then this node contains the time the local
+             management subsystem re-initialized itself.";
+        }
+
+        leaf in-octets {
+          type yang:counter64;
+          status deprecated;
+          description
+            "The total number of octets received on the interface,
+             including framing characters.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifHCInOctets";
+        }
+
+        leaf in-unicast-pkts {
+          type yang:counter64;
+          status deprecated;
+          description
+            "The number of packets, delivered by this sub-layer to a
+             higher (sub-)layer, that were not addressed to a
+             multicast or broadcast address at this sub-layer.
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifHCInUcastPkts";
+        }
+
+        leaf in-broadcast-pkts {
+          type yang:counter64;
+          status deprecated;
+          description
+            "The number of packets, delivered by this sub-layer to a
+             higher (sub-)layer, that were addressed to a broadcast
+             address at this sub-layer.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB -
+                       ifHCInBroadcastPkts";
+        }
+
+        leaf in-multicast-pkts {
+          type yang:counter64;
+          status deprecated;
+          description
+            "The number of packets, delivered by this sub-layer to a
+             higher (sub-)layer, that were addressed to a multicast
+             address at this sub-layer.  For a MAC-layer protocol,
+             this includes both Group and Functional addresses.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB -
+                       ifHCInMulticastPkts";
+        }
+
+        leaf in-discards {
+          type yang:counter32;
+          status deprecated;
+
+          description
+            "The number of inbound packets that were chosen to be
+             discarded even though no errors had been detected to
+             prevent their being deliverable to a higher-layer
+             protocol.  One possible reason for discarding such a
+             packet could be to free up buffer space.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifInDiscards";
+        }
+
+        leaf in-errors {
+          type yang:counter32;
+          status deprecated;
+          description
+            "For packet-oriented interfaces, the number of inbound
+             packets that contained errors preventing them from being
+             deliverable to a higher-layer protocol.  For character-
+             oriented or fixed-length interfaces, the number of
+             inbound transmission units that contained errors
+             preventing them from being deliverable to a higher-layer
+             protocol.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifInErrors";
+        }
+
+        leaf in-unknown-protos {
+          type yang:counter32;
+          status deprecated;
+          description
+            "For packet-oriented interfaces, the number of packets
+             received via the interface that were discarded because
+             of an unknown or unsupported protocol.  For
+             character-oriented or fixed-length interfaces that
+             support protocol multiplexing, the number of
+             transmission units received via the interface that were
+             discarded because of an unknown or unsupported protocol.
+             For any interface that does not support protocol
+             multiplexing, this counter is not present.
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos";
+        }
+
+        leaf out-octets {
+          type yang:counter64;
+          status deprecated;
+          description
+            "The total number of octets transmitted out of the
+             interface, including framing characters.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifHCOutOctets";
+        }
+
+        leaf out-unicast-pkts {
+          type yang:counter64;
+          status deprecated;
+          description
+            "The total number of packets that higher-level protocols
+             requested be transmitted and that were not addressed
+             to a multicast or broadcast address at this sub-layer,
+             including those that were discarded or not sent.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifHCOutUcastPkts";
+        }
+
+        leaf out-broadcast-pkts {
+          type yang:counter64;
+          status deprecated;
+
+          description
+            "The total number of packets that higher-level protocols
+             requested be transmitted and that were addressed to a
+             broadcast address at this sub-layer, including those
+             that were discarded or not sent.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB -
+                       ifHCOutBroadcastPkts";
+        }
+
+        leaf out-multicast-pkts {
+          type yang:counter64;
+          status deprecated;
+          description
+            "The total number of packets that higher-level protocols
+             requested be transmitted and that were addressed to a
+             multicast address at this sub-layer, including those
+             that were discarded or not sent.  For a MAC-layer
+             protocol, this includes both Group and Functional
+             addresses.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB -
+                       ifHCOutMulticastPkts";
+        }
+
+        leaf out-discards {
+          type yang:counter32;
+          status deprecated;
+          description
+            "The number of outbound packets that were chosen to be
+             discarded even though no errors had been detected to
+             prevent their being transmitted.  One possible reason
+             for discarding such a packet could be to free up buffer
+             space.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifOutDiscards";
+        }
+
+        leaf out-errors {
+          type yang:counter32;
+          status deprecated;
+          description
+            "For packet-oriented interfaces, the number of outbound
+             packets that could not be transmitted because of errors.
+             For character-oriented or fixed-length interfaces, the
+             number of outbound transmission units that could not be
+             transmitted because of errors.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifOutErrors";
+        }
+      }
+    }
+  }
+}
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/nfv/etsi-nfv-common.yang b/plugins/org.etsi.mts.tdl.yang2json/samples/nfv/etsi-nfv-common.yang
new file mode 100644
index 0000000000000000000000000000000000000000..0a1c361eddba042598317e1bec71d6797a287d03
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/nfv/etsi-nfv-common.yang
@@ -0,0 +1,736 @@
+submodule etsi-nfv-common {
+  yang-version 1.1;
+  belongs-to etsi-nfv-descriptors {
+    prefix nfv;
+  }
+  organization
+    "European Telecommunications Standards Institute (ETSI)";
+
+  description
+    "Common data types for ETSI data models.";
+
+  revision 2019-04-25 {
+    description
+      "Initial revision
+
+       Common data structures to support VNFD and NSD according to:
+       ETSI GS NFV-IFA 014 Ed261v252
+       ETSI GS NFV-IFA 011 Ed261v254";
+  }
+
+  /*
+   * Identities.
+   */
+  identity layer-protocol {
+  }
+  identity ethernet {
+    base layer-protocol;
+  }
+  identity mpls {
+    base layer-protocol;
+  }
+  identity odu2 {
+    base layer-protocol;
+  }
+  identity ipv4 {
+    base layer-protocol;
+  }
+  identity ipv6 {
+    base layer-protocol;
+  }
+  identity pseudo-wire {
+    base layer-protocol;
+  }
+
+  identity address-type {
+    description
+      "Describes the type of the address to be assigned to the CP
+       instantiated from the parent CPD.
+       Value:
+       • MAC address.
+       • IP address.
+       • …
+       The content type shall be aligned with the address type
+       supported by the layerProtocol attribute of the parent CPD.";
+    reference
+      "GS NFV IFA011: Section 7.1.3.3, AddressData information
+       element.";
+  }
+  identity mac-address {
+    base address-type;
+  }
+  identity ip-address {
+    base address-type;
+  }
+
+  identity supported-operation {
+    description
+      "Indicates which operations are available for this DF via the
+       VNF LCM interface. Instantiate VNF, Query VNF and Terminate
+       VNF are supported in all DF and therefore need not be
+       included in this list.";
+    reference
+      "GS NFV IFA011: Section 7.1.8.2 VnfDf information element";
+  }
+  identity instantiate-vnf {
+    base supported-operation;
+    description
+      "This operation instantiates a particular DF of a VNF based on
+       the definition in the VNFD.";
+    reference
+      "GS NFV IFA007: Section 7.2.3 Instantiate VNF Operation";
+  }
+  identity scale-vnf {
+    base supported-operation;
+    description
+      "This operation provides methods to request scaling a VNF in
+       multiple ways:
+       • horizontal scaling:
+         - scale out: adding additional VNFC instances to the VNF to
+           increase capacity
+         - scale in: removing VNFC instances from the VNF, in order to
+           release unused capacity";
+    reference
+      "GS NFV IFA007: Section 7.2.4 Scale VNF Operation";
+  }
+  identity scale-vnf-to-level {
+    base supported-operation;
+    description
+      "This operation scales an instantiated VNF of a particular DF to
+       a target size. The target size is either expressed as an
+       instantiation level of that DF as defined in the VNFD, or given
+       as a list of scale levels, one per scaling aspect of that DF.
+       Instantiation levels and scaling aspects are declared in the
+       VNFD. Typically, the result of this operation is adding and/or
+       removing Network Functions Virtualization Infrastructure (NFVI)
+       resources to/from the VNF.";
+    reference
+      "GS NFV IFA007: Section 7.2.5 Scale VNF To Level Operation";
+  }
+  identity change-vnf-flavour {
+    base supported-operation;
+    description
+      "This operation changes the DF of a VNF instance.";
+    reference
+      "GS NFV IFA007: Section 7.2.6 Change VNF Flavour Operation";
+  }
+  identity terminate-vnf {
+    base supported-operation;
+    description
+      "This operation terminates a VNF.
+
+       A VNF can be terminated gracefully or forcefully. Graceful
+       termination means that the VNFM arranges to take the
+       VNF out of service, e.g. by asking the VNF's EM to take the
+       VNF out of service, and only after that shuts down the
+       VNF and releases the resources. Forceful termination means that
+       the VNFM immediately shuts down the VNF and releases the
+       resources. A time interval can be specified for taking the VNF
+       out of service, after which the VNF is shut down if taking it
+       out of service has not completed.";
+    reference
+      "GS NFV IFA007: Section 7.2.7 Terminate VNF Operation";
+  }
+  identity query-vnf {
+    base supported-operation;
+    description
+      "This operation provides information about VNF instances. The
+       applicable VNF instances can be chosen based on
+       filtering criteria, and the information can be restricted to
+       selected attributes.";
+    reference
+      "GS NFV IFA007: Section 7.2.9 Query VNF Operation";
+  }
+  identity heal-vnf {
+    base supported-operation;
+    description
+      "This operation enables the NFVO to request a VNFM to perform a
+       VNF healing procedure.";
+    reference
+      "GS NFV IFA007: Section 7.2.10 Heal VNF Operation";
+  }
+  identity operate-vnf {
+    base supported-operation;
+    description
+      "This operation enables requesting to change the state of a VNF
+       instance, including starting and stopping the VNF instance.";
+    reference
+      "GS NFV IFA007: Section 7.2.11 Operate VNF Operation";
+  }
+  identity modify-vnf-information {
+    base supported-operation;
+    description
+      "This operation allows updating information about a VNF
+       instance.";
+    reference
+      "GS NFV IFA007: Section 7.2.12 Modify VNF Operation";
+  }
+
+  identity cp-role {
+    description
+      "Identifies the role of the port in the context of the traffic
+       flow patterns in the VNF or parent NS.";
+    reference
+      "GS NFV IFA011: Section 7.1.6.3 Cpd information element";
+  }
+  identity root {
+    base cp-role;
+  }
+  identity leaf {
+    base cp-role;
+  }
+
+  identity checksum-algorithm {
+    description
+      "Identifies the algorithms supported for the purpose of
+       calculating the checksum.";
+    reference
+      "GS NFV IFA011: Section 7.1.6.10 Checksum information element.";
+  }
+
+  identity sha-224 {
+    base checksum-algorithm;
+    description
+      "SHA-224.";
+    reference
+      "GS NFV IFA011: Section 7.1.6.10 Checksum information element.";
+  }
+
+  identity sha-256 {
+    base checksum-algorithm;
+    description
+      "SHA-256.";
+    reference
+      "GS NFV IFA011: Section 7.1.6.10 Checksum information element.";
+  }
+
+  identity sha-384 {
+    base checksum-algorithm;
+    description
+      "SHA-384.";
+    reference
+      "GS NFV IFA011: Section 7.1.6.10 Checksum information element.";
+  }
+
+  identity sha-512 {
+    base checksum-algorithm;
+    description
+      "SHA-512.";
+    reference
+      "GS NFV IFA011: Section 7.1.6.10 Checksum information element.";
+  }
+
+  identity storage-type {
+    description
+      "Base type of storage that identities can derive from.";
+  }
+
+  identity root-storage {
+    base storage-type;
+    description
+      "Root type of storage.";
+  }
+
+  identity swap-storage {
+    base storage-type;
+    description
+      "Swap type of storage.";
+  }
+
+  identity ephemeral-storage {
+    base storage-type;
+    description
+      "Ephemeral type of storage.";
+  }
+
+  /*
+   * Typedefs
+   */
+
+  typedef flow-pattern {
+    type enumeration {
+      enum line;
+      enum tree;
+      enum mesh;
+    }
+  }
+
+  typedef affinity-type {
+    type enumeration {
+      enum "affinity";
+      enum "anti-affinity";
+    }
+  }
+
+  typedef affinity-scope {
+    type enumeration {
+      enum "nfvi-node";
+      enum "zone-group";
+      enum "zone";
+      enum "nfvi-pop";
+    }
+  }
+
+  typedef internal-lifecycle-management-script-event {
+    type enumeration {
+      enum "start-instantiation";
+      enum "end-instantiation";
+      enum "start-scaling";
+      enum "end-scaling";
+      enum "start-healing";
+      enum "end-healing";
+      enum "start-termination";
+      enum "end-termination";
+      enum "start-vnf-flavour-change";
+      enum "end-vnf-flavour-change";
+      enum "start-vnf-operation-change";
+      enum "end-vnf-operation-change";
+      enum "start-vnf-ext-conn-change";
+      enum "end-vnf-ext-conn-change";
+      enum "start-vnfinfo-modification";
+      enum "end-vnfinfo-modification";
+    }
+  }
+
+  grouping local-affinity-or-anti-affinity-rule {
+    list local-affinity-or-anti-affinity-rule {
+      key "affinity-type affinity-scope";
+      leaf affinity-type {
+        type affinity-type;
+        description
+          "Specifies whether the rule is an affinity rule or an
+           anti-affinity rule.";
+        reference
+          "GS NFV IFA011: Section 7.1.8.11,
+           LocalAffinityOrAntiAffinityRule information element.";
+      }
+
+      leaf affinity-scope {
+        type affinity-scope;
+        description
+          "Specifies the scope of the rule, possible values are
+           'NFVI-PoP', 'Zone', 'ZoneGroup', 'NFVI-node'.";
+        reference
+          "GS NFV IFA011: Section 7.1.8.11,
+           LocalAffinityOrAntiAffinityRule information element.";
+      }
+    }
+  }
+
+  grouping connectivity-type {
+    container connectivity-type {
+      leaf-list layer-protocol {
+        type identityref {
+          base layer-protocol;
+        }
+        description
+          "Identifies the protocols that the VL uses (Ethernet,
+           MPLS, ODU2, IPV4, IPV6, Pseudo-Wire). The top layer
+           protocol of the VL protocol stack shall always be provided.
+           The lower layer protocols may be included when there are
+           specific requirements on these layers.";
+        reference
+          "GS NFV IFA011: Section 7.1.7.3, ConnectivityType
+           information element.";
+      }
+
+      leaf flow-pattern {
+        type flow-pattern;
+        description
+          "Identifies the flow pattern of the connectivity (Line,
+           Tree, Mesh).";
+        reference
+          "GS NFV IFA011: Section 7.1.7.3, ConnectivityType
+           information element.";
+      }
+    }
+  }
+
+  grouping link-bitrate-requirements {
+    leaf root {
+      type uint64;
+      units "Mbps";
+      mandatory true;
+      description
+        "Specifies the throughput requirement of
+         the link (e.g. bitrate of E-Line, root bitrate
+         of E-Tree, aggregate capacity of E-LAN).";
+      reference
+        "GS NFV IFA011: Section 7.1.8.6, LinkBitrateRequirements
+         information element.";
+    }
+
+    leaf leaf {
+      type uint64;
+      units "Mbps";
+      description
+        "Specifies the throughput requirement of
+        leaf connections to the link when
+        applicable to the connectivity type (e.g. for
+        E-Tree and E-LAN branches).";
+      reference
+        "GS NFV IFA011: Section 7.1.8.6, LinkBitrateRequirements
+         information element.";
+    }
+  }
+
+  grouping monitoring-parameter {
+    leaf name {
+      type string;
+      description
+        "Human readable name of the monitoring parameter.";
+      reference
+        "GS NFV IFA011: Section 7.1.11.3, MonitoringParameter
+         information element.";
+    }
+    leaf performance-metric {
+      type string;
+      description
+        "Performance metric that is monitored. This attribute shall
+         contain the related 'Measurement Name' value as defined in
+         clause 7.2 of ETSI GS NFV-IFA 027";
+      reference
+        "GS NFV IFA011: Section 7.1.11.3, MonitoringParameter
+         information element and Section 7.2 of ETSI GS NFV-IFA 027.";
+    }
+    leaf collection-period {
+      type uint64;
+      units "ms";
+      description
+        "An attribute that describes the recommended periodicity at
+         which to collect the performance information. VNFM determines
+         if this parameter is considered.
+
+         The vendor may provide this information as a guidance for
+         creating PmJobs if needed.";
+      reference
+        "GS NFV IFA011: Section 7.1.11.3, MonitoringParameter
+         information element.";
+    }
+  }
+
+  grouping security-parameters {
+    leaf signature {
+      type string;
+      description
+        "Provides the signature of the signed part of the
+         descriptor.";
+      reference
+        "GS NFV IFA014: Section 6.2.5, SecurityParameters
+         information element.";
+    }
+    leaf algorithm {
+      type string;
+      description
+        "Identifies the algorithm used to compute the signature.";
+      reference
+        "GS NFV IFA014: Section 6.2.5, SecurityParameters
+         information element.";
+    }
+    leaf certificate {
+      type string;
+      description
+        "Provides a certificate or a reference to a certificate to
+         validate the signature.";
+      reference
+        "GS NFV IFA014: Section 6.2.5, SecurityParameters
+         information element.";
+    }
+  }
+
+  grouping cpd {
+    description
+      "A Cpd information element describes network
+       connectivity to a compute resource or a VL.";
+    reference
+      "GS NFV IFA011: Section 7.1.6.3 Cpd information element";
+
+    leaf id {
+      type string;
+      description
+        "Identifier of this Cpd information element.";
+      reference
+        "GS NFV IFA011: Section 7.1.6.3 Cpd information element";
+    }
+
+    leaf-list layer-protocol {
+      default ethernet;
+      type identityref {
+        base layer-protocol;
+      }
+      description
+        "Identifies a protocol that the connection points
+         corresponding to the CPD support for connectivity purposes
+         (e.g. Ethernet, MPLS, ODU2, IPV4, IPV6, Pseudo-Wire, etc.).";
+      reference
+        "GS NFV IFA011: Section 7.1.6.3 Cpd information element";
+    }
+
+    leaf role {
+      type identityref {
+        base cp-role;
+      }
+      description
+        "Identifies the role of the connection points
+         corresponding to the CPD in the context of the traffic
+         flow patterns in the VNF, PNF or NS. For example an NS with
+         a tree flow pattern within the NS will have legal cpRoles
+         of ROOT and LEAF.";
+      reference
+        "GS NFV IFA011: Section 7.1.6.3 Cpd information element";
+    }
+
+    leaf description {
+      type string;
+      description
+        "Provides human-readable information on the purpose of the
+         connection point (e.g. connection point for control plane
+         traffic).";
+      reference
+        "GS NFV IFA011: Section 7.1.6.3 Cpd information element";
+    }
+
+    list protocol {
+      key "associated-layer-protocol";
+
+      leaf associated-layer-protocol {
+        type identityref {
+          base layer-protocol;
+        }
+        description
+          "One of the values of the attribute layerProtocol of the Cpd
+           IE.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.8 CpProtocolData information
+           element";
+      }
+
+      list address-data {
+        key "type";
+
+        leaf type {
+          type identityref {
+            base address-type;
+          }
+          description
+            "Describes the type of the address to be assigned to the
+             CP instantiated from the parent CPD.
+             Value:
+               • MAC address.
+               • IP address.
+               • Etc.
+             The content type shall be aligned with the address type
+             supported by the layerProtocol attribute of the parent
+             CPD.";
+          reference
+            "GS NFV IFA011: Section 7.1.3.3 AddressData information
+             element";
+        }
+
+        container l2-address-data {
+          when "../type='mac-address'";
+          leaf mac-address-assignment {
+            type boolean;
+            mandatory true;
+            description
+              "Specify if the MAC address assignment is the
+               responsibility of management and orchestration function
+               or not. If it is set to True, it is the management and
+               orchestration function responsibility. If it is set to
+               False, it will be provided by an external entity,
+               e.g. OSS/BSS.";
+            reference
+              "GS NFV IFA011: Section 7.1.3.5 L2AddressData
+               information element";
+          }
+
+          description
+            "Provides the information on the MAC addresses to be
+             assigned to the CP(s) instantiated from the parent CPD.
+             Shall be present when the addressType is MAC address.";
+          reference
+            "GS NFV IFA011: Section 7.1.3.3 AddressData information
+             element";
+        }
+
+        container l3-address-data {
+          when "../type='ip-address'";
+          leaf ip-address-assignment {
+            type boolean;
+            mandatory true;
+            description
+              "Specify if the address assignment is the responsibility
+               of management and orchestration function or not. If it
+               is set to True, it is the management and orchestration
+               function responsibility. ";
+            reference
+              "GS NFV IFA011: Section 7.1.3.4, L3AddressData
+               information element.";
+          }
+
+          leaf floating-ip-activated {
+            type boolean;
+            mandatory true;
+            description
+              "Specify if the floating IP scheme is activated on the CP
+               or not.";
+            reference
+              "GS NFV IFA011: Section 7.1.3.4, L3AddressData
+               information element.";
+          }
+
+          leaf ip-address-type {
+            type enumeration {
+              enum "ipv4";
+              enum "ipv6";
+            }
+            description
+              "Define address type. The address type should be aligned
+               with the address type supported by the layerProtocol
+               attribute of the parent VnfExtCpd.";
+            reference
+              "GS NFV IFA011: Section 7.1.3.4, L3AddressData
+               information element.";
+          }
+
+          leaf number-of-ip-addresses {
+            type uint32;
+            description
+              "Minimum number of IP addresses to be assigned based on
+               this L3AddressData information element.";
+            reference
+              "GS NFV IFA011: Section 7.1.3.4, L3AddressData
+               information element.";
+          }
+        }
+        description
+          "Provides information on the addresses to be assigned to the
+           CP(s) instantiated from the CPD.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.8 CpProtocolData information
+           element";
+      }
+      description
+        "Identifies the protocol layering information the CP uses for
+         connectivity purposes and associated information. There shall
+         be one cpProtocol for each layer protocol as indicated by the
+         attribute layerProtocol. When a PnfExtCpd as defined in ETSI
+         GS NFV-IFA 014 [i.8] is inherited from this Cpd, the
+         cardinality is set to 0.";
+      reference
+        "GS NFV IFA011: Section 7.1.6.3 Cpd information element";
+    }
+
+    leaf trunk-mode {
+      type boolean;
+      description
+        "Information about whether the Cp instantiated from this CPD
+         is in Trunk mode (802.1Q or other). When operating in
+         'trunk mode', the Cp is capable of carrying traffic for
+         several VLANs. A cardinality of 0 implies that trunkMode
+         is not configured for the Cp i.e. It is equivalent to
+         Boolean value 'false'.";
+      reference
+        "GS NFV IFA011: Section 7.1.6.3 Cpd information element";
+    }
+  }
+
+  grouping security-group-rule {
+    list security-group-rule {
+      key "id";
+
+      leaf id {
+        type string;
+        description
+          "Identifier of this SecurityGroupRule information
+           element.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.9, SecurityGroupRule
+           information element.";
+      }
+
+      leaf description {
+        type string;
+        description
+          "Human readable description of the security group rule.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.9, SecurityGroupRule
+           information element.";
+      }
+
+      leaf direction {
+        type enumeration {
+          enum ingress;
+          enum egress;
+        }
+        default "ingress";
+        description
+          "The direction in which the security group rule is applied.
+           Permitted values: INGRESS, EGRESS. Defaults to INGRESS.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.9, SecurityGroupRule
+           information element.";
+      }
+
+      leaf ether-type {
+        type enumeration {
+          enum ipv4;
+          enum ipv6;
+        }
+        default "ipv4";
+        description
+          "Indicates the protocol carried over the Ethernet layer.
+           Permitted values: IPV4, IPV6. Defaults to IPV4.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.9, SecurityGroupRule
+           information element.";
+      }
+
+      leaf protocol {
+        type enumeration {
+          enum tcp;
+          enum udp;
+          enum icmp;
+        }
+        default "tcp";
+        description
+          "Indicates the protocol carried over the IP layer.
+           Permitted values: any protocol defined in the IANA
+           protocol registry, e.g. TCP, UDP, ICMP, etc. Defaults
+           to TCP.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.9, SecurityGroupRule
+           information element.";
+      }
+
+      leaf port-range-min {
+        must ". <= ../port-range-max";
+        type uint16;
+        default "0";
+        description
+          "Indicates minimum port number in the range that is
+           matched by the security group rule. Defaults to 0.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.9, SecurityGroupRule
+           information element.";
+      }
+
+      leaf port-range-max {
+        must ". >= ../port-range-min";
+        type uint16;
+        default "65535";
+        description
+          "Indicates maximum port number in the range that is
+           matched by the security group rule. Defaults to 65535.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.9, SecurityGroupRule
+           information element.";
+      }
+
+      description
+        "Defines security group rules to be used by the VNF.";
+      reference
+        "GS NFV IFA011: Section 7.1.2, VNFD information element.";
+    }
+  }
+}
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/nfv/etsi-nfv-descriptors.yang b/plugins/org.etsi.mts.tdl.yang2json/samples/nfv/etsi-nfv-descriptors.yang
new file mode 100644
index 0000000000000000000000000000000000000000..afedb3b7a4a8daf1178ce22f92df35c9b96188f9
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/nfv/etsi-nfv-descriptors.yang
@@ -0,0 +1,65 @@
+module etsi-nfv-descriptors {
+  yang-version 1.1;
+  namespace "urn:etsi:nfv:yang:etsi-nfv-descriptors";
+  prefix nfv;
+
+  include etsi-nfv-common;
+  include etsi-nfv-ns;
+  include etsi-nfv-vnf;
+  include etsi-nfv-pnf;
+
+  organization
+    "European Telecommunications Standards Institute (ETSI)";
+
+  description
+    "Network Function Virtualization Descriptors";
+
+  revision 2019-04-25 {
+    description
+      "Initial revision.
+       NSD and PNFD according to ETSI GS NFV-IFA 014 Ed261v252
+       VNFD according to ETSI GS NFV-IFA 011 Ed261v254";
+  }
+
+  container nfv {
+    list vnfd {
+      key "id";
+      description
+        "A VNF Descriptor (VNFD) is a deployment template which
+         describes a VNF in terms of deployment and operational
+         behaviour requirements. It also contains connectivity,
+         interface and virtualised resource requirements";
+      reference
+        "GS NFV-IFA011: Section 7.1.2, VNFD information element";
+
+      uses vnfd;
+    }
+
+    list nsd {
+      key "id";
+
+      description
+        "The NSD information element is a deployment template whose
+         instances are used by the NFVO for the lifecycle
+         management of NSs.";
+      reference
+        "GS NFV-IFA014: Section 6.2.2, Network Service Descriptor
+         information element.";
+
+      uses nsd;
+    }
+
+    list pnfd {
+      key "id";
+
+      description
+	"The Pnfd information element is a deployment template
+         enabling on-boarding PNFs and referencing them from an
+         NSD. It focuses on connectivity aspects only.";
+      reference
+        "GS NFV-IFA014: Section 6.6.2, Pnfd information element.";
+
+      uses pnfd;
+    }
+  }
+}
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/nfv/etsi-nfv-ns.yang b/plugins/org.etsi.mts.tdl.yang2json/samples/nfv/etsi-nfv-ns.yang
new file mode 100644
index 0000000000000000000000000000000000000000..1eb49ce02f133723d16093debe9c6aef98d1397a
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/nfv/etsi-nfv-ns.yang
@@ -0,0 +1,1585 @@
+submodule etsi-nfv-ns {
+  yang-version 1.1;
+  belongs-to etsi-nfv-descriptors {
+    prefix nfv;
+  }
+
+  include etsi-nfv-common;
+  include etsi-nfv-vnf;
+  include etsi-nfv-pnf;
+
+  description
+    "Models for NS according to ETSI GS NFV-IFA 014.";
+
+  revision 2019-04-25 {
+    description
+      "Initial revision
+       Common data structure to support NSD according to:
+       ETSI GS NFV-IFA 014 Ed261v252";
+
+    reference
+      "ETSI GS NFV-IFA 014 Ed261v252";
+  }
+
+  grouping resource-handle {
+    leaf vim-id {
+      type string;
+    }
+    leaf resource-provider-id {
+      type string;
+    }
+    leaf resource-id {
+      type string;
+    }
+  }
+
+
+  grouping nsd {
+    leaf id {
+      type string;
+      description
+        "Identifier of this NSD information element. It Globally
+         uniquely identifies an instance of the NSD.";
+      reference
+        "GS NFV IFA014: Section 6.2.2.2 Network Service Descriptor
+         information element";
+    }
+
+    leaf designer {
+      type string;
+      description
+        "Identifies the designer of the NSD.";
+      reference
+        "GS NFV IFA014: Section 6.2.2.2 Network Service Descriptor
+         information element";
+    }
+
+    leaf version {
+      type string;
+      description
+        "Identifies the version of the NSD.";
+      reference
+        "GS NFV IFA014: Section 6.2.2.2 Network Service Descriptor
+         information element";
+    }
+
+    leaf name {
+      type string;
+      description
+        "Provides the human readable name of the NSD.";
+      reference
+        "GS NFV IFA014: Section 6.2.2.2 Network Service Descriptor
+         information element";
+    }
+
+    leaf invariant-id {
+      type string;
+      description
+        "Identifies an NSD in a version independent manner. This
+         attribute is invariant across versions of the network
+         service descriptor.";
+      reference
+        "GS NFV IFA014: Section 6.2.2.2 Network Service Descriptor
+         information element";
+    }
+
+    leaf-list nested-nsd-id {
+      must ". != ../id";
+      type leafref {
+        path "../../nsd/id";
+      }
+      description
+        "References the NSD of a constituent nested NS.";
+      reference
+        "GS NFV IFA014: Section 6.2.2.2 Network Service Descriptor
+         information element";
+    }
+
+    leaf-list vnfd-id {
+      type leafref {
+        path "../../vnfd/id";
+      }
+      description
+        "References the VNFD of a constituent VNF.";
+      reference
+        "GS NFV IFA014: Section 6.2.2.2 Network Service Descriptor
+         information element";
+    }
+
+    leaf-list pnfd-id {
+      type leafref {
+        path "../../pnfd/id";
+      }
+      description
+        "References the PNFD of a constituent PNF.";
+      reference
+        "GS NFV IFA014: Section 6.2.2.2 Network Service Descriptor
+         information element";
+    }
+
+    list sapd {
+      key "id";
+      description
+        "Provides the descriptor of a service access point of the
+         network service.";
+      reference
+        "GS NFV IFA014: Section 6.2.2.2 Network Service Descriptor
+         information element";
+
+      leaf id {
+        type string;
+        description
+          "Identifier of this Cpd information element.";
+        reference
+          "GS NFV IFA014: Section 6.6.3.1 Cpd information element";
+      }
+
+      leaf address-assignment {
+        type boolean;
+        description
+          "Specify whether the SAP address assignment is under the
+           responsibility of management and orchestration functions
+           or not. If it is set to True, management and
+           orchestration functions are responsible for assigning
+           addresses to the access points instantiated from this
+           SAPD.";
+        reference
+          "GS NFV IFA014: Section 6.2.3.2 Sapd information element";
+      }
+
+      choice cpd-or-virtual-link {
+        leaf virtual-link-desc {
+          type leafref {
+            path "../../virtual-link-desc/id";
+          }
+          description
+            "References the descriptor of the NS VL instance to
+             which the SAP instantiated from this SAPD connects to.";
+          reference
+            "GS NFV IFA014: Section 6.2.3.2 Sapd information element";
+        }
+
+        choice associated-cpd-id {
+          container vnf {
+            leaf vnfd-id {
+              mandatory true;
+              type leafref {
+                path "../../../../vnfd/id";
+              }
+              must "boolean(../../../vnfd-id[.=current()])";
+            }
+
+            leaf ext-cpd-id {
+              mandatory true;
+              type leafref {
+                path "deref(../vnfd-id)/../ext-cpd/id";
+              }
+            }
+          }
+
+          container pnf {
+            leaf pnfd-id {
+              mandatory true;
+              type leafref {
+                path "../../../../pnfd/id";
+              }
+              must "boolean(../pnfd-id[.=current()])";
+            }
+
+            leaf ext-cpd-id {
+              mandatory true;
+              type leafref {
+                path "deref(../pnfd-id)/../ext-cpd/id";
+              }
+            }
+          }
+          container ns {
+            leaf nsd-id {
+              mandatory true;
+              type leafref {
+                path "../../../../nsd/id";
+              }
+              must "boolean(../nsd-id[.=current()])";
+            }
+
+            leaf ext-cpd-id {
+              mandatory true;
+              type leafref {
+                path "deref(../nsd-id)/../sapd/id";
+              }
+            }
+          }
+        }
+      }
+    }
+
+    list virtual-link-desc {
+      key "id";
+      description
+        "Provides the constituent VLDs.";
+      reference
+        "GS NFV IFA014: Section 6.2.2.2 Network Service Descriptor
+         information element";
+      leaf id {
+        type string;
+        description
+          "Identifier of the NsVirtualLinkDesc information element.
+           It uniquely identifies a VLD.";
+        reference
+          "GS NFV IFA014: Section 6.5.2.2 NsVirtualLinkDesc
+           information element";
+      }
+
+      uses connectivity-type;
+
+      list df {
+        key "id";
+
+        description
+          "The VirtualLinkDf information element specifies
+           properties for instantiating a VL according to a
+           specific flavour.";
+        reference
+          "GS NFV IFA014: Section 6.5.2.2 NsVirtualLinkDesc
+           information element";
+
+        leaf id {
+          type string;
+          description
+            "Identifies this VirtualLinkDf information element
+             within a VLD.";
+          reference
+            "GS NFV IFA014: Section 6.5.4.2 VirtualLinkDf
+             information element";
+        }
+
+        container qos {
+          presence "VL QoS parameters";
+          description
+            "The QoS information element specifies quality of
+             service parameters applicable to a VL.";
+          reference
+            "GS NFV IFA014: Section 6.5.4.2 VirtualLinkDf
+             information element";
+
+          leaf latency {
+            mandatory true;
+            type uint32;
+            units "ms";
+            description
+              "Specifies the maximum latency in ms.";
+            reference
+              "GS NFV IFA014: Section 6.5.6.2 QoS information
+               element";
+          }
+
+          leaf packet-delay-variation {
+            mandatory true;
+            type uint32;
+            units "ms";
+            description
+              "Specifies the maximum jitter in ms.";
+            reference
+              "GS NFV IFA014: Section 6.5.6.2 QoS information
+               element";
+          }
+
+          leaf packet-loss-ratio {
+            type decimal64 {
+              fraction-digits "2";
+              range "0..1.00";
+            }
+            description
+              "Specifies the maximum packet loss ratio.";
+            reference
+              "GS NFV IFA014: Section 6.5.6.2 QoS information
+               element";
+          }
+
+          leaf priority {
+            type uint32;
+            description
+              "Specifies the priority level in case of
+               congestion on the underlying physical links.";
+            reference
+              "GS NFV IFA014: Section 6.5.6.2 QoS information
+               element";
+          }
+        }
+
+        leaf service-availability-level {
+          type enumeration {
+            enum "level-1";
+            enum "level-2";
+            enum "level-3";
+          }
+          description
+            "Specifies one of the three levels defined in ETSI
+             ETSI GS NFV-REL 001 [i.5]
+               * Level 1.
+               * Level 2.
+               * Level 3.";
+          reference
+            "GS NFV IFA014: Section 6.5.4.2 VirtualLinkDf
+             information element";
+        }
+      }
+
+      leaf test-access {
+        type enumeration {
+          enum none;
+          enum passive-monitoring;
+          enum active;
+        }
+        description
+          "Specifies test access facilities expected on the VL.";
+        reference
+          "GS NFV IFA014: Section 6.5.2.2 NsVirtualLinkDesc
+           information element";
+      }
+
+      leaf description {
+        type string;
+        description
+          "Provides human-readable information on the purpose of
+           the virtual link (e.g. VL for control plane traffic).";
+        reference
+          "GS NFV IFA014: Section 6.5.2.2 NsVirtualLinkDesc
+           information element";
+      }
+      uses security-parameters;
+    }
+
+    list vnffgd {
+      key "id";
+
+      description
+        "Provides the descriptors of the applicable forwarding
+         graphs.";
+      reference
+        "GS NFV IFA014: Section 6.2.2.2 Network Service Descriptor
+         information element";
+
+      leaf id {
+        type string;
+        description
+          "Identifier of this Vnffgd information element. It
+           uniquely identifies a VNFFGD.";
+        reference
+          "GS NFV IFA014: Section 6.4.2.2 Vnffgd information
+             element";
+      }
+
+      leaf-list vnf-profile-id {
+        type leafref {
+          path "../../df/vnf-profile/id";
+        }
+        description
+          "References the VnfProfile of a constituent VNF.";
+        reference
+          "GS NFV IFA014: Section 6.4.2.2 Vnffgd information
+           element";
+      }
+
+      leaf-list pnf-profile-id {
+        type leafref {
+          path "../../df/pnf-profile/id";
+        }
+        description
+          "References the PnfProfile of a constituent PNF.";
+        reference
+          "GS NFV IFA014: Section 6.4.2.2 Vnffgd information
+           element";
+      }
+
+      leaf-list nested-ns-profile-id {
+        type leafref {
+          path "../../df/ns-profile/id";
+        }
+        description
+          "References the NsProfile of a nestedNS.";
+        reference
+          "GS NFV IFA014: Section 6.4.2.2 Vnffgd information
+           element";
+      }
+
+      leaf virtual-link-profile-id {
+        type leafref {
+          path "../../df/virtual-link-profile/id";
+        }
+        description
+          "References the Virtual Link Profile of a constituent
+             VL.";
+        reference
+          "GS NFV IFA014: Section 6.4.2.2 Vnffgd information
+           element";
+      }
+
+      list cpd-pool {
+        key "id";
+
+        description
+          "Describes a pool of descriptors of connection points
+           attached to one of the constituent VNFs and PNFs and/or
+           one of the SAPs of the parent NS or of a nested NS.";
+        reference
+          "GS NFV IFA014: Section 6.4.2.2 Vnffgd information
+           element";
+
+        leaf id {
+          type string;
+        }
+
+        choice constituent-base-element-id {
+          mandatory "true";
+          container vnf-profile {
+            leaf vnf-profile-id {
+              must ". = deref(../../vnfd-profile-id)" {
+              }
+              type leafref {
+                path "../../../../../nsd/df/vnf-profile/id";
+              }
+            }
+          }
+          container pnf-profile {
+            leaf pnf-profile-id {
+              must ". = deref(../../pnfd-profile-id)" {
+              }
+              type leafref {
+                path "../../../../../nsd/df/pnf-profile/id";
+              }
+            }
+          }
+          container ns-profile {
+            leaf ns-profile-id {
+              must ". = deref(../../ns-profile-id)" {
+              }
+              type leafref {
+                path "../../../../../nsd/df/ns-profile/id";
+              }
+            }
+          }
+          description
+            "Reference to the profile of an NS constituent.";
+          reference
+            "GS NFV IFA014: Section 6.4.8 CpdInConstituentElement
+             information element";
+        }
+
+        choice constituent-cpd-id {
+          container vnf {
+            leaf vnfd-id {
+              must ". = deref(../../vnfd-profile-id)/../vnfd-id" {
+              }
+              type leafref {
+                path "../../../../../vnfd/id";
+              }
+            }
+            leaf cpd-id {
+              type leafref {
+                path "deref(../vnfd-id)/../ext-cpd/id";
+              }
+            }
+          }
+          container pnf {
+            leaf pnfd-id {
+              must ". = deref(../../pnfd-profile-id)/../pnfd-id" {
+              }
+              type leafref {
+                path "../../../../../pnfd/id";
+              }
+            }
+            leaf pnf-cpd-id {
+              type leafref {
+                path "deref(../pnfd-id)/../ext-cpd/id";
+              }
+            }
+          }
+          container ns {
+            leaf nsd-id {
+              must ". = deref(../../nested-ns-profile-id)/" +
+                   "../nsd-id" {
+              }
+
+              type leafref {
+                path "../../../../../nsd/id";
+              }
+            }
+            leaf sap-cpd-id {
+              type leafref {
+                path "deref(../nsd-id)/../sapd/id";
+              }
+            }
+          }
+          description
+            "A reference to the descriptor of a connection point
+             attached to one of the constituent VNFs and PNFs or to
+             the descriptor of a NS SAP.";
+          reference
+            "GS NFV IFA014: Section 6.4.4.2 CpdPool information
+             element";
+        }
+      }
+
+      list nfpd {
+        key "id";
+
+        description
+          "The network forwarding path associated to the VNFFG.";
+        reference
+          "GS NFV IFA014: Section 6.4.2.2 Vnffgd information
+           element";
+
+        leaf id {
+          type string;
+          description
+            "Identifies this nfpd information element within a
+             VNFFGD.";
+          reference
+            "GS NFV IFA014: Section 6.4.3.2 Nfpd information
+             element";
+        }
+
+        leaf rule {
+          type string;
+          description
+            "Provides an NFP classification and selection rule.
+             The rule may be expressed as a criteria constructed
+             out of atomic assertions linked by Boolean operators
+             AND, OR and NOT.";
+          reference
+            "GS NFV IFA014: Section 6.4.3.2 Nfpd information
+             element";
+        }
+
+        list position-desc-id {
+          key "id";
+
+          description
+            "Describes a position in the NFP in terms of one or
+             more CP profiles and rules for distributing the
+             traffic among CP and SAP instances created from the
+             CPD or SAPD associated to these profiles. This shall
+             be connection point profile, which is either a CPD
+             associated with the VnfProfile of a constituent VNF,
+             or a CPD associated with the PnfProfile of a
+             constituent PNF, or a SAPD associated with the
+             NsProfile of a nested NS. The related VnfProfile,
+             PnfProfile and NsProfile shall be included in the
+             parent VNFFGD.";
+          reference
+            "GS NFV IFA014: Section 6.4.3.2 Nfpd information
+             element";
+
+          leaf id {
+            type string;
+            description
+              "Identifier of this NfpPositionDesc element.";
+            reference
+              "GS NFV IFA014: Section 6.4.5.2 NfpPositionDesc
+               information element";
+          }
+
+          list cp-profile-id {
+            key "id";
+
+            description
+              "References the profile of a connection point to be
+               traversed by the traffic flows matching the criteria.
+               This shall be a connection point attached to one of
+               the constituent VNFs and PNFs of the parent VNFFG,
+               or a SAP of one of the constituent nested NSs of the
+               parent VNFFG.";
+            reference
+              "GS NFV IFA014: Section 6.4.5.2 NfpPositionDesc
+               information element";
+
+            leaf id {
+              type string;
+              description
+                "Identifier of this CpProfile information element.
+                 It uniquely identifies a CpProfile.";
+              reference
+                "GS NFV IFA014: Section 6.4.6.2 CpProfile
+                 information element";
+            }
+
+            list constituent-profile-elements {
+              key "id";
+
+              description
+                "Specifies the constituents of the CpProfile.";
+              reference
+                "GS NFV IFA014: Section 6.4.6.2 CpProfile
+                 information element";
+
+              leaf id {
+                type string;
+                description
+                  "Specifies the constituents of the CpProfile.";
+                reference
+                  "GS NFV IFA014: Section 6.4.7.2
+                   ConstituentProfileElements information element";
+              }
+
+              leaf cpd-id {
+                type string;
+                description
+                  "References the VNF external CPD for a given
+                   VnfProfile, or the PNF external CPD for a given
+                   PnfProfile, or a NS SAPD for a give NsProfile
+                   identified by the constituentBasedElementId.";
+                reference
+                  "GS NFV IFA014: Section 6.4.7.2
+                   ConstituentProfileElements information element";
+              }
+            }
+          }
+        }
+      }
+    }
+
+    leaf-list autoscale-rule {
+      type string;
+    }
+    list lifecycle-management-script {
+      key "event";
+      leaf event {
+        type string;
+      }
+      leaf script {
+        type string;
+      }
+    }
+
+    list df {
+      min-elements 1;
+      must "default-instantiation-level or " +
+           "count(ns-instantiation-level) = 1" {
+        error-message
+          "default-instantiation-level must be present if there " +
+          "multiple instantion-level";
+        reference
+          "GS NFV IFA014: Section 6.3.2.2 NsDf information element";
+      }
+
+      key "id";
+      description
+        "Identifies a DF within the scope of an NSD.";
+      reference
+        "GS NFV IFA014: Section 6.2.2.2 Network Service Descriptor
+         information element";
+
+      leaf id {
+        type string;
+        description
+          "Identifies this NsDf information element. It identifies
+           a NS DF within the NSD.";
+        reference
+          "GS NFV IFA014: Section 6.3.2.2 NsDf information element";
+      }
+
+      leaf flavour-key {
+        type leafref {
+          path "../monitored-info/id";
+        }
+        description
+          "Assurance parameter against which this flavour is being
+           described.
+
+           The key can be a combination of multiple assurance
+           parameters with a logical relationship between them.
+           The parameters should be present as a monitoredInfo
+           attribute in the NSD.";
+        reference
+          "GS NFV IFA014: Section 6.3.2.2 NsDf information element";
+      }
+
+      list vnf-profile {
+        must "min-number-of-instances <= max-number-of-instances";
+        must "boolean(../../vnfd-id[.=current()/vnfd-id])" {
+          error-message "VNFDs in the profile has to be listed as a " +
+                        "dependency of the network service " +
+                        "descriptor.";
+        }
+        key "id";
+        description
+          "VNF profile to be used for the NS flavour.";
+        reference
+          "GS NFV IFA014: Section 6.3.2.2 NsDf information element";
+
+        leaf id {
+          type string;
+          description
+            "Identifier of this vnfProfile information element. It
+             uniquely identifies a VnfProfile.";
+          reference
+            "GS NFV IFA014: Section 6.3.3.2 VnfProfile information
+             element";
+        }
+
+        leaf vnfd-id {
+          mandatory true;
+          type leafref {
+            path "../../../../vnfd/id";
+          }
+          description
+            "References a VNFD.";
+          reference
+            "GS NFV IFA014: Section 6.3.3.2 VnfProfile information
+             element";
+        }
+
+        leaf flavour-id {
+          mandatory true;
+          type leafref {
+            path "deref(../vnfd-id)/../df/id";
+          }
+          description
+            "Identifies a flavour within the VNFD.";
+          reference
+            "GS NFV IFA014: Section 6.3.3.2 VnfProfile information
+             element";
+        }
+
+        leaf instantiation-level {
+          mandatory true;
+          type leafref {
+            path "deref(../flavour-id)/../instantiation-level/id";
+          }
+          description
+            "Identifier of the instantiation level of the VNF DF
+             to be used for instantiation. If not present, the
+             default instantiation level as declared in the VNFD
+             shall be used.";
+          reference
+            "GS NFV IFA014: Section 6.3.3.2 VnfProfile information
+             element";
+        }
+
+        leaf min-number-of-instances {
+          default 1;
+          type uint16;
+          description
+            "Minimum number of instances of the VNF based on this
+             VNFD that is permitted to exist for this VnfProfile.";
+          reference
+            "GS NFV IFA014: Section 6.3.3.2 VnfProfile information
+             element";
+        }
+
+        leaf max-number-of-instances {
+          default 1;
+          type uint16;
+          description
+            "Maximum number of instances of the VNF based on this
+             VNFD that is permitted to exist for this VnfProfile.";
+          reference
+            "GS NFV IFA014: Section 6.3.3.2 VnfProfile information
+             element";
+        }
+
+        uses local-affinity-or-anti-affinity-rule;
+
+        list affinity-or-anti-affinity-group {
+          key "id";
+
+          description
+            "Identifier(s) of the affinity or anti-affinity
+             group(s) the VnfProfile belongs to.";
+          reference
+            "GS NFV IFA014: Section 6.3.3.2 VnfProfile information
+             element";
+
+          leaf id {
+            type leafref {
+              path "../../../affinity-or-anti-affinity-group/id";
+            }
+          }
+        }
+
+        list virtual-link-connectivity {
+          key "virtual-link-profile-id";
+
+          description
+            "Defines the connection information of the VNF, it
+             contains connection relationship between a VNF
+             connection point and a NS Virtual Link.";
+          reference
+            "GS NFV IFA014: Section 6.3.3.2 VnfProfile information
+               element";
+
+          leaf virtual-link-profile-id {
+            type leafref {
+              path "../../../virtual-link-profile/id";
+            }
+            description
+              "Reference an NS VL profile.";
+            reference
+              "GS NFV IFA014: Section 6.3.7.2, NsVirutalLinkConnectivity
+               information element.";
+          }
+
+          list constituent-cpd-id {
+            key "constituent-base-element-id";
+
+            description
+              "Describes a connection point on a VNF/PNF or a SAP
+               which connects to virtual links instantiated from
+               the profile identified in the virtualLinkProfileId
+               attribute.";
+            reference
+              "GS NFV IFA014: Section 6.3.7
+               NsVirtualLinkConnectivity information element";
+
+            leaf constituent-base-element-id {
+              type leafref {
+                path "../../../id";
+              }
+              description
+                "Reference to the profile of an NS constituent.";
+              reference
+                "GS NFV IFA014: Section 6.4.8
+                 CpdInConstituentElement information element";
+            }
+
+            leaf constituent-cpd-id {
+              type leafref {
+                path "deref(../../../vnfd-id)/../ext-cpd/id";
+              }
+              description
+                "A reference to the descriptor of a connection point
+                 attached to one of the constituent VNFs and PNFs or to
+                 the descriptor of a NS SAP.";
+              reference
+                "GS NFV IFA014: Section 6.4.4.2 CpdPool information
+                 element";
+            }
+          }
+        }
+      }
+
+      list pnf-profile {
+        key "id";
+        must "boolean(../../pnfd-id[.=current()/pnfd-id])" {
+          error-message "PNFDs in the profile has to be listed as a " +
+                        "dependency of the network service " +
+                        "descriptor.";
+        }
+
+        leaf id {
+          type string;
+          description
+            "Identifier of this PnfProfile information element.
+             It uniquely identifies a PnfProfile.";
+          reference
+            "GS NFV IFA014: Section 6.3.6.2 PnfProfile information
+             element";
+        }
+
+        leaf pnfd-id {
+          type leafref {
+            path "../../../../pnfd/id";
+          }
+          description
+            "References a PNFD.";
+          reference
+            "GS NFV IFA014: Section 6.3.6.2 PnfProfile information
+             element";
+        }
+
+        list virtual-link-connectivity {
+          key "virtual-link-profile-id";
+
+          description
+            "Defines the connection information of the PNF, it
+             contains connection relationship between a PNF
+             connection point and a NS Virtual Link.";
+          reference
+            "GS NFV IFA014: Section 6.3.6.2 PnfProfile information
+             element";
+
+          leaf virtual-link-profile-id {
+            type leafref {
+              path "../../../virtual-link-profile/id";
+            }
+            description
+              "Reference an NS VL profile.";
+            reference
+              "GS NFV IFA014: Section 6.3.7.2, NsVirutalLinkConnectivity
+               information element.";
+          }
+
+          list constituent-cpd-id {
+            key "constituent-base-element-id";
+
+            description
+              "Describes a connection point on a VNF/PNF or a SAP
+               which connects to virtual links instantiated from
+               the profile identified in the virtualLinkProfileId
+               attribute.";
+            reference
+              "GS NFV IFA014: Section 6.3.7
+               NsVirtualLinkConnectivity information element";
+
+            leaf constituent-base-element-id {
+              type leafref {
+                path "../../../id";
+              }
+              description
+                "Reference to the profile of an NS constituent.";
+              reference
+                "GS NFV IFA014: Section 6.4.8
+                 CpdInConstituentElement information element";
+            }
+
+            leaf constituent-cpd-id {
+              type leafref {
+                path "deref(../../../pnfd-id)/../ext-cpd/id";
+              }
+              description
+                "A reference to the descriptor of a connection point
+                 attached to one of the constituent VNFs and PNFs or to
+                 the descriptor of a NS SAP.";
+              reference
+                "GS NFV IFA014: Section 6.4.4.2 CpdPool information
+                 element";
+            }
+          }
+        }
+      }
+
+      list virtual-link-profile {
+        key "id";
+
+        description
+          "VL profile to be used for the NS flavour.";
+        reference
+          "GS NFV IFA014: Section 6.3.2.2 NsDf information element";
+
+        leaf id {
+          type string;
+          description
+            "Uniquely identifies this VirtualLinkProfile
+             information element.";
+          reference
+            "GS NFV IFA014: Section 6.3.2.2 VirtualLinkProfile
+             information element";
+        }
+
+        leaf virtual-link-desc-id {
+          mandatory true;
+          type leafref {
+            path "../../../virtual-link-desc/id";
+          }
+          description
+            "Uniquely references a VLD.";
+          reference
+            "GS NFV IFA014: Section 6.3.2.2 VirtualLinkProfile
+             information element";
+        }
+
+        leaf flavour-id {
+          mandatory true;
+          type leafref {
+            path "deref(../virtual-link-desc-id)/../df/id";
+          }
+          description
+            "Identifies a flavour within the VLD.";
+          reference
+            "GS NFV IFA014: Section 6.3.2.2 VirtualLinkProfile
+             information element";
+        }
+
+        uses local-affinity-or-anti-affinity-rule;
+
+        list affinity-or-anti-affinity-group {
+          key "id";
+
+          description
+            "Identifies an affinity or anti-affinity group the
+             VLs instantiated according to the VlProfile belong
+             to.";
+          reference
+            "GS NFV IFA014: Section 6.3.4.2 VirtualLinkProfile
+             information element";
+
+          leaf id {
+            type leafref {
+              path "../../../affinity-or-anti-affinity-group/id";
+            }
+          }
+        }
+
+        container max-bitrate-requirements {
+          description
+            "Specifies the maximum bitrate requirements for a VL
+             instantiated according to this profile.";
+          reference
+            "GS NFV IFA014: Section 6.3.4.2 VirtualLinkProfile
+             information element";
+          uses link-bitrate-requirements;
+        }
+        container min-bitrate-requirements {
+          description
+            "Specifies the minimum bitrate requirements for a VL
+             instantiated according to this profile.";
+          reference
+            "GS NFV IFA014: Section 6.3.4.2 VirtualLinkProfile
+             information element";
+          uses link-bitrate-requirements;
+        }
+      }
+
+      list scaling-aspect {
+        key "id";
+
+        description
+          "The scaling aspects supported by this DF of the NS.";
+        reference
+          "GS NFV IFA014: Section 6.3.2.2 NsDf information element";
+
+        leaf id {
+          type string;
+          description
+            "Identifier of this NsScalingAspect information element.
+             It uniquely identifies the NS scaling aspect in an
+             NSD.";
+          reference
+            "GS NFV IFA014: Section 6.7.2.2 NsScalingAspect
+             information element";
+        }
+
+        leaf name {
+          type string;
+          description
+            "Provides a human readable name of the NS scaling
+             aspect.";
+          reference
+            "GS NFV IFA014: Section 6.7.2.2 NsScalingAspect
+             information element";
+        }
+
+        leaf description {
+          type string;
+          description
+            "Provides a human readable description of the NS
+             scaling aspect.";
+          reference
+            "GS NFV IFA014: Section 6.7.2.2 NsScalingAspect
+             information element";
+        }
+
+        leaf scaling-level {
+          type leafref {
+            path "../../ns-instantiation-level/id";
+          }
+          description
+            "Describes the details of an NS level.";
+          reference
+            "GS NFV IFA014: Section 6.7.2.2 NsScalingAspect
+             information element";
+        }
+      }
+
+      list affinity-or-anti-affinity-group {
+        key "id";
+
+        description
+          "Specifies affinity or anti-affinity relationship
+           applicable between the VNF instances created using
+           different VNFDs, the Virtual Link instances created
+           using different NsVirtualLinkDescs or the nested NS
+           instances created using different NSDs in the same
+           affinity or anti-affinity group.";
+        reference
+          "GS NFV IFA014: Section 6.3.2.2 NsDf information element";
+
+        leaf id {
+          type string;
+          description
+            "Identifier of Identifier of this
+             AffinityOrAntiAffinityGroup information element.";
+          reference
+            "GS NFV IFA014: Section 6.3.5.2 AffinityOrAntiAffinity
+             information element";
+        }
+
+        leaf type {
+          mandatory true;
+          type affinity-type;
+          description
+            "Specifies the type of relationship that the members of
+             the group have: 'affinity' or 'anti-affinity.'";
+          reference
+            "GS NFV IFA014: Section 6.3.5.2 AffinityOrAntiAffinity
+             information element";
+        }
+
+        leaf scope {
+          mandatory true;
+          type affinity-scope;
+          description
+            "Specifies the scope of the affinity or anti-affinity
+             relationship e.g. a NFVI node, an NFVI PoP, etc.";
+          reference
+            "GS NFV IFA014: Section 6.3.5.2 AffinityOrAntiAffinity
+             information element";
+        }
+      }
+
+      list ns-instantiation-level {
+        min-elements 1;
+        key "id";
+
+        description
+          "Describes the details of an NS level.";
+        reference
+          "GS NFV IFA014: Section 6.3.2.2 NsDf information element
+           GS NFV IFA014: Section 6.7.2.2 NsScaling information
+           element";
+
+        leaf id {
+          type string;
+          description
+            "Identifier of this NsLevel information element. It
+             uniquely identifies an NS level within the DF.";
+          reference
+            "GS NFV IFA014: Section 6.3.9.2 NsLevel information
+             element";
+        }
+
+        leaf description {
+          type string;
+          description
+            "Human readable description of the NS level.";
+          reference
+            "GS NFV IFA014: Section 6.3.9.2 NsLevel information
+             element";
+        }
+
+        list vnf-to-level-mapping {
+          key "vnf-profile-id";
+
+          description
+            "Specifies the profile of the VNFs involved in this NS
+             level and, for each of them, the required number of
+             instances.";
+          reference
+            "GS NFV IFA014: Section 6.3.9.2 NsLevel information
+             element";
+
+          leaf vnf-profile-id {
+            type leafref {
+              path "../../../vnf-profile/id";
+            }
+            description
+              "Identifies the profile to be used for a VNF
+               involved in an NS level.";
+            reference
+              "GS NFV IFA014: Section 6.7.4.2 VnfToLevelMapping
+               information element";
+          }
+
+          leaf number-of-instances {
+            default 1;
+            type uint32;
+            description
+              "Specifies the number of VNF instances required for
+               an NS level.";
+            reference
+              "GS NFV IFA014: Section 6.7.4.2 VnfToLevelMapping
+               information element";
+          }
+        }
+
+        list virtual-link-to-level-mapping {
+          key "virtual-link-profile-id";
+
+          description
+            "Specifies the profile of the VLs involved in this NS
+             level and, for each of them, the needed bandwidth.";
+          reference
+            "GS NFV IFA014: Section 6.3.9.2 NsLevel information
+             element";
+
+          leaf virtual-link-profile-id {
+            type leafref {
+              path "../../../virtual-link-profile/id";
+            }
+            description
+              "Identifies the profile to be used for a VL involved
+               in an NS level.";
+            reference
+              "GS NFV IFA014: Section 6.7.5.2
+               VirtualLinkToLevelMapping information element";
+          }
+
+          uses link-bitrate-requirements;
+        }
+
+        list ns-to-level-mapping {
+          key "ns-profile-id";
+
+          description
+            "Specifies the profile of the nested NSs involved in
+             this NS level and, for each of them, the required
+             number of instances.";
+          reference
+            "GS NFV IFA014: Section 6.3.9.2 NsLevel information
+             element";
+
+          leaf ns-profile-id {
+            type leafref {
+              path "../../../ns-profile/id";
+            }
+            description
+              "Identifies the profile to be used for a nested NS
+               involved in the NS level.";
+            reference
+              "GS NFV IFA014: Section 6.7.6.2 NsToLevel information
+               element";
+          }
+
+          leaf number-of-instances {
+            default 1;
+            type uint32;
+            description
+              "Specifies the number of nested NS instances required
+               for the NS scale level.";
+            reference
+              "GS NFV IFA014: Section 6.7.6.2 NsToLevel information
+               element";
+          }
+        }
+
+        must "(count(vnf-to-level-mapping) + " +
+             "count(virtual-link-to-level-mapping) + " +
+             "count(ns-to-level-mapping)) > 0" {
+          error-message
+	    "At least one attribute between " +
+            "vnf-to-level-mapping, " +
+            "virtual-link-to-level-mapping and " +
+            "ns-to-level-mapping shall be present.";
+          description
+            "At least one attribute between vnfToLevelMapping,
+             vlirtualLinkToLevelMapping and nsToLevelMapping shall
+             be present.";
+          reference
+            "GS NFV IFA014: Section 6.3.9.2 NsLevel information
+             element";
+        }
+      }
+
+      leaf default-instantiation-level {
+        type leafref {
+          path "../ns-instantiation-level/id";
+        }
+        description
+          "Identifies the NS level which represents the default NS
+           instantiation level for this DF. It shall be present if
+           there are multiple 'nsIinstantiationLevel' entries.";
+        reference
+          "GS NFV IFA014: Section 6.3.2.2 NsDf information element";
+      }
+
+      list ns-profile {
+        must "min-number-of-instances <= max-number-of-instances" {
+          error-message
+            "min-number-of-instances has to be less than or equal" +
+            "max-number-of-instances.";
+        }
+        must "boolean(../../nested-nsd-id[.=current()/nsd-id])" {
+          error-message
+	    "PNFDs in the profile has to be listed as a " +
+            "dependency of the network service " +
+            "descriptor.";
+        }
+        key "id";
+
+        description
+          "Specifies a NS Profile supported by this NS DF.";
+        reference
+          "GS NFV IFA014: Section 6.3.2.2 NsDf information element";
+
+        leaf id {
+          type string;
+          description
+            "Identifies an NS profile.";
+          reference
+            "GS NFV IFA014: Section 6.3.11.2 NsProfile information
+             element";
+        }
+
+        leaf nsd-id {
+          mandatory true;
+          type leafref {
+            path "../../../../nsd/id";
+          }
+          description
+            "Identifies the NSD applicable to NS instantiated
+             according to this profile.";
+          reference
+            "GS NFV IFA014: Section 6.3.11.2 NsProfile information
+             element";
+        }
+
+	leaf ns-df-id {
+          mandatory true;
+          type leafref {
+            path "deref(../nsd-id)/../df/id";
+          }
+          description
+            "Identifies the applicable network service DF within
+             the scope of the NSD.";
+          reference
+            "GS NFV IFA014: Section 6.3.11.2 NsProfile information
+             element";
+        }
+
+	leaf instantiation-level-id {
+          mandatory true;
+          type leafref {
+            path "deref(../ns-df-id)/../ns-instantiation-level/id";
+          }
+          description
+            "Identifies the NS level within the referenced NS DF to
+             be used in the context of the parent NS instantiation.
+             If not present, the default NS instantiation level as
+             declared in the referenced NSD shall be used.";
+          reference
+            "GS NFV IFA014: Section 6.3.11.2 NsProfile information
+             element";
+        }
+
+	leaf min-number-of-instances {
+          type uint16;
+          default 1;
+          description
+            "Minimum number of nested NS instances based on the
+             referenced NSD that is permitted to exist for this
+             NsProfile.";
+          reference
+            "GS NFV IFA014: Section 6.3.11.2 NsProfile information
+             element";
+        }
+
+	leaf max-number-of-instances {
+          type uint16;
+          default 1;
+          description
+            "Maximum number of nested NS instances based on the
+             referenced NSD that is permitted to exist for this
+             NsProfile.";
+          reference
+            "GS NFV IFA014: Section 6.3.11.2 NsProfile information
+             element";
+        }
+
+        list affinity-or-anti-affinity-group-id {
+          key "id";
+
+          description
+            "Identifies an affinity or anti-affinity group the NSs
+             created according to this NsProfile belongs to.";
+          reference
+            "GS NFV IFA014: Section 6.3.11.2 NsProfile information
+             element";
+
+          leaf id {
+            type leafref {
+              path "../../../affinity-or-anti-affinity-group/id";
+            }
+          }
+        }
+
+        list virtual-link-connectivity {
+          key "virtual-link-profile-id";
+
+          leaf virtual-link-profile-id {
+            type leafref {
+              path "../../../virtual-link-profile/id";
+            }
+            description
+              "Reference an NS VL profile.";
+            reference
+              "GS NFV IFA014: Section 6.3.7.2, NsVirutalLinkConnectivity
+               information element.";
+          }
+
+          list constituent-cpd-id {
+            key "constituent-base-element-id";
+
+            description
+              "Describes a connection point on a VNF/PNF or a SAP
+               which connects to virtual links instantiated from
+               the profile identified in the virtualLinkProfileId
+               attribute.";
+            reference
+              "GS NFV IFA014: Section 6.3.7
+               NsVirtualLinkConnectivity information element";
+
+            leaf constituent-base-element-id {
+              type leafref {
+                path "../../../id";
+              }
+              description
+                "Reference to the profile of an NS constituent.";
+              reference
+                "GS NFV IFA014: Section 6.4.8
+                 CpdInConstituentElement information element";
+            }
+
+            leaf constituent-cpd-id {
+              type leafref {
+                path "deref(../../../nsd-id)/../sapd/id";
+              }
+              description
+                "A reference to the descriptor of a connection point
+                 attached to one of the constituent VNFs and PNFs or to
+                 the descriptor of a NS SAP.";
+              reference
+                "GS NFV IFA014: Section 6.4.4.2 CpdPool information
+                 element";
+            }
+          }
+        }
+      }
+
+      list dependencies {
+        key "id";
+
+        description
+          "Specifies the order in which instances of the VNFs and/or
+           nested NSs have to be created.";
+        reference
+          "GS NFV IFA014: Section 6.3.2.2 NsDf information element";
+
+        leaf id {
+          type string;
+        }
+
+        choice primary-id {
+          leaf primary-vnf-profile {
+            type leafref {
+              path "../../vnf-profile/vnfd-id";
+            }
+          }
+          leaf primary-ns-profile {
+            type leafref {
+              path "../../ns-profile/nsd-id";
+            }
+          }
+          description
+            "References a VnfProfile or NsProfile.";
+          reference
+            "GS NFV IFA014: Section 6.3.12.2 Dependencies
+             information element";
+        }
+
+	choice secondary-id {
+          leaf secondary-vnf-profile {
+            type leafref {
+              path "../../vnf-profile/vnfd-id";
+            }
+          }
+          leaf secondary-ns-profile {
+            type leafref {
+              path "../../ns-profile/nsd-id";
+            }
+          }
+          description
+            "References a VnfProfile or NsProfile.";
+          reference
+            "GS NFV IFA014: Section 6.3.12.2 Dependencies
+             information element";
+        }
+      }
+
+      list monitored-info {
+        key "id";
+
+        leaf id {
+          type string;
+        }
+
+        container vnf-indicator-info {
+          leaf vnfd-id {
+            type leafref {
+              path "../../../../../vnfd/id";
+            }
+            description
+              "Identifies a VNFD.";
+            reference
+              "GS NFV IFA014: Section 6.2.7.2 VnfIndicatorData
+               information element";
+          }
+
+	  leaf vnf-indicator {
+            mandatory true;
+            type leafref {
+              path "deref(../vnfd-id)/../indicator/id";
+            }
+            description
+              "Identifies a VNF indicator within the VNFD.";
+            reference
+              "GS NFV IFA014: Section 6.2.7.2 VnfIndicatorData
+               information element";
+          }
+          description
+            "Uniquely identifies this VNF Indicator information
+             element.";
+          reference
+            "GS NFV IFA014: Section 6.2.6.2 MonitoredData
+             information element";
+        }
+
+        // monitoringParameter in IFA014 is defined by MonitoredData
+        // whereas monitoringParameter in IFA011 is defined by
+        // MonitoringParameter.
+        container monitoring-parameter {
+          leaf id {
+            type string;
+            description
+              "Unique identifier of this monitoring parameter
+               information element.";
+            reference
+              "GS NFV IFA014: Section 6.2.8.2 MonitoringParameter
+               information element";
+          }
+
+          leaf name {
+            type string;
+            description
+              "Human readable name of the monitoring parameter.";
+            reference
+              "GS NFV IFA014: Section 6.2.8.2 MonitoringParameter
+               information element";
+          }
+
+          leaf performance-metric {
+            mandatory true;
+            type string;
+            description
+              "Defines the virtualised resource-related performance
+               metric.";
+            reference
+              "GS NFV IFA014: Section 6.2.8.2 MonitoringParameter
+               information element";
+          }
+
+          leaf collection-period {
+            type string;
+            description
+              "An attribute that describes the periodicity at
+               which to collect the performance information.";
+            reference
+              "GS NFV IFA014: Section 6.2.8.2 MonitoringParameter
+               information element";
+          }
+        }
+      }
+    }
+    uses security-parameters;
+  }
+}
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/nfv/etsi-nfv-nsd.yang b/plugins/org.etsi.mts.tdl.yang2json/samples/nfv/etsi-nfv-nsd.yang
new file mode 100644
index 0000000000000000000000000000000000000000..52cd50858104cbfdf6de45381c30bdd3f4dc4fd6
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/nfv/etsi-nfv-nsd.yang
@@ -0,0 +1,62 @@
+module etsi-nfv-nsd {
+  yang-version 1.1;
+  namespace "urn:etsi:nfv:yang:etsi-nfv-nsd";
+  prefix nsd;
+
+  import etsi-nfv-descriptors {
+    prefix vnf;
+  }
+
+  organization
+    "European Telecommunications Standards Institute (ETSI)";
+
+  description
+    "Network Services Descriptors";
+
+  revision 2019-04-25 {
+    description
+      "Initial revision.
+       NSD according to ETSI GS NFV-IFA 014 Ed261v252.";
+  }
+
+  container nsd {
+    list vnfd {
+      key "id";
+      description
+        "A VNF Descriptor (VNFD) is a deployment template which
+         describes a VNF in terms of deployment and operational
+         behaviour requirements. It also contains connectivity,
+         interface and virtualised resource requirements";
+      reference
+        "GS NFV-IFA011: Section 7.1.2, VNFD information element";
+
+      uses vnf:vnfd;
+    }
+
+    list nsd {
+      key "id";
+      max-elements 1;
+      uses vnf:nsd;
+      description
+	"The NSD information element is a deployment template whose
+         instances are used by the NFVO for the lifecycle management
+         of NSs.";
+      reference
+        "GS NFV-IFA014: Section 6.2.2, Network Service Descriptor
+         information element";
+    }
+
+    list pnfd {
+      key "id";
+
+      description
+	"The Pnfd information element is a deployment template
+         enabling on-boarding PNFs and referencing them from an
+         NSD. It focuses on connectivity aspects only.";
+      reference
+        "GS NFV-IFA014: Section 6.6.2, Pnfd information element.";
+
+      uses vnf:pnfd;
+    }
+  }
+}
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/nfv/etsi-nfv-pnf.yang b/plugins/org.etsi.mts.tdl.yang2json/samples/nfv/etsi-nfv-pnf.yang
new file mode 100644
index 0000000000000000000000000000000000000000..ffe5d064004831f8c62fe68b97f6811f745dfd2a
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/nfv/etsi-nfv-pnf.yang
@@ -0,0 +1,121 @@
+submodule etsi-nfv-pnf {
+  yang-version 1.1;
+  belongs-to etsi-nfv-descriptors {
+    prefix nfv;
+  }
+
+  /*
+   * Import
+   */
+  include etsi-nfv-common;
+
+  description
+    "Models for PNFD according to GS NFV-IFA 014.";
+
+  revision 2019-04-25 {
+    description
+      "Initial revision.
+
+       Common data structure to support VNFD according to:
+       ETSI GS NFV-IFA 014 Ed261v252";
+
+    reference
+      "ETSI GS NFV-IFA 014 Ed261v252";
+  }
+
+  grouping pnfd {
+    description
+      "The Pnfd information element is a deployment template
+       enabling on-boarding PNFs and referencing them from an NSD.
+       It focuses on connectivity aspects only";
+    reference
+      "GS NFV-IFA014: Section 6.6.2, Pnfd information element";
+
+    leaf id {
+      type string;
+      description
+        "Identifier of this Pnfd information element. It uniquely
+         identifies the PNFD.";
+      reference
+        "GS NFV-IFA014: Section 6.6.2, Pnfd information element";
+    }
+
+    leaf function-description {
+      type string;
+      description
+        "Describes the PNF function.";
+      reference
+        "GS NFV-IFA014: Section 6.6.2, Pnfd information element";
+    }
+
+    leaf provider {
+      type string;
+      description
+        "Identifies the provider of the PNFD.";
+      reference
+        "GS NFV-IFA014: Section 6.6.2, Pnfd information element";
+    }
+
+    leaf version {
+      type string;
+      mandatory true;
+      description
+        "Identifies the version of the PNFD.";
+      reference
+        "GS NFV-IFA014: Section 6.6.2, Pnfd information element";
+    }
+
+    leaf invariant-id {
+      type string;
+      description
+        "Identifies a PNFD in a version independent manner. This
+         attribute is invariant across versions of PNFD.";
+      reference
+        "GS NFV-IFA014: Section 6.6.2, Pnfd information element";
+    }
+
+    leaf name {
+      type string;
+      description
+        "Provides the human readable name of the PNFD.";
+      reference
+        "GS NFV-IFA014: Section 6.6.2, Pnfd information element";
+    }
+
+    list ext-cpd {
+      key "id";
+      uses cpd;
+      description
+        "Specifies the characteristics of one or more connection
+         points where to connect the PNF to a VL.";
+      reference
+        "GS NFV-IFA014: Section 6.6.2, Pnfd information element";
+    }
+
+    list security {
+      key "signature";
+      uses security-parameters;
+      description
+        "Provides a signature to prevent tampering.
+         Editor's Note: While IFA014 does specify that the PNFD
+         includes a security parameter. SOL001 does not have one.
+         We need to harmonize SOL001 & SOL006 on this point.";
+      reference
+        "GS NFV-IFA014: Section 6.6.2, Pnfd information element";
+    }
+
+    leaf geographical-location-info {
+      type string;
+      description
+        "It provides information about the geographical location
+         (e.g. geographic coordinates or address of the building,
+         etc.) of the PNF. The cardinality 0 is used when the
+         location is unknown.
+         Editor's Note: The type is TBD in SOL001. We need to make
+         a common SOL001/SOL006 decision.";
+      reference
+        "GS NFV-IFA014: Section 6.6.2, Pnfd information element";
+    }
+    uses security-group-rule;
+  }
+}
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/nfv/etsi-nfv-pnfd.yang b/plugins/org.etsi.mts.tdl.yang2json/samples/nfv/etsi-nfv-pnfd.yang
new file mode 100644
index 0000000000000000000000000000000000000000..a365e0189d31d9342ab067369ec328691cd22563
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/nfv/etsi-nfv-pnfd.yang
@@ -0,0 +1,26 @@
+module etsi-nfv-pnfd {
+  yang-version 1.1;
+  namespace "urn:etsi:nfv:yang:etsi-nfv-pnfd";
+  prefix pnfd;
+
+  import etsi-nfv-descriptors {
+    prefix vnf;
+  }
+
+  organization
+    "European Telecommunications Standards Institute (ETSI)";
+
+  description
+    "Physcial Network Function Descriptor.";
+
+  revision 2019-04-25 {
+    description
+      "Initial revision.
+       NSD according to ETSI GS NFV-IFA 014 Ed261v252.";
+  }
+
+  container pnfd {
+    presence "PNFD container.";
+    uses vnf:pnfd;
+  }
+}
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/nfv/etsi-nfv-vnf.yang b/plugins/org.etsi.mts.tdl.yang2json/samples/nfv/etsi-nfv-vnf.yang
new file mode 100644
index 0000000000000000000000000000000000000000..43c11095fa644be600e48c843e9c5fca838e2be8
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/nfv/etsi-nfv-vnf.yang
@@ -0,0 +1,2795 @@
+submodule etsi-nfv-vnf {
+  yang-version 1.1;
+  belongs-to etsi-nfv-descriptors {
+    prefix nfv;
+  }
+
+  include etsi-nfv-common;
+
+  import ietf-inet-types {
+    prefix inet;
+  }
+  import ietf-yang-types {
+    prefix yang;
+  }
+
+  description
+    "Models for VNFD according to GS NFV-IFA 011.";
+
+  revision 2019-03-18 {
+    description
+      "Initial revision.
+
+       Common data structure to support VNFD according to:
+       VNFD according to ETSI GS NFV-IFA 011 Ed261v254";
+
+    reference
+      "ETSI GS NFV-IFA 011 Ed261v254";
+  }
+
+  grouping virtual-network-interface-requirements {
+    list virtual-network-interface-requirement {
+      key "name";
+      description
+        "Specifies requirements on a virtual network interface
+         realising the CPs instantiated from this CPD.";
+      reference
+        "GS NFV-IFA011: Section 7.1.6.4, VduCpd information
+         element";
+
+      leaf name {
+        type string;
+        description
+          "Provides a human readable name for the requirement.";
+        reference
+          "GS NFV-IFA011: Section 7.1.6.6,
+           VirtualNetworkInterfaceRequirements information element";
+      }
+
+      leaf description {
+        type string;
+        description
+          "Provides a human readable description of the requirement.";
+        reference
+          "GS NFV-IFA011: Section 7.1.6.6,
+           VirtualNetworkInterfaceRequirements information element";
+      }
+
+      leaf support-mandatory {
+        default "false";
+        type boolean;
+        description
+          "Indicates whether fulfilling the constraint is
+           mandatory (true) for successful operation or desirable
+           (false).";
+        reference
+          "GS NFV-IFA011: Section 7.1.6.6,
+           VirtualNetworkInterfaceRequirements information element";
+      }
+
+      list network-interface-requirements {
+        key "key";
+        min-elements "1";
+        max-elements "1";
+
+        leaf key {
+          type string;
+        }
+        leaf value {
+          type string;
+        }
+        description
+          "The network interface requirements. An element from an
+           array of key-value pairs that articulate the network
+           interface deployment requirements.";
+        reference
+          "GS NFV-IFA011: Section 7.1.6.6,
+           VirtualNetworkInterfaceRequirements information element";
+      }
+    }
+  }
+
+  grouping vnfd {
+    leaf id {
+      type string;
+      description
+        "Identifier of this VNFD information element. This attribute
+         shall be globally unique. The format will be defined in the
+         data model specification phase.";
+      reference
+        "GS NFV-IFA011: Section 7.1.2, VNFD information element";
+    }
+
+    leaf provider {
+      type string;
+      mandatory true;
+      description
+        "Provider of the VNF and of the VNFD";
+      reference
+        "GS NFV-IFA011: Section 7.1.2, VNFD information element";
+    }
+
+    leaf product-name {
+      type string;
+      mandatory true;
+      description
+        "Name to identify the VNF Product. Invariant for the VNF
+         Product lifetime.";
+      reference
+        "GS NFV-IFA011: Section 7.1.2, VNFD information element";
+    }
+
+    leaf software-version {
+      type string;
+      mandatory true;
+      description
+        "Software version of the VNF. This is changed when there is
+         any change to the software that is included in the VNF
+         Package";
+      reference
+        "GS NFV-IFA011: Section 7.1.2, VNFD information element";
+    }
+
+    leaf version {
+      type string;
+      mandatory true;
+      description
+        "Identifies the version of the VNFD";
+      reference
+        "GS NFV-IFA011: Section 7.1.2, VNFD information element";
+    }
+
+    leaf product-info-name {
+      type string;
+      description
+        "Human readable name of the VNFD. Can change
+         during the VNF Product lifetime.";
+      reference
+        "GS NFV-IFA011: Section 7.1.2, VNFD information element";
+    }
+
+    leaf product-info-description {
+      type string;
+      description
+        "Human readable description of the VNFD. Can change during
+         the VNF Product lifetime.";
+      reference
+        "GS NFV-IFA011: Section 7.1.2, VNFD information element";
+    }
+
+    leaf-list vnfm-info {
+      type string;
+      min-elements 1;
+      description
+        "Identifies VNFM(s) compatible with the VNF described in
+         this version of the VNFD.";
+      reference
+        "GS NFV-IFA011: Section 7.1.2, VNFD information element";
+    }
+
+    leaf localization-language {
+      type string;
+      description
+        "Information about the language of the VNF.";
+      reference
+        "GS NFV-IFA011: Section 7.1.2, VNFD information element";
+    }
+
+    leaf default-localization-language {
+      when "../localization-language";
+      type string;
+      description
+        "Default localization language that is instantiated if no
+         information about selected localization language is
+         available. Shall be present if 'localization-language'
+         is present and shall be absent otherwise.";
+      reference
+        "GS NFV-IFA011: Section 7.1.2, VNFD information element";
+    }
+
+    list vdu {
+      key "id";
+      min-elements 1;
+      description
+        "The Virtualisation Deployment Unit (VDU) is a construct supporting
+         the description of the deployment and operational behaviour of a
+         VNF component, or the entire VNF if it was not componentized in
+         components.";
+      reference
+        "GS NFV IFA011: Section 7.1.2, VNFD information element";
+
+      leaf id {
+        type string;
+        description
+          "Unique identifier of this VDU in VNFD.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.2, Vdu information element";
+      }
+
+      leaf name {
+        type string;
+        mandatory true;
+        description
+          "Human readable name of the VDU.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.2, Vdu information element";
+      }
+
+      leaf description {
+        type string;
+        description
+          "Human readable description of the VDU.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.2, Vdu information element";
+      }
+
+      list int-cpd {
+        key "id";
+        min-elements 1;
+        description
+          "A internal-connection-point element is a type of
+           connection point and describes network connectivity
+           between a VDU instance and an internal Virtual Link or
+           an external connection point.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.2, Vdu information element";
+
+        leaf int-virtual-link-desc {
+          type leafref {
+            path "../../../int-virtual-link-desc/id";
+          }
+          description
+            "Reference of the internal VLD which this internal CPD
+             connects to.";
+          reference
+            "GS NFV IFA011: Section 7.1.6.4, VduCpd information
+             element";
+        }
+
+        leaf bitrate-requirement {
+          type uint64;
+          units "Mbps";
+          description
+            "Bitrate requirement on this CP.";
+          reference
+            "GS NFV IFA011: Section 7.1.6.4, VduCpd information
+             element.";
+        }
+        uses virtual-network-interface-requirements;
+
+        leaf nicio-requirements {
+          type leafref {
+            path "../../../virtual-compute-desc/id";
+          }
+          description
+            "This references (couples) the CPD with any logical node I/O
+             requirements (for network devices) that may have been
+             created. Linking these attributes is necessary so that so
+             that I/O requirements that need to be articulated at the
+             logical node level can be associated with the network
+             interface requirements associated with the CPD.";
+          reference
+            "GS NFV-IFA011: Section 7.1.6.6,
+             VirtualNetworkInterfaceRequirements information element";
+        }
+
+        leaf-list order {
+          type uint32;
+          description
+            "The order of the NIC to be assigned on the compute
+             instance (e.g. 2 for eth2).
+
+             Note: when binding more than one port to a single
+             compute (aka multi vNICs) and ordering is desired, it
+             is mandatory that all ports will be set with an order
+             value. The order values shall represent a positive,
+             arithmetic progression that starts with 0 (i.e. 0, 1,
+             2,..., n).
+
+             If the property is not present, it shall be left to the
+             VIM to assign a value when creating the instance.";
+          reference
+            "GS NFV IFA011: Section 7.1.6.4, VduCpd information
+             element.";
+        }
+        uses cpd;
+
+        leaf security-group-rule-id {
+          type leafref {
+            path "../../../security-group-rule/id";
+          }
+          description
+            "Reference of the security group rules bound to this
+             CPD.";
+          reference
+            "GS NFV IFA011: Section 7.1.6.3 Cpd information element";
+        }
+      }
+
+      leaf virtual-compute-desc {
+        type leafref {
+          path "../../virtual-compute-desc/id";
+        }
+        must "../../virtual-compute-desc[id=current()]/" +
+             "virtual-memory/size >=" +
+             "../../sw-image-desc[id=current()/" +
+             "../sw-image-desc]/min-ram" {
+        }
+        description
+          "Describes CPU, Memory and acceleration requirements of
+           the Virtualisation Container realizing this VDU.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.2, VDU information
+           element, and Section 7.1.9.2.2, VirtualComputeDesc
+           information element.";
+      }
+
+      leaf-list virtual-storage-desc {
+        type leafref {
+          path "../../virtual-storage-desc/id";
+        }
+        description
+          "Describes storage requirements for a VirtualStorage
+           instance attached to the virtualisation container
+           created from virtualComputeDesc defined for this VDU.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.2, VDU information
+           element, and Section 7.1.9.4, Information elements
+           related to Virtual Storage.";
+      }
+
+      list boot-order {
+        ordered-by user;
+        key "key";
+
+        leaf key {
+          type uint32;
+        }
+
+        leaf value {
+          type leafref {
+            path "../../virtual-storage-desc";
+          }
+        }
+        description
+          "The key indicates the boot index (lowest index defines
+           highest boot priority). The Value references a descriptor
+           from which a valid boot device is created e.g.
+           VirtualStorageDesc from which a VirtualStorage instance
+           is created.
+
+           Editor's note: The boot-order node requires further
+           study.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.2, Vdu information
+           element.";
+      }
+
+      leaf sw-image-desc {
+        type leafref {
+          path "../../sw-image-desc/id";
+        }
+        description
+          "Describes the software image which is directly loaded on
+           the virtualisation container realising this Vdu.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.2, Vdu information
+           element.";
+      }
+
+      leaf-list nfvi-constraint {
+        type string;
+        description
+          "Describes constraints on the NFVI for the VNFC
+           instance(s) created from this Vdu. For example, aspects
+           of a secure hosting environment for the VNFC instance
+           that involve additional entities or processes.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.2, VDU Information
+           element.";
+      }
+
+      list monitoring-parameter {
+        key "id";
+        leaf id {
+          type string;
+          description
+            "Unique identifier of the monitoring parameter.";
+          reference
+            "GS NFV IFA011: Section 7.1.11.3, MonitoringParameter
+             information element.";
+        }
+        uses monitoring-parameter;
+      }
+
+      list configurable-properties {
+        key "key";
+        leaf key {
+          type string;
+        }
+        leaf value {
+          type string;
+        }
+        description
+          "It provides VNFC configurable properties that can be
+           modified using the ModifyVnfInfo operation.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.7,
+           VnfcConfigurableProperties Information element.";
+      }
+
+      leaf boot-data {
+        type string;
+        description
+          "Contains a string or a URL to a file contained in the
+           VNF package used to customize a virtualised compute
+           resource at boot time. The bootData may contain variable
+           parts that are replaced by deployment specific values
+           before being sent to the VIM.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.7,
+           VnfcConfigurableProperties Information element.";
+      }
+    }
+
+    list virtual-compute-desc {
+      key "id";
+      description
+        "Defines descriptors of virtual compute resources to be
+         used by the VNF.";
+      leaf id {
+        type string;
+        description
+          "Unique identifier of this VirtualComputeDesc in the
+           VNFD.";
+        reference
+          "GS NFV IFA011: Section 7.1.9.2, Information elements
+           related to Virtual CPU.";
+      }
+
+      list logical-node {
+        key "id";
+
+        leaf id {
+          type string;
+          description
+            "Identifies this set of logical node requirements.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.6, LogicalNodeRequirements
+             Information elements.";
+        }
+
+        list requirement-detail {
+          key "key";
+
+          leaf key {
+            type string;
+          }
+
+          leaf value {
+            type string;
+          }
+          description
+            "The logical node-level compute, memory and I/O
+             requirements. An array of key-value pairs that
+             articulate the deployment requirements.
+
+             This could include the number of CPU cores on this
+             logical node, a memory configuration specific to a
+             logical node (e.g. such as available in the Linux
+             kernel via the libnuma library) or a requirement
+             related to the association of an I/O device with the
+             logical node.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.6, LogicalNodeRequirements
+             information element.";
+        }
+        description
+          "The logical node requirements.";
+        reference
+          "GS NFV IFA011: Section 7.1.9.2, VirtualComputeDesc
+           information element.";
+      }
+
+      list request-additional-capability {
+        key "name";
+
+        leaf name {
+          type string;
+          description
+            "Identifies a requested additional capability for the
+             VDU. ETSI GS NFV-IFA 002 [i.1] describes acceleration
+             capabilities.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.5,
+             RequestedAdditionalCapabilityData Information element.";
+        }
+
+        leaf support-mandatory {
+          type boolean;
+          description
+            "Indicates whether the requested additional capability
+             is mandatory for successful operation.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.5,
+             RequestedAdditionalCapabilityData Information
+             element.";
+        }
+
+        leaf min-version {
+          type string;
+          description
+            "Identifies the minimum version of the requested
+             additional capability.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.5,
+             RequestedAdditionalCapabilityData Information element.";
+        }
+
+        leaf preferred-version {
+          type string;
+          description
+            "Identifies the preferred version of the requested
+             additional capability.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.5,
+             RequestedAdditionalCapabilityData Information element.";
+        }
+
+        list target-performance-parameters {
+          key "key";
+
+          leaf key {
+            type string;
+          }
+
+          leaf value {
+            type string;
+          }
+          description
+            "Identifies specific attributes, dependent on the
+             requested additional capability type.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.5,
+             RequestedAdditionalCapabilityData Information element.";
+        }
+      }
+
+      leaf compute-requirements {
+        type string;
+        description
+          "Specifies compute requirements.";
+        reference
+          "GS NFV IFA011: Section 7.1.9.2.2, VirtualComputeDesc
+           Information element.";
+      }
+
+      container virtual-memory {
+        leaf size {
+          type decimal64 {
+            fraction-digits 1;
+            range "0..max";
+          }
+          units "GB";
+          default 1;
+          description
+            "Amount of virtual memory in GB.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.3, Information elements
+             related to Virtual Memory.";
+        }
+
+        leaf over-subscription-policy {
+          type string;
+          description
+            "The memory core oversubscription policy in terms of
+             virtual memory to physical memory on the platform.
+             The cardinality can be 0 during the allocation
+             request, if no particular value is requested.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.3, Information elements
+             related to Virtual Memory.";
+        }
+
+        list vdu-mem-requirements {
+          key "key";
+
+          leaf key {
+            type string;
+          }
+
+          leaf value {
+            type string;
+          }
+          description
+            "Array of key-value pair requirements on the memory for
+             the VDU.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.3.2, VirtualMemoryData
+             information element.";
+        }
+
+        leaf numa-enabled {
+          type boolean;
+          description
+            "It specifies the memory allocation to be cognisant of
+             the relevant process/core allocation. The cardinality
+             can be 0 during the allocation request, if no
+             particular value is requested.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.3, Information elements
+             related to Virtual Memory.";
+        }
+        description
+          "The virtual memory of the virtualised compute.";
+        reference
+          "GS NFV IFA011: Section 7.1.9.2.2, VirtualComputeDesc
+           Information element.";
+      }
+
+      container virtual-cpu {
+        description
+          "The virtual CPU(s)of the virtualised compute.";
+        reference
+          "GS NFV IFA011: Section 7.1.9.2.2, VirtualComputeDesc
+           Information element.";
+
+        leaf cpu-architecture {
+          type string;
+          description
+            "CPU architecture type. Examples are x86, ARM. The
+             cardinality can be 0 during the allocation request,
+             if no particular CPU architecture type is requested.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.2.3, VirtualCpuData
+             information elements.";
+        }
+
+        leaf num-virtual-cpu {
+          type uint16 {
+            range "1..max";
+          }
+          default 1;
+          description
+            "Number of virtual CPUs.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.2.3, VirtualCpuData
+             information elements.";
+        }
+
+        leaf clock {
+          type uint32;
+          units "MHz";
+          description
+            "Minimum virtual CPU clock rate (e.g. in MHz). The
+             cardinality can be 0 during the allocation request,
+             if no particular value is requested.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.2.3, VirtualCpuData
+             information elements.";
+        }
+
+        leaf oversubscription-policy {
+          type string;
+          description
+            "The CPU core oversubscription policy e.g. the relation
+             of virtual CPU cores to physical CPU cores/threads.
+             The cardinality can be 0 during the allocation request,
+             if no particular value is requested.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.2.3, VirtualCpuData
+             information elements.";
+        }
+
+        list vdu-cpu-requirements {
+          key "key";
+
+          leaf key {
+            type string;
+          }
+
+          leaf value {
+            type string;
+          }
+          description
+            "Array of key-value pair requirements on the compute
+             (CPU) for the VDU.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.3.2, VirtualCpuData
+             information element.";
+        }
+
+        container pinning {
+          presence "Set to specify CPU pinning.";
+
+          leaf policy {
+            default "dynamic";
+            type enumeration {
+              enum "static";
+              enum "dynamic";
+            }
+            description
+              "The policy can take values of 'static' or 'dynamic'.
+               In case of 'static' the virtual CPU cores are
+               requested to be allocated to logical CPU cores
+               according to the rules defined in
+               virtualCpuPinningRules. In case of 'dynamic' the
+               allocation of virtual CPU cores to logical CPU cores
+               is decided by the VIM. (e.g. SMT (Simultaneous
+               MultiThreading) requirements).";
+            reference
+              "GS NFV IFA011: Section 7.1.9.2.4,
+               VirtualCpuPinningData information element.";
+          }
+
+          list rule {
+            when "../policy = 'static'";
+            key "key";
+
+            leaf key {
+              type string;
+            }
+            leaf value {
+              type string;
+            }
+            description
+              "A list of rules that should be considered during the
+               allocation of the virtual CPUs to logical CPUs in case
+               of 'static' virtualCpuPinningPolicy.";
+            reference
+              "GS NFV IFA011: Section 7.1.9.2.4,
+               VirtualCpuPinningData information element.";
+          }
+          description
+            "The virtual CPU pinning configuration for the
+             virtualised compute resource.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.2.3,
+             VirtualCpuData information element.";
+        }
+      }
+    }
+
+    list virtual-storage-desc {
+      key "id";
+      description
+        "Storage requirements for a Virtual Storage instance
+         attached to the VNFC created from this VDU";
+      leaf id {
+        type string;
+        description
+          "Unique identifier of this VirtualStorageDesc in the
+           VNFD.";
+        reference
+          "GS NFV IFA011: Section 7.1.9.4, Information elements
+           related to Virtual Storage.";
+      }
+
+      leaf type-of-storage {
+        // Needed to be able to onboard images
+        default root-storage;
+        type identityref {
+          base storage-type;
+        }
+        description
+          "Type of virtualised storage resource (e.g. volume,
+           object).";
+        reference
+          "GS NFV IFA011: Section 7.1.9.4, Information elements
+           related to Virtual Storage.";
+      }
+
+      leaf size-of-storage {
+        type uint64;
+        units "GB";
+        default 0;
+        description
+          "Size of virtualised storage resource (e.g. size of
+           volume, in GB)";
+        reference
+          "GS NFV IFA011: Section 7.1.9.4, Information elements
+           related to Virtual Storage.";
+      }
+
+      list vdu-storage-requirements {
+        key "key";
+
+        leaf key {
+          type string;
+        }
+
+        leaf value {
+          type string;
+        }
+        description
+          "Array of key-value pairs that articulate the storage
+           deployment requirements.";
+        reference
+          "GS NFV IFA011: Section 7.1.9.4.2, VirtualStorageDesc
+           information element.";
+      }
+
+      leaf rdma-enabled {
+        type boolean;
+        description
+          "Indicate if the storage support RDMA.";
+        reference
+          "GS NFV IFA011: Section 7.1.9.4, Information elements
+           related to Virtual Storage.";
+      }
+
+      leaf sw-image-desc {
+        type leafref {
+          path "../../sw-image-desc/id";
+        }
+        must "../size-of-storage >=" +
+          "../../sw-image-desc[id=current()]/min-disk" {
+        }
+        description
+          "Software image to be loaded on the VirtualStorage
+           resource created based on this VirtualStorageDesc.";
+        reference
+          "GS NFV IFA011: Section 7.1.9.4, Information elements
+           related to Virtual Storage.";
+      }
+    }
+
+    list sw-image-desc {
+      key "id";
+      description
+        "Defines descriptors of software images to be used by the
+         VNF.";
+      reference
+        "GS NFV IFA011: Section 7.1.2, VNFD Information element.";
+
+      leaf id {
+        type string;
+        description
+          "The identifier of this software image.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.5, SwImageDesc information
+           element";
+      }
+
+      leaf name {
+        mandatory true;
+        type string;
+        description
+          "The name of this software image.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.5 SwImageDesc
+           information element.";
+      }
+
+      leaf version {
+        mandatory true;
+        type string;
+        description
+          "The version of this software image.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.5 SwImageDesc
+           information element.";
+      }
+
+      container checksum {
+
+        leaf algorithm {
+          mandatory true;
+          type identityref {
+            base checksum-algorithm;
+          }
+          description
+            "Species the algorithm used to obtain the checksum
+             value.";
+          reference
+            "GS NFV IFA011: Section 7.1.6.10 ChecksumData
+             information element.";
+        }
+
+        leaf hash {
+          mandatory true;
+          type string;
+          description
+            "Contains the result of applying the algorithm
+             indicated by the algorithm attribute to the data to
+             which this ChecksumData refers.";
+          reference
+            "GS NFV IFA011: Section 7.1.6.10 ChecksumData
+             information element.";
+        }
+        description
+          "The checksum of the software image file.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.5 SwImageDesc
+           information element.";
+      }
+
+      leaf container-format {
+        default "bare";
+        type enumeration {
+          enum "aki" {
+            description
+              "An Amazon kernel image.";
+          }
+          enum "ami" {
+            description
+              "An Amazon machine image.";
+          }
+          enum "ari" {
+            description
+              "An Amazon ramdisk image.";
+          }
+          enum "bare" {
+            description
+              "The image does not have a container or metadata
+               envelope.";
+          }
+          enum "docker" {
+            description
+              "A docker container format.";
+          }
+          enum "ova" {
+            description
+              "An OVF package in a tarfile.";
+          }
+          enum "ovf" {
+            description
+              "The OVF container format.";
+          }
+        }
+        description
+          "The container format describes the container file
+           format in which software image is provided.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.5 SwImageDesc
+           information element.";
+      }
+
+      leaf disk-format {
+        default "qcow2";
+        type enumeration {
+          enum "aki" {
+            description
+              "An Amazon kernel image.";
+          }
+          enum "ami" {
+            description
+              "An Amazon machine image.";
+          }
+          enum "ari" {
+            description
+              "An Amazon ramdisk image.";
+          }
+          enum "iso" {
+            description
+              "An archive format for the data contents of an
+               disk, such as CD-ROM.";
+          }
+          enum "qcow2" {
+            description
+              "Supported by the QEMU emulator that can expand
+               dynamically and supports Copy on Write.";
+          }
+          enum "raw" {
+            description
+              "An unstructured disk image format; if you have a
+               file without an extension it is possibly a raw
+               format.";
+          }
+          enum "vdi" {
+            description
+              "Supported by VirtualBox virtual machine monitor
+               and the QEMU emulator.";
+          }
+          enum "vhd" {
+            description
+              "The VHD disk format, a common disk format used by
+               virtual machine monitors from VMware, Xen,
+               Microsoft, VirtualBox, and others.";
+          }
+          enum "vhdx" {
+            description
+              "The VHDX disk format, an enhanced version of the
+               VHD format, which supports larger disk sizes among
+               other features.";
+          }
+          enum "vmdk" {
+            description
+              "Common disk format supported by many common virtual
+               machine monitors.";
+          }
+        }
+        description
+          "The disk format of a software image is the format of
+           the underlying disk image.";
+      }
+
+        leaf min-disk {
+          type uint64;
+          units "GB";
+          mandatory true;
+          description
+            "The minimal disk size requirement for this software
+             image. The value of the 'size of storage' attribute
+             of the VirtualStorageDesc referencing this
+             SwImageDesc shall not be smaller than the value of
+             minDisk.";
+          reference
+            "GS NFV IFA011: Section 7.1.6.5, SwImageDesc
+             information element.";
+        }
+
+      leaf min-ram {
+        type decimal64 {
+          fraction-digits 1;
+          range "0..max";
+        }
+        units "GB";
+        default 0;
+        description
+          "The minimal RAM requirement for this software image.
+           The value of the 'size' attribute of
+           VirtualMemoryData of the Vdu referencing this
+           SwImageDesc shall not be smaller than the value of
+           minRam.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.5, SwImageDesc
+           information element.";
+      }
+
+      leaf size {
+        mandatory true;
+        type uint64;
+        units "GB";
+        description
+          "The size of this software image.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.5, SwImageDesc
+           information element.";
+      }
+
+      leaf image {
+        default ".";
+        type inet:uri;
+        description
+          "This is a reference to the actual software image.
+           The reference can be relative to the root of the VNF
+           Package or can be a URL";
+        reference
+          "GS NFV IFA011: Section 7.1.6.5, SwImageDesc
+           information element.";
+      }
+
+      leaf operating-system {
+        type string;
+        description
+          "Identifies the operating system used in the software
+           image. This attribute may also identify if a 32 bit
+           or 64 bit software image is used.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.5, SwImageDesc
+           information element.";
+      }
+
+      leaf-list supported-virtualization-environment {
+        type string;
+        description
+          "Identifies the virtualisation environments
+           (e.g. hypervisor) compatible with this software
+           image.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.5, SwImageDesc
+           information element.";
+      }
+    }
+
+    list int-virtual-link-desc {
+      key "id";
+      description
+        "Represents the type of network connectivity mandated by the
+         VNF provider between two or more CPs which includes at
+         least one internal CP.";
+      reference
+        "GS NFV IFA011: Section 7.1.2, Vnfd information element.";
+
+      leaf id {
+        type string;
+        description
+          "Unique identifier of this internal VLD in VNFD.";
+        reference
+          "GS NFV IFA011: Section 7.1.7.2, VnfVirtualLinkDesc
+           Information elements.";
+      }
+
+      list flavour {
+        key "id";
+        description
+          "Describes a specific flavour of the VL with specific
+             bitrate requirements.";
+        reference
+          "GS NFV IFA011: Section 7.1.7.2, VnfVirtualLinkDesc
+           Information elements.";
+
+        leaf id {
+          type string;
+          description
+            "Identifies a flavour within a VnfVirtualLinkDesc.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.5, VirtualLinkDescFlavour
+             information element.";
+        }
+
+        container qos {
+          presence "VL QoS parameters";
+          description
+            "QoS of the VL.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.5, VirtualLinkDescFlavour
+             information element.";
+
+          leaf latency {
+            type uint32;
+            units "ms";
+            mandatory true;
+            description
+              "Specifies the maximum latency in ms.";
+            reference
+              "GS NFV IFA011: Section 7.1.8.10, QoS information
+               element.";
+          }
+
+          leaf packet-delay-variation {
+            type uint32;
+            units "ms";
+            mandatory true;
+            description
+              "Specifies the maximum jitter in ms.";
+            reference
+              "GS NFV IFA011: Section 7.1.8.10, QoS information
+               element.";
+          }
+
+          leaf packet-loss-ratio {
+            type decimal64 {
+              fraction-digits "2";
+              range "0..1.00";
+            }
+            description
+              "Specifies the maximum packet loss ratio.";
+            reference
+              "GS NFV IFA011: Section 7.1.8.10, QoS information
+               element.";
+          }
+        }
+      }
+
+      uses connectivity-type;
+
+      leaf-list test-access {
+        type string;
+        description
+          "Specifies test access facilities expected on the VL
+           (e.g. none, passive monitoring, or active (intrusive)
+           loopbacks at endpoints.";
+        reference
+          "GS NFV IFA011: Section 7.1.7.2, VnfVirtualLinkDesc
+           information element.";
+      }
+
+      leaf description {
+        type string;
+        description
+          "Provides human-readable information on the purpose of
+           the VL (e.g. control plane traffic).";
+        reference
+          "GS NFV IFA011: Section 7.1.7.2, VnfVirtualLinkDesc
+           information element.";
+      }
+
+      list monitoring-parameters {
+        key "id";
+
+        leaf id {
+          type string;
+          description
+            "Unique identifier of the monitoring parameter.";
+          reference
+            "GS NFV IFA011: Section 7.1.11.3, MonitoringParameter
+             information element.";
+        }
+        uses monitoring-parameter;
+      }
+    }
+
+    uses security-group-rule;
+
+    list ext-cpd {
+      key "id";
+      min-elements 1;
+
+      description
+        "Describes an external interface exposed by this VNF enabling
+         connection with a Virual Link";
+      reference
+        "GS NFV IFA011: Section 7.1.2, VNFD information element.";
+
+      choice cp-connection {
+        leaf int-virtual-link-desc {
+          description
+            "Reference to the internal Virtual Link Descriptor (VLD)
+             to which CPs instantiated from this external CP
+             Descriptor (CPD) connect. Either intVirtualLinkDesc or
+             intCpd shall be present.";
+          type leafref {
+            path "../../int-virtual-link-desc/id";
+          }
+        }
+
+        container int-cpd {
+          leaf vdu-id {
+            type leafref {
+              path "../../../vdu/id";
+            }
+          }
+
+          leaf cpd {
+            type leafref {
+              path "deref(../vdu-id)/../int-cpd/id";
+            }
+          }
+        }
+      }
+      uses virtual-network-interface-requirements;
+
+      leaf nicio-requirements {
+        type leafref {
+          path "../../virtual-compute-desc/id";
+        }
+        description
+          "This references (couples) the CPD with any logical node I/O
+           requirements (for network devices) that may have been
+           created. Linking these attributes is necessary so that so
+           that I/O requirements that need to be articulated at the
+           logical node level can be associated with the network
+           interface requirements associated with the CPD.";
+        reference
+          "GS NFV-IFA011: Section 7.1.6.6,
+           VirtualNetworkInterfaceRequirements information element";
+      }
+      uses cpd;
+
+      leaf security-group-rule-id {
+        type leafref {
+          path "../../security-group-rule/id";
+        }
+        description
+          "Reference of the security group rules bound to this
+           CPD.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.3 Cpd information element";
+      }
+    }
+
+    list df {
+      must "default-instantiation-level or " +
+           "count(instantiation-level) = 1";
+      key "id";
+      min-elements 1;
+      description
+        "Describes a specific Deployment Flavour (DF) of a VNF with
+         specific requirements for capacity and performance.";
+      reference
+        "GS NFV IFA011: Section 7.1.2, VNFD information element.";
+
+      leaf id {
+        type string;
+        description
+          "Identifier of this DF within the VNFD.";
+        reference
+          "GS NFV IFA011: Section 7.1.8, Information elements
+           to the DeploymentFlavour.";
+      }
+
+      leaf description {
+        type string;
+        description
+          "Human readable description of the deployment flavour";
+        reference
+          "GS NFV IFA011: Section 7.1.8, Information elements
+           to the DeploymentFlavour.";
+      }
+
+      list vdu-profile {
+        key "id";
+        min-elements 1;
+        description
+          "The Vduprofile describes additional instantiation data for
+           a given VDU used in a deployment flavour.";
+        reference
+          "GS NFV IFA011: Section 7.1.8, Information elements
+           to the DeploymentFlavour.";
+
+        leaf id {
+          type leafref {
+            path "../../../vdu/id";
+          }
+          reference
+            "GS NFV IFA011: Section 7.1.8.3, VduProfile information
+             element.";
+        }
+
+        leaf min-number-of-instances {
+          type uint16;
+          default 1;
+          description
+            "Minimum number of instances of the VNFC based on this
+             VDU that is permitted to exist for this flavour.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.3, VduProfile information
+             element.";
+        }
+
+        leaf max-number-of-instances {
+          type uint16;
+          default 1;
+          must ". >= ../min-number-of-instances";
+          reference
+            "GS NFV IFA011: Section 7.1.8.3, VduProfile information
+             element.";
+        }
+        uses local-affinity-or-anti-affinity-rule;
+
+        list affinity-or-anti-affinity-group {
+          key "id";
+
+          description
+            "Identifier(s) of the affinity or anti-affinity
+             group(s) the VDU belongs to.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.3, VduProfile information
+             element.";
+          leaf id {
+            type leafref {
+              path "../../../" +
+                "affinity-or-anti-affinity-group/id";
+            }
+            description
+              "Identifies an affinity or anti-affinity group to
+               which the affinity or anti-affinity rule applies.";
+            reference
+              "GS NFV IFA011: Section 7.1.8.12, AffinityOrAntiAffinity
+               information element.";
+          }
+        }
+      }
+
+      list virtual-link-profile {
+        key "id flavour";
+        description
+          "Defines the internal VLD along with additional data which
+           is used in this DF.";
+        reference
+          "GS NFV IFA011: Section 7.1.8.2, VnfDf information
+           element.";
+
+        leaf id {
+          type leafref {
+            path "../../../int-virtual-link-desc/id";
+          }
+          description
+            "Uniquely identifies a Vnf VLD.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.4, VirtualLinkProfile
+             information element.";
+        }
+
+        leaf flavour {
+          type leafref {
+            path "deref(../../../ext-cpd/int-virtual-link-desc)" +
+                 "/../flavour/id";
+          }
+          description
+            "Identifies a flavour within the VnfVirtualLinkDesc.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.4, VirtualLinkProfile
+             information element.";
+        }
+        uses local-affinity-or-anti-affinity-rule;
+
+        list affinity-or-anti-affinity-group {
+          key "id";
+          leaf id {
+            type leafref {
+              path "../../../affinity-or-anti-affinity-group/id";
+            }
+          }
+          description
+            "Identifier(s) of the affinity or anti-affinity
+             group(s) the VnfVirtualLinkDesc belongs to.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.4, VirtualLinkProfile
+             information element.";
+        }
+
+        container max-bit-rate-requirements {
+          leaf root {
+            mandatory "true";
+            type uint32;
+            description
+              "Throughput requirement of the link (e.g. bitrate of
+               E-Line, root bitrate of E-Tree, aggregate capacity
+               of E-LAN).";
+            reference
+              "GS NFV IFA011: Section 7.1.8.6,
+               LinkBitrateRequirements information element.";
+          }
+
+          leaf leaf {
+            type uint32;
+            description
+              "Throughput requirement of leaf connections to the
+               link when applicable to the connectivity type
+               (e.g. for E-Tree and E-LAN branches).";
+            reference
+              "GS NFV IFA011: Section 7.1.8.6,
+               LinkBitrateRequirements information element.";
+          }
+          description
+            "Specifies the maximum bitrate requirements for a VL
+             instantiated according to this profile.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.4, VirtualLinkProfile
+             information element.";
+        }
+
+        container min-bit-rate-requirements {
+          leaf root {
+            mandatory "true";
+            type uint32;
+            description
+              "Throughput requirement of the link (e.g. bitrate of
+               E-Line, root bitrate of E-Tree, aggregate capacity
+               of E-LAN).";
+            reference
+              "GS NFV IFA011: Section 7.1.8.6,
+               LinkBitrateRequirements information element.";
+          }
+
+          leaf leaf {
+            type uint32;
+            description
+              "Throughput requirement of leaf connections to the
+               link when applicable to the connectivity type
+               (e.g. for E-Tree and E-LAN branches).";
+            reference
+              "GS NFV IFA011: Section 7.1.8.6,
+               LinkBitrateRequirements information element.";
+          }
+          description
+            "Specifies the minimum bitrate requirements for a VL
+             instantiated according to this profile.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.4, VirtualLinkProfile
+             information element.";
+        }
+
+        container virtual-link-protocol-data {
+          leaf associated-layer-protocol {
+            type identityref {
+              base layer-protocol;
+            }
+            description
+              "One of the values of the attribute layerProtocol of
+               the ConnectivityType IE.";
+            reference
+              "GS NFV IFA011: Section 7.1.8.13,
+               VirtualLinkProtocolData information element.";
+          }
+
+          container l2-protocol-data {
+            when "(../associated-layer-protocol = 'Ethernet') or " +
+                 "(../associated-layer-protocol = 'MPLS') or " +
+                 "(../associated-layer-protocol = 'ODU2') or " +
+                 "(../associated-layer-protocol = 'Pseudo-Wire')";
+
+            leaf name {
+              type string;
+              description
+                "Network name associated with this L2 protocol.";
+              reference
+                "GS NFV IFA011: Section 7.1.8.14,
+                 L2ProtocolData information element.";
+            }
+
+            leaf network-type {
+              type enumeration {
+                enum flat;
+                enum vlan;
+                enum vxlan;
+                enum gre;
+              }
+              description
+                "Specifies the network type for this L2 protocol.
+                 Possible values: FLAT, VLAN, VXLAN, GRE.";
+              reference
+                "GS NFV IFA011: Section 7.1.8.14,
+                 L2ProtocolData information element.";
+            }
+
+            leaf vlan-transparent {
+              type boolean;
+              description
+                "Specifies whether to support VLAN transparency for
+                 this L2 protocol or not.";
+              reference
+                "GS NFV IFA011: Section 7.1.8.14,
+                 L2ProtocolData information element.";
+            }
+
+            leaf mtu {
+              type uint16;
+              description
+                "Specifies the maximum transmission unit (MTU) value
+                 for this L2 protocol.";
+              reference
+                "GS NFV IFA011: Section 7.1.8.14,
+                 L2ProtocolData information element.";
+            }
+            description
+              "Specifies the L2 protocol data for this virtual link.
+               Shall be present when the associatedLayerProtocol
+               attribute indicates a L2 protocol and shall be absent
+               otherwise.";
+            reference
+              "GS NFV IFA011: Section 7.1.8.13,
+               VirtualLinkProtocolData information element.";
+          }
+
+          container l3-protocol-data {
+            when "(../associated-layer-protocol = 'IPv4') or " +
+                 "(../associated-layer-protocol = 'IPv6')";
+
+            leaf name {
+              type string;
+              description
+                "Network name associated with this L3 protocol.";
+              reference
+                "GS NFV IFA011: Section 7.1.8.15,
+                 L3ProtocolData information element.";
+            }
+
+            leaf ip-version {
+              type enumeration {
+                enum ipv4;
+                enum ipv6;
+              }
+              default "ipv4";
+              description
+                "Specifies IP version of this L3 protocol.
+                 Value:
+                 • IPV4.
+                 • IPV6.";
+              reference
+                "GS NFV IFA011: Section 7.1.8.15,
+                 L3ProtocolData information element.";
+            }
+
+            leaf cidr {
+              type string;
+              description
+                "Specifies the CIDR (Classless InterDomain Routing)
+                 of this L3 protocol.";
+              reference
+                "GS NFV IFA011: Section 7.1.8.15,
+                 L3ProtocolData information element.";
+            }
+
+            leaf-list ip-allocation-pools {
+              type string;
+              description
+                "Specifies the allocation pools with start and end
+                 IP addresses for this L3 protocol.";
+              reference
+                "GS NFV IFA011: Section 7.1.8.15,
+                 L3ProtocolData information element.";
+            }
+
+            leaf gateway-ip {
+              type inet:ip-address;
+              description
+                "Specifies the gateway IP address for this L3
+                 protocol.";
+              reference
+                "GS NFV IFA011: Section 7.1.8.15,
+                 L3ProtocolData information element.";
+            }
+
+            leaf dhcp-enabled {
+              type boolean;
+              default "true";
+              description
+                "Indicates whether DHCP (Dynamic Host Configuration
+                 Protocol) is enabled or disabled for this L3
+                 protocol.";
+              reference
+                "GS NFV IFA011: Section 7.1.8.15,
+                 L3ProtocolData information element.";
+            }
+
+            leaf ipv6-address-mode {
+              when "../ip-version = 'ipv6'";
+              type enumeration {
+                enum slaac;
+                enum dhcpv6-stateful;
+                enum dhcpv6-stateless;
+              }
+              description
+                "Specifies IPv6 address mode. Possible values:
+                 • SLAAC.
+                 • DHCPV6-STATEFUL.
+                 • DHCPV6-STATELESS.
+                 May be present when the value of the ipVersion
+                 attribute is 'IPV6' and shall be absent otherwise.";
+              reference
+                "GS NFV IFA011: Section 7.1.8.15,
+                 L3ProtocolData information element.";
+            }
+            description
+              "Specifies the L3 protocol data for this virtual link.
+               Shall be present when the associatedLayerProtocol
+               attribute indicates a L3 protocol and shall be absent
+               otherwise.";
+            reference
+              "GS NFV IFA011: Section 7.1.8.13,
+               VirtualLinkProtocolData information element.";
+          }
+          description
+            "Specifies the protocol data for a VL instantiated
+             according to this profile. Cardinality 0 is used when
+             no protocol data needs to be specified.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.4, VirtualLinkProfile
+             information element.";
+        }
+      }
+
+      list instantiation-level {
+        key "id";
+        min-elements 1;
+        description
+          "Describes the various levels of resources that can be
+           used to instantiate the VNF using this flavour.
+           Examples: Small, Medium, Large. If there is only one
+           'instantiationLevel' entry, it shall be treated as the
+           default instantiation level for this DF.
+
+           The InstantiationLevel information element describes a
+           given level of resources to be instantiated within a
+           deployment flavour in term of the number of VNFC instances
+           to be created from each VDU.
+           All the VDUs referenced in the level shall be part of the
+           corresponding deployment flavour and their number shall
+           be within the range (min/max) for this deployment flavour.";
+        reference
+          "GS NFV IFA011: Section 7.1.8.2 VnfDf information element";
+
+        leaf id {
+          type string;
+          description
+            "Uniquely identifies a level with the DF.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.7 InstantiationLevel
+             information element";
+        }
+
+        leaf description {
+          type string;
+          description
+            "Human readable description of the instantiation level";
+          reference
+            "GS NFV IFA011: Section 7.1.8.7 InstantiationLevel
+             information element";
+        }
+
+        list vdu-level {
+          key "vdu-id";
+          min-elements 1;
+          description
+            "Sets the number of instances for the VDU in this
+             instantiation level.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.7 InstantiationLevel
+             information element";
+
+          leaf vdu-id {
+            type leafref {
+              path "../../../../vdu/id";
+            }
+            description
+              "Uniquely identifies a VDU.";
+            reference
+              "GS NFV IFA011: Section 7.1.8.9 VduLevel information
+               element";
+          }
+
+          leaf number-of-instances {
+            type uint16;
+            must ". <= ../../../../df/" +
+                 "vdu-profile[id=current()/../vdu-id]/" +
+                 "max-number-of-instances";
+            must ". >= ../../../../df/" +
+                 "vdu-profile[id=current()/../vdu-id]/" +
+                 "min-number-of-instances";
+            default 1;
+            description
+              "Number of instances of VNFC based on this VDU to
+               deploy for this level.";
+            reference
+              "GS NFV IFA011: Section 7.1.8.9 VduLevel information
+               element";
+          }
+        }
+
+        list scaling-info {
+          key "scaling-aspect-id";
+          description
+            "The InstantiationLevel information element describes a
+             given level of resources to be instantiated within a
+             DF in term of the number of VNFC instances to be
+             created from each VDU.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.7 InstantiationLevel
+             information element";
+
+          leaf scaling-aspect-id {
+            type leafref {
+              path "../../../scaling-aspect/id";
+            }
+            description
+              "Identifier of the scaling aspect.";
+            reference
+              "GS NFV IFA011: Section 7.1.8.8 ScaleInfo information
+               element";
+          }
+
+          leaf scale-level {
+            type uint32;
+            description
+              "The scale level, greater than or equal to 0.";
+            reference
+              "GS NFV IFA011: Section 7.1.8.8 ScaleInfo information
+               element";
+          }
+        }
+      }
+
+      leaf default-instantiation-level {
+        type leafref {
+          path "../instantiation-level/id";
+        }
+        description
+          "This attribute references the 'instantiationLevel'
+           entry which defines the default instantiation level for
+           this DF. It shall be present if there are multiple
+           'instantiationLevel' entries.";
+        reference
+          "GS NFV IFA011: Section 7.1.8.2 VnfDf information
+           element";
+      }
+
+      leaf-list supported-operation {
+        type identityref {
+          base supported-operation;
+        }
+        description
+          "Indicates which operations are available for this DF via
+           the VNF LCM interface. Instantiate VNF, Query VNF and
+           Terminate VNF are supported in all DF and therefore
+           need not be included in this list.";
+        reference
+          "GS NFV IFA011: Section 7.1.8.2 VnfDf information
+           element";
+      }
+
+      container lcm-operations-configuration {
+        description
+          "This information element is a container for all
+           attributes that affect the invocation of the VNF
+           Lifecycle Management operations, structured by
+           operation.";
+        reference
+          "GS NFV IFA011: Section 7.1.8.2 VnfDf information
+           element";
+
+        container instantiate-vnf-op-config {
+          list parameter {
+            key "key";
+
+            leaf key {
+              type string;
+            }
+
+            leaf value {
+              type string;
+            }
+            description
+              "Array of KVP requirements for VNF-specific parameters
+               to be passed when invoking the InstantiateVnf
+               operation.";
+            reference
+              "GS NFV IFA011: Section 7.1.5.3
+               InstantiateVnfOpConfig information element";
+          }
+          description
+            "Configuration parameters for the InstantiateVnf
+             operation.";
+          reference
+            "GS NFV IFA011: Section 7.1.5.2
+             VnfLcmOperationsConfiguration information element";
+        }
+
+        container scale-vnf-op-config {
+          description
+            "Configuration parameters for the ScaleVnf operation.";
+          reference
+            "GS NFV IFA011: Section 7.1.5.2
+             VnfLcmOperationsConfiguration information element";
+
+          list parameter {
+            key "key";
+
+            leaf key {
+              type string;
+            }
+
+            leaf value {
+              type string;
+            }
+            description
+              "Array of KVP requirements for VNFspecific parameters
+               to be passed when invoking the ScaleVnf operation.";
+            reference
+              "GS NFV IFA011: Section 7.1.5.4 ScaleVnfOpConfig
+               information element";
+          }
+
+          leaf scaling-by-more-than-one-step-supported {
+            type boolean;
+            default false;
+            description
+              "Signals whether passing a value larger than one in
+               the numScalingSteps parameter of the ScaleVnf
+               operation is supported by this VNF.
+               Default is FALSE, i.e. 'not supported'.";
+            reference
+              "GS NFV IFA011: Section 7.1.5.4
+               ScaleVnfOpConfig information element";
+          }
+        }
+
+        container scale-vnf-to-level-op-config {
+          description
+            "This information element defines attributes that
+             affect the invocation of the ScaleVnfToLevel
+             operation.";
+          reference
+            "GS NFV IFA011: Section 7.1.5.2
+             VnfLcmOperationsConfiguration information element";
+
+          list parameter {
+            key "key";
+            leaf key {
+              type string;
+            }
+            leaf value {
+              type string;
+            }
+            description
+              "Array of KVP requirements for VNF-specific parameters
+               to be passed when invoking the ScaleVnfToLevel
+               operation.";
+            reference
+              "GS NFV IFA011: Section 7.1.5.5
+               ScaleVnfToLevelOpConfig information element";
+          }
+
+          leaf arbitrary-target-levels-supported {
+            type boolean;
+            default "false";
+            description
+              "Signals whether scaling according to the parameter
+               'scaleInfo' is supported by this VNF.";
+            reference
+              "GS NFV IFA011: Section 7.1.5.5
+               ScaleVnfToLevelOpConfig information element";
+          }
+        }
+
+        container heal-vnf-op-config {
+          description
+            "This information element defines attributes that
+             affect the invocation of the HealVnf operation.";
+          reference
+            "GS NFV IFA011: Section 7.1.5.2
+             VnfLcmOperationsConfiguration information element";
+
+          list parameter {
+            key "key";
+
+            leaf key {
+              type string;
+            }
+
+            leaf value {
+              type string;
+            }
+            description
+              "Array of KVP requirements for VNF-specific parameters
+               to be passed when invoking the HealVnf operation.";
+            reference
+              "GS NFV IFA011: Section 7.1.5.6 HealVnfOpConfig
+               information element";
+          }
+
+          leaf-list cause {
+            type string;
+            description
+              "Supported 'cause' parameter values.";
+            reference
+              "GS NFV IFA011: Section 7.1.5.6 HealVnfOpConfig
+               information element";
+          }
+        }
+
+        container terminate-vnf-op-config {
+          description
+            "This information element defines attributes that
+             affect the invocation of the TerminateVnf operation.";
+          reference
+            "GS NFV IFA011: Section 7.1.5.2
+             VnfLcmOperationsConfiguration information element";
+
+          leaf min-graceful-termination {
+            type yang:timeticks;
+            default "1";
+            description
+              "Minimum timeout value for graceful termination of
+               a VNF instance.";
+            reference
+              "GS NFV IFA011: Section 7.1.5.7
+               TerminateVnfOpConfig information element";
+          }
+
+          leaf max-recommended-graceful-termination {
+            type yang:timeticks;
+            description
+              "Maximum recommended timeout value that can be needed
+               to gracefully terminate a VNF instance of a
+               particular type under certain conditions, such as
+               maximum load condition. This is provided by VNF
+               provider as information for the operator
+               facilitating the selection of optimal timeout value.
+               This value is not used as constraint.";
+            reference
+              "GS NFV IFA011: Section 7.1.5.7
+               TerminateVnfOpConfig information element";
+          }
+
+          list parameter {
+            key "key";
+            leaf key {
+              type string;
+            }
+            leaf value {
+              type string;
+            }
+            description
+              "Array of KVP requirements for VNF-specific parameters
+               to be passed when invoking the TerminateVnf
+               operation.";
+            reference
+              "GS NFV IFA011: Section 7.1.5.7
+               TerminateVnfOpConfig information element";
+          }
+        }
+
+        container operate-vnf-op-config {
+          description
+            "This information element defines attributes that
+             affect the invocation of the OperateVnf operation.";
+          reference
+            "GS NFV IFA011: Section 7.1.5.2
+             VnfLcmOperationsConfiguration information element";
+
+          leaf min-graceful-stop-timeout {
+            type yang:timeticks;
+            default "1";
+            description
+              "Minimum timeout value for graceful stop of a VNF
+               instance.";
+            reference
+              "GS NFV IFA011: Section 7.1.5.8
+               OperateVnfOpConfig information element";
+          }
+
+          leaf max-recommended-graceful-stop-timeout {
+            type yang:timeticks;
+            description
+              "Maximum recommended timeout value that can be
+               needed to gracefully stop a VNF instance of a
+               particular type under certain conditions, such as
+               maximum load condition. This is provided by VNF
+               provider as information for the operator facilitating
+               the selection of optimal timeout value. This value
+               is not used as constraint.";
+            reference
+              "GS NFV IFA011: Section 7.1.5.8
+               OperateVnfOpConfig information element";
+          }
+
+          list parameter {
+            key "key";
+            leaf key {
+              type string;
+            }
+            leaf value {
+              type string;
+            }
+            description
+              "Array of KVP requirements for VNF-specific parameters
+               to be passed when invoking the OperateVnf
+               operation.";
+            reference
+              "GS NFV IFA011: Section 7.1.5.8
+               OperateVnfOpConfig information element";
+          }
+        }
+
+        container change-vnf-flavour-op-config {
+          list parameter {
+            key "key";
+            leaf key {
+              type string;
+            }
+            leaf value {
+              type string;
+            }
+            description
+              "Array of KVP requirements for VNF-specific parameters
+               to be passed when invoking the OperateVnf
+               operation.";
+            reference
+              "GS NFV IFA011: Section 7.1.5.9
+               ChangeVnfFlavour information element";
+          }
+          description
+            "Configuration parameters for the ChangeVnfFlavour
+             operation.";
+          reference
+            "GS NFV IFA011: Section 7.1.5.2
+             VnfLcmOperationsConfiguration information element";
+        }
+
+        container change-ext-vnf-connectivity-op-config {
+          list parameter {
+            key "key";
+            leaf key {
+              type string;
+            }
+            leaf value {
+              type string;
+            }
+            description
+              "Array of KVP requirements for VNF-specific parameters
+               to be passed when invoking the
+               ChangeExtVnfConnectivity operation.";
+            reference
+              "GS NFV IFA011: Section 7.1.5.10
+               ChangeExtVnfConnectivityOpConfig information
+               element";
+          }
+          description
+            "Configuration parameters for the
+             ChangeExtVnfConnectivity operation.";
+          reference
+            "GS NFV IFA011: Section 7.1.5.2
+             VnfLcmOperationsConfiguration information element";
+        }
+      }
+
+      list affinity-or-anti-affinity-group {
+        key "id";
+        description
+          "The AffinityOrAntiAffinityGroup describes the affinity
+           or anti-affinity relationship applicable between the
+           virtualization containers to be created based on
+           different VDUs, or between internal VLs to be created
+           based on different VnfVirtualLinkDesc(s).
+
+           Per VNF, the affinity/anti-affinity rules defined using
+           this information element, using the
+           LocalAffinityOrAntiAffinityRule information element, and
+           using the placement constraints in the
+           GrantLifecycleOperation as defined in ETSI GS NFV-IFA
+           007 [i.3] should be conflict-free. In case of conflicts,
+           the placement constraints in the
+           GrantLifecycleOperation shall take precedence.";
+
+        reference
+          "GS NFV IFA011: Section 7.1.8.2 VnfDf information
+           element";
+
+        leaf id {
+          type string;
+          description
+            "Identifies an affinity or anti-affinity group to which
+             the affinity or anti-affinity rule applies.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.12
+             AffinityOrAntiAffinityGroup information element";
+        }
+
+        leaf type {
+          mandatory true;
+          type affinity-type;
+          description
+            "Specifies whether the rule is an affinity rule or an
+             anti-affinity rule.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.12
+             AffinityOrAntiAffinityGroup information element";
+        }
+
+        leaf scope {
+          mandatory true;
+          type affinity-scope;
+          description
+            "Specifies the scope of the rule, possible values are
+             'NFVI-PoP', 'Zone', 'ZoneGroup', 'NFVI-node'.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.12
+             AffinityOrAntiAffinityGroup information element";
+        }
+      }
+
+      list indicator {
+        key "id";
+
+        leaf id {
+          type string;
+          description
+            "Unique identifier.";
+          reference
+            "GS NFV IFA011: Section 7.1.11.2 VnfIndicator
+             information element";
+        }
+
+        leaf name {
+          type string;
+          description
+            "The human readable name of the VnfIndicator.";
+          reference
+            "GS NFV IFA011: Section 7.1.11.2 VnfIndicator
+             information element";
+        }
+
+        leaf indicator-value {
+          type string;
+          description
+            "Defines the allowed values or value ranges of this
+             indicator.";
+          reference
+            "GS NFV IFA011: Section 7.1.11.2 VnfIndicator
+             information element";
+        }
+
+        leaf source {
+          type enumeration {
+            enum vnf;
+            enum em;
+            enum both;
+          }
+          description
+            "Describe the source of the indicator. The possible
+             values are:
+             • VNF.
+             • EM.
+             • Both.
+
+             This tells the consumer where to send the subscription
+             request.";
+          reference
+            "GS NFV IFA011: Section 7.1.11.2 VnfIndicator
+             information element";
+        }
+
+        description
+          "Declares the VNF indicators that are supported by this
+           VNF (specific to this DF).";
+        reference
+          "GS NFV IFA011: Section 7.1.8.2 VnfDf information
+             element";
+      }
+
+      list supported-vnf-interfaces {
+        key "name";
+
+        leaf name {
+          type enumeration {
+            enum vnf-configuration;
+            enum vnf-indicator;
+          }
+          description
+            "Identifies an interface produced by the VNF. Valid
+             values:
+             - VNF_CONFIGURATION
+             - VNF_INDICATOR";
+          reference
+            "GS NFV IFA011: Section 7.1.8.16 VnfInterfaceDetails
+             information element";
+        }
+
+        leaf-list cpd-id {
+          type leafref {
+            path "../../../ext-cpd/id";
+          }
+          description
+            "References one or more CPDs from which to instantiate
+             external CPs through which interface endpoints on the
+             VNF side can be reached by the VNFM.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.16 VnfInterfaceDetails
+             information element";
+        }
+
+        list interface-details {
+          key "key";
+
+          leaf key {
+            type string;
+          }
+
+          leaf value {
+            type string;
+          }
+        }
+
+        description
+          "Indicates which interfaces the VNF produces and provides
+           additional details on how to access the interface
+           endpoints.";
+        reference
+          "GS NFV IFA011: Section 7.1.8.2 VnfDf information
+             element";
+      }
+
+      list monitoring-parameter {
+        key "id";
+
+        description
+          "Defines the virtualised resources monitoring parameters
+           on VNF level.";
+        reference
+          "GS NFV IFA011: Section 7.1.8.2 VnfDf information
+           element";
+
+        leaf id {
+          type string;
+          description
+            "Unique identifier of the monitoring parameter.";
+          reference
+            "GS NFV IFA011: Section 7.1.11.3 MonitoringParameter
+             information element";
+        }
+        uses monitoring-parameter;
+      }
+
+      list scaling-aspect {
+        key "id";
+
+        description
+          "The scaling aspects supported by this DF of the VNF.
+           scalingAspect shall be present if the VNF supports
+           scaling.";
+        reference
+          "GS NFV IFA011: Section 7.1.8.2 VnfDf information
+           element";
+
+        leaf id {
+          type string;
+          description
+            "Unique identifier of this aspect in the VNFD.";
+          reference
+            "GS NFV IFA011: Section 7.1.10.2 ScalingAspect
+               information element";
+        }
+
+        leaf name {
+          type string;
+          description
+            "Human readable name of the aspect.";
+          reference
+            "GS NFV IFA011: Section 7.1.10.2 ScalingAspect
+             information element";
+        }
+
+        leaf description {
+          type string;
+          description
+            "Human readable description of the aspect.";
+          reference
+            "GS NFV IFA011: Section 7.1.10.2 ScalingAspect
+             information element";
+        }
+
+        leaf max-scale-level {
+          type uint32 {
+            range "1..max";
+          }
+          description
+            "The maximum scaleLevel for total number of scaling
+             steps that can be applied w.r.t. this aspect. The
+             value of this attribute corresponds to the number of
+             scaling steps can be applied to this aspect when
+             scaling it from the minimum scale level (i.e. 0) to the
+             maximum scale level defined by this attribute.";
+          reference
+            "GS NFV IFA011: Section 7.1.10.2 ScalingAspect
+             information element";
+        }
+
+        container aspect-delta-details {
+          list deltas {
+            key "id";
+            min-elements 1;
+
+            leaf id {
+              type string;
+              description
+                "Identifier of this scaling delta.";
+              reference
+                "GS NFV IFA011: Section 7.1.10.4 ScalingDelta
+                 information element";
+            }
+
+            list vdu-delta {
+              key "id";
+
+              leaf id {
+                type leafref {
+                  path "../../../../../../vdu/id";
+                }
+                description
+                  "Uniquely identifies a VDU.";
+                reference
+                  "GS NFV IFA011: Section 7.1.8.9 VduLevel
+                   information element";
+              }
+
+              leaf number-of-instances {
+                type uint32 {
+                  range "0..max";
+                }
+                description
+                  "Number of instances of VNFC based on this VDU to
+                   deploy for an instantiation level or for a
+                   scaling delta. Shall be zero or greater.";
+                reference
+                  "GS NFV IFA011: Section 7.1.8.9 VduLevel
+                   information element";
+              }
+              description
+                "The number of VNFC instances based on particular
+                 VDUs to be created or removed.";
+              reference
+                "GS NFV IFA011: Section 7.1.10.4 ScalingDelta
+                 information element";
+            }
+
+            list virtual-link-bit-rate-delta {
+              key "id";
+
+              leaf id {
+                type string;
+                description
+                  "Uniquely identifies a VnfVirtualLinkDesc.";
+                reference
+                  "GS NFV IFA011: Section 7.1.10.5
+                   VirtualLinkBitRateLevel information element";
+              }
+
+              container bit-rate-requirements {
+                leaf root {
+                  type uint32;
+                  units bits/sec;
+                  mandatory true;
+                  description
+                    "Throughput requirement of the link (e.g.
+                     bitrate of E-Line, root bitrate of E-Tree,
+                     aggregate capacity of E-LAN).";
+                  reference
+                    "GS NFV IFA011: Section 7.1.8.6
+                     LinkBitrateRequirements information element";
+                }
+
+                leaf leaf {
+                  type uint32;
+                  units bits/sec;
+                  description
+                    "Throughput requirement of leaf connections to
+                     the link when applicable to the connectivity
+                     type (e.g. for E-Tree and E-LAN branches).";
+                  reference
+                    "GS NFV IFA011: Section 7.1.8.6
+                     LinkBitrateRequirements information element";
+                }
+                description
+                  "Bitrate requirements for an instantiation level
+                   or bitrate delta for a scaling step.";
+                reference
+                  "GS NFV IFA011: Section 7.1.10.5
+                   VirtualLinkBitRateLevel information element";
+              }
+              description
+                "The bitrate to be added or removed to virtual links
+                 created from particular virtual link descriptors.";
+              reference
+                "GS NFV IFA011: Section 7.1.10.4 ScalingDelta
+                 information element";
+            }
+            description
+              "Declares different scaling deltas, each of which is
+               applied for one or more scaling steps of this
+               aspect.";
+            reference
+              "GS NFV IFA011: Section 7.1.10.3 AspectDeltaDetails
+               information element";
+          }
+
+          leaf step-deltas {
+            type leafref {
+              path "../deltas/id";
+            }
+            description
+              "Identifiers of the individual scaling deltas to be
+               applied for the subsequent scaling steps of this
+               aspect. The first entry in the array shall correspond
+               to the first scaling step (between scale levels 0 to
+               1) and the last entry in the array shall correspond
+               to the last scaling step (between maxScaleLevel-1
+               and maxScaleLevel).
+
+               Each referenced scaling delta shall be declared in
+               the 'deltas' attribute.";
+            reference
+              "GS NFV IFA011: Section 7.1.10.3 AspectDeltaDetails
+               information element";
+          }
+          description
+            "A specification of the deltas in terms of number of
+             instances of VNFCs and virtual link bit rates that
+             correspond to the scaling steps of this aspect. A
+             cardinality of zero indicates that this mapping has to
+             be specified in a lifecycle management script or be
+             otherwise known to the VNFM. The information in this
+             attribute, if provided, shall be consistent with the
+             information provided in the 'InstantiationLevel'
+             information element. If this attribute is provided, it
+             shall be provided for all scaling aspects.";
+          reference
+            "GS NFV IFA011: Section 7.1.10.2 ScalingAspect
+             information element";
+        }
+      }
+    }
+
+    container configurable-properties {
+      description
+        "Describes the configurable properties of the VNF
+         (e.g. related to auto scaling and auto healing).";
+      reference
+        "GS NFV IFA011: Section 7.1.2 VNFD information element";
+
+      leaf is-auto-scalable-enabled {
+        type boolean;
+        description
+          "It permits to enable (TRUE) / disable (FALSE) the
+           auto-scaling functionality.";
+        reference
+          "GS NFV IFA011: Section 7.1.12 VnfConfigurableProperties
+           information element";
+      }
+
+      leaf is-auto-heal-enabled {
+        type boolean;
+        description
+          "It permits to enable (TRUE) / disable (FALSE) the
+           auto-healing functionality.";
+        reference
+          "GS NFV IFA011: Section 7.1.12 VnfConfigurableProperties
+           information element";
+      }
+
+      list additional-configurable-property {
+        key "key";
+
+        leaf key {
+          type string;
+        }
+
+        leaf value {
+          type string;
+        }
+        description
+          "It provides VNF specific configurable properties that can
+           be modified using the ModifyVnfConfiguration operation.";
+        reference
+          "GS NFV IFA011: Section 7.1.12 VnfConfigurableProperties
+           information element";
+      }
+    }
+
+    container modifiable-attributes {
+      description
+        "Describes the modifiable attributes of the VNF.";
+      reference
+        "GS NFV IFA011: Section 7.1.2 VNFD information element";
+
+      leaf-list extension {
+        type string;
+        description
+          "Additional VNF-specific attributes of VnfInfo that
+           affect the lifecycle management of a VNF instance and
+           that are writeable.
+
+           For each VNF instance, these attributes are stored
+           persistently by the VNFM and can be queried and
+           modified through the VNFM.
+
+           These attributes are intended to be consumed by the
+           VNFM or by the lifecycle management scripts during the
+           execution of VNF lifecycle management operations.
+
+           Modifying these values has no direct effect on the VNF
+           instance; however, modified values can be considered
+           during subsequent VNF lifecycle management operations,
+           which means that the modified values can indirectly
+           affect the configuration of the VNF instance.";
+        reference
+          "GS NFV IFA011: Section 7.1.14 VnfInfoModifiableAttributes
+           information element";
+      }
+
+      leaf-list metadata {
+        type string;
+        description
+          "Additional VNF-specific attributes of VnfInfo that are
+           writeable and that provide metadata describing the VNF
+           instance.
+
+           For each VNF instance, these attributes are stored
+           persistently by the VNFM and can be queried and modified
+           through the VNFM.
+
+           These attributes are intended to provide information to
+           functional blocks external to the VNFM and will not be
+           used by the VNFM or the VNF lifecycle management
+           scripts when executing lifecycle management operations.
+
+           Modifying these attributes has no effect on the VNF
+           instance. It only affects the attribute values stored by
+           the VNFM.";
+        reference
+          "GS NFV IFA011: Section 7.1.14 VnfInfoModifiableAttributes
+           information element";
+      }
+    }
+
+    list lifecycle-management-script {
+      key "id";
+      description
+        "Includes a list of events and corresponding management
+         scripts performed for the VNF.";
+      reference
+        "GS NFV IFA011: Section 7.1.2 VNFD information element";
+
+      leaf id {
+        type string;
+        description
+          "A unique string that identfies the script in question.";
+      }
+
+      leaf-list event {
+        type internal-lifecycle-management-script-event;
+        description
+          "Describes VNF lifecycle event(s) or an external stimulus
+           detected on a VNFM reference point.";
+        reference
+          "GS NFV IFA011: Section 7.1.13 LifeCycleManagementScript
+           information element";
+      }
+
+      leaf-list lcm-transition-event {
+        type string;
+        description
+          "Describes the transition VNF lifecycle event(s) that
+           cannot be mapped to any of the enumerated values
+           defined for the event attribute.";
+        reference
+          "GS NFV IFA011: Section 7.1.13 LifeCycleManagementScript
+           information element";
+      }
+
+      leaf script {
+        type string;
+        description
+          "Includes a VNF LCM script (e.g. written in a DSL as
+           specified in requirement VNF_PACK.LCM.001) triggered to
+           react to one of the events listed in the event
+           attribute.";
+        reference
+          "GS NFV IFA011: Section 7.1.13 LifeCycleManagementScript
+           information element";
+      }
+
+      leaf script-dsl {
+        type string;
+        description
+          "Defines the domain specific language (i.e. the type) of
+           script that is provided. Types of scripts could include
+           bash, python, etc.";
+        reference
+          "GS NFV IFA011: Section 7.1.13 LifeCycleManagementScript
+           information element";
+      }
+
+      list script-input {
+        key "key";
+
+        leaf key {
+          type string;
+          description
+            "Includes a VNF LCM script (e.g. written in a DSL as
+             specified in requirement VNF_PACK.LCM.001) triggered to
+             react to one of the events listed in the event
+             attribute.
+
+             The string value specified here is a path to a file in
+             the VNF package.";
+          reference
+            "GS NFV IFA011: Section 7.1.13 LifeCycleManagementScript
+             information element";
+        }
+
+        leaf value {
+          type string;
+        }
+        description
+          "Array of KVP requirements with the key as the parameter
+           name and the value as the parameter that need to be
+           passed as an input to the script.";
+        reference
+          "GS NFV IFA011: Section 7.1.13 LifeCycleManagementScript
+           information element";
+      }
+    }
+
+    list element-group {
+      key "id";
+      description
+        "Describes the associated elements of a VNFD for a certain
+         purpose during VNF lifecycle management.";
+      reference
+        "GS NFV IFA011: Section 7.1.2 VNFD information element";
+
+      leaf id {
+        type string;
+        description
+          "Unique identifier of this group in the VNFD.";
+        reference
+          "GS NFV IFA011: Section 7.1.4 VnfdElementGroup
+           information element";
+      }
+
+      leaf description {
+        type string;
+        description
+          "Human readable description of the group.";
+        reference
+          "GS NFV IFA011: Section 7.1.4 VnfdElementGroup
+           information element";
+      }
+
+      leaf-list vdu {
+        type leafref {
+          path "../../vdu/id";
+        }
+        description
+          "References to Vdus that are part of this group.";
+        reference
+          "GS NFV IFA011: Section 7.1.4 VnfdElementGroup
+           information element";
+      }
+
+      leaf-list virtual-link-desc {
+        type leafref {
+          path "../../int-virtual-link-desc/id";
+        }
+        description
+          "References to VnfVirtualLinkDesc that are part of this
+           group.";
+        reference
+          "GS NFV IFA011: Section 7.1.4 VnfdElementGroup
+           information element";
+      }
+    }
+
+    list indicator {
+      key "id";
+      description
+        "Declares the VNF indicators that are supported by this
+         VNF.";
+      reference
+        "GS NFV IFA011: Section 7.1.2 VNFD information element";
+
+      leaf id {
+        type string;
+        description
+          "Unique identifier";
+        reference
+          "GS NFV IFA011: Section 7.1.11.2 VnfdIndicator
+           information element";
+      }
+
+      leaf name {
+        type string;
+        description
+          "The human readable name of the VnfIndicator.";
+        reference
+          "GS NFV IFA011: Section 7.1.11.2 VnfdIndicator
+           information element";
+      }
+
+      leaf-list indicator-value {
+        type string;
+        description
+          "Defines the allowed values or value ranges of this
+           indicator.";
+        reference
+          "GS NFV IFA011: Section 7.1.11.2 VnfdIndicator
+           information element";
+      }
+
+      leaf source {
+        type enumeration {
+          enum "vnf";
+          enum "em";
+          enum "both";
+        }
+        description
+          "Describe the source of the indicator. The possible values
+           are:
+           • VNF.
+           • EM.
+           • Both.
+           This tells the consumer where to send the subscription
+           request.";
+        reference
+          "GS NFV IFA011: Section 7.1.11.2 VnfdIndicator
+           information element";
+      }
+    }
+
+    leaf-list auto-scale {
+      type string;
+      description
+        "Rule that determines when a scaling action needs to be
+         triggered on a VNF instance e.g. based on certain VNF
+         indicator values or VNF indicator value changes or a
+         combination of VNF indicator value(s) and monitoring
+         parameter(s).";
+      reference
+        "GS NFV IFA011: Section 7.1.2 VNFD information element";
+    }
+  }
+}
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/nfv/etsi-nfv-vnfd.yang b/plugins/org.etsi.mts.tdl.yang2json/samples/nfv/etsi-nfv-vnfd.yang
new file mode 100644
index 0000000000000000000000000000000000000000..5ded801b6d367dece55ad824c3fbef16c1c53f0a
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/nfv/etsi-nfv-vnfd.yang
@@ -0,0 +1,26 @@
+module etsi-nfv-vnfd {
+  yang-version 1.1;
+  namespace "urn:etsi:nfv:yang:etsi-nfv-vnfd";
+  prefix vnfd;
+
+  import etsi-nfv-descriptors {
+    prefix vnf;
+  }
+
+  organization
+    "European Telecommunications Standards Institute (ETSI)";
+
+  description
+    "Virtual Network Function Descriptor.";
+
+  revision 2019-03-18 {
+    description
+      "Initial revision.
+       VNFD according to ETSI GS NFV-IFA 011 Ed261v254.";
+  }
+
+  container vnfd {
+    presence "VNFD container.";
+    uses vnf:vnfd;
+  }
+}
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/simple.tdltx b/plugins/org.etsi.mts.tdl.yang2json/samples/simple.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..3e0cd8a8ec2c370d40c33831f75478af4d09fa8e
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/simple.tdltx
@@ -0,0 +1,591 @@
+Package generated_from_simple {
+    Type String
+    Type TODO_RESOLVE_REFERENCED
+    Use "simple" as SOURCE_MAPPING
+    Use "TODO" as TARGET_MAPPING
+    Structure system (
+        string host_name,
+        string_collection domain_search,
+        system___login login
+    )
+    Type string { pattern }
+    Map string to "BaseStringType{name=(urn:ietf:params:xml:ns:yang:1)string, status=CURRENT, patterns=[]" in SOURCE_MAPPING as string_SOURCE_MAPPING
+    Map string to "target://BaseStringType{name=(urn:ietf:params:xml:ns:yang:1)string, status=CURRENT, patterns=[]" in TARGET_MAPPING as string_TARGET_MAPPING
+    Constraint pattern
+    Collection string_collection of string
+    Map string_collection to "BaseStringType{name=(urn:ietf:params:xml:ns:yang:1)string, status=CURRENT, patterns=[]" in SOURCE_MAPPING as string_collection_SOURCE_MAPPING
+    Map string_collection to "target://BaseStringType{name=(urn:ietf:params:xml:ns:yang:1)string, status=CURRENT, patterns=[]" in TARGET_MAPPING as string_collection_TARGET_MAPPING
+    Structure system___login (
+        string message,
+        login___user_collection user
+    )
+    Structure login___user (
+        string ^name,
+        string full_name,
+        string class
+    )
+    Map login___user to "(http://acme.example.com/system?revision=2007-06-09)user" in SOURCE_MAPPING as login___user_SOURCE_MAPPING {
+        ^name -> "name",
+        full_name -> "full_name",
+        class -> "class"
+    }
+    Map login___user to "target://(http://acme.example.com/system?revision=2007-06-09)user" in TARGET_MAPPING as login___user_TARGET_MAPPING {
+        ^name -> "name",
+        full_name -> "full_name",
+        class -> "class"
+    }
+    Collection login___user_collection of login___user
+    Map login___user_collection to "(http://acme.example.com/system?revision=2007-06-09)user" in SOURCE_MAPPING as login___user_collection_SOURCE_MAPPING
+    Map login___user_collection to "target://(http://acme.example.com/system?revision=2007-06-09)user" in TARGET_MAPPING as login___user_collection_TARGET_MAPPING
+    Map system___login to "(http://acme.example.com/system?revision=2007-06-09)login" in SOURCE_MAPPING as system___login_SOURCE_MAPPING {
+        message -> "message",
+        user -> "user"
+    }
+    Map system___login to "target://(http://acme.example.com/system?revision=2007-06-09)login" in TARGET_MAPPING as system___login_TARGET_MAPPING {
+        message -> "message",
+        user -> "user"
+    }
+    Map system to "(http://acme.example.com/system?revision=2007-06-09)system" in SOURCE_MAPPING as system_SOURCE_MAPPING {
+        host_name -> "host_name",
+        domain_search -> "domain_search",
+        login -> "login"
+    }
+    Map system to "target://(http://acme.example.com/system?revision=2007-06-09)system" in TARGET_MAPPING as system_TARGET_MAPPING {
+        host_name -> "host_name",
+        domain_search -> "domain_search",
+        login -> "login"
+    }
+    Structure parent_container (
+        parent_container___parent_ordered_list_collection child_container
+    )
+    Structure parent_container___parent_ordered_list (
+        string parent_key_leaf,
+        string parent_ordinary_leaf,
+        parent_ordered_list___child_ordered_list_collection child_ordered_list
+    )
+    Structure parent_ordered_list___child_ordered_list (
+        string child_key_leaf,
+        string child_ordinary_leaf
+    )
+    Map parent_ordered_list___child_ordered_list to "(opendaylight.org/example-module)child-ordered-list" in SOURCE_MAPPING as parent_ordered_list___child_ordered_list_SOURCE_MAPPING {
+        child_key_leaf -> "child_key_leaf",
+        child_ordinary_leaf -> "child_ordinary_leaf"
+    }
+    Map parent_ordered_list___child_ordered_list to "target://(opendaylight.org/example-module)child-ordered-list" in TARGET_MAPPING as parent_ordered_list___child_ordered_list_TARGET_MAPPING {
+        child_key_leaf -> "child_key_leaf",
+        child_ordinary_leaf -> "child_ordinary_leaf"
+    }
+    Collection parent_ordered_list___child_ordered_list_collection of parent_ordered_list___child_ordered_list
+    Map parent_ordered_list___child_ordered_list_collection to "(opendaylight.org/example-module)child-ordered-list" in SOURCE_MAPPING as parent_ordered_list___child_ordered_list_collection_SOURCE_MAPPING
+    Map parent_ordered_list___child_ordered_list_collection to "target://(opendaylight.org/example-module)child-ordered-list" in TARGET_MAPPING as parent_ordered_list___child_ordered_list_collection_TARGET_MAPPING
+    Map parent_container___parent_ordered_list to "(opendaylight.org/example-module)parent-ordered-list" in SOURCE_MAPPING as parent_container___parent_ordered_list_SOURCE_MAPPING {
+        parent_key_leaf -> "parent_key_leaf",
+        parent_ordinary_leaf -> "parent_ordinary_leaf",
+        child_ordered_list -> "child_ordered_list"
+    }
+    Map parent_container___parent_ordered_list to "target://(opendaylight.org/example-module)parent-ordered-list" in TARGET_MAPPING as parent_container___parent_ordered_list_TARGET_MAPPING {
+        parent_key_leaf -> "parent_key_leaf",
+        parent_ordinary_leaf -> "parent_ordinary_leaf",
+        child_ordered_list -> "child_ordered_list"
+    }
+    Collection parent_container___parent_ordered_list_collection of parent_container___parent_ordered_list
+    Map parent_container___parent_ordered_list_collection to "(opendaylight.org/example-module)parent-ordered-list" in SOURCE_MAPPING as parent_container___parent_ordered_list_collection_SOURCE_MAPPING
+    Map parent_container___parent_ordered_list_collection to "target://(opendaylight.org/example-module)parent-ordered-list" in TARGET_MAPPING as parent_container___parent_ordered_list_collection_TARGET_MAPPING
+    Map parent_container to "(opendaylight.org/example-module)parent-container" in SOURCE_MAPPING as parent_container_SOURCE_MAPPING {
+        child_container -> "child_container"
+    }
+    Map parent_container to "target://(opendaylight.org/example-module)parent-container" in TARGET_MAPPING as parent_container_TARGET_MAPPING {
+        child_container -> "child_container"
+    }
+    Structure sports (
+        sports___person_collection person,
+        sports___team_collection team,
+        sports___protocol_collection protocol
+    )
+    Structure sports___person (
+        string ^name,
+        date_and_time birthday
+    )
+    Type date_and_time { pattern : "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[\\+\\-]\\d{2}:\\d{2})" } extends string
+    Map date_and_time to "\\d{4-\\d{2-\\d{2T\\d{2:\\d{2:\\d{2(\\.\\d+)?(Z|[\\+\\-]\\d{2:\\d{2)], description=The date-and-time type is a profile of the ISO 8601\nstandard for representation of dates and times using the\nGregorian calendar.  The profile is defined by the\ndate-time production in Section 5.6 of RFC 3339.\n\nThe date-and-time type is compatible with the dateTime XML\nschema type with the following notable exceptions:\n\n(a) The date-and-time type does not allow negative years.\n\n(b) The date-and-time time-offset -00:00 indicates an unknown\n    time zone (see RFC 3339) while -00:00 and +00:00 and Z\n    all represent the same time zone in dateTime.\n\n(c) The canonical format (see below) of data-and-time values\n    differs from the canonical format used by the dateTime XML\n    schema type, which requires all times to be in UTC using\n    the time-offset \'Z\'.\n\nThis type is not equivalent to the DateAndTime textual\nconvention of the SMIv2 since RFC 3339 uses a different\nseparator between full-date and full-time and provides\nhigher resolution of time-secfrac.\n\nThe canonical format for date-and-time values with a known time\nzone uses a numeric time zone offset that is calculated using\nthe device\'s configured known offset to UTC time.  A change of\nthe device\'s offset to UTC time will cause date-and-time values\nto change accordingly.  Such changes might happen periodically\nin case a server follows automatically daylight saving time\n(DST) time zone offset changes.  The canonical format for\ndate-and-time values with an unknown time zone (usually\nreferring to the notion of local time) uses the time-offset\n-00:00., qname=(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)date-and-time, reference=RFC 3339: Date and Time on the Internet: Timestamps\nRFC 2579: Textual Conventions for SMIv2\nXSD-TYPES: XML Schema Part 2: Datatypes Second Edition, status=CURRENT" in SOURCE_MAPPING as date_and_time_SOURCE_MAPPING
+    Map date_and_time to "target://\\d{4-\\d{2-\\d{2T\\d{2:\\d{2:\\d{2(\\.\\d+)?(Z|[\\+\\-]\\d{2:\\d{2)], description=The date-and-time type is a profile of the ISO 8601\nstandard for representation of dates and times using the\nGregorian calendar.  The profile is defined by the\ndate-time production in Section 5.6 of RFC 3339.\n\nThe date-and-time type is compatible with the dateTime XML\nschema type with the following notable exceptions:\n\n(a) The date-and-time type does not allow negative years.\n\n(b) The date-and-time time-offset -00:00 indicates an unknown\n    time zone (see RFC 3339) while -00:00 and +00:00 and Z\n    all represent the same time zone in dateTime.\n\n(c) The canonical format (see below) of data-and-time values\n    differs from the canonical format used by the dateTime XML\n    schema type, which requires all times to be in UTC using\n    the time-offset \'Z\'.\n\nThis type is not equivalent to the DateAndTime textual\nconvention of the SMIv2 since RFC 3339 uses a different\nseparator between full-date and full-time and provides\nhigher resolution of time-secfrac.\n\nThe canonical format for date-and-time values with a known time\nzone uses a numeric time zone offset that is calculated using\nthe device\'s configured known offset to UTC time.  A change of\nthe device\'s offset to UTC time will cause date-and-time values\nto change accordingly.  Such changes might happen periodically\nin case a server follows automatically daylight saving time\n(DST) time zone offset changes.  The canonical format for\ndate-and-time values with an unknown time zone (usually\nreferring to the notion of local time) uses the time-offset\n-00:00., qname=(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)date-and-time, reference=RFC 3339: Date and Time on the Internet: Timestamps\nRFC 2579: Textual Conventions for SMIv2\nXSD-TYPES: XML Schema Part 2: Datatypes Second Edition, status=CURRENT" in TARGET_MAPPING as date_and_time_TARGET_MAPPING
+    Map sports___person to "(http://example.com/example-sports)person" in SOURCE_MAPPING as sports___person_SOURCE_MAPPING {
+        ^name -> "name",
+        birthday -> "birthday"
+    }
+    Map sports___person to "target://(http://example.com/example-sports)person" in TARGET_MAPPING as sports___person_TARGET_MAPPING {
+        ^name -> "name",
+        birthday -> "birthday"
+    }
+    Collection sports___person_collection of sports___person
+    Map sports___person_collection to "(http://example.com/example-sports)person" in SOURCE_MAPPING as sports___person_collection_SOURCE_MAPPING
+    Map sports___person_collection to "target://(http://example.com/example-sports)person" in TARGET_MAPPING as sports___person_collection_TARGET_MAPPING
+    Structure sports___team (
+        string ^name,
+        team___player_collection player,
+        protocol protocol,
+        team___vlan_id vlan_id
+    )
+    Structure team___player (
+        @LeafRefPath : "/sports/person/name"
+        leafref ^name,
+        season season,
+        uint16 number,
+        scores scores,
+        uint16_collection score_list
+    )
+    Type leafref
+    Map leafref to "BaseLeafrefType{name=(http://example.com/ns/link)leafref, status=CURRENT, pathStatement=ParsedPathExpression{steps=LocationPathSteps{locationPath=YangLocationPath{absolute=true, steps=[Step{axis=child, qname=Unqualified{localName=config, Step{axis=child, qname=Unqualified{localName=links, Step{axis=child, qname=Unqualified{localName=link, Step{axis=child, qname=Unqualified{localName=name], originalString=/config/links/link/name" in SOURCE_MAPPING as leafref_SOURCE_MAPPING
+    Map leafref to "target://BaseLeafrefType{name=(http://example.com/ns/link)leafref, status=CURRENT, pathStatement=ParsedPathExpression{steps=LocationPathSteps{locationPath=YangLocationPath{absolute=true, steps=[Step{axis=child, qname=Unqualified{localName=config, Step{axis=child, qname=Unqualified{localName=links, Step{axis=child, qname=Unqualified{localName=link, Step{axis=child, qname=Unqualified{localName=name], originalString=/config/links/link/name" in TARGET_MAPPING as leafref_TARGET_MAPPING
+    Annotation LeafRefPath
+    Type season { pattern } extends string
+    Map season to "DerivedStringType{baseType=BaseStringType{name=(urn:ietf:params:xml:ns:yang:1)string, status=CURRENT, patterns=[], description=The name of a sports season, including the type and the year, e.g,\n\'Champions League 2014/2015\'., qname=(http://example.com/example-sports)season, status=CURRENT" in SOURCE_MAPPING as season_SOURCE_MAPPING
+    Map season to "target://DerivedStringType{baseType=BaseStringType{name=(urn:ietf:params:xml:ns:yang:1)string, status=CURRENT, patterns=[], description=The name of a sports season, including the type and the year, e.g,\n\'Champions League 2014/2015\'., qname=(http://example.com/example-sports)season, status=CURRENT" in TARGET_MAPPING as season_TARGET_MAPPING
+    Type uint16
+    Map uint16 to "BaseUint16Type{name=(urn:ietf:params:xml:ns:yang:1)uint16, status=CURRENT, range=ResolvedRangeConstraint{ranges=[[0..65535]]" in SOURCE_MAPPING as uint16_SOURCE_MAPPING
+    Map uint16 to "target://BaseUint16Type{name=(urn:ietf:params:xml:ns:yang:1)uint16, status=CURRENT, range=ResolvedRangeConstraint{ranges=[[0..65535]]" in TARGET_MAPPING as uint16_TARGET_MAPPING
+    Type scores extends uint16
+    Map scores to "DerivedUint16Type{baseType=BaseUint16Type{name=(urn:ietf:params:xml:ns:yang:1)uint16, status=CURRENT, range=ResolvedRangeConstraint{ranges=[[0..65535]], default=0, qname=(http://example.com/example-sports)scores, status=CURRENT" in SOURCE_MAPPING as scores_SOURCE_MAPPING
+    Map scores to "target://DerivedUint16Type{baseType=BaseUint16Type{name=(urn:ietf:params:xml:ns:yang:1)uint16, status=CURRENT, range=ResolvedRangeConstraint{ranges=[[0..65535]], default=0, qname=(http://example.com/example-sports)scores, status=CURRENT" in TARGET_MAPPING as scores_TARGET_MAPPING
+    Collection uint16_collection of uint16
+    Map uint16_collection to "BaseUint16Type{name=(urn:ietf:params:xml:ns:yang:1)uint16, status=CURRENT, range=ResolvedRangeConstraint{ranges=[[0..65535]]" in SOURCE_MAPPING as uint16_collection_SOURCE_MAPPING
+    Map uint16_collection to "target://BaseUint16Type{name=(urn:ietf:params:xml:ns:yang:1)uint16, status=CURRENT, range=ResolvedRangeConstraint{ranges=[[0..65535]]" in TARGET_MAPPING as uint16_collection_TARGET_MAPPING
+    Map team___player to "(http://example.com/example-sports)player" in SOURCE_MAPPING as team___player_SOURCE_MAPPING {
+        ^name -> "name",
+        season -> "season",
+        number -> "number",
+        scores -> "scores",
+        score_list -> "score_list"
+    }
+    Map team___player to "target://(http://example.com/example-sports)player" in TARGET_MAPPING as team___player_TARGET_MAPPING {
+        ^name -> "name",
+        season -> "season",
+        number -> "number",
+        scores -> "scores",
+        score_list -> "score_list"
+    }
+    Collection team___player_collection of team___player
+    Map team___player_collection to "(http://example.com/example-sports)player" in SOURCE_MAPPING as team___player_collection_SOURCE_MAPPING
+    Map team___player_collection to "target://(http://example.com/example-sports)player" in TARGET_MAPPING as team___player_collection_TARGET_MAPPING
+    Enumerated protocol {
+        protocol tcp,
+        protocol udp,
+        protocol icmp
+    }
+    Map protocol to "DerivedEnumerationType{baseType=BaseEnumerationType{name=(http://example.com/example-sports)enumeration, status=CURRENT, values=[EnumPairImpl{name=tcp, value=0, EnumPairImpl{name=udp, value=1, EnumPairImpl{name=icmp, value=2], default=tcp, qname=(http://example.com/example-sports)protocol, status=CURRENT" in SOURCE_MAPPING as protocol_SOURCE_MAPPING
+    Map protocol to "target://DerivedEnumerationType{baseType=BaseEnumerationType{name=(http://example.com/example-sports)enumeration, status=CURRENT, values=[EnumPairImpl{name=tcp, value=0, EnumPairImpl{name=udp, value=1, EnumPairImpl{name=icmp, value=2], default=tcp, qname=(http://example.com/example-sports)protocol, status=CURRENT" in TARGET_MAPPING as protocol_TARGET_MAPPING
+    Type team___vlan_id { union : "vid_range_type","team___vlan_id___enumeration" }
+    Constraint union
+    Type vid_range_type { pattern : "([1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?(,[1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?)*)" } extends string
+    Map vid_range_type to "([1-9][0-9]{0,3(-[1-9][0-9]{0,3)?(,[1-9][0-9]{0,3(-[1-9][0-9]{0,3)?)*)], description=A list of VLAN Ids, or non overlapping VLAN ranges, in ascending\norder, between 1 and 4094.\n\nThis type is used to match an ordered list of VLAN Ids, or\ncontiguous ranges of VLAN Ids. Valid VLAN Ids must be in the range\n1 to 4094, and included in the list in non overlapping ascending\norder.\n\nFor example: 1,10-100,250,500-1000, qname=(http://example.com/example-sports)vid-range-type, status=CURRENT" in SOURCE_MAPPING as vid_range_type_SOURCE_MAPPING
+    Map vid_range_type to "target://([1-9][0-9]{0,3(-[1-9][0-9]{0,3)?(,[1-9][0-9]{0,3(-[1-9][0-9]{0,3)?)*)], description=A list of VLAN Ids, or non overlapping VLAN ranges, in ascending\norder, between 1 and 4094.\n\nThis type is used to match an ordered list of VLAN Ids, or\ncontiguous ranges of VLAN Ids. Valid VLAN Ids must be in the range\n1 to 4094, and included in the list in non overlapping ascending\norder.\n\nFor example: 1,10-100,250,500-1000, qname=(http://example.com/example-sports)vid-range-type, status=CURRENT" in TARGET_MAPPING as vid_range_type_TARGET_MAPPING
+    Enumerated team___vlan_id___enumeration {
+        team___vlan_id___enumeration ^any
+    }
+    Map team___vlan_id___enumeration to "BaseEnumerationType{name=(http://example.com/example-sports)enumeration, status=CURRENT, values=[EnumPairImpl{name=any, value=4095]" in SOURCE_MAPPING as team___vlan_id___enumeration_SOURCE_MAPPING
+    Map team___vlan_id___enumeration to "target://BaseEnumerationType{name=(http://example.com/example-sports)enumeration, status=CURRENT, values=[EnumPairImpl{name=any, value=4095]" in TARGET_MAPPING as team___vlan_id___enumeration_TARGET_MAPPING
+    Map team___vlan_id to "([1-9][0-9]{0,3(-[1-9][0-9]{0,3)?(,[1-9][0-9]{0,3(-[1-9][0-9]{0,3)?)*)], description=A list of VLAN Ids, or non overlapping VLAN ranges, in ascending\norder, between 1 and 4094.\n\nThis type is used to match an ordered list of VLAN Ids, or\ncontiguous ranges of VLAN Ids. Valid VLAN Ids must be in the range\n1 to 4094, and included in the list in non overlapping ascending\norder.\n\nFor example: 1,10-100,250,500-1000, qname=(http://example.com/example-sports)vid-range-type, status=CURRENT, BaseEnumerationType{name=(http://example.com/example-sports)enumeration, status=CURRENT, values=[EnumPairImpl{name=any, value=4095]]" in SOURCE_MAPPING as team___vlan_id_SOURCE_MAPPING
+    Map team___vlan_id to "target://([1-9][0-9]{0,3(-[1-9][0-9]{0,3)?(,[1-9][0-9]{0,3(-[1-9][0-9]{0,3)?)*)], description=A list of VLAN Ids, or non overlapping VLAN ranges, in ascending\norder, between 1 and 4094.\n\nThis type is used to match an ordered list of VLAN Ids, or\ncontiguous ranges of VLAN Ids. Valid VLAN Ids must be in the range\n1 to 4094, and included in the list in non overlapping ascending\norder.\n\nFor example: 1,10-100,250,500-1000, qname=(http://example.com/example-sports)vid-range-type, status=CURRENT, BaseEnumerationType{name=(http://example.com/example-sports)enumeration, status=CURRENT, values=[EnumPairImpl{name=any, value=4095]]" in TARGET_MAPPING as team___vlan_id_TARGET_MAPPING
+    Map sports___team to "(http://example.com/example-sports)team" in SOURCE_MAPPING as sports___team_SOURCE_MAPPING {
+        ^name -> "name",
+        player -> "player",
+        protocol -> "protocol",
+        vlan_id -> "vlan_id"
+    }
+    Map sports___team to "target://(http://example.com/example-sports)team" in TARGET_MAPPING as sports___team_TARGET_MAPPING {
+        ^name -> "name",
+        player -> "player",
+        protocol -> "protocol",
+        vlan_id -> "vlan_id"
+    }
+    Collection sports___team_collection of sports___team
+    Map sports___team_collection to "(http://example.com/example-sports)team" in SOURCE_MAPPING as sports___team_collection_SOURCE_MAPPING
+    Map sports___team_collection to "target://(http://example.com/example-sports)team" in TARGET_MAPPING as sports___team_collection_TARGET_MAPPING
+    Structure sports___protocol (
+        string associated_layer_protocol,
+        protocoly protocoly,
+        protocol___ext_cpd_collection ext_cpd,
+        protocol___case_ext_cpd_collection case_ext_cpd,
+        string protocolz,
+        protocol___port_map_collection port_map
+    )
+    Enumerated protocoly {
+        protocoly tcp,
+        protocoly udp,
+        protocoly icmp
+    }
+    Map protocoly to "DerivedEnumerationType{baseType=BaseEnumerationType{name=(http://example.com/example-sports)enumeration, status=CURRENT, values=[EnumPairImpl{name=tcp, value=0, EnumPairImpl{name=udp, value=1, EnumPairImpl{name=icmp, value=2], default=tcp, qname=(http://example.com/example-sports)protocoly, status=CURRENT" in SOURCE_MAPPING as protocoly_SOURCE_MAPPING
+    Map protocoly to "target://DerivedEnumerationType{baseType=BaseEnumerationType{name=(http://example.com/example-sports)enumeration, status=CURRENT, values=[EnumPairImpl{name=tcp, value=0, EnumPairImpl{name=udp, value=1, EnumPairImpl{name=icmp, value=2], default=tcp, qname=(http://example.com/example-sports)protocoly, status=CURRENT" in TARGET_MAPPING as protocoly_TARGET_MAPPING
+    Structure protocol___ext_cpd (
+        string k,
+        ext_cpd___cp_connection cp_connection
+    )
+    Structure ext_cpd___cp_connection (
+        cp_connection___int_virtual_link_desc int_virtual_link_desc,
+        cp_connection___int_cpd int_cpd
+    )
+    Structure cp_connection___int_virtual_link_desc (
+        string int_virtual_link_desc
+    )
+    Map cp_connection___int_virtual_link_desc to "(http://example.com/example-sports)int-virtual-link-desc" in SOURCE_MAPPING as cp_connection___int_virtual_link_desc_SOURCE_MAPPING {
+        int_virtual_link_desc -> "int_virtual_link_desc"
+    }
+    Map cp_connection___int_virtual_link_desc to "target://(http://example.com/example-sports)int-virtual-link-desc" in TARGET_MAPPING as cp_connection___int_virtual_link_desc_TARGET_MAPPING {
+        int_virtual_link_desc -> "int_virtual_link_desc"
+    }
+    Structure cp_connection___int_cpd (
+        int_cpd___int_cpd int_cpd
+    )
+    Structure int_cpd___int_cpd (
+        string vdu_id,
+        string cpd
+    )
+    Map int_cpd___int_cpd to "(http://example.com/example-sports)int-cpd" in SOURCE_MAPPING as int_cpd___int_cpd_SOURCE_MAPPING {
+        vdu_id -> "vdu_id",
+        cpd -> "cpd"
+    }
+    Map int_cpd___int_cpd to "target://(http://example.com/example-sports)int-cpd" in TARGET_MAPPING as int_cpd___int_cpd_TARGET_MAPPING {
+        vdu_id -> "vdu_id",
+        cpd -> "cpd"
+    }
+    Map cp_connection___int_cpd to "(http://example.com/example-sports)int-cpd" in SOURCE_MAPPING as cp_connection___int_cpd_SOURCE_MAPPING {
+        int_cpd -> "int_cpd"
+    }
+    Map cp_connection___int_cpd to "target://(http://example.com/example-sports)int-cpd" in TARGET_MAPPING as cp_connection___int_cpd_TARGET_MAPPING {
+        int_cpd -> "int_cpd"
+    }
+    Map ext_cpd___cp_connection to "(http://example.com/example-sports)cp-connection" in SOURCE_MAPPING as ext_cpd___cp_connection_SOURCE_MAPPING {
+        int_virtual_link_desc -> "int_virtual_link_desc",
+        int_cpd -> "int_cpd"
+    }
+    Map ext_cpd___cp_connection to "target://(http://example.com/example-sports)cp-connection" in TARGET_MAPPING as ext_cpd___cp_connection_TARGET_MAPPING {
+        int_virtual_link_desc -> "int_virtual_link_desc",
+        int_cpd -> "int_cpd"
+    }
+    Map protocol___ext_cpd to "(http://example.com/example-sports)ext-cpd" in SOURCE_MAPPING as protocol___ext_cpd_SOURCE_MAPPING {
+        k -> "k",
+        cp_connection -> "cp_connection"
+    }
+    Map protocol___ext_cpd to "target://(http://example.com/example-sports)ext-cpd" in TARGET_MAPPING as protocol___ext_cpd_TARGET_MAPPING {
+        k -> "k",
+        cp_connection -> "cp_connection"
+    }
+    Collection protocol___ext_cpd_collection of protocol___ext_cpd
+    Map protocol___ext_cpd_collection to "(http://example.com/example-sports)ext-cpd" in SOURCE_MAPPING as protocol___ext_cpd_collection_SOURCE_MAPPING
+    Map protocol___ext_cpd_collection to "target://(http://example.com/example-sports)ext-cpd" in TARGET_MAPPING as protocol___ext_cpd_collection_TARGET_MAPPING
+    Structure protocol___case_ext_cpd (
+        string k,
+        case_ext_cpd___cp_connection cp_connection
+    )
+    Structure case_ext_cpd___cp_connection (
+        cp_connection___a ^a,
+        cp_connection___b b
+    )
+    Structure cp_connection___a (
+        string int_virtual_link_desc
+    )
+    Map cp_connection___a to "(http://example.com/example-sports)a" in SOURCE_MAPPING as cp_connection___a_SOURCE_MAPPING {
+        int_virtual_link_desc -> "int_virtual_link_desc"
+    }
+    Map cp_connection___a to "target://(http://example.com/example-sports)a" in TARGET_MAPPING as cp_connection___a_TARGET_MAPPING {
+        int_virtual_link_desc -> "int_virtual_link_desc"
+    }
+    Structure cp_connection___b (
+        b___int_cpd int_cpd
+    )
+    Structure b___int_cpd (
+        string vdu_id,
+        string cpd
+    )
+    Map b___int_cpd to "(http://example.com/example-sports)int-cpd" in SOURCE_MAPPING as b___int_cpd_SOURCE_MAPPING {
+        vdu_id -> "vdu_id",
+        cpd -> "cpd"
+    }
+    Map b___int_cpd to "target://(http://example.com/example-sports)int-cpd" in TARGET_MAPPING as b___int_cpd_TARGET_MAPPING {
+        vdu_id -> "vdu_id",
+        cpd -> "cpd"
+    }
+    Map cp_connection___b to "(http://example.com/example-sports)b" in SOURCE_MAPPING as cp_connection___b_SOURCE_MAPPING {
+        int_cpd -> "int_cpd"
+    }
+    Map cp_connection___b to "target://(http://example.com/example-sports)b" in TARGET_MAPPING as cp_connection___b_TARGET_MAPPING {
+        int_cpd -> "int_cpd"
+    }
+    Map case_ext_cpd___cp_connection to "(http://example.com/example-sports)cp-connection" in SOURCE_MAPPING as case_ext_cpd___cp_connection_SOURCE_MAPPING {
+        ^a -> "a",
+        b -> "b"
+    }
+    Map case_ext_cpd___cp_connection to "target://(http://example.com/example-sports)cp-connection" in TARGET_MAPPING as case_ext_cpd___cp_connection_TARGET_MAPPING {
+        ^a -> "a",
+        b -> "b"
+    }
+    Map protocol___case_ext_cpd to "(http://example.com/example-sports)case-ext-cpd" in SOURCE_MAPPING as protocol___case_ext_cpd_SOURCE_MAPPING {
+        k -> "k",
+        cp_connection -> "cp_connection"
+    }
+    Map protocol___case_ext_cpd to "target://(http://example.com/example-sports)case-ext-cpd" in TARGET_MAPPING as protocol___case_ext_cpd_TARGET_MAPPING {
+        k -> "k",
+        cp_connection -> "cp_connection"
+    }
+    Collection protocol___case_ext_cpd_collection of protocol___case_ext_cpd
+    Map protocol___case_ext_cpd_collection to "(http://example.com/example-sports)case-ext-cpd" in SOURCE_MAPPING as protocol___case_ext_cpd_collection_SOURCE_MAPPING
+    Map protocol___case_ext_cpd_collection to "target://(http://example.com/example-sports)case-ext-cpd" in TARGET_MAPPING as protocol___case_ext_cpd_collection_TARGET_MAPPING
+    Structure protocol___port_map (
+        string port_ref,
+        port_map___map_type map_type
+    )
+    Structure port_map___map_type (
+        map_type___static_filtering_entries static_filtering_entries,
+        map_type___static_vlan_registration_entries static_vlan_registration_entries
+    )
+    Structure map_type___static_filtering_entries (
+        static_filtering_entries___static_filtering_entries static_filtering_entries
+    )
+    Structure static_filtering_entries___static_filtering_entries (
+        static_filtering_entries___control_element control_element,
+        string connection_identifier
+    )
+    Enumerated static_filtering_entries___control_element {
+        static_filtering_entries___control_element forward,
+        static_filtering_entries___control_element filter
+    }
+    Map static_filtering_entries___control_element to "BaseEnumerationType{name=(http://example.com/example-sports)enumeration, status=CURRENT, values=[EnumPairImpl{name=forward, value=0, EnumPairImpl{name=filter, value=1]" in SOURCE_MAPPING as static_filtering_entries___control_element_SOURCE_MAPPING
+    Map static_filtering_entries___control_element to "target://BaseEnumerationType{name=(http://example.com/example-sports)enumeration, status=CURRENT, values=[EnumPairImpl{name=forward, value=0, EnumPairImpl{name=filter, value=1]" in TARGET_MAPPING as static_filtering_entries___control_element_TARGET_MAPPING
+    Map static_filtering_entries___static_filtering_entries to "(http://example.com/example-sports)static-filtering-entries" in SOURCE_MAPPING as static_filtering_entries___static_filtering_entries_SOURCE_MAPPING {
+        control_element -> "control_element",
+        connection_identifier -> "connection_identifier"
+    }
+    Map static_filtering_entries___static_filtering_entries to "target://(http://example.com/example-sports)static-filtering-entries" in TARGET_MAPPING as static_filtering_entries___static_filtering_entries_TARGET_MAPPING {
+        control_element -> "control_element",
+        connection_identifier -> "connection_identifier"
+    }
+    Map map_type___static_filtering_entries to "(http://example.com/example-sports)static-filtering-entries" in SOURCE_MAPPING as map_type___static_filtering_entries_SOURCE_MAPPING {
+        static_filtering_entries -> "static_filtering_entries"
+    }
+    Map map_type___static_filtering_entries to "target://(http://example.com/example-sports)static-filtering-entries" in TARGET_MAPPING as map_type___static_filtering_entries_TARGET_MAPPING {
+        static_filtering_entries -> "static_filtering_entries"
+    }
+    Structure map_type___static_vlan_registration_entries (
+        static_vlan_registration_entries___static_vlan_registration_entries static_vlan_registration_entries
+    )
+    Structure static_vlan_registration_entries___static_vlan_registration_entries (
+        static_vlan_registration_entries___registrar_admin_control registrar_admin_control
+    )
+    Enumerated static_vlan_registration_entries___registrar_admin_control {
+        static_vlan_registration_entries___registrar_admin_control fixed_new_ignored,
+        static_vlan_registration_entries___registrar_admin_control forbidden
+    }
+    Map static_vlan_registration_entries___registrar_admin_control to "BaseEnumerationType{name=(http://example.com/example-sports)enumeration, status=CURRENT, values=[EnumPairImpl{name=fixed-new-ignored, value=0, EnumPairImpl{name=forbidden, value=1]" in SOURCE_MAPPING as static_vlan_registration_entries___registrar_admin_control_SOURCE_MAPPING
+    Map static_vlan_registration_entries___registrar_admin_control to "target://BaseEnumerationType{name=(http://example.com/example-sports)enumeration, status=CURRENT, values=[EnumPairImpl{name=fixed-new-ignored, value=0, EnumPairImpl{name=forbidden, value=1]" in TARGET_MAPPING as static_vlan_registration_entries___registrar_admin_control_TARGET_MAPPING
+    Map static_vlan_registration_entries___static_vlan_registration_entries to "(http://example.com/example-sports)static-vlan-registration-entries" in SOURCE_MAPPING as static_vlan_registration_entries___static_vlan_registration_entries_SOURCE_MAPPING {
+        registrar_admin_control -> "registrar_admin_control"
+    }
+    Map static_vlan_registration_entries___static_vlan_registration_entries to "target://(http://example.com/example-sports)static-vlan-registration-entries" in TARGET_MAPPING as static_vlan_registration_entries___static_vlan_registration_entries_TARGET_MAPPING {
+        registrar_admin_control -> "registrar_admin_control"
+    }
+    Map map_type___static_vlan_registration_entries to "(http://example.com/example-sports)static-vlan-registration-entries" in SOURCE_MAPPING as map_type___static_vlan_registration_entries_SOURCE_MAPPING {
+        static_vlan_registration_entries -> "static_vlan_registration_entries"
+    }
+    Map map_type___static_vlan_registration_entries to "target://(http://example.com/example-sports)static-vlan-registration-entries" in TARGET_MAPPING as map_type___static_vlan_registration_entries_TARGET_MAPPING {
+        static_vlan_registration_entries -> "static_vlan_registration_entries"
+    }
+    Map port_map___map_type to "(http://example.com/example-sports)map-type" in SOURCE_MAPPING as port_map___map_type_SOURCE_MAPPING {
+        static_filtering_entries -> "static_filtering_entries",
+        static_vlan_registration_entries -> "static_vlan_registration_entries"
+    }
+    Map port_map___map_type to "target://(http://example.com/example-sports)map-type" in TARGET_MAPPING as port_map___map_type_TARGET_MAPPING {
+        static_filtering_entries -> "static_filtering_entries",
+        static_vlan_registration_entries -> "static_vlan_registration_entries"
+    }
+    Map protocol___port_map to "(http://example.com/example-sports)port-map" in SOURCE_MAPPING as protocol___port_map_SOURCE_MAPPING {
+        port_ref -> "port_ref",
+        map_type -> "map_type"
+    }
+    Map protocol___port_map to "target://(http://example.com/example-sports)port-map" in TARGET_MAPPING as protocol___port_map_TARGET_MAPPING {
+        port_ref -> "port_ref",
+        map_type -> "map_type"
+    }
+    Collection protocol___port_map_collection of protocol___port_map
+    Map protocol___port_map_collection to "(http://example.com/example-sports)port-map" in SOURCE_MAPPING as protocol___port_map_collection_SOURCE_MAPPING
+    Map protocol___port_map_collection to "target://(http://example.com/example-sports)port-map" in TARGET_MAPPING as protocol___port_map_collection_TARGET_MAPPING
+    Map sports___protocol to "(http://example.com/example-sports)protocol" in SOURCE_MAPPING as sports___protocol_SOURCE_MAPPING {
+        associated_layer_protocol -> "associated_layer_protocol",
+        protocoly -> "protocoly",
+        ext_cpd -> "ext_cpd",
+        case_ext_cpd -> "case_ext_cpd",
+        protocolz -> "protocolz",
+        port_map -> "port_map"
+    }
+    Map sports___protocol to "target://(http://example.com/example-sports)protocol" in TARGET_MAPPING as sports___protocol_TARGET_MAPPING {
+        associated_layer_protocol -> "associated_layer_protocol",
+        protocoly -> "protocoly",
+        ext_cpd -> "ext_cpd",
+        case_ext_cpd -> "case_ext_cpd",
+        protocolz -> "protocolz",
+        port_map -> "port_map"
+    }
+    Collection sports___protocol_collection of sports___protocol
+    Map sports___protocol_collection to "(http://example.com/example-sports)protocol" in SOURCE_MAPPING as sports___protocol_collection_SOURCE_MAPPING
+    Map sports___protocol_collection to "target://(http://example.com/example-sports)protocol" in TARGET_MAPPING as sports___protocol_collection_TARGET_MAPPING
+    Map sports to "(http://example.com/example-sports)sports" in SOURCE_MAPPING as sports_SOURCE_MAPPING {
+        person -> "person",
+        team -> "team",
+        protocol -> "protocol"
+    }
+    Map sports to "target://(http://example.com/example-sports)sports" in TARGET_MAPPING as sports_TARGET_MAPPING {
+        person -> "person",
+        team -> "team",
+        protocol -> "protocol"
+    }
+    Structure config (
+        config___link_collection links,
+        config___queueDiscipline_collection queueDisciplines,
+        config___linkLimitation_collection linkLimitations,
+        config___defaultLink defaultLink
+    )
+    Structure config___link (
+        string ^name,
+        link___flags flags,
+        mac_address addr,
+        mac_address brd,
+        mtu mtu
+    )
+    Structure link___flags (
+        empty UP,
+        empty NOARP,
+        empty BROADCAST,
+        empty MULTICAST,
+        empty LOOPBACK,
+        empty NOTRAILERS
+    )
+    Type empty
+    Map empty to "BaseEmptyType{name=(urn:ietf:params:xml:ns:yang:1)empty, status=CURRENT" in SOURCE_MAPPING as empty_SOURCE_MAPPING
+    Map empty to "target://BaseEmptyType{name=(urn:ietf:params:xml:ns:yang:1)empty, status=CURRENT" in TARGET_MAPPING as empty_TARGET_MAPPING
+    Map link___flags to "(http://example.com/ns/link)flags" in SOURCE_MAPPING as link___flags_SOURCE_MAPPING {
+        UP -> "UP",
+        NOARP -> "NOARP",
+        BROADCAST -> "BROADCAST",
+        MULTICAST -> "MULTICAST",
+        LOOPBACK -> "LOOPBACK",
+        NOTRAILERS -> "NOTRAILERS"
+    }
+    Map link___flags to "target://(http://example.com/ns/link)flags" in TARGET_MAPPING as link___flags_TARGET_MAPPING {
+        UP -> "UP",
+        NOARP -> "NOARP",
+        BROADCAST -> "BROADCAST",
+        MULTICAST -> "MULTICAST",
+        LOOPBACK -> "LOOPBACK",
+        NOTRAILERS -> "NOTRAILERS"
+    }
+    Type mac_address { pattern : "[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}" } extends string
+    Map mac_address to "[0-9a-fA-F]{2(:[0-9a-fA-F]{2){5], description=The mac-address type represents an IEEE 802 MAC address.\nThe canonical representation uses lowercase characters.\n\nIn the value set and its semantics, this type is equivalent\nto the MacAddress textual convention of the SMIv2., qname=(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)mac-address, reference=IEEE 802: IEEE Standard for Local and Metropolitan Area\n          Networks: Overview and Architecture\nRFC 2579: Textual Conventions for SMIv2, status=CURRENT" in SOURCE_MAPPING as mac_address_SOURCE_MAPPING
+    Map mac_address to "target://[0-9a-fA-F]{2(:[0-9a-fA-F]{2){5], description=The mac-address type represents an IEEE 802 MAC address.\nThe canonical representation uses lowercase characters.\n\nIn the value set and its semantics, this type is equivalent\nto the MacAddress textual convention of the SMIv2., qname=(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)mac-address, reference=IEEE 802: IEEE Standard for Local and Metropolitan Area\n          Networks: Overview and Architecture\nRFC 2579: Textual Conventions for SMIv2, status=CURRENT" in TARGET_MAPPING as mac_address_TARGET_MAPPING
+    Type mtu extends uint32
+    Type uint32
+    Map mtu to "DerivedUint32Type{baseType=BaseUint32Type{name=(urn:ietf:params:xml:ns:yang:1)uint32, status=CURRENT, range=ResolvedRangeConstraint{ranges=[[0..4294967295]], default=1500, qname=(http://example.com/ns/link)mtu, status=CURRENT" in SOURCE_MAPPING as mtu_SOURCE_MAPPING
+    Map mtu to "target://DerivedUint32Type{baseType=BaseUint32Type{name=(urn:ietf:params:xml:ns:yang:1)uint32, status=CURRENT, range=ResolvedRangeConstraint{ranges=[[0..4294967295]], default=1500, qname=(http://example.com/ns/link)mtu, status=CURRENT" in TARGET_MAPPING as mtu_TARGET_MAPPING
+    Map config___link to "(http://example.com/ns/link)link" in SOURCE_MAPPING as config___link_SOURCE_MAPPING {
+        ^name -> "name",
+        flags -> "flags",
+        addr -> "addr",
+        brd -> "brd",
+        mtu -> "mtu"
+    }
+    Map config___link to "target://(http://example.com/ns/link)link" in TARGET_MAPPING as config___link_TARGET_MAPPING {
+        ^name -> "name",
+        flags -> "flags",
+        addr -> "addr",
+        brd -> "brd",
+        mtu -> "mtu"
+    }
+    Collection config___link_collection { maxLength : 1024 } of config___link
+    Map config___link_collection to "(http://example.com/ns/link)link" in SOURCE_MAPPING as config___link_collection_SOURCE_MAPPING
+    Map config___link_collection to "target://(http://example.com/ns/link)link" in TARGET_MAPPING as config___link_collection_TARGET_MAPPING
+    Constraint maxLength
+    Structure config___queueDiscipline (
+        @LeafRefPath : "/config/links/link/name"
+        leafref linkName,
+        QueueDisciplineType ^type,
+        uint32 length
+    )
+    Enumerated QueueDisciplineType {
+        QueueDisciplineType pfifo_fast,
+        QueueDisciplineType noqueue,
+        QueueDisciplineType noop,
+        QueueDisciplineType htb
+    }
+    Map QueueDisciplineType to "DerivedEnumerationType{baseType=BaseEnumerationType{name=(http://example.com/ns/link)enumeration, status=CURRENT, values=[EnumPairImpl{name=pfifo_fast, value=0, EnumPairImpl{name=noqueue, value=1, EnumPairImpl{name=noop, value=2, EnumPairImpl{name=htb, value=3], qname=(http://example.com/ns/link)QueueDisciplineType, status=CURRENT" in SOURCE_MAPPING as QueueDisciplineType_SOURCE_MAPPING
+    Map QueueDisciplineType to "target://DerivedEnumerationType{baseType=BaseEnumerationType{name=(http://example.com/ns/link)enumeration, status=CURRENT, values=[EnumPairImpl{name=pfifo_fast, value=0, EnumPairImpl{name=noqueue, value=1, EnumPairImpl{name=noop, value=2, EnumPairImpl{name=htb, value=3], qname=(http://example.com/ns/link)QueueDisciplineType, status=CURRENT" in TARGET_MAPPING as QueueDisciplineType_TARGET_MAPPING
+    Map uint32 to "BaseUint32Type{name=(urn:ietf:params:xml:ns:yang:1)uint32, status=CURRENT, range=ResolvedRangeConstraint{ranges=[[0..4294967295]]" in SOURCE_MAPPING as uint32_SOURCE_MAPPING
+    Map uint32 to "target://BaseUint32Type{name=(urn:ietf:params:xml:ns:yang:1)uint32, status=CURRENT, range=ResolvedRangeConstraint{ranges=[[0..4294967295]]" in TARGET_MAPPING as uint32_TARGET_MAPPING
+    Map config___queueDiscipline to "(http://example.com/ns/link)queueDiscipline" in SOURCE_MAPPING as config___queueDiscipline_SOURCE_MAPPING {
+        linkName -> "linkName",
+        ^type -> "type",
+        length -> "length"
+    }
+    Map config___queueDiscipline to "target://(http://example.com/ns/link)queueDiscipline" in TARGET_MAPPING as config___queueDiscipline_TARGET_MAPPING {
+        linkName -> "linkName",
+        ^type -> "type",
+        length -> "length"
+    }
+    Collection config___queueDiscipline_collection { maxLength : 1024 } of config___queueDiscipline
+    Map config___queueDiscipline_collection to "(http://example.com/ns/link)queueDiscipline" in SOURCE_MAPPING as config___queueDiscipline_collection_SOURCE_MAPPING
+    Map config___queueDiscipline_collection to "target://(http://example.com/ns/link)queueDiscipline" in TARGET_MAPPING as config___queueDiscipline_collection_TARGET_MAPPING
+    Structure config___linkLimitation (
+        @LeafRefPath : "/config/links/link/name"
+        leafref linkName,
+        linkLimitation___limitations limitations
+    )
+    Structure linkLimitation___limitations (
+        only10Mbps only10Mbps,
+        onlyHalfDuplex onlyHalfDuplex
+    )
+    Type only10Mbps extends boolean
+    Type boolean
+    Map only10Mbps to "DerivedBooleanType{baseType=BaseBooleanType{name=(urn:ietf:params:xml:ns:yang:1)boolean, status=CURRENT, default=false, qname=(http://example.com/ns/link)only10Mbps, status=CURRENT" in SOURCE_MAPPING as only10Mbps_SOURCE_MAPPING
+    Map only10Mbps to "target://DerivedBooleanType{baseType=BaseBooleanType{name=(urn:ietf:params:xml:ns:yang:1)boolean, status=CURRENT, default=false, qname=(http://example.com/ns/link)only10Mbps, status=CURRENT" in TARGET_MAPPING as only10Mbps_TARGET_MAPPING
+    Type onlyHalfDuplex extends boolean
+    Map onlyHalfDuplex to "DerivedBooleanType{baseType=BaseBooleanType{name=(urn:ietf:params:xml:ns:yang:1)boolean, status=CURRENT, default=false, qname=(http://example.com/ns/link)onlyHalfDuplex, status=CURRENT" in SOURCE_MAPPING as onlyHalfDuplex_SOURCE_MAPPING
+    Map onlyHalfDuplex to "target://DerivedBooleanType{baseType=BaseBooleanType{name=(urn:ietf:params:xml:ns:yang:1)boolean, status=CURRENT, default=false, qname=(http://example.com/ns/link)onlyHalfDuplex, status=CURRENT" in TARGET_MAPPING as onlyHalfDuplex_TARGET_MAPPING
+    Map linkLimitation___limitations to "(http://example.com/ns/link)limitations" in SOURCE_MAPPING as linkLimitation___limitations_SOURCE_MAPPING {
+        only10Mbps -> "only10Mbps",
+        onlyHalfDuplex -> "onlyHalfDuplex"
+    }
+    Map linkLimitation___limitations to "target://(http://example.com/ns/link)limitations" in TARGET_MAPPING as linkLimitation___limitations_TARGET_MAPPING {
+        only10Mbps -> "only10Mbps",
+        onlyHalfDuplex -> "onlyHalfDuplex"
+    }
+    Map config___linkLimitation to "(http://example.com/ns/link)linkLimitation" in SOURCE_MAPPING as config___linkLimitation_SOURCE_MAPPING {
+        linkName -> "linkName",
+        limitations -> "limitations"
+    }
+    Map config___linkLimitation to "target://(http://example.com/ns/link)linkLimitation" in TARGET_MAPPING as config___linkLimitation_TARGET_MAPPING {
+        linkName -> "linkName",
+        limitations -> "limitations"
+    }
+    Collection config___linkLimitation_collection of config___linkLimitation
+    Map config___linkLimitation_collection to "(http://example.com/ns/link)linkLimitation" in SOURCE_MAPPING as config___linkLimitation_collection_SOURCE_MAPPING
+    Map config___linkLimitation_collection to "target://(http://example.com/ns/link)linkLimitation" in TARGET_MAPPING as config___linkLimitation_collection_TARGET_MAPPING
+    Structure config___defaultLink (
+        @LeafRefPath : "/config/links/link/name"
+        leafref linkName
+    )
+    Map config___defaultLink to "(http://example.com/ns/link)defaultLink" in SOURCE_MAPPING as config___defaultLink_SOURCE_MAPPING {
+        linkName -> "linkName"
+    }
+    Map config___defaultLink to "target://(http://example.com/ns/link)defaultLink" in TARGET_MAPPING as config___defaultLink_TARGET_MAPPING {
+        linkName -> "linkName"
+    }
+    Map config to "(http://example.com/ns/link)config" in SOURCE_MAPPING as config_SOURCE_MAPPING {
+        links -> "links",
+        queueDisciplines -> "queueDisciplines",
+        linkLimitations -> "linkLimitations",
+        defaultLink -> "defaultLink"
+    }
+    Map config to "target://(http://example.com/ns/link)config" in TARGET_MAPPING as config_TARGET_MAPPING {
+        links -> "links",
+        queueDisciplines -> "queueDisciplines",
+        linkLimitations -> "linkLimitations",
+        defaultLink -> "defaultLink"
+    }
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/simple/acme.yang b/plugins/org.etsi.mts.tdl.yang2json/samples/simple/acme.yang
new file mode 100644
index 0000000000000000000000000000000000000000..d2a489e8afbc50317446c064f6574f3df3da045a
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/simple/acme.yang
@@ -0,0 +1,47 @@
+// Contents of "acme-system.yang"
+module acme-system {
+    namespace "acme-system";
+    prefix "acme";
+
+    organization "ACME Inc.";
+    contact "joe@acme.example.com";
+    description
+        "The module for entities implementing the ACME system.";
+
+    revision 2007-06-09 {
+        description "Initial revision.";
+    }
+
+    container system {
+        leaf host-name {
+            type string;
+            description "Hostname for this system";
+        }
+
+        leaf-list domain-search {
+            type string;
+            description "List of domain names to search";
+        }
+
+        container login {
+            leaf message {
+                type string;
+                description
+                    "Message given at start of login session";
+            }
+
+            list user {
+                key "name";
+                leaf name {
+                    type string;
+                }
+                leaf full-name {
+                    type string;
+                }
+                leaf class {
+                    type string;
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/simple/acme.yang-generated.tdltx b/plugins/org.etsi.mts.tdl.yang2json/samples/simple/acme.yang-generated.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..35a3f347539cc0621735d287e5aaea4bd233383d
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/simple/acme.yang-generated.tdltx
@@ -0,0 +1,22 @@
+Package generated_from_acme_yang {
+    Type String
+    Type TODO_RESOLVE_REFERENCED
+    Use "acme.yang" as SOURCE_MAPPING
+    Structure system (
+        string host_name,
+        string_collection domain_search,
+        system___login login
+    )
+    Type string
+    Collection string_collection of string
+    Structure system___login (
+        string message,
+        login___user_collection user
+    )
+    Structure login___user (
+        string ^name,
+        string full_name,
+        string class
+    )
+    Collection login___user_collection of login___user
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/simple/acme.yang.tdltx b/plugins/org.etsi.mts.tdl.yang2json/samples/simple/acme.yang.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..9a0202a2cf0e3938871bde6e479c531d398dd549
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/simple/acme.yang.tdltx
@@ -0,0 +1,27 @@
+Package generated_from_acme_yang {
+    Type String
+    Type TODO_RESOLVE_REFERENCED
+    Use "acme.yang" as SOURCE_MAPPING
+    Structure system (
+        system___host_name host_name,
+        string_collection domain_search,
+        system___login login
+    )
+    Type system___host_name
+    Type string
+    Collection string_collection of string
+    Structure system___login (
+        login___message message,
+        login___user_collection user
+    )
+    Type login___message
+    Structure login___user (
+        user___name ^name,
+        user___full_name full_name,
+        user___class class
+    )
+    Type user___name
+    Type user___full_name
+    Type user___class
+    Collection login___user_collection of login___user
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/simple/example.yang b/plugins/org.etsi.mts.tdl.yang2json/samples/simple/example.yang
new file mode 100644
index 0000000000000000000000000000000000000000..d667828fa284eabb7153c74c539e12e959b6e2aa
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/simple/example.yang
@@ -0,0 +1,36 @@
+module example-module {
+    namespace "opendaylight.org/example-module";
+    prefix "example";
+
+    container parent-container {
+        container child-container {
+            list parent-ordered-list {
+                ordered-by user;
+
+                key "parent-key-leaf";
+
+                leaf parent-key-leaf {
+                    type string;
+                }
+
+                leaf parent-ordinary-leaf {
+                    type string;
+                }
+
+                list child-ordered-list {
+                    ordered-by user;
+
+                    key "child-key-leaf";
+
+                    leaf child-key-leaf {
+                        type string;
+                    }
+
+                    leaf child-ordinary-leaf {
+                        type string;
+                    }
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/simple/example.yang.tdltx b/plugins/org.etsi.mts.tdl.yang2json/samples/simple/example.yang.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..c53a018db00c0a6f86d616605ab423b05eb81b26
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/simple/example.yang.tdltx
@@ -0,0 +1,26 @@
+Package generated_from_example_yang {
+    Type String
+    Type TODO_RESOLVE_REFERENCED
+    Use "example.yang" as SOURCE_MAPPING
+    Structure parent_container (
+        parent_container___child_container child_container
+    )
+    Structure parent_container___child_container (
+        child_container___parent_ordered_list_collection parent_ordered_list
+    )
+    Structure child_container___parent_ordered_list (
+        parent_ordered_list___parent_key_leaf parent_key_leaf,
+        parent_ordered_list___parent_ordinary_leaf parent_ordinary_leaf,
+        parent_ordered_list___child_ordered_list_collection child_ordered_list
+    )
+    Type parent_ordered_list___parent_key_leaf
+    Type parent_ordered_list___parent_ordinary_leaf
+    Structure parent_ordered_list___child_ordered_list (
+        child_ordered_list___child_key_leaf child_key_leaf,
+        child_ordered_list___child_ordinary_leaf child_ordinary_leaf
+    )
+    Type child_ordered_list___child_key_leaf
+    Type child_ordered_list___child_ordinary_leaf
+    Collection parent_ordered_list___child_ordered_list_collection of parent_ordered_list___child_ordered_list
+    Collection child_container___parent_ordered_list_collection of child_container___parent_ordered_list
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/simple/links.yang b/plugins/org.etsi.mts.tdl.yang2json/samples/simple/links.yang
new file mode 100644
index 0000000000000000000000000000000000000000..65de24507353714b0c6328cd70e14ea984abd3c0
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/simple/links.yang
@@ -0,0 +1,119 @@
+module links {
+    namespace "http://example.com/ns/link";
+    prefix link;
+
+    import ietf-yang-types {
+        prefix yang;
+    }
+
+
+    grouping LinkFlagsType {
+        leaf UP {
+            type empty;
+        }
+        leaf NOARP {
+            type empty;
+        }
+        leaf BROADCAST {
+            type empty;
+        }
+        leaf MULTICAST {
+            type empty;
+        }
+        leaf LOOPBACK {
+            type empty;
+      }
+        leaf NOTRAILERS {
+            type empty;
+        }
+    }
+
+    typedef QueueDisciplineType {
+        type enumeration {
+            enum pfifo_fast;
+            enum noqueue;
+            enum noop;
+            enum htb;
+        }
+    }
+    typedef QueueDisciplineTypeX {
+        type enumeration {
+            enum pfifo_fast;
+            enum noqueue;
+            enum noop;
+            enum htb;
+        }
+    }
+    container config {
+        container links {
+            list link {
+                key name;
+                unique addr;
+                max-elements 1024;
+                leaf name {
+                    type string;
+                }
+                container flags {
+                    uses LinkFlagsType;
+                }
+                leaf addr {
+                    type yang:mac-address;
+                    mandatory true;
+                }
+                leaf brd {
+                    type yang:mac-address;
+                    mandatory true;
+                }
+                leaf mtu {
+                    type uint32;
+                    default 1500;
+                }
+            }
+        }
+        container queueDisciplines {
+            list queueDiscipline {
+                key linkName;
+                max-elements 1024;
+                leaf linkName {
+                    type leafref {
+                        path "/config/links/link/name";
+                    }
+                }
+                leaf type {
+                    type QueueDisciplineType;
+                    mandatory true;
+                }
+                leaf length {
+                    type uint32;
+                }
+            }
+        }
+        container linkLimitations {
+            list linkLimitation {
+                key linkName;
+                leaf linkName {
+                    type leafref {
+                        path "/config/links/link/name";
+                    }
+                }
+                container limitations {
+                    leaf only10Mbps {
+                        type boolean;
+                        default false;
+                    }
+                    leaf onlyHalfDuplex {
+                        type boolean;
+                        default false;
+                    }
+                }
+            }
+        }
+        container defaultLink {
+            leaf linkName {
+                type leafref {
+                    path "/config/links/link/name";
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/simple/links.yang-generated.tdltx b/plugins/org.etsi.mts.tdl.yang2json/samples/simple/links.yang-generated.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..f10679ca0a19faa5068d9abc6ecf08eff58b4205
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/simple/links.yang-generated.tdltx
@@ -0,0 +1,64 @@
+Package generated_from_links_yang {
+    Type String
+    Type TODO_RESOLVE_REFERENCED
+    Use "links.yang" as SOURCE_MAPPING
+    Structure config (
+        config___link_collection links,
+        config___queueDiscipline_collection queueDisciplines,
+        config___linkLimitation_collection linkLimitations,
+        config___defaultLink defaultLink
+    )
+    Structure config___link (
+        string ^name,
+        link___flags flags,
+        mac_address addr,
+        mac_address brd,
+        mtu mtu
+    )
+    Type string
+    Structure link___flags (
+        empty UP,
+        empty NOARP,
+        empty BROADCAST,
+        empty MULTICAST,
+        empty LOOPBACK,
+        empty NOTRAILERS
+    )
+    Type empty
+    Type mac_address extends string
+    Type mtu extends uint32
+    Type uint32
+    Collection config___link_collection of config___link
+    Structure config___queueDiscipline (
+        @LeafRefPath : "/config/links/link/name"
+        leafref linkName,
+        QueueDisciplineType ^type,
+        uint32 length
+    )
+    Type leafref
+    Annotation LeafRefPath
+    Enumerated QueueDisciplineType {
+        QueueDisciplineType pfifo_fast,
+        QueueDisciplineType noqueue,
+        QueueDisciplineType noop,
+        QueueDisciplineType htb
+    }
+    Collection config___queueDiscipline_collection of config___queueDiscipline
+    Structure config___linkLimitation (
+        @LeafRefPath : "/config/links/link/name"
+        leafref linkName,
+        linkLimitation___limitations limitations
+    )
+    Structure linkLimitation___limitations (
+        only10Mbps only10Mbps,
+        onlyHalfDuplex onlyHalfDuplex
+    )
+    Type only10Mbps extends boolean
+    Type boolean
+    Type onlyHalfDuplex extends boolean
+    Collection config___linkLimitation_collection of config___linkLimitation
+    Structure config___defaultLink (
+        @LeafRefPath : "/config/links/link/name"
+        leafref linkName
+    )
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/simple/links.yang.tdltx b/plugins/org.etsi.mts.tdl.yang2json/samples/simple/links.yang.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..d92705d8472cf48cb28ac7db4f2b8388e6b1021e
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/simple/links.yang.tdltx
@@ -0,0 +1,66 @@
+Package generated_from_links_yang {
+    Type String
+    Type TODO_RESOLVE_REFERENCED
+    Use "links.yang" as SOURCE_MAPPING
+    Structure config (
+        config___link_collection links,
+        config___queueDiscipline_collection queueDisciplines,
+        config___linkLimitation_collection linkLimitations,
+        config___defaultLink defaultLink
+    )
+    Structure config___link (
+        link___name ^name,
+        link___flags flags,
+        link___addr addr,
+        link___brd brd,
+        link___mtu mtu
+    )
+    Type link___name
+    Structure link___flags (
+        flags___UP UP,
+        flags___NOARP NOARP,
+        flags___BROADCAST BROADCAST,
+        flags___MULTICAST MULTICAST,
+        flags___LOOPBACK LOOPBACK,
+        flags___NOTRAILERS NOTRAILERS
+    )
+    Type flags___UP
+    Type flags___NOARP
+    Type flags___BROADCAST
+    Type flags___MULTICAST
+    Type flags___LOOPBACK
+    Type flags___NOTRAILERS
+    Type link___addr extends string
+    Type string
+    Type link___brd extends string
+    Type link___mtu extends uint32
+    Type uint32
+    Collection config___link_collection of config___link
+    Structure config___queueDiscipline (
+        queueDiscipline___linkName linkName,
+        queueDiscipline___type ^type,
+        queueDiscipline___length length
+    )
+    Type queueDiscipline___linkName
+    Type queueDiscipline___type extends enumeration
+    Type enumeration
+    Type queueDiscipline___length
+    Collection config___queueDiscipline_collection of config___queueDiscipline
+    Structure config___linkLimitation (
+        linkLimitation___linkName linkName,
+        linkLimitation___limitations limitations
+    )
+    Type linkLimitation___linkName
+    Structure linkLimitation___limitations (
+        limitations___only10Mbps only10Mbps,
+        limitations___onlyHalfDuplex onlyHalfDuplex
+    )
+    Type limitations___only10Mbps extends boolean
+    Type boolean
+    Type limitations___onlyHalfDuplex extends boolean
+    Collection config___linkLimitation_collection of config___linkLimitation
+    Structure config___defaultLink (
+        defaultLink___linkName linkName
+    )
+    Type defaultLink___linkName
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/simple/sports.yang b/plugins/org.etsi.mts.tdl.yang2json/samples/simple/sports.yang
new file mode 100644
index 0000000000000000000000000000000000000000..86872bd0f053bedaf9c789cecce1588494e972d7
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/simple/sports.yang
@@ -0,0 +1,221 @@
+module example-sports {
+
+    namespace "http://example.com/example-sports";
+    prefix sports;
+
+    import ietf-yang-types {
+        prefix yang;
+    }
+
+    typedef season {
+        type string;
+        description
+          "The name of a sports season, including the type and the year, e.g,
+           'Champions League 2014/2015'.";
+    }
+
+    container sports {
+        config true;
+
+        list person {
+            key "name";
+            leaf name {
+                type string;
+            }
+            leaf birthday {
+                type yang:date-and-time;
+                mandatory true;
+            }
+        }
+
+        list team {
+            key "name";
+            leaf name {
+                type string;
+            }
+            list player {
+                key "name season";
+                unique number;
+                leaf name {
+                    type leafref {
+                        path "/sports/person/name";
+                    }
+                }
+                leaf season {
+                    type season;
+                }
+                leaf number {
+                    type uint16;
+                    mandatory true;
+                }
+                leaf scores {
+                    type uint16;
+                    default 0;
+                }
+                leaf-list score-list {
+                    type uint16;
+                }
+            }
+            leaf protocol {
+                type enumeration {
+                    enum tcp;
+                    enum udp;
+                    enum icmp;
+                }
+                default "tcp";
+            }
+            leaf vlan-id {
+              type union {
+                type vid-range-type;
+                type enumeration {
+                  enum any {
+                    value 4095;
+                    description
+                      "Matches 'any' VLAN in the range 1 to 4094.";
+                  }
+                }
+              }
+              mandatory true;
+              description
+                "VLAN Ids or any";
+            }
+            
+            
+        }
+        list protocol {
+            key "associated-layer-protocol";
+            leaf associated-layer-protocol {
+                type string;
+
+                description
+                  "One of the values of the attribute layerProtocol of the Cpd
+                   IE.";
+                reference
+                  "GS NFV IFA011: Section 7.1.6.8 CpProtocolData information
+                   element";
+            }
+            uses g1;
+            uses g2;
+        }
+    }
+    grouping g1 {
+        leaf protocoly {
+            type enumeration {
+                enum tcp;
+                enum udp;
+                enum icmp;
+            }
+            default "tcp";
+        }
+        list ext-cpd {
+        	key "k";
+        	leaf k {
+        		type string;
+        	}
+            choice cp-connection {
+                // no case
+                leaf int-virtual-link-desc {
+                    type string;
+                }
+                container int-cpd {
+                    leaf vdu-id {
+                        type string;
+                    }
+                    leaf cpd {
+                        type string;
+                    }
+                }
+            }
+        }
+        list case-ext-cpd {
+        	key "k";
+        	leaf k {
+        		type string;
+        	}
+            choice cp-connection {
+                // case
+                case a {
+                    leaf int-virtual-link-desc {
+                        type string;
+                    }
+                }
+                case b {
+
+                    container int-cpd {
+                        leaf vdu-id {
+                            type string;
+                        }
+                        leaf cpd {
+                            type string;
+                        }
+                    }
+                }
+            }
+        }
+
+    }
+    grouping g2 {
+        leaf protocolz {
+            type string;
+        }
+        list port-map {
+            key "port-ref";
+            leaf port-ref {
+                type string;
+            }
+            choice map-type {
+                // no case
+                container static-filtering-entries {
+                    leaf control-element {
+                        type enumeration {
+                            enum forward;
+                            enum filter;
+                        }
+                    }
+                    leaf connection-identifier {
+                        type string;
+                    }
+                }
+                container static-vlan-registration-entries {
+                    leaf registrar-admin-control {
+                        type enumeration {
+                            enum fixed-new-ignored;
+                            enum forbidden;
+                        }
+                    }
+                }
+            }
+        }
+    }
+    typedef vid-range-type {
+      type string {
+        pattern
+          "([1-9]"+
+          "[0-9]{0,3}"+
+          "(-[1-9][0-9]{0,3})?"+
+          "(,[1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?)*)";
+      }
+      description
+        "A list of VLAN Ids, or non overlapping VLAN ranges, in ascending
+        order, between 1 and 4094.
+        
+        This type is used to match an ordered list of VLAN Ids, or
+        contiguous ranges of VLAN Ids. Valid VLAN Ids must be in the range
+        1 to 4094, and included in the list in non overlapping ascending
+        order.
+        
+        For example: 1,10-100,250,500-1000";
+    }
+    typedef vlanid {
+      type uint16 {
+        range "1..4094";
+      }
+      description
+        "The vlanid type uniquely identifies a VLAN. This is the 12-bit
+        VLAN-ID used in the VLAN Tag header. The range is defined by the
+        referenced specification. This type is in the value set and its
+        semantics equivalent to the VlanId textual convention of the
+        SMIv2.";
+    }
+      
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2json/samples/simple/sports.yang-generated.tdltx b/plugins/org.etsi.mts.tdl.yang2json/samples/simple/sports.yang-generated.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..89428f05e99badc3ee1ad005c8027f839c19de4c
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/samples/simple/sports.yang-generated.tdltx
@@ -0,0 +1,134 @@
+Package generated_from_sports_yang {
+    Type String
+    Type TODO_RESOLVE_REFERENCED
+    Use "sports.yang" as SOURCE_MAPPING
+    Structure sports (
+        sports___person_collection person,
+        sports___team_collection team,
+        sports___protocol_collection protocol
+    )
+    Structure sports___person (
+        string ^name,
+        date_and_time birthday
+    )
+    Type string { pattern }
+    Type date_and_time extends string
+    Collection sports___person_collection of sports___person
+    Structure sports___team (
+        string ^name,
+        team___player_collection player,
+        protocol protocol,
+        team___vlan_id vlan_id
+    )
+    Structure team___player (
+        @LeafRefPath : "/sports/person/name"
+        leafref ^name,
+        season season,
+        uint16 number,
+        scores scores,
+        uint16_collection score_list
+    )
+    Type leafref
+    Annotation LeafRefPath
+    Type season extends string
+    Type uint16
+    Type scores extends uint16
+    Collection uint16_collection of uint16
+    Collection team___player_collection of team___player
+    Enumerated protocol {
+        protocol tcp,
+        protocol udp,
+        protocol icmp
+    }
+    Type team___vlan_id { union : "vid_range_type","team___vlan_id___enumeration" }
+    Constraint union
+    Type vid_range_type { pattern : "([1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?(,[1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?)*)" } extends string
+   
+    Constraint pattern
+    Enumerated team___vlan_id___enumeration {
+        team___vlan_id___enumeration ^any
+    }
+    Collection sports___team_collection of sports___team
+    Structure sports___protocol (
+        string associated_layer_protocol,
+        protocoly protocoly,
+        protocol___ext_cpd_collection ext_cpd,
+        protocol___case_ext_cpd_collection case_ext_cpd,
+        string protocolz,
+        protocol___port_map_collection port_map
+    )
+    Enumerated protocoly {
+        protocoly tcp,
+        protocoly udp,
+        protocoly icmp
+    }
+    Structure protocol___ext_cpd (
+        string k,
+        ext_cpd___cp_connection cp_connection
+    )
+    Structure ext_cpd___cp_connection (
+        cp_connection___int_virtual_link_desc int_virtual_link_desc,
+        cp_connection___int_cpd int_cpd
+    )
+    Structure cp_connection___int_virtual_link_desc (
+        string int_virtual_link_desc
+    )
+    Structure cp_connection___int_cpd (
+        int_cpd___int_cpd int_cpd
+    )
+    Structure int_cpd___int_cpd (
+        string vdu_id,
+        string cpd
+    )
+    Collection protocol___ext_cpd_collection of protocol___ext_cpd
+    Structure protocol___case_ext_cpd (
+        string k,
+        case_ext_cpd___cp_connection cp_connection
+    )
+    Structure case_ext_cpd___cp_connection (
+        cp_connection___a ^a,
+        cp_connection___b b
+    )
+    Structure cp_connection___a (
+        string int_virtual_link_desc
+    )
+    Structure cp_connection___b (
+        b___int_cpd int_cpd
+    )
+    Structure b___int_cpd (
+        string vdu_id,
+        string cpd
+    )
+    Collection protocol___case_ext_cpd_collection of protocol___case_ext_cpd
+    Structure protocol___port_map (
+        string port_ref,
+        port_map___map_type map_type
+    )
+    Structure port_map___map_type (
+        map_type___static_filtering_entries static_filtering_entries,
+        map_type___static_vlan_registration_entries static_vlan_registration_entries
+    )
+    Structure map_type___static_filtering_entries (
+        static_filtering_entries___static_filtering_entries static_filtering_entries
+    )
+    Structure static_filtering_entries___static_filtering_entries (
+        static_filtering_entries___control_element control_element,
+        string connection_identifier
+    )
+    Enumerated static_filtering_entries___control_element {
+        static_filtering_entries___control_element forward,
+        static_filtering_entries___control_element filter
+    }
+    Structure map_type___static_vlan_registration_entries (
+        static_vlan_registration_entries___static_vlan_registration_entries static_vlan_registration_entries
+    )
+    Structure static_vlan_registration_entries___static_vlan_registration_entries (
+        static_vlan_registration_entries___registrar_admin_control registrar_admin_control
+    )
+    Enumerated static_vlan_registration_entries___registrar_admin_control {
+        static_vlan_registration_entries___registrar_admin_control fixed_new_ignored,
+        static_vlan_registration_entries___registrar_admin_control forbidden
+    }
+    Collection protocol___port_map_collection of protocol___port_map
+    Collection sports___protocol_collection of sports___protocol
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2json/src/org/etsi/mts/tdl/yang2json/App.java b/plugins/org.etsi.mts.tdl.yang2json/src/org/etsi/mts/tdl/yang2json/App.java
new file mode 100644
index 0000000000000000000000000000000000000000..63bd489a1e3a16496a9fcbfd00428c1802c1dc7e
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2json/src/org/etsi/mts/tdl/yang2json/App.java
@@ -0,0 +1,280 @@
+/*
+ * This Java source file was generated by the Gradle 'init' task.
+ */
+package org.etsi.mts.tdl.yang2json;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringWriter;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.LinkedHashMap;
+import org.opendaylight.yangtools.odlext.parser.MountStatementSupport;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+import org.opendaylight.yangtools.yang.data.api.schema.stream.InputStreamNormalizer;
+import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizationException;
+import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
+import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter;
+import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactory;
+import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
+import org.opendaylight.yangtools.yang.data.codec.gson.JSONNormalizedNodeStreamWriter;
+import org.opendaylight.yangtools.yang.data.codec.gson.JsonWriterFactory;
+import org.opendaylight.yangtools.yang.data.spi.node.LazyValues;
+import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
+import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.model.spi.source.FileYangTextSource;
+import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
+import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference;
+import org.opendaylight.yangtools.yang.parser.api.YangParserConfiguration;
+import org.opendaylight.yangtools.yang.parser.api.YangSyntaxErrorException;
+import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.RFC7950Reactors;
+import org.opendaylight.yangtools.yang.parser.rfc7950.repo.YangStatementStreamSource;
+import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase;
+import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
+import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor;
+import org.opendaylight.yangtools.yang.parser.stmt.reactor.EffectiveSchemaContext; 
+import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor.BuildAction;
+
+// import org.opendaylight.;
+
+// public class App {
+//     public String getGreeting() {
+//         return "Hello World!";
+//     }
+
+//     public static void main(String[] args) {
+//         System.out.println(new App().getGreeting());
+
+//     }
+
+
+public class App {     
+    QName system = QName.create("acme-system", "2007-06-09", "system");
+    QName login = QName.create(system, "login");
+    QName user = QName.create(system, "user"); 
+    private LinkedHashMap<String, QName> names = new LinkedHashMap<>();
+    private SchemaContext schemaContext;
+    private InputStreamNormalizer PARSER;
+
+
+    public App(String limit, String targetFilename) {
+        try {
+			init(limit, targetFilename);
+		} catch (IOException | ReactorException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+    }
+
+    public static void main( String[] args ) throws IOException, ReactorException, NormalizationException
+    {
+        String limit = new File(".").getAbsolutePath();
+        String targetFilename = "samples/simple/acme.yang";
+        // targetFilename = "yang.parser.test/app/src/main/resources/foo.yang";
+        App app = new App(limit, targetFilename);
+        app.process();
+    }
+
+    private void process()
+            throws IOException, ReactorException, NormalizationException {
+
+        NormalizedNode data = parseTopLevelComplete(PARSER);
+        NormalizedNode childSingle = parseChildDataSingle(PARSER);
+        NormalizedNode childMultiple = parseChildDataMultiple(PARSER);
+        writeNodeData(PARSER, data);
+        //TODO: partial writing does not work yet
+        // writeNestedNodeData(PARSER, data);
+        // writeNodeData(PARSER, childSingle);
+        // writeNodeData(PARSER, childMultiple);
+        // writeNestedNodeData(PARSER, childSingle);
+        // writeNestedNodeData(PARSER, childMultiple);
+    }
+
+
+    private void init(String limit, String targetFilename) throws IOException, ReactorException {
+        schemaContext = loadSchema(limit, targetFilename);
+        schemaContext.getChildNodes().forEach(e->System.out.println(e.getQName().getNamespace()));
+        expand("", schemaContext);
+        //parse json input
+        System.out.println("----------------------------------------------------");
+        names.forEach((k,v)-> System.out.println(k+":"+v.getNamespace()));
+        System.out.println("----------------------------------------------------");
+
+        PARSER = JSONCodecFactorySupplier.RFC7951.getShared((EffectiveSchemaContext) schemaContext);
+    }
+
+    private static CrossSourceStatementReactor createReactor() {
+		CrossSourceStatementReactor reactor = RFC7950Reactors.vanillaReactorBuilder()
+            .addStatementSupport(ModelProcessingPhase.FULL_DECLARATION,
+            new MountStatementSupport(YangParserConfiguration.DEFAULT))
+        .build();
+		return reactor;
+	}
+
+
+    public void expand(String prefix, DataSchemaNode node) {
+        System.out.println(prefix + node.getQName().getNamespace() 
+            + " : "+node.getQName().getLocalName() 
+            // + " : " + node.getQName().getModule()
+            );
+        names.put(node.getQName().getLocalName(), node.getQName());
+        if (node instanceof DataNodeContainer) {
+            for (DataSchemaNode c : ((DataNodeContainer) node).getChildNodes()) {
+                expand(prefix+"  ", c);
+            }
+        }
+    }
+
+    private NormalizedNode parseTopLevelComplete(InputStreamNormalizer PARSER)
+            throws NormalizationException, IOException {
+    	String json = Files.readString(Path.of("samples", "json", "acme.system.json"));
+        NormalizedNode data = PARSER.parseChildData(Inference.of((EffectiveSchemaContext) schemaContext), stream(json)).result().data();
+
+        System.out.println(data.prettyTree());
+        return data;
+    }
+
+    private NormalizedNode parseChildDataMultiple(InputStreamNormalizer PARSER)
+            throws NormalizationException, IOException {
+        SchemaInferenceStack stack = SchemaInferenceStack.of((EffectiveModelContext) schemaContext);
+        stack.enterSchemaTree(system);
+        stack.enterSchemaTree(login);
+        stack.enterSchemaTree(user);
+        String json = Files.readString(Path.of("samples", "json", "acme.system.login.user.json"));
+        NormalizedNode data = PARSER.parseData(
+            stack.toInference(), 
+            stream(json)).data();
+        System.out.println(data.prettyTree());
+        return data;
+    }
+
+    private NormalizedNode parseChildDataSingle(InputStreamNormalizer PARSER)
+            throws NormalizationException, IOException {
+        SchemaInferenceStack stack = SchemaInferenceStack.of((EffectiveModelContext) schemaContext);
+        stack.enterSchemaTree(system);
+        stack.enterSchemaTree(login);
+        String json = Files.readString(Path.of("samples", "json", "acme.system.login.json"));
+        NormalizedNode childData = PARSER.parseChildData(
+            stack.toInference(), 
+            stream(json)).result().data();
+        System.out.println(childData.prettyTree());
+        return childData;
+    }
+
+    private void writeNestedNodeData(InputStreamNormalizer PARSER, NormalizedNode data) throws IOException {
+        // nested writer
+        final var nestedWriter = new StringWriter();
+        // InputStreamNormalizer nPARSER = JSONCodecFactorySupplier.RFC7951.getShared((EffectiveSchemaContext) stack.currentStatement());
+        final var jsonNestedStream = JSONNormalizedNodeStreamWriter.createNestedWriter(
+            (JSONCodecFactory) PARSER, JsonWriterFactory.createJsonWriter(nestedWriter, 2));
+            final var nestedNodeWriter = NormalizedNodeWriter.forStreamWriter(((NormalizedNodeStreamWriter) jsonNestedStream)
+        );
+
+        nestedNodeWriter.write(data).close();
+        System.out.println(nestedWriter.toString());
+
+        var dcc  = (DataContainerChild)data;
+        var b = dcc.body();
+        b = ((LazyValues) b).iterator().next().body();
+        var c = ((LazyValues) b).iterator().next();
+        //TODO: does not work yet
+        nestedNodeWriter.write(c).close();
+        // Just to put it somewhere
+        System.out.println(nestedWriter.toString());
+    }
+
+    private void writeNodeData(InputStreamNormalizer PARSER, NormalizedNode data) throws IOException {
+        //write json output
+        //TODO: need to figure out partial parsing and output
+        // String holder
+        final var writer = new StringWriter();
+        // StreamWriter which outputs JSON strings
+        // StreamWriter which outputs JSON strings
+        final var jsonStream = JSONNormalizedNodeStreamWriter.createExclusiveWriter(
+            (JSONCodecFactory) PARSER, JsonWriterFactory.createJsonWriter(writer, 2));
+            
+        // NormalizedNode -> StreamWriter
+        final var nodeWriter = NormalizedNodeWriter.forStreamWriter((NormalizedNodeStreamWriter) jsonStream);
+            
+        // Write multiple NormalizedNodes fluently, flush()/close() as needed
+        nodeWriter.write(data).close();
+        System.out.println(writer.toString());
+    }
+
+    private SchemaContext loadSchema(String limit, String targetFilename)
+            throws IOException, ReactorException {
+        CrossSourceStatementReactor reactor = createReactor();
+		BuildAction build = reactor.newBuild();
+
+		//TODO: extract
+		//DONE: resolve files -> load everything from the root folder (naive approach)
+		//TODO: handle folders as well?
+		//TODO: handle duplicates modules?
+		System.out.println("Load YANG libraries from parent:");
+		Path target = Path.of(targetFilename);
+        System.out.println(target.toAbsolutePath().toString());
+		Path parent = target;
+		while (parent.getParent() != null && !parent.toAbsolutePath().toString().equals(limit)) {
+			parent = parent.getParent();
+		}
+		if (parent != target) {
+			Files.walk(parent).filter(f->
+					f.toFile().isFile() &&
+					f.toString().endsWith(".yang") &&
+					!f.toString().equals(targetFilename)
+				).forEach(f -> {
+					System.out.println(f);
+					build.addLibSource(moduleFromPath(f.toString()));
+				}
+			);
+        }
+
+        System.out.println("Processing: "+target);
+		if (target.toFile().isDirectory()) {
+			Files.walk(target).filter(f->
+					f.toFile().isFile() &&
+					f.toString().endsWith(".yang") &&
+					!f.toString().equals(targetFilename)
+					).forEach(f -> {
+						System.out.println(f);
+						build.addSource(moduleFromPath(f.toString()));
+					}
+				);
+			//non-recursive version
+//			Files.list(target)
+//				.filter(p->p.toString().endsWith("yang"))
+//				.forEach(p -> 
+//				build.addSource(moduleFromPath(p.toString()))
+//			);
+		} else {
+			build.addSource(moduleFromPath(targetFilename));
+		}
+        SchemaContext schemaContext = build.buildEffective();
+        return schemaContext;
+    }
+    private static InputStream stream(final String str) {
+        return new ByteArrayInputStream(str.getBytes(StandardCharsets.UTF_8));
+    }
+    private static YangStatementStreamSource moduleFromPath(String path) {
+    	return moduleFromPath(Path.of(path));
+    }
+    private static YangStatementStreamSource moduleFromPath(Path path) {
+        try {
+            // return new YangStatementSourceImpl("/example.yang", false);
+            return YangStatementStreamSource.create(new FileYangTextSource(path));
+            // return YangStatementStreamSource.create(YangTextSource.forResource(path));
+        } catch (final YangSyntaxErrorException | IOException e) {
+            throw new IllegalStateException("Failed to find resource " + path.toString(), e);
+        }
+    }
+
+}
+
+// }
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/.classpath b/plugins/org.etsi.mts.tdl.yang2tdl/.classpath
new file mode 100644
index 0000000000000000000000000000000000000000..685a6999c9acba0d0158b0929d7a4d384644452e
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/.classpath
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11">
+		<attributes>
+			<attribute name="module" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/.project b/plugins/org.etsi.mts.tdl.yang2tdl/.project
new file mode 100644
index 0000000000000000000000000000000000000000..1215e5c9581af36258e7593778df6b40f35ba4a2
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/.project
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.etsi.mts.tdl.yang2tdl</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>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+	<filteredResources>
+		<filter>
+			<id>1705077780129</id>
+			<name></name>
+			<type>30</type>
+			<matcher>
+				<id>org.eclipse.core.resources.regexFilterMatcher</id>
+				<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
+</projectDescription>
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/.settings/org.eclipse.core.resources.prefs b/plugins/org.etsi.mts.tdl.yang2tdl/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000000000000000000000000000000000000..99f26c0203a7844de00dbfc56e6a35d8ed3c022c
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/.settings/org.eclipse.jdt.core.prefs b/plugins/org.etsi.mts.tdl.yang2tdl/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000000000000000000000000000000000..c9545f06a4120d5b4a1228fb19f67a1171bc0f5b
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,9 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.compliance=11
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/.settings/org.eclipse.m2e.core.prefs b/plugins/org.etsi.mts.tdl.yang2tdl/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000000000000000000000000000000000000..f897a7f1cb2389f85fe6381425d29f0a9866fb65
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/META-INF/MANIFEST.MF b/plugins/org.etsi.mts.tdl.yang2tdl/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..cbab1cef08c4b34b2345fe0cec3cda13163e5411
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/META-INF/MANIFEST.MF
@@ -0,0 +1,19 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: YANG to TDL Translator
+Bundle-SymbolicName: org.etsi.mts.tdl.yang2tdl;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Vendor: European Telecommunications Standards Institute (ETSI)
+Export-Package: org.etsi.mts.tdl.yang2tdl
+Require-Bundle: org.etsi.mts.tdl.common,
+ org.eclipse.emf.ecore,
+ org.eclipse.xtext,
+ org.etsi.mts.tdl.common,
+ org.etsi.mts.tdl.helper,
+ org.eclipse.ui;resolution:=optional,
+ org.eclipse.core.resources;resolution:=optional,
+ org.eclipse.core.runtime;bundle-version="3.26.100";resolution:=optional,
+ org.etsi.mts.tdl.extras.yang.tools.wrapper,
+ org.eclipse.ui.ide
+Automatic-Module-Name: org.etsi.mts.tdl.yang2tdl
+Bundle-ClassPath: .
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/build.properties b/plugins/org.etsi.mts.tdl.yang2tdl/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..110a2d2dcf728557f3b95feaadcbceec80f8c351
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = target/classes/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/plugin.xml b/plugins/org.etsi.mts.tdl.yang2tdl/plugin.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9f291dde7384e019b7dea2ebae807c488f4d4112
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/plugin.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+   <extension
+         point="org.eclipse.ui.propertyPages">
+      <page
+            category="org.etsi.mts.tdl.projectPropertyPage"
+            class="org.etsi.mts.tdl.yang2tdl.PropertyPage"
+            id="org.etsi.mts.tdl.yang2tdl.propertyPage"
+            name="YANG Import"
+            objectClass="org.eclipse.core.resources.IProject">
+      </page>
+   </extension>
+
+</plugin>
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/pom.xml b/plugins/org.etsi.mts.tdl.yang2tdl/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3e31341626da72a5953a9aee82c5601b024cad3c
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/pom.xml
@@ -0,0 +1,21 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.etsi.mts.tdl</groupId>
+		<artifactId>org.etsi.mts.tdl.parent</artifactId>
+		<version>1.0.0-SNAPSHOT</version>
+		<relativePath>../../org.etsi.mts.tdl.parent</relativePath>
+
+	</parent>
+	<artifactId>org.etsi.mts.tdl.yang2tdl</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<build>
+		<plugins>
+			<plugin>
+				<artifactId>maven-compiler-plugin</artifactId>
+			</plugin>
+		</plugins>
+	</build>
+</project>
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples.tdltx b/plugins/org.etsi.mts.tdl.yang2tdl/samples.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..210bd895bf768f2cefa75cdd1aa0732e3355a993
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples.tdltx
@@ -0,0 +1,1937 @@
+Package generated_from_samples {
+    Type String
+    Type TODO_RESOLVE_REFERENCED
+    Use "samples" as SOURCE_MAPPING
+    Structure system (
+        string host_name,
+        string_collection domain_search,
+        system___login login
+    )
+    Type string extends string
+    Collection string_collection of string
+    Structure system___login (
+        string message,
+        login___user_collection user
+    )
+    Structure login___user (
+        string ^name,
+        string full_name,
+        string class
+    )
+    Collection login___user_collection of login___user
+    Structure nfv (
+        nfv___vnfd_collection vnfd,
+        nfv___nsd_collection nsd,
+        nfv___pnfd_collection pnfd
+    )
+    Structure nfv___vnfd (
+        string id,
+        string provider,
+        string product_name,
+        string software_version,
+        string version,
+        string product_info_name,
+        string product_info_description,
+        string_collection vnfm_info,
+        string localization_language,
+        string default_localization_language,
+        vnfd___vdu_collection vdu,
+        vnfd___virtual_compute_desc_collection virtual_compute_desc,
+        vnfd___virtual_storage_desc_collection virtual_storage_desc,
+        vnfd___sw_image_desc_collection sw_image_desc,
+        vnfd___int_virtual_link_desc_collection int_virtual_link_desc,
+        vnfd___ext_cpd_collection ext_cpd,
+        vnfd___df_collection df,
+        vnfd___configurable_properties configurable_properties,
+        vnfd___modifiable_attributes modifiable_attributes,
+        vnfd___lifecycle_management_script_collection lifecycle_management_script,
+        vnfd___element_group_collection element_group,
+        vnfd___indicator_collection indicator,
+        string_collection auto_scale,
+        vnfd___security_group_rule_collection security_group_rule
+    )
+    Structure vnfd___vdu (
+        string id,
+        string ^name,
+        string description,
+        vdu___int_cpd_collection int_cpd,
+        @LeafRefPath : "../../virtual-compute-desc/id"
+        leafref virtual_compute_desc,
+        @LeafRefPath : "../../virtual-storage-desc/id"
+        leafref_collection virtual_storage_desc,
+        vdu___boot_order_collection boot_order,
+        @LeafRefPath : "../../sw-image-desc/id"
+        leafref sw_image_desc,
+        string_collection nfvi_constraint,
+        vdu___monitoring_parameter_collection monitoring_parameter,
+        vdu___configurable_properties_collection configurable_properties,
+        string boot_data
+    )
+    Structure vdu___int_cpd (
+        @LeafRefPath : "../../../int-virtual-link-desc/id"
+        leafref int_virtual_link_desc,
+        bitrate_requirement bitrate_requirement,
+        @LeafRefPath : "../../../virtual-compute-desc/id"
+        leafref nicio_requirements,
+        uint32_collection order,
+        @LeafRefPath : "../../../security-group-rule/id"
+        leafref security_group_rule_id,
+        int_cpd___virtual_network_interface_requirement_collection virtual_network_interface_requirement,
+        string id,
+        identityref_collection layer_protocol,
+        identityref role,
+        string description,
+        int_cpd___protocol_collection protocol,
+        boolean trunk_mode
+    )
+    Type leafref
+    Annotation LeafRefPath
+    Type bitrate_requirement extends uint64
+    Type uint64
+    Type uint32 extends uint32
+    Collection uint32_collection of uint32
+    Structure int_cpd___virtual_network_interface_requirement (
+        string ^name,
+        string description,
+        support_mandatory support_mandatory,
+        virtual_network_interface_requirement___network_interface_requirements_collection network_interface_requirements
+    )
+    Type support_mandatory extends boolean
+    Type boolean
+    Structure virtual_network_interface_requirement___network_interface_requirements (
+        string key,
+        string ^value
+    )
+    Collection virtual_network_interface_requirement___network_interface_requirements_collection of virtual_network_interface_requirement___network_interface_requirements
+    Collection int_cpd___virtual_network_interface_requirement_collection of int_cpd___virtual_network_interface_requirement
+    Type identityref
+    Collection identityref_collection of identityref
+    Structure int_cpd___protocol (
+        identityref associated_layer_protocol,
+        protocol___address_data_collection address_data
+    )
+    Structure protocol___address_data (
+        identityref ^type,
+        address_data___l2_address_data l2_address_data,
+        address_data___l3_address_data l3_address_data
+    )
+    Structure address_data___l2_address_data (
+        boolean mac_address_assignment
+    )
+    Structure address_data___l3_address_data (
+        boolean ip_address_assignment,
+        boolean floating_ip_activated,
+        enumeration ip_address_type,
+        uint32 number_of_ip_addresses
+    )
+    Type enumeration
+    Collection protocol___address_data_collection of protocol___address_data
+    Collection int_cpd___protocol_collection of int_cpd___protocol
+    Collection vdu___int_cpd_collection of vdu___int_cpd
+    Collection leafref_collection of leafref
+    Structure vdu___boot_order (
+        uint32 key,
+        @LeafRefPath : "../../virtual-storage-desc"
+        leafref ^value
+    )
+    Collection vdu___boot_order_collection of vdu___boot_order
+    Structure vdu___monitoring_parameter (
+        string id,
+        string ^name,
+        string performance_metric,
+        collection_period collection_period
+    )
+    Type collection_period extends uint64
+    Collection vdu___monitoring_parameter_collection of vdu___monitoring_parameter
+    Structure vdu___configurable_properties (
+        string key,
+        string ^value
+    )
+    Collection vdu___configurable_properties_collection of vdu___configurable_properties
+    Collection vnfd___vdu_collection of vnfd___vdu
+    Structure vnfd___virtual_compute_desc (
+        string id,
+        virtual_compute_desc___logical_node_collection logical_node,
+        virtual_compute_desc___request_additional_capability_collection request_additional_capability,
+        string compute_requirements,
+        virtual_compute_desc___virtual_memory virtual_memory,
+        virtual_compute_desc___virtual_cpu virtual_cpu
+    )
+    Structure virtual_compute_desc___logical_node (
+        string id,
+        logical_node___requirement_detail_collection requirement_detail
+    )
+    Structure logical_node___requirement_detail (
+        string key,
+        string ^value
+    )
+    Collection logical_node___requirement_detail_collection of logical_node___requirement_detail
+    Collection virtual_compute_desc___logical_node_collection of virtual_compute_desc___logical_node
+    Structure virtual_compute_desc___request_additional_capability (
+        string ^name,
+        boolean support_mandatory,
+        string min_version,
+        string preferred_version,
+        request_additional_capability___target_performance_parameters_collection target_performance_parameters
+    )
+    Structure request_additional_capability___target_performance_parameters (
+        string key,
+        string ^value
+    )
+    Collection request_additional_capability___target_performance_parameters_collection of request_additional_capability___target_performance_parameters
+    Collection virtual_compute_desc___request_additional_capability_collection of virtual_compute_desc___request_additional_capability
+    Structure virtual_compute_desc___virtual_memory (
+        ^size ^size,
+        string over_subscription_policy,
+        virtual_memory___vdu_mem_requirements_collection vdu_mem_requirements,
+        boolean numa_enabled
+    )
+    Type ^size extends uint64
+    Type decimal64
+    Structure virtual_memory___vdu_mem_requirements (
+        string key,
+        string ^value
+    )
+    Collection virtual_memory___vdu_mem_requirements_collection of virtual_memory___vdu_mem_requirements
+    Structure virtual_compute_desc___virtual_cpu (
+        string cpu_architecture,
+        num_virtual_cpu num_virtual_cpu,
+        clock clock,
+        string oversubscription_policy,
+        virtual_cpu___vdu_cpu_requirements_collection vdu_cpu_requirements,
+        virtual_cpu___pinning pinning
+    )
+    Type num_virtual_cpu extends uint16
+    Type uint16 extends uint16
+    Type clock extends uint32
+    Structure virtual_cpu___vdu_cpu_requirements (
+        string key,
+        string ^value
+    )
+    Collection virtual_cpu___vdu_cpu_requirements_collection of virtual_cpu___vdu_cpu_requirements
+    Structure virtual_cpu___pinning (
+        policy policy,
+        pinning___rule_collection rule
+    )
+    Enumerated policy {
+        policy static,
+        policy dynamic
+    }
+    Structure pinning___rule (
+        string key,
+        string ^value
+    )
+    Collection pinning___rule_collection of pinning___rule
+    Collection vnfd___virtual_compute_desc_collection of vnfd___virtual_compute_desc
+    Structure vnfd___virtual_storage_desc (
+        string id,
+        type_of_storage type_of_storage,
+        size_of_storage size_of_storage,
+        virtual_storage_desc___vdu_storage_requirements_collection vdu_storage_requirements,
+        boolean rdma_enabled,
+        @LeafRefPath : "../../sw-image-desc/id"
+        leafref sw_image_desc
+    )
+    Type type_of_storage extends identityref
+    Type size_of_storage extends uint64
+    Structure virtual_storage_desc___vdu_storage_requirements (
+        string key,
+        string ^value
+    )
+    Collection virtual_storage_desc___vdu_storage_requirements_collection of virtual_storage_desc___vdu_storage_requirements
+    Collection vnfd___virtual_storage_desc_collection of vnfd___virtual_storage_desc
+    Structure vnfd___sw_image_desc (
+        string id,
+        string ^name,
+        string version,
+        sw_image_desc___checksum checksum,
+        container_format container_format,
+        disk_format disk_format,
+        min_disk min_disk,
+        min_ram min_ram,
+        ^size ^size,
+        image image,
+        string operating_system,
+        string_collection supported_virtualization_environment
+    )
+    Structure sw_image_desc___checksum (
+        identityref algorithm,
+        string hash
+    )
+    Enumerated container_format {
+        container_format aki,
+        container_format ami,
+        container_format ari,
+        container_format bare,
+        container_format docker,
+        container_format ova,
+        container_format ovf
+    }
+    Enumerated disk_format {
+        disk_format aki,
+        disk_format ami,
+        disk_format ari,
+        disk_format iso,
+        disk_format qcow2,
+        disk_format raw,
+        disk_format vdi,
+        disk_format vhd,
+        disk_format vhdx,
+        disk_format vmdk
+    }
+    Type min_disk extends uint64
+    Type min_ram extends decimal64
+    Type image extends uri
+    Type uri
+    Collection vnfd___sw_image_desc_collection of vnfd___sw_image_desc
+    Structure vnfd___int_virtual_link_desc (
+        string id,
+        int_virtual_link_desc___flavour_collection flavour,
+        string_collection test_access,
+        string description,
+        int_virtual_link_desc___monitoring_parameters_collection monitoring_parameters,
+        int_virtual_link_desc___connectivity_type connectivity_type
+    )
+    Structure int_virtual_link_desc___flavour (
+        string id,
+        flavour___qos qos
+    )
+    Structure flavour___qos (
+        latency latency,
+        packet_delay_variation packet_delay_variation,
+        decimal64 packet_loss_ratio
+    )
+    Type latency extends uint32
+    Type packet_delay_variation extends uint32
+    Collection int_virtual_link_desc___flavour_collection of int_virtual_link_desc___flavour
+    Structure int_virtual_link_desc___monitoring_parameters (
+        string id,
+        string ^name,
+        string performance_metric,
+        collection_period collection_period
+    )
+    Collection int_virtual_link_desc___monitoring_parameters_collection of int_virtual_link_desc___monitoring_parameters
+    Structure int_virtual_link_desc___connectivity_type (
+        identityref_collection layer_protocol,
+        flow_pattern flow_pattern
+    )
+    Enumerated flow_pattern {
+        flow_pattern line,
+        flow_pattern tree,
+        flow_pattern mesh,
+        flow_pattern line,
+        flow_pattern tree,
+        flow_pattern mesh
+    }
+    Collection vnfd___int_virtual_link_desc_collection of vnfd___int_virtual_link_desc
+    Structure vnfd___ext_cpd (
+        ext_cpd___cp_connection cp_connection,
+        @LeafRefPath : "../../virtual-compute-desc/id"
+        leafref nicio_requirements,
+        @LeafRefPath : "../../security-group-rule/id"
+        leafref security_group_rule_id,
+        ext_cpd___virtual_network_interface_requirement_collection virtual_network_interface_requirement,
+        string id,
+        identityref_collection layer_protocol,
+        identityref role,
+        string description,
+        ext_cpd___protocol_collection protocol,
+        boolean trunk_mode
+    )
+    Structure ext_cpd___cp_connection (
+        cp_connection___int_virtual_link_desc int_virtual_link_desc,
+        cp_connection___int_cpd int_cpd
+    )
+    Structure cp_connection___int_virtual_link_desc (
+        @LeafRefPath : "../../int-virtual-link-desc/id"
+        string int_virtual_link_desc
+    )
+    Structure cp_connection___int_cpd (
+        int_cpd___int_cpd int_cpd
+    )
+    Structure int_cpd___int_cpd (
+        @LeafRefPath : "../../../vdu/id"
+        string vdu_id,
+        @LeafRefPath : "deref(../vdu-id)/../int-cpd/id"
+        string cpd
+    )
+    Structure ext_cpd___virtual_network_interface_requirement (
+        string ^name,
+        string description,
+        support_mandatory support_mandatory,
+        virtual_network_interface_requirement___network_interface_requirements_collection network_interface_requirements
+    )
+    Collection ext_cpd___virtual_network_interface_requirement_collection of ext_cpd___virtual_network_interface_requirement
+    Structure ext_cpd___protocol (
+        identityref associated_layer_protocol,
+        protocol___address_data_collection address_data
+    )
+    Collection ext_cpd___protocol_collection of ext_cpd___protocol
+    Collection vnfd___ext_cpd_collection of vnfd___ext_cpd
+    Structure vnfd___df (
+        string id,
+        string description,
+        df___vdu_profile_collection vdu_profile,
+        df___virtual_link_profile_collection virtual_link_profile,
+        df___instantiation_level_collection instantiation_level,
+        @LeafRefPath : "../instantiation-level/id"
+        leafref default_instantiation_level,
+        identityref_collection supported_operation,
+        df___lcm_operations_configuration lcm_operations_configuration,
+        df___affinity_or_anti_affinity_group_collection affinity_or_anti_affinity_group,
+        df___indicator_collection indicator,
+        df___supported_vnf_interfaces_collection supported_vnf_interfaces,
+        df___monitoring_parameter_collection monitoring_parameter,
+        df___scaling_aspect_collection scaling_aspect
+    )
+    Structure df___vdu_profile (
+        @LeafRefPath : "../../../vdu/id"
+        leafref id,
+        min_number_of_instances min_number_of_instances,
+        max_number_of_instances max_number_of_instances,
+        vdu_profile___affinity_or_anti_affinity_group_collection affinity_or_anti_affinity_group,
+        vdu_profile___local_affinity_or_anti_affinity_rule_collection local_affinity_or_anti_affinity_rule
+    )
+    Type min_number_of_instances extends uint16
+    Type max_number_of_instances extends uint16
+    Structure vdu_profile___affinity_or_anti_affinity_group (
+        @LeafRefPath : "../../../affinity-or-anti-affinity-group/id"
+        leafref id
+    )
+    Collection vdu_profile___affinity_or_anti_affinity_group_collection of vdu_profile___affinity_or_anti_affinity_group
+    Structure vdu_profile___local_affinity_or_anti_affinity_rule (
+        affinity_type affinity_type,
+        affinity_scope affinity_scope
+    )
+    Enumerated affinity_type {
+        affinity_type affinity,
+        affinity_type anti_affinity,
+        affinity_type affinity,
+        affinity_type anti_affinity,
+        affinity_type affinity,
+        affinity_type anti_affinity,
+        affinity_type affinity,
+        affinity_type anti_affinity,
+        affinity_type affinity,
+        affinity_type anti_affinity,
+        affinity_type affinity,
+        affinity_type anti_affinity
+    }
+    Enumerated affinity_scope {
+        affinity_scope nfvi_node,
+        affinity_scope zone_group,
+        affinity_scope zone,
+        affinity_scope nfvi_pop,
+        affinity_scope nfvi_node,
+        affinity_scope zone_group,
+        affinity_scope zone,
+        affinity_scope nfvi_pop,
+        affinity_scope nfvi_node,
+        affinity_scope zone_group,
+        affinity_scope zone,
+        affinity_scope nfvi_pop,
+        affinity_scope nfvi_node,
+        affinity_scope zone_group,
+        affinity_scope zone,
+        affinity_scope nfvi_pop,
+        affinity_scope nfvi_node,
+        affinity_scope zone_group,
+        affinity_scope zone,
+        affinity_scope nfvi_pop,
+        affinity_scope nfvi_node,
+        affinity_scope zone_group,
+        affinity_scope zone,
+        affinity_scope nfvi_pop
+    }
+    Collection vdu_profile___local_affinity_or_anti_affinity_rule_collection of vdu_profile___local_affinity_or_anti_affinity_rule
+    Collection df___vdu_profile_collection of df___vdu_profile
+    Structure df___virtual_link_profile (
+        @LeafRefPath : "../../../int-virtual-link-desc/id"
+        leafref id,
+        @LeafRefPath : "deref(../../../ext-cpd/int-virtual-link-desc)/../flavour/id"
+        leafref flavour,
+        virtual_link_profile___affinity_or_anti_affinity_group_collection affinity_or_anti_affinity_group,
+        virtual_link_profile___max_bit_rate_requirements max_bit_rate_requirements,
+        virtual_link_profile___min_bit_rate_requirements min_bit_rate_requirements,
+        virtual_link_profile___virtual_link_protocol_data virtual_link_protocol_data,
+        virtual_link_profile___local_affinity_or_anti_affinity_rule_collection local_affinity_or_anti_affinity_rule,
+        @LeafRefPath : "../../../virtual-link-desc/id"
+        leafref virtual_link_desc_id,
+        @LeafRefPath : "deref(../virtual-link-desc-id)/../df/id"
+        leafref flavour_id,
+        virtual_link_profile___max_bitrate_requirements max_bitrate_requirements,
+        virtual_link_profile___min_bitrate_requirements min_bitrate_requirements
+    )
+    Structure virtual_link_profile___affinity_or_anti_affinity_group (
+        @LeafRefPath : "../../../affinity-or-anti-affinity-group/id"
+        leafref id
+    )
+    Collection virtual_link_profile___affinity_or_anti_affinity_group_collection of virtual_link_profile___affinity_or_anti_affinity_group
+    Structure virtual_link_profile___max_bit_rate_requirements (
+        uint32 root,
+        uint32 leaf
+    )
+    Structure virtual_link_profile___min_bit_rate_requirements (
+        uint32 root,
+        uint32 leaf
+    )
+    Structure virtual_link_profile___virtual_link_protocol_data (
+        identityref associated_layer_protocol,
+        virtual_link_protocol_data___l2_protocol_data l2_protocol_data,
+        virtual_link_protocol_data___l3_protocol_data l3_protocol_data
+    )
+    Structure virtual_link_protocol_data___l2_protocol_data (
+        string ^name,
+        enumeration network_type,
+        boolean vlan_transparent,
+        uint16 mtu
+    )
+    Structure virtual_link_protocol_data___l3_protocol_data (
+        string ^name,
+        ip_version ip_version,
+        string cidr,
+        string_collection ip_allocation_pools,
+        ip_address gateway_ip,
+        dhcp_enabled dhcp_enabled,
+        enumeration ipv6_address_mode
+    )
+    Enumerated ip_version {
+        ip_version ipv4,
+        ip_version ipv6
+    }
+    Type ip_address extends union
+    Type union
+    Type dhcp_enabled extends boolean
+    Structure virtual_link_profile___local_affinity_or_anti_affinity_rule (
+        affinity_type affinity_type,
+        affinity_scope affinity_scope
+    )
+    Collection virtual_link_profile___local_affinity_or_anti_affinity_rule_collection of virtual_link_profile___local_affinity_or_anti_affinity_rule
+    Collection df___virtual_link_profile_collection of df___virtual_link_profile
+    Structure df___instantiation_level (
+        string id,
+        string description,
+        instantiation_level___vdu_level_collection vdu_level,
+        instantiation_level___scaling_info_collection scaling_info
+    )
+    Structure instantiation_level___vdu_level (
+        @LeafRefPath : "../../../../vdu/id"
+        leafref vdu_id,
+        number_of_instances number_of_instances
+    )
+    Type number_of_instances extends uint32
+    Collection instantiation_level___vdu_level_collection of instantiation_level___vdu_level
+    Structure instantiation_level___scaling_info (
+        @LeafRefPath : "../../../scaling-aspect/id"
+        leafref scaling_aspect_id,
+        uint32 scale_level
+    )
+    Collection instantiation_level___scaling_info_collection of instantiation_level___scaling_info
+    Collection df___instantiation_level_collection of df___instantiation_level
+    Structure df___lcm_operations_configuration (
+        lcm_operations_configuration___parameter_collection instantiate_vnf_op_config,
+        lcm_operations_configuration___scale_vnf_op_config scale_vnf_op_config,
+        lcm_operations_configuration___scale_vnf_to_level_op_config scale_vnf_to_level_op_config,
+        lcm_operations_configuration___heal_vnf_op_config heal_vnf_op_config,
+        lcm_operations_configuration___terminate_vnf_op_config terminate_vnf_op_config,
+        lcm_operations_configuration___operate_vnf_op_config operate_vnf_op_config,
+        lcm_operations_configuration___parameter_collection change_vnf_flavour_op_config,
+        lcm_operations_configuration___parameter_collection change_ext_vnf_connectivity_op_config
+    )
+    Structure lcm_operations_configuration___parameter (
+        string key,
+        string ^value
+    )
+    Collection lcm_operations_configuration___parameter_collection of lcm_operations_configuration___parameter
+    Structure lcm_operations_configuration___scale_vnf_op_config (
+        scale_vnf_op_config___parameter_collection ^parameter,
+        scaling_by_more_than_one_step_supported scaling_by_more_than_one_step_supported
+    )
+    Structure scale_vnf_op_config___parameter (
+        string key,
+        string ^value
+    )
+    Collection scale_vnf_op_config___parameter_collection of scale_vnf_op_config___parameter
+    Type scaling_by_more_than_one_step_supported extends boolean
+    Structure lcm_operations_configuration___scale_vnf_to_level_op_config (
+        scale_vnf_to_level_op_config___parameter_collection ^parameter,
+        arbitrary_target_levels_supported arbitrary_target_levels_supported
+    )
+    Structure scale_vnf_to_level_op_config___parameter (
+        string key,
+        string ^value
+    )
+    Collection scale_vnf_to_level_op_config___parameter_collection of scale_vnf_to_level_op_config___parameter
+    Type arbitrary_target_levels_supported extends boolean
+    Structure lcm_operations_configuration___heal_vnf_op_config (
+        heal_vnf_op_config___parameter_collection ^parameter,
+        string_collection cause
+    )
+    Structure heal_vnf_op_config___parameter (
+        string key,
+        string ^value
+    )
+    Collection heal_vnf_op_config___parameter_collection of heal_vnf_op_config___parameter
+    Structure lcm_operations_configuration___terminate_vnf_op_config (
+        min_graceful_termination min_graceful_termination,
+        timeticks max_recommended_graceful_termination,
+        terminate_vnf_op_config___parameter_collection ^parameter
+    )
+    Type min_graceful_termination extends timeticks
+    Type timeticks extends uint32
+    Structure terminate_vnf_op_config___parameter (
+        string key,
+        string ^value
+    )
+    Collection terminate_vnf_op_config___parameter_collection of terminate_vnf_op_config___parameter
+    Structure lcm_operations_configuration___operate_vnf_op_config (
+        min_graceful_stop_timeout min_graceful_stop_timeout,
+        timeticks max_recommended_graceful_stop_timeout,
+        operate_vnf_op_config___parameter_collection ^parameter
+    )
+    Type min_graceful_stop_timeout extends timeticks
+    Structure operate_vnf_op_config___parameter (
+        string key,
+        string ^value
+    )
+    Collection operate_vnf_op_config___parameter_collection of operate_vnf_op_config___parameter
+    Structure df___affinity_or_anti_affinity_group (
+        string id,
+        affinity_type ^type,
+        affinity_scope scope
+    )
+    Collection df___affinity_or_anti_affinity_group_collection of df___affinity_or_anti_affinity_group
+    Structure df___indicator (
+        string id,
+        string ^name,
+        string indicator_value,
+        enumeration source
+    )
+    Collection df___indicator_collection of df___indicator
+    Structure df___supported_vnf_interfaces (
+        enumeration ^name,
+        @LeafRefPath : "../../../ext-cpd/id"
+        leafref_collection cpd_id,
+        supported_vnf_interfaces___interface_details_collection interface_details
+    )
+    Structure supported_vnf_interfaces___interface_details (
+        string key,
+        string ^value
+    )
+    Collection supported_vnf_interfaces___interface_details_collection of supported_vnf_interfaces___interface_details
+    Collection df___supported_vnf_interfaces_collection of df___supported_vnf_interfaces
+    Structure df___monitoring_parameter (
+        string id,
+        string ^name,
+        string performance_metric,
+        collection_period collection_period
+    )
+    Collection df___monitoring_parameter_collection of df___monitoring_parameter
+    Structure df___scaling_aspect (
+        string id,
+        string ^name,
+        string description,
+        uint32 max_scale_level,
+        scaling_aspect___aspect_delta_details aspect_delta_details,
+        @LeafRefPath : "../../ns-instantiation-level/id"
+        leafref scaling_level
+    )
+    Structure scaling_aspect___aspect_delta_details (
+        aspect_delta_details___deltas_collection deltas,
+        @LeafRefPath : "../deltas/id"
+        leafref step_deltas
+    )
+    Structure aspect_delta_details___deltas (
+        string id,
+        deltas___vdu_delta_collection vdu_delta,
+        deltas___virtual_link_bit_rate_delta_collection virtual_link_bit_rate_delta
+    )
+    Structure deltas___vdu_delta (
+        @LeafRefPath : "../../../../../../vdu/id"
+        leafref id,
+        uint32 number_of_instances
+    )
+    Collection deltas___vdu_delta_collection of deltas___vdu_delta
+    Structure deltas___virtual_link_bit_rate_delta (
+        string id,
+        virtual_link_bit_rate_delta___bit_rate_requirements bit_rate_requirements
+    )
+    Structure virtual_link_bit_rate_delta___bit_rate_requirements (
+        root root,
+        leaf leaf
+    )
+    Type root extends uint64
+    Type leaf extends uint64
+    Collection deltas___virtual_link_bit_rate_delta_collection of deltas___virtual_link_bit_rate_delta
+    Collection aspect_delta_details___deltas_collection of aspect_delta_details___deltas
+    Collection df___scaling_aspect_collection of df___scaling_aspect
+    Collection vnfd___df_collection of vnfd___df
+    Structure vnfd___configurable_properties (
+        boolean is_auto_scalable_enabled,
+        boolean is_auto_heal_enabled,
+        configurable_properties___additional_configurable_property_collection additional_configurable_property
+    )
+    Structure configurable_properties___additional_configurable_property (
+        string key,
+        string ^value
+    )
+    Collection configurable_properties___additional_configurable_property_collection of configurable_properties___additional_configurable_property
+    Structure vnfd___modifiable_attributes (
+        string_collection extension,
+        string_collection metadata
+    )
+    Structure vnfd___lifecycle_management_script (
+        string id,
+        internal_lifecycle_management_script_event_collection ^event,
+        string_collection lcm_transition_event,
+        string script,
+        string script_dsl,
+        lifecycle_management_script___script_input_collection script_input
+    )
+    Enumerated internal_lifecycle_management_script_event {
+        internal_lifecycle_management_script_event start_instantiation,
+        internal_lifecycle_management_script_event end_instantiation,
+        internal_lifecycle_management_script_event start_scaling,
+        internal_lifecycle_management_script_event end_scaling,
+        internal_lifecycle_management_script_event start_healing,
+        internal_lifecycle_management_script_event end_healing,
+        internal_lifecycle_management_script_event start_termination,
+        internal_lifecycle_management_script_event end_termination,
+        internal_lifecycle_management_script_event start_vnf_flavour_change,
+        internal_lifecycle_management_script_event end_vnf_flavour_change,
+        internal_lifecycle_management_script_event start_vnf_operation_change,
+        internal_lifecycle_management_script_event end_vnf_operation_change,
+        internal_lifecycle_management_script_event start_vnf_ext_conn_change,
+        internal_lifecycle_management_script_event end_vnf_ext_conn_change,
+        internal_lifecycle_management_script_event start_vnfinfo_modification,
+        internal_lifecycle_management_script_event end_vnfinfo_modification,
+        internal_lifecycle_management_script_event start_instantiation,
+        internal_lifecycle_management_script_event end_instantiation,
+        internal_lifecycle_management_script_event start_scaling,
+        internal_lifecycle_management_script_event end_scaling,
+        internal_lifecycle_management_script_event start_healing,
+        internal_lifecycle_management_script_event end_healing,
+        internal_lifecycle_management_script_event start_termination,
+        internal_lifecycle_management_script_event end_termination,
+        internal_lifecycle_management_script_event start_vnf_flavour_change,
+        internal_lifecycle_management_script_event end_vnf_flavour_change,
+        internal_lifecycle_management_script_event start_vnf_operation_change,
+        internal_lifecycle_management_script_event end_vnf_operation_change,
+        internal_lifecycle_management_script_event start_vnf_ext_conn_change,
+        internal_lifecycle_management_script_event end_vnf_ext_conn_change,
+        internal_lifecycle_management_script_event start_vnfinfo_modification,
+        internal_lifecycle_management_script_event end_vnfinfo_modification,
+        internal_lifecycle_management_script_event start_instantiation,
+        internal_lifecycle_management_script_event end_instantiation,
+        internal_lifecycle_management_script_event start_scaling,
+        internal_lifecycle_management_script_event end_scaling,
+        internal_lifecycle_management_script_event start_healing,
+        internal_lifecycle_management_script_event end_healing,
+        internal_lifecycle_management_script_event start_termination,
+        internal_lifecycle_management_script_event end_termination,
+        internal_lifecycle_management_script_event start_vnf_flavour_change,
+        internal_lifecycle_management_script_event end_vnf_flavour_change,
+        internal_lifecycle_management_script_event start_vnf_operation_change,
+        internal_lifecycle_management_script_event end_vnf_operation_change,
+        internal_lifecycle_management_script_event start_vnf_ext_conn_change,
+        internal_lifecycle_management_script_event end_vnf_ext_conn_change,
+        internal_lifecycle_management_script_event start_vnfinfo_modification,
+        internal_lifecycle_management_script_event end_vnfinfo_modification
+    }
+    Collection internal_lifecycle_management_script_event_collection of internal_lifecycle_management_script_event
+    Structure lifecycle_management_script___script_input (
+        string key,
+        string ^value
+    )
+    Collection lifecycle_management_script___script_input_collection of lifecycle_management_script___script_input
+    Collection vnfd___lifecycle_management_script_collection of vnfd___lifecycle_management_script
+    Structure vnfd___element_group (
+        string id,
+        string description,
+        @LeafRefPath : "../../vdu/id"
+        leafref_collection vdu,
+        @LeafRefPath : "../../int-virtual-link-desc/id"
+        leafref_collection virtual_link_desc
+    )
+    Collection vnfd___element_group_collection of vnfd___element_group
+    Structure vnfd___indicator (
+        string id,
+        string ^name,
+        string_collection indicator_value,
+        enumeration source
+    )
+    Collection vnfd___indicator_collection of vnfd___indicator
+    Structure vnfd___security_group_rule (
+        string id,
+        string description,
+        direction direction,
+        ether_type ether_type,
+        protocol protocol,
+        port_range_min port_range_min,
+        port_range_max port_range_max
+    )
+    Enumerated direction {
+        direction ingress,
+        direction egress,
+        direction ingress,
+        direction egress
+    }
+    Enumerated ether_type {
+        ether_type ipv4,
+        ether_type ipv6,
+        ether_type ipv4,
+        ether_type ipv6
+    }
+    Enumerated protocol {
+        protocol tcp,
+        protocol udp,
+        protocol icmp,
+        protocol tcp,
+        protocol udp,
+        protocol icmp,
+        protocol tcp,
+        protocol udp,
+        protocol icmp
+    }
+    Type port_range_min extends uint16
+    Type port_range_max extends uint16
+    Collection vnfd___security_group_rule_collection of vnfd___security_group_rule
+    Collection nfv___vnfd_collection of nfv___vnfd
+    Structure nfv___nsd (
+        string id,
+        string designer,
+        string version,
+        string ^name,
+        string invariant_id,
+        @LeafRefPath : "../../nsd/id"
+        leafref_collection nested_nsd_id,
+        @LeafRefPath : "../../vnfd/id"
+        leafref_collection vnfd_id,
+        @LeafRefPath : "../../pnfd/id"
+        leafref_collection pnfd_id,
+        nsd___sapd_collection sapd,
+        nsd___virtual_link_desc_collection virtual_link_desc,
+        nsd___vnffgd_collection vnffgd,
+        string_collection autoscale_rule,
+        nsd___lifecycle_management_script_collection lifecycle_management_script,
+        nsd___df_collection df,
+        string signature,
+        string algorithm,
+        string certificate
+    )
+    Structure nsd___sapd (
+        string id,
+        boolean address_assignment,
+        sapd___cpd_or_virtual_link cpd_or_virtual_link
+    )
+    Structure sapd___cpd_or_virtual_link (
+        cpd_or_virtual_link___virtual_link_desc virtual_link_desc,
+        cpd_or_virtual_link___associated_cpd_id associated_cpd_id
+    )
+    Structure cpd_or_virtual_link___virtual_link_desc (
+        @LeafRefPath : "../../virtual-link-desc/id"
+        leafref virtual_link_desc
+    )
+    Structure cpd_or_virtual_link___associated_cpd_id (
+        associated_cpd_id___associated_cpd_id associated_cpd_id
+    )
+    Structure associated_cpd_id___associated_cpd_id (
+        associated_cpd_id___vnf vnf,
+        associated_cpd_id___pnf pnf,
+        associated_cpd_id___ns ns
+    )
+    Structure associated_cpd_id___vnf (
+        vnf___vnf vnf
+    )
+    Structure vnf___vnf (
+        @LeafRefPath : "../../../../../vnfd/id"
+        leafref vnfd_id,
+        @LeafRefPath : "deref(../vnfd-id)/../ext-cpd/id"
+        leafref ext_cpd_id,
+        @LeafRefPath : "deref(../vnfd-id)/../ext-cpd/id"
+        leafref cpd_id
+    )
+    Structure associated_cpd_id___pnf (
+        pnf___pnf pnf
+    )
+    Structure pnf___pnf (
+        @LeafRefPath : "../../../../../pnfd/id"
+        leafref pnfd_id,
+        @LeafRefPath : "deref(../pnfd-id)/../ext-cpd/id"
+        leafref ext_cpd_id,
+        @LeafRefPath : "deref(../pnfd-id)/../ext-cpd/id"
+        leafref pnf_cpd_id
+    )
+    Structure associated_cpd_id___ns (
+        ns___ns ns
+    )
+    Structure ns___ns (
+        @LeafRefPath : "../../../../../nsd/id"
+        leafref nsd_id,
+        @LeafRefPath : "deref(../nsd-id)/../sapd/id"
+        leafref ext_cpd_id,
+        @LeafRefPath : "deref(../nsd-id)/../sapd/id"
+        leafref sap_cpd_id
+    )
+    Collection nsd___sapd_collection of nsd___sapd
+    Structure nsd___virtual_link_desc (
+        string id,
+        virtual_link_desc___df_collection df,
+        enumeration test_access,
+        string description,
+        virtual_link_desc___connectivity_type connectivity_type,
+        string signature,
+        string algorithm,
+        string certificate
+    )
+    Structure virtual_link_desc___df (
+        string id,
+        df___qos qos,
+        enumeration service_availability_level
+    )
+    Structure df___qos (
+        latency latency,
+        packet_delay_variation packet_delay_variation,
+        decimal64 packet_loss_ratio,
+        uint32 priority
+    )
+    Collection virtual_link_desc___df_collection of virtual_link_desc___df
+    Structure virtual_link_desc___connectivity_type (
+        identityref_collection layer_protocol,
+        flow_pattern flow_pattern
+    )
+    Collection nsd___virtual_link_desc_collection of nsd___virtual_link_desc
+    Structure nsd___vnffgd (
+        string id,
+        @LeafRefPath : "../../df/vnf-profile/id"
+        leafref_collection vnf_profile_id,
+        @LeafRefPath : "../../df/pnf-profile/id"
+        leafref_collection pnf_profile_id,
+        @LeafRefPath : "../../df/ns-profile/id"
+        leafref_collection nested_ns_profile_id,
+        @LeafRefPath : "../../df/virtual-link-profile/id"
+        leafref virtual_link_profile_id,
+        vnffgd___cpd_pool_collection cpd_pool,
+        vnffgd___nfpd_collection nfpd
+    )
+    Structure vnffgd___cpd_pool (
+        string id,
+        cpd_pool___constituent_base_element_id constituent_base_element_id,
+        cpd_pool___constituent_cpd_id constituent_cpd_id
+    )
+    Structure cpd_pool___constituent_base_element_id (
+        constituent_base_element_id___vnf_profile vnf_profile,
+        constituent_base_element_id___pnf_profile pnf_profile,
+        constituent_base_element_id___ns_profile ns_profile
+    )
+    Structure constituent_base_element_id___vnf_profile (
+        vnf_profile___vnf_profile vnf_profile
+    )
+    Structure vnf_profile___vnf_profile (
+        @LeafRefPath : "../../../../../nsd/df/vnf-profile/id"
+        leafref vnf_profile_id
+    )
+    Structure constituent_base_element_id___pnf_profile (
+        pnf_profile___pnf_profile pnf_profile
+    )
+    Structure pnf_profile___pnf_profile (
+        @LeafRefPath : "../../../../../nsd/df/pnf-profile/id"
+        leafref pnf_profile_id
+    )
+    Structure constituent_base_element_id___ns_profile (
+        ns_profile___ns_profile ns_profile
+    )
+    Structure ns_profile___ns_profile (
+        @LeafRefPath : "../../../../../nsd/df/ns-profile/id"
+        leafref ns_profile_id
+    )
+    Structure cpd_pool___constituent_cpd_id (
+        constituent_cpd_id___vnf vnf,
+        constituent_cpd_id___pnf pnf,
+        constituent_cpd_id___ns ns
+    )
+    Structure constituent_cpd_id___vnf (
+        vnf___vnf vnf
+    )
+    Structure constituent_cpd_id___pnf (
+        pnf___pnf pnf
+    )
+    Structure constituent_cpd_id___ns (
+        ns___ns ns
+    )
+    Collection vnffgd___cpd_pool_collection of vnffgd___cpd_pool
+    Structure vnffgd___nfpd (
+        string id,
+        string rule,
+        nfpd___position_desc_id_collection position_desc_id
+    )
+    Structure nfpd___position_desc_id (
+        string id,
+        position_desc_id___cp_profile_id_collection cp_profile_id
+    )
+    Structure position_desc_id___cp_profile_id (
+        string id,
+        cp_profile_id___constituent_profile_elements_collection constituent_profile_elements
+    )
+    Structure cp_profile_id___constituent_profile_elements (
+        string id,
+        string cpd_id
+    )
+    Collection cp_profile_id___constituent_profile_elements_collection of cp_profile_id___constituent_profile_elements
+    Collection position_desc_id___cp_profile_id_collection of position_desc_id___cp_profile_id
+    Collection nfpd___position_desc_id_collection of nfpd___position_desc_id
+    Collection vnffgd___nfpd_collection of vnffgd___nfpd
+    Collection nsd___vnffgd_collection of nsd___vnffgd
+    Structure nsd___lifecycle_management_script (
+        string ^event,
+        string script
+    )
+    Collection nsd___lifecycle_management_script_collection of nsd___lifecycle_management_script
+    Structure nsd___df (
+        string id,
+        @LeafRefPath : "../monitored-info/id"
+        leafref flavour_key,
+        df___vnf_profile_collection vnf_profile,
+        df___pnf_profile_collection pnf_profile,
+        df___virtual_link_profile_collection virtual_link_profile,
+        df___scaling_aspect_collection scaling_aspect,
+        df___affinity_or_anti_affinity_group_collection affinity_or_anti_affinity_group,
+        df___ns_instantiation_level_collection ns_instantiation_level,
+        @LeafRefPath : "../ns-instantiation-level/id"
+        leafref default_instantiation_level,
+        df___ns_profile_collection ns_profile,
+        df___dependencies_collection dependencies,
+        df___monitored_info_collection monitored_info
+    )
+    Structure df___vnf_profile (
+        string id,
+        @LeafRefPath : "../../../../vnfd/id"
+        leafref vnfd_id,
+        @LeafRefPath : "deref(../vnfd-id)/../df/id"
+        leafref flavour_id,
+        @LeafRefPath : "deref(../flavour-id)/../instantiation-level/id"
+        leafref instantiation_level,
+        min_number_of_instances min_number_of_instances,
+        max_number_of_instances max_number_of_instances,
+        vnf_profile___affinity_or_anti_affinity_group_collection affinity_or_anti_affinity_group,
+        vnf_profile___virtual_link_connectivity_collection virtual_link_connectivity,
+        vnf_profile___local_affinity_or_anti_affinity_rule_collection local_affinity_or_anti_affinity_rule
+    )
+    Structure vnf_profile___affinity_or_anti_affinity_group (
+        @LeafRefPath : "../../../affinity-or-anti-affinity-group/id"
+        leafref id
+    )
+    Collection vnf_profile___affinity_or_anti_affinity_group_collection of vnf_profile___affinity_or_anti_affinity_group
+    Structure vnf_profile___virtual_link_connectivity (
+        @LeafRefPath : "../../../virtual-link-profile/id"
+        leafref virtual_link_profile_id,
+        virtual_link_connectivity___constituent_cpd_id_collection constituent_cpd_id
+    )
+    Structure virtual_link_connectivity___constituent_cpd_id (
+        @LeafRefPath : "../../../id"
+        leafref constituent_base_element_id,
+        @LeafRefPath : "deref(../../../nsd-id)/../sapd/id"
+        leafref constituent_cpd_id
+    )
+    Collection virtual_link_connectivity___constituent_cpd_id_collection of virtual_link_connectivity___constituent_cpd_id
+    Collection vnf_profile___virtual_link_connectivity_collection of vnf_profile___virtual_link_connectivity
+    Structure vnf_profile___local_affinity_or_anti_affinity_rule (
+        affinity_type affinity_type,
+        affinity_scope affinity_scope
+    )
+    Collection vnf_profile___local_affinity_or_anti_affinity_rule_collection of vnf_profile___local_affinity_or_anti_affinity_rule
+    Collection df___vnf_profile_collection of df___vnf_profile
+    Structure df___pnf_profile (
+        string id,
+        @LeafRefPath : "../../../../pnfd/id"
+        leafref pnfd_id,
+        pnf_profile___virtual_link_connectivity_collection virtual_link_connectivity
+    )
+    Structure pnf_profile___virtual_link_connectivity (
+        @LeafRefPath : "../../../virtual-link-profile/id"
+        leafref virtual_link_profile_id,
+        virtual_link_connectivity___constituent_cpd_id_collection constituent_cpd_id
+    )
+    Collection pnf_profile___virtual_link_connectivity_collection of pnf_profile___virtual_link_connectivity
+    Collection df___pnf_profile_collection of df___pnf_profile
+    Structure virtual_link_profile___max_bitrate_requirements (
+        root root,
+        leaf leaf
+    )
+    Structure virtual_link_profile___min_bitrate_requirements (
+        root root,
+        leaf leaf
+    )
+    Structure df___ns_instantiation_level (
+        string id,
+        string description,
+        ns_instantiation_level___vnf_to_level_mapping_collection vnf_to_level_mapping,
+        ns_instantiation_level___virtual_link_to_level_mapping_collection virtual_link_to_level_mapping,
+        ns_instantiation_level___ns_to_level_mapping_collection ns_to_level_mapping
+    )
+    Structure ns_instantiation_level___vnf_to_level_mapping (
+        @LeafRefPath : "../../../vnf-profile/id"
+        leafref vnf_profile_id,
+        number_of_instances number_of_instances
+    )
+    Collection ns_instantiation_level___vnf_to_level_mapping_collection of ns_instantiation_level___vnf_to_level_mapping
+    Structure ns_instantiation_level___virtual_link_to_level_mapping (
+        @LeafRefPath : "../../../virtual-link-profile/id"
+        leafref virtual_link_profile_id,
+        root root,
+        leaf leaf
+    )
+    Collection ns_instantiation_level___virtual_link_to_level_mapping_collection of ns_instantiation_level___virtual_link_to_level_mapping
+    Structure ns_instantiation_level___ns_to_level_mapping (
+        @LeafRefPath : "../../../ns-profile/id"
+        leafref ns_profile_id,
+        number_of_instances number_of_instances
+    )
+    Collection ns_instantiation_level___ns_to_level_mapping_collection of ns_instantiation_level___ns_to_level_mapping
+    Collection df___ns_instantiation_level_collection of df___ns_instantiation_level
+    Structure df___ns_profile (
+        string id,
+        @LeafRefPath : "../../../../nsd/id"
+        leafref nsd_id,
+        @LeafRefPath : "deref(../nsd-id)/../df/id"
+        leafref ns_df_id,
+        @LeafRefPath : "deref(../ns-df-id)/../ns-instantiation-level/id"
+        leafref instantiation_level_id,
+        min_number_of_instances min_number_of_instances,
+        max_number_of_instances max_number_of_instances,
+        ns_profile___affinity_or_anti_affinity_group_id_collection affinity_or_anti_affinity_group_id,
+        ns_profile___virtual_link_connectivity_collection virtual_link_connectivity
+    )
+    Structure ns_profile___affinity_or_anti_affinity_group_id (
+        @LeafRefPath : "../../../affinity-or-anti-affinity-group/id"
+        leafref id
+    )
+    Collection ns_profile___affinity_or_anti_affinity_group_id_collection of ns_profile___affinity_or_anti_affinity_group_id
+    Structure ns_profile___virtual_link_connectivity (
+        @LeafRefPath : "../../../virtual-link-profile/id"
+        leafref virtual_link_profile_id,
+        virtual_link_connectivity___constituent_cpd_id_collection constituent_cpd_id
+    )
+    Collection ns_profile___virtual_link_connectivity_collection of ns_profile___virtual_link_connectivity
+    Collection df___ns_profile_collection of df___ns_profile
+    Structure df___dependencies (
+        string id,
+        dependencies___primary_id primary_id,
+        dependencies___secondary_id secondary_id
+    )
+    Structure dependencies___primary_id (
+        primary_id___primary_vnf_profile primary_vnf_profile,
+        primary_id___primary_ns_profile primary_ns_profile
+    )
+    Structure primary_id___primary_vnf_profile (
+        @LeafRefPath : "../../vnf-profile/vnfd-id"
+        leafref primary_vnf_profile
+    )
+    Structure primary_id___primary_ns_profile (
+        @LeafRefPath : "../../ns-profile/nsd-id"
+        leafref primary_ns_profile
+    )
+    Structure dependencies___secondary_id (
+        secondary_id___secondary_vnf_profile secondary_vnf_profile,
+        secondary_id___secondary_ns_profile secondary_ns_profile
+    )
+    Structure secondary_id___secondary_vnf_profile (
+        @LeafRefPath : "../../vnf-profile/vnfd-id"
+        leafref secondary_vnf_profile
+    )
+    Structure secondary_id___secondary_ns_profile (
+        @LeafRefPath : "../../ns-profile/nsd-id"
+        leafref secondary_ns_profile
+    )
+    Collection df___dependencies_collection of df___dependencies
+    Structure df___monitored_info (
+        string id,
+        monitored_info___vnf_indicator_info vnf_indicator_info,
+        monitored_info___monitoring_parameter monitoring_parameter
+    )
+    Structure monitored_info___vnf_indicator_info (
+        @LeafRefPath : "../../../../../vnfd/id"
+        leafref vnfd_id,
+        @LeafRefPath : "deref(../vnfd-id)/../indicator/id"
+        leafref vnf_indicator
+    )
+    Structure monitored_info___monitoring_parameter (
+        string id,
+        string ^name,
+        string performance_metric,
+        string collection_period
+    )
+    Collection df___monitored_info_collection of df___monitored_info
+    Collection nsd___df_collection of nsd___df
+    Collection nfv___nsd_collection of nfv___nsd
+    Structure nfv___pnfd (
+        string id,
+        string function_description,
+        string provider,
+        string version,
+        string invariant_id,
+        string ^name,
+        pnfd___ext_cpd_collection ext_cpd,
+        pnfd___security_collection security,
+        string geographical_location_info,
+        pnfd___security_group_rule_collection security_group_rule
+    )
+    Structure pnfd___ext_cpd (
+        string id,
+        identityref_collection layer_protocol,
+        identityref role,
+        string description,
+        ext_cpd___protocol_collection protocol,
+        boolean trunk_mode
+    )
+    Collection pnfd___ext_cpd_collection of pnfd___ext_cpd
+    Structure pnfd___security (
+        string signature,
+        string algorithm,
+        string certificate
+    )
+    Collection pnfd___security_collection of pnfd___security
+    Structure pnfd___security_group_rule (
+        string id,
+        string description,
+        direction direction,
+        ether_type ether_type,
+        protocol protocol,
+        port_range_min port_range_min,
+        port_range_max port_range_max
+    )
+    Collection pnfd___security_group_rule_collection of pnfd___security_group_rule
+    Collection nfv___pnfd_collection of nfv___pnfd
+    Structure nsd (
+        nsd___vnfd_collection vnfd,
+        nsd___nsd_collection nsd,
+        nsd___pnfd_collection pnfd
+    )
+    Structure nsd___vnfd (
+        string id,
+        string provider,
+        string product_name,
+        string software_version,
+        string version,
+        string product_info_name,
+        string product_info_description,
+        string_collection vnfm_info,
+        string localization_language,
+        string default_localization_language,
+        vnfd___vdu_collection vdu,
+        vnfd___virtual_compute_desc_collection virtual_compute_desc,
+        vnfd___virtual_storage_desc_collection virtual_storage_desc,
+        vnfd___sw_image_desc_collection sw_image_desc,
+        vnfd___int_virtual_link_desc_collection int_virtual_link_desc,
+        vnfd___ext_cpd_collection ext_cpd,
+        vnfd___df_collection df,
+        vnfd___configurable_properties configurable_properties,
+        vnfd___modifiable_attributes modifiable_attributes,
+        vnfd___lifecycle_management_script_collection lifecycle_management_script,
+        vnfd___element_group_collection element_group,
+        vnfd___indicator_collection indicator,
+        string_collection auto_scale,
+        vnfd___security_group_rule_collection security_group_rule
+    )
+    Collection nsd___vnfd_collection of nsd___vnfd
+    Structure nsd___nsd (
+        string id,
+        string designer,
+        string version,
+        string ^name,
+        string invariant_id,
+        @LeafRefPath : "../../nsd/id"
+        leafref_collection nested_nsd_id,
+        @LeafRefPath : "../../vnfd/id"
+        leafref_collection vnfd_id,
+        @LeafRefPath : "../../pnfd/id"
+        leafref_collection pnfd_id,
+        nsd___sapd_collection sapd,
+        nsd___virtual_link_desc_collection virtual_link_desc,
+        nsd___vnffgd_collection vnffgd,
+        string_collection autoscale_rule,
+        nsd___lifecycle_management_script_collection lifecycle_management_script,
+        nsd___df_collection df,
+        string signature,
+        string algorithm,
+        string certificate
+    )
+    Collection nsd___nsd_collection of nsd___nsd
+    Structure nsd___pnfd (
+        string id,
+        string function_description,
+        string provider,
+        string version,
+        string invariant_id,
+        string ^name,
+        pnfd___ext_cpd_collection ext_cpd,
+        pnfd___security_collection security,
+        string geographical_location_info,
+        pnfd___security_group_rule_collection security_group_rule
+    )
+    Collection nsd___pnfd_collection of nsd___pnfd
+    Structure pnfd (
+        string id,
+        string function_description,
+        string provider,
+        string version,
+        string invariant_id,
+        string ^name,
+        pnfd___ext_cpd_collection ext_cpd,
+        pnfd___security_collection security,
+        string geographical_location_info,
+        pnfd___security_group_rule_collection security_group_rule
+    )
+    Structure vnfd (
+        string id,
+        string provider,
+        string product_name,
+        string software_version,
+        string version,
+        string product_info_name,
+        string product_info_description,
+        string_collection vnfm_info,
+        string localization_language,
+        string default_localization_language,
+        vnfd___vdu_collection vdu,
+        vnfd___virtual_compute_desc_collection virtual_compute_desc,
+        vnfd___virtual_storage_desc_collection virtual_storage_desc,
+        vnfd___sw_image_desc_collection sw_image_desc,
+        vnfd___int_virtual_link_desc_collection int_virtual_link_desc,
+        vnfd___ext_cpd_collection ext_cpd,
+        vnfd___df_collection df,
+        vnfd___configurable_properties configurable_properties,
+        vnfd___modifiable_attributes modifiable_attributes,
+        vnfd___lifecycle_management_script_collection lifecycle_management_script,
+        vnfd___element_group_collection element_group,
+        vnfd___indicator_collection indicator,
+        string_collection auto_scale,
+        vnfd___security_group_rule_collection security_group_rule
+    )
+    Structure parent_container (
+        parent_container___parent_ordered_list_collection child_container
+    )
+    Structure parent_container___parent_ordered_list (
+        string parent_key_leaf,
+        string parent_ordinary_leaf,
+        parent_ordered_list___child_ordered_list_collection child_ordered_list
+    )
+    Structure parent_ordered_list___child_ordered_list (
+        string child_key_leaf,
+        string child_ordinary_leaf
+    )
+    Collection parent_ordered_list___child_ordered_list_collection of parent_ordered_list___child_ordered_list
+    Collection parent_container___parent_ordered_list_collection of parent_container___parent_ordered_list
+    Structure sports (
+        sports___person_collection person,
+        sports___team_collection team,
+        sports___protocol_collection protocol
+    )
+    Structure sports___person (
+        string ^name,
+        date_and_time birthday
+    )
+    Type date_and_time extends string
+    Collection sports___person_collection of sports___person
+    Structure sports___team (
+        string ^name,
+        team___player_collection player,
+        protocol protocol
+    )
+    Structure team___player (
+        @LeafRefPath : "/sports/person/name"
+        leafref ^name,
+        season season,
+        uint16 number,
+        scores scores,
+        uint16_collection score_list
+    )
+    Type season extends string
+    Type scores extends uint16
+    Collection uint16_collection of uint16
+    Collection team___player_collection of team___player
+    Collection sports___team_collection of sports___team
+    Structure sports___protocol (
+        string associated_layer_protocol,
+        protocoly protocoly,
+        protocol___ext_cpd_collection ext_cpd,
+        protocol___case_ext_cpd_collection case_ext_cpd,
+        string protocolz,
+        protocol___port_map_collection port_map
+    )
+    Enumerated protocoly {
+        protocoly tcp,
+        protocoly udp,
+        protocoly icmp
+    }
+    Structure protocol___ext_cpd (
+        string k,
+        ext_cpd___cp_connection cp_connection
+    )
+    Collection protocol___ext_cpd_collection of protocol___ext_cpd
+    Structure protocol___case_ext_cpd (
+        string k,
+        case_ext_cpd___cp_connection cp_connection
+    )
+    Structure case_ext_cpd___cp_connection (
+        cp_connection___a ^a,
+        cp_connection___b b
+    )
+    Structure cp_connection___a (
+        string int_virtual_link_desc
+    )
+    Structure cp_connection___b (
+        b___int_cpd int_cpd
+    )
+    Structure b___int_cpd (
+        string vdu_id,
+        string cpd
+    )
+    Collection protocol___case_ext_cpd_collection of protocol___case_ext_cpd
+    Structure protocol___port_map (
+        string port_ref,
+        port_map___map_type map_type
+    )
+    Structure port_map___map_type (
+        map_type___static_filtering_entries static_filtering_entries,
+        map_type___static_vlan_registration_entries static_vlan_registration_entries,
+        map_type___mac_address_registration_entries mac_address_registration_entries,
+        map_type___dynamic_vlan_registration_entries dynamic_vlan_registration_entries,
+        map_type___dynamic_reservation_entries dynamic_reservation_entries,
+        map_type___dynamic_filtering_entries dynamic_filtering_entries
+    )
+    Structure map_type___static_filtering_entries (
+        static_filtering_entries___static_filtering_entries static_filtering_entries
+    )
+    Structure static_filtering_entries___static_filtering_entries (
+        enumeration control_element,
+        port_number_type connection_identifier
+    )
+    Structure map_type___static_vlan_registration_entries (
+        static_vlan_registration_entries___static_vlan_registration_entries static_vlan_registration_entries
+    )
+    Structure static_vlan_registration_entries___static_vlan_registration_entries (
+        enumeration registrar_admin_control,
+        enumeration vlan_transmitted
+    )
+    Collection protocol___port_map_collection of protocol___port_map
+    Collection sports___protocol_collection of sports___protocol
+    Structure bridge (
+        name_type ^name,
+        mac_address address,
+        identityref bridge_type,
+        uint16 ports,
+        up_time up_time,
+        uint32 components,
+        bridge___component_collection ^component
+    )
+    Type name_type extends string
+    Type mac_address extends string
+    Type up_time extends zero_based_counter32
+    Type zero_based_counter32
+    Structure bridge___component (
+        string ^name,
+        uint32 id,
+        identityref ^type,
+        mac_address address,
+        traffic_class_enabled traffic_class_enabled,
+        uint16 ports,
+        @LeafRefPath : "/if:interfaces/if:interface/if:name"
+        interface_ref_collection bridge_port,
+        component___capabilities capabilities,
+        component___filtering_database filtering_database,
+        component___permanent_database permanent_database,
+        component___bridge_vlan bridge_vlan,
+        component___bridge_mst bridge_mst
+    )
+    Type traffic_class_enabled extends boolean
+    Type interface_ref extends leafref
+    Collection interface_ref_collection of interface_ref
+    Structure component___capabilities (
+        extended_filtering extended_filtering,
+        traffic_classes traffic_classes,
+        static_entry_individual_port static_entry_individual_port,
+        ivl_capable ivl_capable,
+        svl_capable svl_capable,
+        hybrid_capable hybrid_capable,
+        configurable_pvid_tagging configurable_pvid_tagging,
+        local_vlan_capable local_vlan_capable
+    )
+    Type extended_filtering extends boolean
+    Type traffic_classes extends boolean
+    Type static_entry_individual_port extends boolean
+    Type ivl_capable extends boolean
+    Type svl_capable extends boolean
+    Type hybrid_capable extends boolean
+    Type configurable_pvid_tagging extends boolean
+    Type local_vlan_capable extends boolean
+    Structure component___filtering_database (
+        aging_time aging_time,
+        gauge32 ^size,
+        gauge32 static_entries,
+        gauge32 dynamic_entries,
+        gauge32 static_vlan_registration_entries,
+        gauge32 dynamic_vlan_registration_entries,
+        gauge32 mac_address_registration_entries,
+        filtering_database___filtering_entry_collection filtering_entry,
+        filtering_database___vlan_registration_entry_collection vlan_registration_entry
+    )
+    Type aging_time extends uint32
+    Type gauge32 extends uint32
+    Structure filtering_database___filtering_entry (
+        uint32 database_id,
+        mac_address address,
+        vid_range_type vids,
+        enumeration entry_type,
+        filtering_entry___port_map_collection port_map,
+        enumeration status
+    )
+    Type vid_range_type extends string
+    Structure filtering_entry___port_map (
+        port_number_type port_ref,
+        port_map___map_type map_type
+    )
+    Type port_number_type extends uint32
+    Structure map_type___mac_address_registration_entries (
+        mac_address_registration_entries___mac_address_registration_entries mac_address_registration_entries
+    )
+    Structure mac_address_registration_entries___mac_address_registration_entries (
+        enumeration control_element
+    )
+    Structure map_type___dynamic_vlan_registration_entries (
+        dynamic_vlan_registration_entries___dynamic_vlan_registration_entries dynamic_vlan_registration_entries
+    )
+    Structure dynamic_vlan_registration_entries___dynamic_vlan_registration_entries (
+        enumeration control_element
+    )
+    Structure map_type___dynamic_reservation_entries (
+        dynamic_reservation_entries___dynamic_reservation_entries dynamic_reservation_entries
+    )
+    Structure dynamic_reservation_entries___dynamic_reservation_entries (
+        enumeration control_element
+    )
+    Structure map_type___dynamic_filtering_entries (
+        dynamic_filtering_entries___dynamic_filtering_entries dynamic_filtering_entries
+    )
+    Structure dynamic_filtering_entries___dynamic_filtering_entries (
+        enumeration control_element
+    )
+    Collection filtering_entry___port_map_collection of filtering_entry___port_map
+    Collection filtering_database___filtering_entry_collection of filtering_database___filtering_entry
+    Structure filtering_database___vlan_registration_entry (
+        uint32 database_id,
+        vid_range_type vids,
+        enumeration entry_type,
+        vlan_registration_entry___port_map_collection port_map
+    )
+    Structure vlan_registration_entry___port_map (
+        port_number_type port_ref,
+        port_map___map_type map_type
+    )
+    Collection vlan_registration_entry___port_map_collection of vlan_registration_entry___port_map
+    Collection filtering_database___vlan_registration_entry_collection of filtering_database___vlan_registration_entry
+    Structure component___permanent_database (
+        gauge32 ^size,
+        gauge32 static_entries,
+        gauge32 static_vlan_registration_entries,
+        permanent_database___filtering_entry_collection filtering_entry
+    )
+    Structure permanent_database___filtering_entry (
+        uint32 database_id,
+        mac_address address,
+        vid_range_type vids,
+        enumeration status,
+        filtering_entry___port_map_collection port_map
+    )
+    Collection permanent_database___filtering_entry_collection of permanent_database___filtering_entry
+    Structure component___bridge_vlan (
+        uint16 version,
+        uint16 max_vids,
+        override_default_pvid override_default_pvid,
+        protocol_frame_format_type protocol_template,
+        uint16 max_msti,
+        bridge_vlan___vlan_collection vlan,
+        bridge_vlan___protocol_group_database_collection protocol_group_database,
+        bridge_vlan___vid_to_fid_allocation_collection vid_to_fid_allocation,
+        bridge_vlan___fid_to_vid_allocation_collection fid_to_vid_allocation,
+        bridge_vlan___vid_to_fid_collection vid_to_fid
+    )
+    Type override_default_pvid extends boolean
+    Enumerated protocol_frame_format_type {
+        protocol_frame_format_type Ethernet,
+        protocol_frame_format_type rfc1042,
+        protocol_frame_format_type snap8021H,
+        protocol_frame_format_type snapOther,
+        protocol_frame_format_type llcOther,
+        protocol_frame_format_type Ethernet,
+        protocol_frame_format_type rfc1042,
+        protocol_frame_format_type snap8021H,
+        protocol_frame_format_type snapOther,
+        protocol_frame_format_type llcOther
+    }
+    Structure bridge_vlan___vlan (
+        vlan_index_type vid,
+        name_type ^name,
+        @LeafRefPath : "/if:interfaces/if:interface/if:name"
+        interface_ref_collection untagged_ports,
+        @LeafRefPath : "/if:interfaces/if:interface/if:name"
+        interface_ref_collection egress_ports
+    )
+    Type vlan_index_type extends uint32
+    Collection bridge_vlan___vlan_collection of bridge_vlan___vlan
+    Structure bridge_vlan___protocol_group_database (
+        uint16 db_index,
+        protocol_frame_format_type frame_format_type,
+        protocol_group_database___frame_format frame_format,
+        uint32 group_id
+    )
+    Structure protocol_group_database___frame_format (
+        frame_format___ethernet_rfc1042_snap8021H ethernet_rfc1042_snap8021H,
+        frame_format___snap_other snap_other,
+        frame_format___llc_other llc_other
+    )
+    Structure frame_format___ethernet_rfc1042_snap8021H (
+        ethertype_type ethertype
+    )
+    Type ethertype_type extends string
+    Structure frame_format___snap_other (
+        string protocol_id
+    )
+    Structure frame_format___llc_other (
+        llc_other___dsap_ssap_pairs dsap_ssap_pairs
+    )
+    Structure llc_other___dsap_ssap_pairs (
+        string llc_address
+    )
+    Collection bridge_vlan___protocol_group_database_collection of bridge_vlan___protocol_group_database
+    Structure bridge_vlan___vid_to_fid_allocation (
+        vid_range_type vids,
+        uint32 fid,
+        enumeration allocation_type
+    )
+    Collection bridge_vlan___vid_to_fid_allocation_collection of bridge_vlan___vid_to_fid_allocation
+    Structure bridge_vlan___fid_to_vid_allocation (
+        uint32 fid,
+        enumeration allocation_type,
+        vlan_index_type_collection vid
+    )
+    Collection vlan_index_type_collection of vlan_index_type
+    Collection bridge_vlan___fid_to_vid_allocation_collection of bridge_vlan___fid_to_vid_allocation
+    Structure bridge_vlan___vid_to_fid (
+        vlan_index_type vid,
+        uint32 fid
+    )
+    Collection bridge_vlan___vid_to_fid_collection of bridge_vlan___vid_to_fid
+    Structure component___bridge_mst (
+        mstid_type_collection mstid,
+        bridge_mst___fid_to_mstid_collection fid_to_mstid,
+        bridge_mst___fid_to_mstid_allocation_collection fid_to_mstid_allocation
+    )
+    Type mstid_type extends uint32
+    Collection mstid_type_collection of mstid_type
+    Structure bridge_mst___fid_to_mstid (
+        uint32 fid,
+        mstid_type mstid
+    )
+    Collection bridge_mst___fid_to_mstid_collection of bridge_mst___fid_to_mstid
+    Structure bridge_mst___fid_to_mstid_allocation (
+        vid_range_type fids,
+        mstid_type mstid
+    )
+    Collection bridge_mst___fid_to_mstid_allocation_collection of bridge_mst___fid_to_mstid_allocation
+    Collection bridge___component_collection of bridge___component
+    Collection bridge_collection of bridge
+    Structure interface (
+        string ^name,
+        string description,
+        identityref ^type,
+        enabled enabled,
+        enumeration link_up_down_trap_enable,
+        enumeration admin_status,
+        enumeration oper_status,
+        date_and_time last_change,
+        int32 if_index,
+        phys_address phys_address,
+        @LeafRefPath : "/if:interfaces-state/if:interface/if:name"
+        interface_state_ref_collection higher_layer_if,
+        @LeafRefPath : "/if:interfaces-state/if:interface/if:name"
+        interface_state_ref_collection lower_layer_if,
+        speed speed,
+        interface___statistics statistics,
+        interface___bridge_port bridge_port
+    )
+    Type enabled extends boolean
+    Type int32 extends int32
+    Type phys_address extends string
+    Type speed extends gauge64
+    Type gauge64
+    Structure interface___statistics (
+        date_and_time discontinuity_time,
+        counter64 in_octets,
+        counter64 in_unicast_pkts,
+        counter64 in_broadcast_pkts,
+        counter64 in_multicast_pkts,
+        counter32 in_discards,
+        counter32 in_errors,
+        counter32 in_unknown_protos,
+        counter64 out_octets,
+        counter64 out_unicast_pkts,
+        counter64 out_broadcast_pkts,
+        counter64 out_multicast_pkts,
+        counter32 out_discards,
+        counter32 out_errors
+    )
+    Type counter64 extends uint64
+    Type counter32 extends uint32
+    Structure interface___bridge_port (
+        @LeafRefPath : "/dot1q:bridges/dot1q:bridge/dot1q:name"
+        leafref bridge_name,
+        @LeafRefPath : "/dot1q:bridges/dot1q:bridge[dot1q:name=current()/../bridge-name]/dot1q:component/dot1q:name"
+        leafref component_name,
+        identityref port_type,
+        pvid pvid,
+        default_priority default_priority,
+        bridge_port___priority_regeneration priority_regeneration,
+        pcp_selection pcp_selection,
+        bridge_port___pcp_decoding_map_collection pcp_decoding_table,
+        bridge_port___pcp_encoding_map_collection pcp_encoding_table,
+        use_dei use_dei,
+        drop_encoding drop_encoding,
+        service_access_priority_selection service_access_priority_selection,
+        bridge_port___service_access_priority service_access_priority,
+        bridge_port___traffic_class_map_collection traffic_class,
+        bridge_port___transmission_selection_algorithm_map_collection transmission_selection_algorithm_table,
+        acceptable_frame acceptable_frame,
+        enable_ingress_filtering enable_ingress_filtering,
+        enable_restricted_vlan_registration enable_restricted_vlan_registration,
+        enable_vid_translation_table enable_vid_translation_table,
+        enable_egress_vid_translation_table enable_egress_vid_translation_table,
+        bridge_port___protocol_group_vid_set_collection protocol_group_vid_set,
+        enumeration admin_point_to_point,
+        boolean protocol_based_vlan_classification,
+        uint16 max_vid_set_entries,
+        port_number_type port_number,
+        mac_address address,
+        bits capabilities,
+        bits type_capabilties,
+        boolean external,
+        boolean oper_point_to_point,
+        media_dependent_overhead media_dependent_overhead,
+        bridge_port___statistics statistics,
+        bridge_port___vid_translations_collection vid_translations,
+        bridge_port___egress_vid_translations_collection egress_vid_translations,
+        vlanid svid,
+        bridge_port___cvid_registration_collection cvid_registration,
+        bridge_port___service_priority_regeneration_collection service_priority_regeneration,
+        bridge_port___rcap_internal_interface_collection rcap_internal_interface
+    )
+    Type pvid extends vlan_index_type
+    Type default_priority extends priority_type
+    Type priority_type
+    Structure bridge_port___priority_regeneration (
+        priority0 priority0,
+        priority1 priority1,
+        priority2 priority2,
+        priority3 priority3,
+        priority4 priority4,
+        priority5 priority5,
+        priority6 priority6,
+        priority7 priority7
+    )
+    Type priority0
+    Type priority1
+    Type priority2
+    Type priority3
+    Type priority4
+    Type priority5
+    Type priority6
+    Type priority7
+    Enumerated pcp_selection {
+        pcp_selection _1P0D,
+        pcp_selection _1P1D,
+        pcp_selection _1P2D,
+        pcp_selection _1P3D
+    }
+    Structure bridge_port___pcp_decoding_map (
+        pcp_selection_type pcp,
+        pcp_decoding_map___priority_map_collection priority_map
+    )
+    Type pcp_selection_type
+    Structure pcp_decoding_map___priority_map (
+        priority_type priority_code_point,
+        priority_type priority,
+        boolean drop_eligible
+    )
+    Collection pcp_decoding_map___priority_map_collection of pcp_decoding_map___priority_map
+    Collection bridge_port___pcp_decoding_map_collection of bridge_port___pcp_decoding_map
+    Structure bridge_port___pcp_encoding_map (
+        pcp_selection_type pcp,
+        pcp_encoding_map___priority_map_collection priority_map
+    )
+    Structure pcp_encoding_map___priority_map (
+        priority_type priority,
+        boolean dei,
+        priority_type priority_code_point
+    )
+    Collection pcp_encoding_map___priority_map_collection of pcp_encoding_map___priority_map
+    Collection bridge_port___pcp_encoding_map_collection of bridge_port___pcp_encoding_map
+    Type use_dei extends boolean
+    Type drop_encoding extends boolean
+    Type service_access_priority_selection extends boolean
+    Structure bridge_port___service_access_priority (
+        priority0 priority0,
+        priority1 priority1,
+        priority2 priority2,
+        priority3 priority3,
+        priority4 priority4,
+        priority5 priority5,
+        priority6 priority6,
+        priority7 priority7
+    )
+    Structure bridge_port___traffic_class_map (
+        priority_type priority,
+        traffic_class_map___available_traffic_class_collection available_traffic_class
+    )
+    Structure traffic_class_map___available_traffic_class (
+        uint8 num_traffic_class,
+        traffic_class_type traffic_class
+    )
+    Type uint8
+    Type traffic_class_type
+    Collection traffic_class_map___available_traffic_class_collection of traffic_class_map___available_traffic_class
+    Collection bridge_port___traffic_class_map_collection of bridge_port___traffic_class_map
+    Structure bridge_port___transmission_selection_algorithm_map (
+        traffic_class_type traffic_class,
+        identityref transmission_selection_algorithm
+    )
+    Collection bridge_port___transmission_selection_algorithm_map_collection of bridge_port___transmission_selection_algorithm_map
+    Enumerated acceptable_frame {
+        acceptable_frame admit_only_VLAN_tagged_frames,
+        acceptable_frame admit_only_untagged_and_priority_tagged,
+        acceptable_frame admit_all_frames
+    }
+    Type enable_ingress_filtering extends boolean
+    Type enable_restricted_vlan_registration extends boolean
+    Type enable_vid_translation_table extends boolean
+    Type enable_egress_vid_translation_table extends boolean
+    Structure bridge_port___protocol_group_vid_set (
+        uint32 group_id,
+        vlanid_collection vid
+    )
+    Type vlanid extends uint16
+    Collection vlanid_collection of vlanid
+    Collection bridge_port___protocol_group_vid_set_collection of bridge_port___protocol_group_vid_set
+    Type bits
+    Type media_dependent_overhead extends uint8
+    Structure bridge_port___statistics (
+        counter64 discard_on_ingress_filtering,
+        counter64 delay_exceeded_discards,
+        counter64 mtu_exceeded_discards,
+        counter64 frame_rx,
+        counter64 octets_rx,
+        counter64 frame_tx,
+        counter64 octets_tx,
+        counter64 discard_inbound,
+        counter64 forward_outbound,
+        counter64 discard_lack_of_buffers,
+        counter64 discard_transit_delay_exceeded,
+        counter64 discard_on_error
+    )
+    Structure bridge_port___vid_translations (
+        vlanid local_vid,
+        vlanid relay_vid
+    )
+    Collection bridge_port___vid_translations_collection of bridge_port___vid_translations
+    Structure bridge_port___egress_vid_translations (
+        vlanid relay_vid,
+        vlanid local_vid
+    )
+    Collection bridge_port___egress_vid_translations_collection of bridge_port___egress_vid_translations
+    Structure bridge_port___cvid_registration (
+        vlanid cvid,
+        vlanid svid,
+        untagged_pep untagged_pep,
+        untagged_cep untagged_cep
+    )
+    Type untagged_pep extends boolean
+    Type untagged_cep extends boolean
+    Collection bridge_port___cvid_registration_collection of bridge_port___cvid_registration
+    Structure bridge_port___service_priority_regeneration (
+        vlanid svid,
+        service_priority_regeneration___priority_regeneration priority_regeneration
+    )
+    Structure service_priority_regeneration___priority_regeneration (
+        priority0 priority0,
+        priority1 priority1,
+        priority2 priority2,
+        priority3 priority3,
+        priority4 priority4,
+        priority5 priority5,
+        priority6 priority6,
+        priority7 priority7
+    )
+    Collection bridge_port___service_priority_regeneration_collection of bridge_port___service_priority_regeneration
+    Structure bridge_port___rcap_internal_interface (
+        vlanid external_svid,
+        port_number_type internal_port_number,
+        vlanid internal_svid,
+        enumeration internal_interface_type
+    )
+    Collection bridge_port___rcap_internal_interface_collection of bridge_port___rcap_internal_interface
+    Collection interface_collection of interface
+    Type interface_state_ref extends leafref
+    Collection interface_state_ref_collection of interface_state_ref
+    Structure config (
+        config___link_collection links,
+        config___queueDiscipline_collection queueDisciplines,
+        config___linkLimitation_collection linkLimitations,
+        config___defaultLink defaultLink
+    )
+    Structure config___link (
+        string ^name,
+        link___flags flags,
+        mac_address addr,
+        mac_address brd,
+        mtu mtu
+    )
+    Structure link___flags (
+        empty UP,
+        empty NOARP,
+        empty BROADCAST,
+        empty MULTICAST,
+        empty LOOPBACK,
+        empty NOTRAILERS
+    )
+    Type empty
+    Type mtu extends uint32
+    Collection config___link_collection of config___link
+    Structure config___queueDiscipline (
+        @LeafRefPath : "/config/links/link/name"
+        leafref linkName,
+        QueueDisciplineType ^type,
+        uint32 length
+    )
+    Enumerated QueueDisciplineType {
+        QueueDisciplineType pfifo_fast,
+        QueueDisciplineType noqueue,
+        QueueDisciplineType noop,
+        QueueDisciplineType htb
+    }
+    Collection config___queueDiscipline_collection of config___queueDiscipline
+    Structure config___linkLimitation (
+        @LeafRefPath : "/config/links/link/name"
+        leafref linkName,
+        linkLimitation___limitations limitations
+    )
+    Structure linkLimitation___limitations (
+        only10Mbps only10Mbps,
+        onlyHalfDuplex onlyHalfDuplex
+    )
+    Type only10Mbps extends boolean
+    Type onlyHalfDuplex extends boolean
+    Collection config___linkLimitation_collection of config___linkLimitation
+    Structure config___defaultLink (
+        @LeafRefPath : "/config/links/link/name"
+        leafref linkName
+    )
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/ietf/ietf-inet-types@2013-07-15.yang b/plugins/org.etsi.mts.tdl.yang2tdl/samples/ietf/ietf-inet-types@2013-07-15.yang
new file mode 100644
index 0000000000000000000000000000000000000000..eacefb6363de1beb543567a0fa705571b7dc57a2
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/ietf/ietf-inet-types@2013-07-15.yang
@@ -0,0 +1,458 @@
+module ietf-inet-types {
+
+  namespace "urn:ietf:params:xml:ns:yang:ietf-inet-types";
+  prefix "inet";
+
+  organization
+   "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+  contact
+   "WG Web:   <http://tools.ietf.org/wg/netmod/>
+    WG List:  <mailto:netmod@ietf.org>
+
+    WG Chair: David Kessens
+              <mailto:david.kessens@nsn.com>
+
+    WG Chair: Juergen Schoenwaelder
+              <mailto:j.schoenwaelder@jacobs-university.de>
+
+    Editor:   Juergen Schoenwaelder
+              <mailto:j.schoenwaelder@jacobs-university.de>";
+
+  description
+   "This module contains a collection of generally useful derived
+    YANG data types for Internet addresses and related things.
+
+    Copyright (c) 2013 IETF Trust and the persons identified as
+    authors of the code.  All rights reserved.
+
+    Redistribution and use in source and binary forms, with or
+    without modification, is permitted pursuant to, and subject
+    to the license terms contained in, the Simplified BSD License
+    set forth in Section 4.c of the IETF Trust's Legal Provisions
+    Relating to IETF Documents
+    (http://trustee.ietf.org/license-info).
+
+    This version of this YANG module is part of RFC 6991; see
+    the RFC itself for full legal notices.";
+
+  revision 2013-07-15 {
+    description
+     "This revision adds the following new data types:
+      - ip-address-no-zone
+      - ipv4-address-no-zone
+      - ipv6-address-no-zone";
+    reference
+     "RFC 6991: Common YANG Data Types";
+  }
+
+  revision 2010-09-24 {
+    description
+     "Initial revision.";
+    reference
+     "RFC 6021: Common YANG Data Types";
+  }
+
+  /*** collection of types related to protocol fields ***/
+
+  typedef ip-version {
+    type enumeration {
+      enum unknown {
+        value "0";
+        description
+         "An unknown or unspecified version of the Internet
+          protocol.";
+      }
+      enum ipv4 {
+        value "1";
+        description
+         "The IPv4 protocol as defined in RFC 791.";
+      }
+      enum ipv6 {
+        value "2";
+        description
+         "The IPv6 protocol as defined in RFC 2460.";
+      }
+    }
+    description
+     "This value represents the version of the IP protocol.
+
+      In the value set and its semantics, this type is equivalent
+      to the InetVersion textual convention of the SMIv2.";
+    reference
+     "RFC  791: Internet Protocol
+      RFC 2460: Internet Protocol, Version 6 (IPv6) Specification
+      RFC 4001: Textual Conventions for Internet Network Addresses";
+  }
+
+  typedef dscp {
+    type uint8 {
+      range "0..63";
+    }
+    description
+     "The dscp type represents a Differentiated Services Code Point
+      that may be used for marking packets in a traffic stream.
+      In the value set and its semantics, this type is equivalent
+      to the Dscp textual convention of the SMIv2.";
+    reference
+     "RFC 3289: Management Information Base for the Differentiated
+                Services Architecture
+      RFC 2474: Definition of the Differentiated Services Field
+                (DS Field) in the IPv4 and IPv6 Headers
+      RFC 2780: IANA Allocation Guidelines For Values In
+                the Internet Protocol and Related Headers";
+  }
+
+  typedef ipv6-flow-label {
+    type uint32 {
+      range "0..1048575";
+    }
+    description
+     "The ipv6-flow-label type represents the flow identifier or Flow
+      Label in an IPv6 packet header that may be used to
+      discriminate traffic flows.
+
+      In the value set and its semantics, this type is equivalent
+      to the IPv6FlowLabel textual convention of the SMIv2.";
+    reference
+     "RFC 3595: Textual Conventions for IPv6 Flow Label
+      RFC 2460: Internet Protocol, Version 6 (IPv6) Specification";
+  }
+
+  typedef port-number {
+    type uint16 {
+      range "0..65535";
+    }
+    description
+     "The port-number type represents a 16-bit port number of an
+      Internet transport-layer protocol such as UDP, TCP, DCCP, or
+      SCTP.  Port numbers are assigned by IANA.  A current list of
+      all assignments is available from <http://www.iana.org/>.
+
+      Note that the port number value zero is reserved by IANA.  In
+      situations where the value zero does not make sense, it can
+      be excluded by subtyping the port-number type.
+      In the value set and its semantics, this type is equivalent
+      to the InetPortNumber textual convention of the SMIv2.";
+    reference
+     "RFC  768: User Datagram Protocol
+      RFC  793: Transmission Control Protocol
+      RFC 4960: Stream Control Transmission Protocol
+      RFC 4340: Datagram Congestion Control Protocol (DCCP)
+      RFC 4001: Textual Conventions for Internet Network Addresses";
+  }
+
+  /*** collection of types related to autonomous systems ***/
+
+  typedef as-number {
+    type uint32;
+    description
+     "The as-number type represents autonomous system numbers
+      which identify an Autonomous System (AS).  An AS is a set
+      of routers under a single technical administration, using
+      an interior gateway protocol and common metrics to route
+      packets within the AS, and using an exterior gateway
+      protocol to route packets to other ASes.  IANA maintains
+      the AS number space and has delegated large parts to the
+      regional registries.
+
+      Autonomous system numbers were originally limited to 16
+      bits.  BGP extensions have enlarged the autonomous system
+      number space to 32 bits.  This type therefore uses an uint32
+      base type without a range restriction in order to support
+      a larger autonomous system number space.
+
+      In the value set and its semantics, this type is equivalent
+      to the InetAutonomousSystemNumber textual convention of
+      the SMIv2.";
+    reference
+     "RFC 1930: Guidelines for creation, selection, and registration
+                of an Autonomous System (AS)
+      RFC 4271: A Border Gateway Protocol 4 (BGP-4)
+      RFC 4001: Textual Conventions for Internet Network Addresses
+      RFC 6793: BGP Support for Four-Octet Autonomous System (AS)
+                Number Space";
+  }
+
+  /*** collection of types related to IP addresses and hostnames ***/
+
+  typedef ip-address {
+    type union {
+      type inet:ipv4-address;
+      type inet:ipv6-address;
+    }
+    description
+     "The ip-address type represents an IP address and is IP
+      version neutral.  The format of the textual representation
+      implies the IP version.  This type supports scoped addresses
+      by allowing zone identifiers in the address format.";
+    reference
+     "RFC 4007: IPv6 Scoped Address Architecture";
+  }
+
+  typedef ipv4-address {
+    type string {
+      pattern
+        '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+      +  '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
+      + '(%[\p{N}\p{L}]+)?';
+    }
+    description
+      "The ipv4-address type represents an IPv4 address in
+       dotted-quad notation.  The IPv4 address may include a zone
+       index, separated by a % sign.
+
+       The zone index is used to disambiguate identical address
+       values.  For link-local addresses, the zone index will
+       typically be the interface index number or the name of an
+       interface.  If the zone index is not present, the default
+       zone of the device will be used.
+
+       The canonical format for the zone index is the numerical
+       format";
+  }
+
+  typedef ipv6-address {
+    type string {
+      pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+            + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+            + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
+            + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
+            + '(%[\p{N}\p{L}]+)?';
+      pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+            + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
+            + '(%.+)?';
+    }
+    description
+     "The ipv6-address type represents an IPv6 address in full,
+      mixed, shortened, and shortened-mixed notation.  The IPv6
+      address may include a zone index, separated by a % sign.
+
+      The zone index is used to disambiguate identical address
+      values.  For link-local addresses, the zone index will
+      typically be the interface index number or the name of an
+      interface.  If the zone index is not present, the default
+      zone of the device will be used.
+
+      The canonical format of IPv6 addresses uses the textual
+      representation defined in Section 4 of RFC 5952.  The
+      canonical format for the zone index is the numerical
+      format as described in Section 11.2 of RFC 4007.";
+    reference
+     "RFC 4291: IP Version 6 Addressing Architecture
+      RFC 4007: IPv6 Scoped Address Architecture
+      RFC 5952: A Recommendation for IPv6 Address Text
+                Representation";
+  }
+
+  typedef ip-address-no-zone {
+    type union {
+      type inet:ipv4-address-no-zone;
+      type inet:ipv6-address-no-zone;
+    }
+    description
+     "The ip-address-no-zone type represents an IP address and is
+      IP version neutral.  The format of the textual representation
+      implies the IP version.  This type does not support scoped
+      addresses since it does not allow zone identifiers in the
+      address format.";
+    reference
+     "RFC 4007: IPv6 Scoped Address Architecture";
+  }
+
+  typedef ipv4-address-no-zone {
+    type inet:ipv4-address {
+      pattern '[0-9\.]*';
+    }
+    description
+      "An IPv4 address without a zone index.  This type, derived from
+       ipv4-address, may be used in situations where the zone is
+       known from the context and hence no zone index is needed.";
+  }
+
+  typedef ipv6-address-no-zone {
+    type inet:ipv6-address {
+      pattern '[0-9a-fA-F:\.]*';
+    }
+    description
+      "An IPv6 address without a zone index.  This type, derived from
+       ipv6-address, may be used in situations where the zone is
+       known from the context and hence no zone index is needed.";
+    reference
+     "RFC 4291: IP Version 6 Addressing Architecture
+      RFC 4007: IPv6 Scoped Address Architecture
+      RFC 5952: A Recommendation for IPv6 Address Text
+                Representation";
+  }
+
+  typedef ip-prefix {
+    type union {
+      type inet:ipv4-prefix;
+      type inet:ipv6-prefix;
+    }
+    description
+     "The ip-prefix type represents an IP prefix and is IP
+      version neutral.  The format of the textual representations
+      implies the IP version.";
+  }
+
+  typedef ipv4-prefix {
+    type string {
+      pattern
+         '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+       +  '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
+       + '/(([0-9])|([1-2][0-9])|(3[0-2]))';
+    }
+    description
+     "The ipv4-prefix type represents an IPv4 address prefix.
+      The prefix length is given by the number following the
+      slash character and must be less than or equal to 32.
+
+      A prefix length value of n corresponds to an IP address
+      mask that has n contiguous 1-bits from the most
+      significant bit (MSB) and all other bits set to 0.
+
+      The canonical format of an IPv4 prefix has all bits of
+      the IPv4 address set to zero that are not part of the
+      IPv4 prefix.";
+  }
+
+  typedef ipv6-prefix {
+    type string {
+      pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+            + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+            + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
+            + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
+            + '(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))';
+      pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+            + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
+            + '(/.+)';
+    }
+
+    description
+     "The ipv6-prefix type represents an IPv6 address prefix.
+      The prefix length is given by the number following the
+      slash character and must be less than or equal to 128.
+
+      A prefix length value of n corresponds to an IP address
+      mask that has n contiguous 1-bits from the most
+      significant bit (MSB) and all other bits set to 0.
+
+      The IPv6 address should have all bits that do not belong
+      to the prefix set to zero.
+
+      The canonical format of an IPv6 prefix has all bits of
+      the IPv6 address set to zero that are not part of the
+      IPv6 prefix.  Furthermore, the IPv6 address is represented
+      as defined in Section 4 of RFC 5952.";
+    reference
+     "RFC 5952: A Recommendation for IPv6 Address Text
+                Representation";
+  }
+
+  /*** collection of domain name and URI types ***/
+
+  typedef domain-name {
+    type string {
+      pattern
+        '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*'
+      + '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)'
+      + '|\.';
+      length "1..253";
+    }
+    description
+     "The domain-name type represents a DNS domain name.  The
+      name SHOULD be fully qualified whenever possible.
+
+      Internet domain names are only loosely specified.  Section
+      3.5 of RFC 1034 recommends a syntax (modified in Section
+      2.1 of RFC 1123).  The pattern above is intended to allow
+      for current practice in domain name use, and some possible
+      future expansion.  It is designed to hold various types of
+      domain names, including names used for A or AAAA records
+      (host names) and other records, such as SRV records.  Note
+      that Internet host names have a stricter syntax (described
+      in RFC 952) than the DNS recommendations in RFCs 1034 and
+      1123, and that systems that want to store host names in
+      schema nodes using the domain-name type are recommended to
+      adhere to this stricter standard to ensure interoperability.
+
+      The encoding of DNS names in the DNS protocol is limited
+      to 255 characters.  Since the encoding consists of labels
+      prefixed by a length bytes and there is a trailing NULL
+      byte, only 253 characters can appear in the textual dotted
+      notation.
+
+      The description clause of schema nodes using the domain-name
+      type MUST describe when and how these names are resolved to
+      IP addresses.  Note that the resolution of a domain-name value
+      may require to query multiple DNS records (e.g., A for IPv4
+      and AAAA for IPv6).  The order of the resolution process and
+      which DNS record takes precedence can either be defined
+      explicitly or may depend on the configuration of the
+      resolver.
+
+      Domain-name values use the US-ASCII encoding.  Their canonical
+      format uses lowercase US-ASCII characters.  Internationalized
+      domain names MUST be A-labels as per RFC 5890.";
+    reference
+     "RFC  952: DoD Internet Host Table Specification
+      RFC 1034: Domain Names - Concepts and Facilities
+      RFC 1123: Requirements for Internet Hosts -- Application
+                and Support
+      RFC 2782: A DNS RR for specifying the location of services
+                (DNS SRV)
+      RFC 5890: Internationalized Domain Names in Applications
+                (IDNA): Definitions and Document Framework";
+  }
+
+  typedef host {
+    type union {
+      type inet:ip-address;
+      type inet:domain-name;
+    }
+    description
+     "The host type represents either an IP address or a DNS
+      domain name.";
+  }
+
+  typedef uri {
+    type string;
+    description
+     "The uri type represents a Uniform Resource Identifier
+      (URI) as defined by STD 66.
+
+      Objects using the uri type MUST be in US-ASCII encoding,
+      and MUST be normalized as described by RFC 3986 Sections
+      6.2.1, 6.2.2.1, and 6.2.2.2.  All unnecessary
+      percent-encoding is removed, and all case-insensitive
+      characters are set to lowercase except for hexadecimal
+      digits, which are normalized to uppercase as described in
+      Section 6.2.2.1.
+
+      The purpose of this normalization is to help provide
+      unique URIs.  Note that this normalization is not
+      sufficient to provide uniqueness.  Two URIs that are
+      textually distinct after this normalization may still be
+      equivalent.
+
+      Objects using the uri type may restrict the schemes that
+      they permit.  For example, 'data:' and 'urn:' schemes
+      might not be appropriate.
+
+      A zero-length URI is not a valid URI.  This can be used to
+      express 'URI absent' where required.
+
+      In the value set and its semantics, this type is equivalent
+      to the Uri SMIv2 textual convention defined in RFC 5017.";
+    reference
+     "RFC 3986: Uniform Resource Identifier (URI): Generic Syntax
+      RFC 3305: Report from the Joint W3C/IETF URI Planning Interest
+                Group: Uniform Resource Identifiers (URIs), URLs,
+                and Uniform Resource Names (URNs): Clarifications
+                and Recommendations
+      RFC 5017: MIB Textual Conventions for Uniform Resource
+                Identifiers (URIs)";
+  }
+
+}
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/ietf/ietf-restconf@2017-01-26.yang b/plugins/org.etsi.mts.tdl.yang2tdl/samples/ietf/ietf-restconf@2017-01-26.yang
new file mode 100644
index 0000000000000000000000000000000000000000..1370ed54800db12c4c20327e56bb5ac3362407b8
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/ietf/ietf-restconf@2017-01-26.yang
@@ -0,0 +1,278 @@
+module ietf-restconf {
+  yang-version 1.1;
+  namespace "urn:ietf:params:xml:ns:yang:ietf-restconf";
+  prefix "rc";
+
+  organization
+    "IETF NETCONF (Network Configuration) Working Group";
+
+  contact
+    "WG Web:   <https://datatracker.ietf.org/wg/netconf/>
+     WG List:  <mailto:netconf@ietf.org>
+
+     Author:   Andy Bierman
+               <mailto:andy@yumaworks.com>
+
+     Author:   Martin Bjorklund
+               <mailto:mbj@tail-f.com>
+
+     Author:   Kent Watsen
+               <mailto:kwatsen@juniper.net>";
+
+  description
+    "This module contains conceptual YANG specifications
+     for basic RESTCONF media type definitions used in
+     RESTCONF protocol messages.
+
+     Note that the YANG definitions within this module do not
+     represent configuration data of any kind.
+     The 'restconf-media-type' YANG extension statement
+     provides a normative syntax for XML and JSON
+     message-encoding purposes.
+
+     Copyright (c) 2017 IETF Trust and the persons identified as
+     authors of the code.  All rights reserved.
+
+     Redistribution and use in source and binary forms, with or
+     without modification, is permitted pursuant to, and subject
+     to the license terms contained in, the Simplified BSD License
+     set forth in Section 4.c of the IETF Trust's Legal Provisions
+     Relating to IETF Documents
+     (http://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC 8040; see
+     the RFC itself for full legal notices.";
+
+  revision 2017-01-26 {
+    description
+      "Initial revision.";
+    reference
+      "RFC 8040: RESTCONF Protocol.";
+  }
+
+  extension yang-data {
+    argument name {
+      yin-element true;
+    }
+    description
+      "This extension is used to specify a YANG data template that
+       represents conceptual data defined in YANG.  It is
+       intended to describe hierarchical data independent of
+       protocol context or specific message-encoding format.
+       Data definition statements within a yang-data extension
+       specify the generic syntax for the specific YANG data
+       template, whose name is the argument of the 'yang-data'
+       extension statement.
+
+       Note that this extension does not define a media type.
+       A specification using this extension MUST specify the
+       message-encoding rules, including the content media type.
+
+       The mandatory 'name' parameter value identifies the YANG
+       data template that is being defined.  It contains the
+       template name.
+
+       This extension is ignored unless it appears as a top-level
+       statement.  It MUST contain data definition statements
+       that result in exactly one container data node definition.
+       An instance of a YANG data template can thus be translated
+       into an XML instance document, whose top-level element
+       corresponds to the top-level container.
+       The module name and namespace values for the YANG module using
+       the extension statement are assigned to instance document data
+       conforming to the data definition statements within
+       this extension.
+
+       The substatements of this extension MUST follow the
+       'data-def-stmt' rule in the YANG ABNF.
+
+       The XPath document root is the extension statement itself,
+       such that the child nodes of the document root are
+       represented by the data-def-stmt substatements within
+       this extension.  This conceptual document is the context
+       for the following YANG statements:
+
+         - must-stmt
+         - when-stmt
+         - path-stmt
+         - min-elements-stmt
+         - max-elements-stmt
+         - mandatory-stmt
+         - unique-stmt
+         - ordered-by
+         - instance-identifier data type
+
+       The following data-def-stmt substatements are constrained
+       when used within a 'yang-data' extension statement.
+
+         - The list-stmt is not required to have a key-stmt defined.
+         - The if-feature-stmt is ignored if present.
+         - The config-stmt is ignored if present.
+         - The available identity values for any 'identityref'
+           leaf or leaf-list nodes are limited to the module
+           containing this extension statement and the modules
+           imported into that module.
+      ";
+  }
+
+  rc:yang-data yang-errors {
+    uses errors;
+  }
+
+  rc:yang-data yang-api {
+    uses restconf;
+  }
+
+  grouping errors {
+    description
+      "A grouping that contains a YANG container
+       representing the syntax and semantics of a
+       YANG Patch error report within a response message.";
+
+    container errors {
+      description
+        "Represents an error report returned by the server if
+         a request results in an error.";
+
+      list error {
+        description
+          "An entry containing information about one
+           specific error that occurred while processing
+           a RESTCONF request.";
+        reference
+          "RFC 6241, Section 4.3.";
+
+        leaf error-type {
+          type enumeration {
+            enum transport {
+              description
+                "The transport layer.";
+            }
+            enum rpc {
+              description
+                "The rpc or notification layer.";
+            }
+            enum protocol {
+              description
+                "The protocol operation layer.";
+            }
+            enum application {
+              description
+                "The server application layer.";
+            }
+          }
+          mandatory true;
+          description
+            "The protocol layer where the error occurred.";
+        }
+
+        leaf error-tag {
+          type string;
+          mandatory true;
+          description
+            "The enumerated error-tag.";
+        }
+
+        leaf error-app-tag {
+          type string;
+          description
+            "The application-specific error-tag.";
+        }
+
+        leaf error-path {
+          type instance-identifier;
+          description
+            "The YANG instance identifier associated
+             with the error node.";
+        }
+
+        leaf error-message {
+          type string;
+          description
+            "A message describing the error.";
+        }
+
+//        anydata error-info {
+//           description
+//             "This anydata value MUST represent a container with
+//              zero or more data nodes representing additional
+//              error information.";
+//        }
+      }
+    }
+  }
+
+  grouping restconf {
+    description
+      "Conceptual grouping representing the RESTCONF
+       root resource.";
+
+    container restconf {
+      description
+        "Conceptual container representing the RESTCONF
+         root resource.";
+
+      container data {
+        description
+          "Container representing the datastore resource.
+           Represents the conceptual root of all state data
+           and configuration data supported by the server.
+           The child nodes of this container can be any data
+           resources that are defined as top-level data nodes
+           from the YANG modules advertised by the server in
+           the 'ietf-yang-library' module.";
+      }
+
+      container operations {
+        description
+          "Container for all operation resources.
+
+           Each resource is represented as an empty leaf with the
+           name of the RPC operation from the YANG 'rpc' statement.
+
+           For example, the 'system-restart' RPC operation defined
+           in the 'ietf-system' module would be represented as
+           an empty leaf in the 'ietf-system' namespace.  This is
+           a conceptual leaf and will not actually be found in
+           the module:
+
+              module ietf-system {
+                leaf system-reset {
+                  type empty;
+                }
+              }
+
+           To invoke the 'system-restart' RPC operation:
+
+              POST /restconf/operations/ietf-system:system-restart
+
+           To discover the RPC operations supported by the server:
+
+              GET /restconf/operations
+
+           In XML, the YANG module namespace identifies the module:
+
+             <system-restart
+                xmlns='urn:ietf:params:xml:ns:yang:ietf-system'/>
+
+           In JSON, the YANG module name identifies the module:
+
+             { 'ietf-system:system-restart' : [null] }
+          ";
+      }
+      leaf yang-library-version {
+        type string {
+          pattern '\d{4}-\d{2}-\d{2}';
+        }
+        config false;
+        mandatory true;
+        description
+          "Identifies the revision date of the 'ietf-yang-library'
+           module that is implemented by this RESTCONF server.
+           Indicates the year, month, and day in YYYY-MM-DD
+           numeric format.";
+      }
+    }
+  }
+
+}
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/ietf/ietf-yang-types@2013-07-15.yang b/plugins/org.etsi.mts.tdl.yang2tdl/samples/ietf/ietf-yang-types@2013-07-15.yang
new file mode 100644
index 0000000000000000000000000000000000000000..ee58fa3ab0042120d5607b8713d21fa0ba845895
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/ietf/ietf-yang-types@2013-07-15.yang
@@ -0,0 +1,474 @@
+module ietf-yang-types {
+
+  namespace "urn:ietf:params:xml:ns:yang:ietf-yang-types";
+  prefix "yang";
+
+  organization
+   "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+  contact
+   "WG Web:   <http://tools.ietf.org/wg/netmod/>
+    WG List:  <mailto:netmod@ietf.org>
+
+    WG Chair: David Kessens
+              <mailto:david.kessens@nsn.com>
+
+    WG Chair: Juergen Schoenwaelder
+              <mailto:j.schoenwaelder@jacobs-university.de>
+
+    Editor:   Juergen Schoenwaelder
+              <mailto:j.schoenwaelder@jacobs-university.de>";
+
+  description
+   "This module contains a collection of generally useful derived
+    YANG data types.
+
+    Copyright (c) 2013 IETF Trust and the persons identified as
+    authors of the code.  All rights reserved.
+
+    Redistribution and use in source and binary forms, with or
+    without modification, is permitted pursuant to, and subject
+    to the license terms contained in, the Simplified BSD License
+    set forth in Section 4.c of the IETF Trust's Legal Provisions
+    Relating to IETF Documents
+    (http://trustee.ietf.org/license-info).
+
+    This version of this YANG module is part of RFC 6991; see
+    the RFC itself for full legal notices.";
+
+  revision 2013-07-15 {
+    description
+     "This revision adds the following new data types:
+      - yang-identifier
+      - hex-string
+      - uuid
+      - dotted-quad";
+    reference
+     "RFC 6991: Common YANG Data Types";
+  }
+
+  revision 2010-09-24 {
+    description
+     "Initial revision.";
+    reference
+     "RFC 6021: Common YANG Data Types";
+  }
+
+  /*** collection of counter and gauge types ***/
+
+  typedef counter32 {
+    type uint32;
+    description
+     "The counter32 type represents a non-negative integer
+      that monotonically increases until it reaches a
+      maximum value of 2^32-1 (4294967295 decimal), when it
+      wraps around and starts increasing again from zero.
+
+      Counters have no defined 'initial' value, and thus, a
+      single value of a counter has (in general) no information
+      content.  Discontinuities in the monotonically increasing
+      value normally occur at re-initialization of the
+      management system, and at other times as specified in the
+      description of a schema node using this type.  If such
+      other times can occur, for example, the creation of
+      a schema node of type counter32 at times other than
+      re-initialization, then a corresponding schema node
+      should be defined, with an appropriate type, to indicate
+      the last discontinuity.
+
+      The counter32 type should not be used for configuration
+      schema nodes.  A default statement SHOULD NOT be used in
+      combination with the type counter32.
+
+      In the value set and its semantics, this type is equivalent
+      to the Counter32 type of the SMIv2.";
+    reference
+     "RFC 2578: Structure of Management Information Version 2
+                (SMIv2)";
+  }
+
+  typedef zero-based-counter32 {
+    type yang:counter32;
+    default "0";
+    description
+     "The zero-based-counter32 type represents a counter32
+      that has the defined 'initial' value zero.
+
+      A schema node of this type will be set to zero (0) on creation
+      and will thereafter increase monotonically until it reaches
+      a maximum value of 2^32-1 (4294967295 decimal), when it
+      wraps around and starts increasing again from zero.
+
+      Provided that an application discovers a new schema node
+      of this type within the minimum time to wrap, it can use the
+      'initial' value as a delta.  It is important for a management
+      station to be aware of this minimum time and the actual time
+      between polls, and to discard data if the actual time is too
+      long or there is no defined minimum time.
+
+      In the value set and its semantics, this type is equivalent
+      to the ZeroBasedCounter32 textual convention of the SMIv2.";
+    reference
+      "RFC 4502: Remote Network Monitoring Management Information
+                 Base Version 2";
+  }
+
+  typedef counter64 {
+    type uint64;
+    description
+     "The counter64 type represents a non-negative integer
+      that monotonically increases until it reaches a
+      maximum value of 2^64-1 (18446744073709551615 decimal),
+      when it wraps around and starts increasing again from zero.
+
+      Counters have no defined 'initial' value, and thus, a
+      single value of a counter has (in general) no information
+      content.  Discontinuities in the monotonically increasing
+      value normally occur at re-initialization of the
+      management system, and at other times as specified in the
+      description of a schema node using this type.  If such
+      other times can occur, for example, the creation of
+      a schema node of type counter64 at times other than
+      re-initialization, then a corresponding schema node
+      should be defined, with an appropriate type, to indicate
+      the last discontinuity.
+
+      The counter64 type should not be used for configuration
+      schema nodes.  A default statement SHOULD NOT be used in
+      combination with the type counter64.
+
+      In the value set and its semantics, this type is equivalent
+      to the Counter64 type of the SMIv2.";
+    reference
+     "RFC 2578: Structure of Management Information Version 2
+                (SMIv2)";
+  }
+
+  typedef zero-based-counter64 {
+    type yang:counter64;
+    default "0";
+    description
+     "The zero-based-counter64 type represents a counter64 that
+      has the defined 'initial' value zero.
+
+      A schema node of this type will be set to zero (0) on creation
+      and will thereafter increase monotonically until it reaches
+      a maximum value of 2^64-1 (18446744073709551615 decimal),
+      when it wraps around and starts increasing again from zero.
+
+      Provided that an application discovers a new schema node
+      of this type within the minimum time to wrap, it can use the
+      'initial' value as a delta.  It is important for a management
+      station to be aware of this minimum time and the actual time
+      between polls, and to discard data if the actual time is too
+      long or there is no defined minimum time.
+
+      In the value set and its semantics, this type is equivalent
+      to the ZeroBasedCounter64 textual convention of the SMIv2.";
+    reference
+     "RFC 2856: Textual Conventions for Additional High Capacity
+                Data Types";
+  }
+
+  typedef gauge32 {
+    type uint32;
+    description
+     "The gauge32 type represents a non-negative integer, which
+      may increase or decrease, but shall never exceed a maximum
+      value, nor fall below a minimum value.  The maximum value
+      cannot be greater than 2^32-1 (4294967295 decimal), and
+      the minimum value cannot be smaller than 0.  The value of
+      a gauge32 has its maximum value whenever the information
+      being modeled is greater than or equal to its maximum
+      value, and has its minimum value whenever the information
+      being modeled is smaller than or equal to its minimum value.
+      If the information being modeled subsequently decreases
+      below (increases above) the maximum (minimum) value, the
+      gauge32 also decreases (increases).
+
+      In the value set and its semantics, this type is equivalent
+      to the Gauge32 type of the SMIv2.";
+    reference
+     "RFC 2578: Structure of Management Information Version 2
+                (SMIv2)";
+  }
+
+  typedef gauge64 {
+    type uint64;
+    description
+     "The gauge64 type represents a non-negative integer, which
+      may increase or decrease, but shall never exceed a maximum
+      value, nor fall below a minimum value.  The maximum value
+      cannot be greater than 2^64-1 (18446744073709551615), and
+      the minimum value cannot be smaller than 0.  The value of
+      a gauge64 has its maximum value whenever the information
+      being modeled is greater than or equal to its maximum
+      value, and has its minimum value whenever the information
+      being modeled is smaller than or equal to its minimum value.
+      If the information being modeled subsequently decreases
+      below (increases above) the maximum (minimum) value, the
+      gauge64 also decreases (increases).
+
+      In the value set and its semantics, this type is equivalent
+      to the CounterBasedGauge64 SMIv2 textual convention defined
+      in RFC 2856";
+    reference
+     "RFC 2856: Textual Conventions for Additional High Capacity
+                Data Types";
+  }
+
+  /*** collection of identifier-related types ***/
+
+  typedef object-identifier {
+    type string {
+      pattern '(([0-1](\.[1-3]?[0-9]))|(2\.(0|([1-9]\d*))))'
+            + '(\.(0|([1-9]\d*)))*';
+    }
+    description
+     "The object-identifier type represents administratively
+      assigned names in a registration-hierarchical-name tree.
+
+      Values of this type are denoted as a sequence of numerical
+      non-negative sub-identifier values.  Each sub-identifier
+      value MUST NOT exceed 2^32-1 (4294967295).  Sub-identifiers
+      are separated by single dots and without any intermediate
+      whitespace.
+
+      The ASN.1 standard restricts the value space of the first
+      sub-identifier to 0, 1, or 2.  Furthermore, the value space
+      of the second sub-identifier is restricted to the range
+      0 to 39 if the first sub-identifier is 0 or 1.  Finally,
+      the ASN.1 standard requires that an object identifier
+      has always at least two sub-identifiers.  The pattern
+      captures these restrictions.
+
+      Although the number of sub-identifiers is not limited,
+      module designers should realize that there may be
+      implementations that stick with the SMIv2 limit of 128
+      sub-identifiers.
+
+      This type is a superset of the SMIv2 OBJECT IDENTIFIER type
+      since it is not restricted to 128 sub-identifiers.  Hence,
+      this type SHOULD NOT be used to represent the SMIv2 OBJECT
+      IDENTIFIER type; the object-identifier-128 type SHOULD be
+      used instead.";
+    reference
+     "ISO9834-1: Information technology -- Open Systems
+      Interconnection -- Procedures for the operation of OSI
+      Registration Authorities: General procedures and top
+      arcs of the ASN.1 Object Identifier tree";
+  }
+
+  typedef object-identifier-128 {
+    type object-identifier {
+      pattern '\d*(\.\d*){1,127}';
+    }
+    description
+     "This type represents object-identifiers restricted to 128
+      sub-identifiers.
+
+      In the value set and its semantics, this type is equivalent
+      to the OBJECT IDENTIFIER type of the SMIv2.";
+    reference
+     "RFC 2578: Structure of Management Information Version 2
+                (SMIv2)";
+  }
+
+  typedef yang-identifier {
+    type string {
+      length "1..max";
+      pattern '[a-zA-Z_][a-zA-Z0-9\-_.]*';
+      pattern '.|..|[^xX].*|.[^mM].*|..[^lL].*';
+    }
+    description
+      "A YANG identifier string as defined by the 'identifier'
+       rule in Section 12 of RFC 6020.  An identifier must
+       start with an alphabetic character or an underscore
+       followed by an arbitrary sequence of alphabetic or
+       numeric characters, underscores, hyphens, or dots.
+
+       A YANG identifier MUST NOT start with any possible
+       combination of the lowercase or uppercase character
+       sequence 'xml'.";
+    reference
+      "RFC 6020: YANG - A Data Modeling Language for the Network
+                 Configuration Protocol (NETCONF)";
+  }
+
+  /*** collection of types related to date and time***/
+
+  typedef date-and-time {
+    type string {
+      pattern '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?'
+            + '(Z|[\+\-]\d{2}:\d{2})';
+    }
+    description
+     "The date-and-time type is a profile of the ISO 8601
+      standard for representation of dates and times using the
+      Gregorian calendar.  The profile is defined by the
+      date-time production in Section 5.6 of RFC 3339.
+
+      The date-and-time type is compatible with the dateTime XML
+      schema type with the following notable exceptions:
+
+      (a) The date-and-time type does not allow negative years.
+
+      (b) The date-and-time time-offset -00:00 indicates an unknown
+          time zone (see RFC 3339) while -00:00 and +00:00 and Z
+          all represent the same time zone in dateTime.
+
+      (c) The canonical format (see below) of data-and-time values
+          differs from the canonical format used by the dateTime XML
+          schema type, which requires all times to be in UTC using
+          the time-offset 'Z'.
+
+      This type is not equivalent to the DateAndTime textual
+      convention of the SMIv2 since RFC 3339 uses a different
+      separator between full-date and full-time and provides
+      higher resolution of time-secfrac.
+
+      The canonical format for date-and-time values with a known time
+      zone uses a numeric time zone offset that is calculated using
+      the device's configured known offset to UTC time.  A change of
+      the device's offset to UTC time will cause date-and-time values
+      to change accordingly.  Such changes might happen periodically
+      in case a server follows automatically daylight saving time
+      (DST) time zone offset changes.  The canonical format for
+      date-and-time values with an unknown time zone (usually
+      referring to the notion of local time) uses the time-offset
+      -00:00.";
+    reference
+     "RFC 3339: Date and Time on the Internet: Timestamps
+      RFC 2579: Textual Conventions for SMIv2
+      XSD-TYPES: XML Schema Part 2: Datatypes Second Edition";
+  }
+
+  typedef timeticks {
+    type uint32;
+    description
+     "The timeticks type represents a non-negative integer that
+      represents the time, modulo 2^32 (4294967296 decimal), in
+      hundredths of a second between two epochs.  When a schema
+      node is defined that uses this type, the description of
+      the schema node identifies both of the reference epochs.
+
+      In the value set and its semantics, this type is equivalent
+      to the TimeTicks type of the SMIv2.";
+    reference
+     "RFC 2578: Structure of Management Information Version 2
+                (SMIv2)";
+  }
+
+  typedef timestamp {
+    type yang:timeticks;
+    description
+     "The timestamp type represents the value of an associated
+      timeticks schema node at which a specific occurrence
+      happened.  The specific occurrence must be defined in the
+      description of any schema node defined using this type.  When
+      the specific occurrence occurred prior to the last time the
+      associated timeticks attribute was zero, then the timestamp
+      value is zero.  Note that this requires all timestamp values
+      to be reset to zero when the value of the associated timeticks
+      attribute reaches 497+ days and wraps around to zero.
+
+      The associated timeticks schema node must be specified
+      in the description of any schema node using this type.
+
+      In the value set and its semantics, this type is equivalent
+      to the TimeStamp textual convention of the SMIv2.";
+    reference
+     "RFC 2579: Textual Conventions for SMIv2";
+  }
+
+  /*** collection of generic address types ***/
+
+  typedef phys-address {
+    type string {
+      pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
+    }
+
+    description
+     "Represents media- or physical-level addresses represented
+      as a sequence octets, each octet represented by two hexadecimal
+      numbers.  Octets are separated by colons.  The canonical
+      representation uses lowercase characters.
+
+      In the value set and its semantics, this type is equivalent
+      to the PhysAddress textual convention of the SMIv2.";
+    reference
+     "RFC 2579: Textual Conventions for SMIv2";
+  }
+
+  typedef mac-address {
+    type string {
+      pattern '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}';
+    }
+    description
+     "The mac-address type represents an IEEE 802 MAC address.
+      The canonical representation uses lowercase characters.
+
+      In the value set and its semantics, this type is equivalent
+      to the MacAddress textual convention of the SMIv2.";
+    reference
+     "IEEE 802: IEEE Standard for Local and Metropolitan Area
+                Networks: Overview and Architecture
+      RFC 2579: Textual Conventions for SMIv2";
+  }
+
+  /*** collection of XML-specific types ***/
+
+  typedef xpath1.0 {
+    type string;
+    description
+     "This type represents an XPATH 1.0 expression.
+
+      When a schema node is defined that uses this type, the
+      description of the schema node MUST specify the XPath
+      context in which the XPath expression is evaluated.";
+    reference
+     "XPATH: XML Path Language (XPath) Version 1.0";
+  }
+
+  /*** collection of string types ***/
+
+  typedef hex-string {
+    type string {
+      pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
+    }
+    description
+     "A hexadecimal string with octets represented as hex digits
+      separated by colons.  The canonical representation uses
+      lowercase characters.";
+  }
+
+  typedef uuid {
+    type string {
+      pattern '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-'
+            + '[0-9a-fA-F]{4}-[0-9a-fA-F]{12}';
+    }
+    description
+     "A Universally Unique IDentifier in the string representation
+      defined in RFC 4122.  The canonical representation uses
+      lowercase characters.
+
+      The following is an example of a UUID in string representation:
+      f81d4fae-7dec-11d0-a765-00a0c91e6bf6
+      ";
+    reference
+     "RFC 4122: A Universally Unique IDentifier (UUID) URN
+                Namespace";
+  }
+
+  typedef dotted-quad {
+    type string {
+      pattern
+        '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+      + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])';
+    }
+    description
+      "An unsigned 32-bit number expressed in the dotted-quad
+       notation, i.e., four octets written as decimal numbers
+       and separated with the '.' (full stop) character.";
+  }
+}
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/json/model.json b/plugins/org.etsi.mts.tdl.yang2tdl/samples/json/model.json
new file mode 100644
index 0000000000000000000000000000000000000000..9f9f33b054d838035714977f83039eaa30bd3311
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/json/model.json
@@ -0,0 +1,39 @@
+{
+  "authors": [
+    {
+      "name": "Alfonso"
+    },
+    {
+      "name": "Alfred"
+    }
+  ],
+  "books": [
+    {
+      "title": "Book One",
+      "authors": [
+        {
+          "name": "Author One"
+        },
+        {
+          "name": "Author Two"
+        }
+      ]
+    },
+    {
+      "title": "Book Two",
+      "authors": [
+        {
+          "name": "Alfonso"
+        }
+      ]
+    },
+    {
+      "title": "Book Three",
+      "authors": [
+        {
+          "name": "Alfred"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/mwt/iana-if-type@2023-01-26.yang b/plugins/org.etsi.mts.tdl.yang2tdl/samples/mwt/iana-if-type@2023-01-26.yang
new file mode 100644
index 0000000000000000000000000000000000000000..036e1f9145d2092f6218b85f7d8553cfed1d6c95
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/mwt/iana-if-type@2023-01-26.yang
@@ -0,0 +1,1852 @@
+module iana-if-type {
+  yang-version 1.1;
+  namespace "urn:ietf:params:xml:ns:yang:iana-if-type";
+  prefix ianaift;
+
+  import ietf-interfaces {
+    prefix if;
+  }
+
+  organization "IANA";
+  contact
+    "        Internet Assigned Numbers Authority
+
+     Postal: ICANN
+             12025 Waterfront Drive, Suite 300
+             Los Angeles, CA 90094-2536
+             United States
+
+     Tel:    +1 310 301 5800
+     <mailto:iana@iana.org>";
+  description
+    "This YANG module defines YANG identities for IANA-registered
+     interface types.
+
+     This YANG module is maintained by IANA and reflects the
+     'ifType definitions' registry.
+
+     The latest revision of this YANG module can be obtained from
+     the IANA web site.
+
+     Requests for new values should be made to IANA via
+     email (iana@iana.org).
+
+     Copyright (c) 2014 IETF Trust and the persons identified as
+     authors of the code.  All rights reserved.
+
+     Redistribution and use in source and binary forms, with or
+     without modification, is permitted pursuant to, and subject
+     to the license terms contained in, the Simplified BSD License
+     set forth in Section 4.c of the IETF Trust's Legal Provisions
+     Relating to IETF Documents
+     (http://trustee.ietf.org/license-info).
+
+     The initial version of this YANG module is part of RFC 7224;
+     see the RFC itself for full legal notices.";
+  reference
+    "IANA 'ifType definitions' registry.
+     <http://www.iana.org/assignments/smi-numbers>";
+
+  revision 2023-01-26 {
+    description
+      "Fix incorrect quotation for previous 3 revision statements.";
+  }
+  
+  revision 2022-08-24 {
+    description
+      "Updated reference for ifType 303.";
+  }
+
+  revision 2022-08-17 {
+    description
+      "Changed gpon description to refer to G.984.";
+  }
+
+  revision 2022-03-07 {
+    description
+      "Coalesced revision history entries for 2018-06-28.";
+  }
+
+  revision 2021-06-21 {
+    description
+      "Corrected reference for ifType 303.";
+  }
+
+  revision 2021-05-17 {
+    description
+      "Registered ifType 303.";
+  }
+
+  revision 2021-04-22 {
+    description
+      "Registered ifType 302.";
+  }
+
+  revision 2021-04-01 {
+    description
+      "Updated reference for 301.";
+  }
+
+  revision 2021-02-18 {
+    description
+      "Registered ifType 301.";
+  }
+
+  revision 2020-08-27 {
+    description
+      "Added missing references.";
+  }
+
+  revision 2020-07-13 {
+    description
+      "Added identity cpri.";
+  }
+
+  revision 2020-07-10 {
+    description
+      "Registered ifType 300.";
+  }
+
+  revision 2020-01-10 {
+    description
+      "Registered ifType 299.";
+  }
+
+  revision 2019-10-16 {
+    description
+      "Registered ifType 298.";
+  }
+  revision 2019-07-16 {
+    description
+      "Registered ifType 297.";
+  }
+  revision 2019-06-21 {
+    description
+      "Updated reference associated with ifTypes 295-296.";
+  }
+  
+  revision 2019-02-08 {
+    description
+      "Corrected formatting issue.";
+  }
+
+  revision 2019-01-31 {
+    description
+      "Registered ifTypes 295-296.";
+  }
+
+  revision 2018-07-03 {
+    description
+      "Corrected revision date.";
+  }
+
+  revision 2018-06-29 {
+    description
+      "Corrected formatting issue.";
+  }
+
+  revision 2018-06-28 {
+    description
+      "Registered ifTypes 293 and 294.";
+  }
+
+  revision 2018-06-22 {
+    description
+      "Registered ifType 292.";
+  }
+
+  revision 2018-06-21 {
+    description
+      "Registered ifType 291.";
+  }
+
+  revision 2017-03-30 {
+    description
+      "Registered ifType 290.";
+  }
+
+  revision 2017-01-19 {
+    description
+      "Registered ifType 289.";
+  }
+
+  revision 2016-11-23 {
+    description
+      "Registered ifTypes 283-288.";
+  }
+
+  revision 2016-06-09 {
+    description
+      "Registered ifType 282.";
+  }
+  revision 2016-05-03 {
+    description
+      "Registered ifType 281.";
+  }
+  revision 2015-06-12 {
+    description
+      "Corrected formatting issue.";
+  }  
+  revision 2014-09-24 {
+    description
+      "Registered ifType 280.";
+  }
+  revision 2014-09-19 {
+    description
+      "Registered ifType 279.";
+  }
+  revision 2014-07-03 {
+    description
+      "Registered ifTypes 277-278.";
+  }
+  revision 2014-05-19 {
+    description
+      "Updated the contact address.";
+  }
+  revision 2014-05-08 {
+    description
+      "Initial revision.";
+    reference
+      "RFC 7224: IANA Interface Type YANG Module";
+  }
+
+  identity iana-interface-type {
+    base if:interface-type;
+    description
+      "This identity is used as a base for all interface types
+       defined in the 'ifType definitions' registry.";
+  }
+
+  identity other {
+    base iana-interface-type;
+  }
+  identity regular1822 {
+    base iana-interface-type;
+  }
+  identity hdh1822 {
+    base iana-interface-type;
+  }
+  identity ddnX25 {
+    base iana-interface-type;
+  }
+  identity rfc877x25 {
+    base iana-interface-type;
+    reference
+      "RFC 1382 - SNMP MIB Extension for the X.25 Packet Layer";
+  }
+  identity ethernetCsmacd {
+    base iana-interface-type;
+    description
+      "For all Ethernet-like interfaces, regardless of speed,
+       as per RFC 3635.";
+    reference
+      "RFC 3635 - Definitions of Managed Objects for the
+                  Ethernet-like Interface Types";
+  }
+  identity iso88023Csmacd {
+    base iana-interface-type;
+    status deprecated;
+    description
+      "Deprecated via RFC 3635.
+       Use ethernetCsmacd(6) instead.";
+    reference
+      "RFC 3635 - Definitions of Managed Objects for the
+                  Ethernet-like Interface Types";
+  }
+  identity iso88024TokenBus {
+    base iana-interface-type;
+  }
+  identity iso88025TokenRing {
+    base iana-interface-type;
+  }
+  identity iso88026Man {
+    base iana-interface-type;
+  }
+  identity starLan {
+    base iana-interface-type;
+    status deprecated;
+    description
+      "Deprecated via RFC 3635.
+       Use ethernetCsmacd(6) instead.";
+    reference
+      "RFC 3635 - Definitions of Managed Objects for the
+                  Ethernet-like Interface Types";
+  }
+  identity proteon10Mbit {
+    base iana-interface-type;
+  }
+  identity proteon80Mbit {
+    base iana-interface-type;
+  }
+  identity hyperchannel {
+    base iana-interface-type;
+  }
+  identity fddi {
+    base iana-interface-type;
+    reference
+      "RFC 1512 - FDDI Management Information Base";
+  }
+  identity lapb {
+    base iana-interface-type;
+    reference
+      "RFC 1381 - SNMP MIB Extension for X.25 LAPB";
+  }
+  identity sdlc {
+    base iana-interface-type;
+  }
+  identity ds1 {
+    base iana-interface-type;
+    description
+      "DS1-MIB.";
+    reference
+      "RFC 4805 - Definitions of Managed Objects for the
+                  DS1, J1, E1, DS2, and E2 Interface Types";
+  }
+  identity e1 {
+    base iana-interface-type;
+    status obsolete;
+    description
+      "Obsolete; see DS1-MIB.";
+    reference
+      "RFC 4805 - Definitions of Managed Objects for the
+                  DS1, J1, E1, DS2, and E2 Interface Types";
+  }
+  identity basicISDN {
+    base iana-interface-type;
+    description
+      "No longer used.  See also RFC 2127.";
+  }
+  identity primaryISDN {
+    base iana-interface-type;
+    description
+      "No longer used.  See also RFC 2127.";
+  }
+  identity propPointToPointSerial {
+    base iana-interface-type;
+    description
+      "Proprietary serial.";
+  }
+  identity ppp {
+    base iana-interface-type;
+  }
+  identity softwareLoopback {
+    base iana-interface-type;
+  }
+  identity eon {
+    base iana-interface-type;
+    description
+      "CLNP over IP.";
+  }
+  identity ethernet3Mbit {
+    base iana-interface-type;
+  }
+  identity nsip {
+    base iana-interface-type;
+    description
+      "XNS over IP.";
+  }
+  identity slip {
+    base iana-interface-type;
+    description
+      "Generic SLIP.";
+  }
+  identity ultra {
+    base iana-interface-type;
+    description
+      "Ultra Technologies.";
+  }
+  identity ds3 {
+    base iana-interface-type;
+    description
+      "DS3-MIB.";
+    reference
+      "RFC 3896 - Definitions of Managed Objects for the
+                  DS3/E3 Interface Type";
+  }
+  identity sip {
+    base iana-interface-type;
+    description
+      "SMDS, coffee.";
+    reference
+      "RFC 1694 - Definitions of Managed Objects for SMDS
+                  Interfaces using SMIv2";
+  }
+  identity frameRelay {
+    base iana-interface-type;
+    description
+      "DTE only.";
+    reference
+      "RFC 2115 - Management Information Base for Frame Relay
+                  DTEs Using SMIv2";
+  }
+  identity rs232 {
+    base iana-interface-type;
+    reference
+      "RFC 1659 - Definitions of Managed Objects for RS-232-like
+                  Hardware Devices using SMIv2";
+  }
+  identity para {
+    base iana-interface-type;
+    description
+      "Parallel-port.";
+    reference
+      "RFC 1660 - Definitions of Managed Objects for
+                  Parallel-printer-like Hardware Devices using
+                  SMIv2";
+  }
+  identity arcnet {
+    base iana-interface-type;
+    description
+      "ARCnet.";
+  }
+  identity arcnetPlus {
+    base iana-interface-type;
+    description
+      "ARCnet Plus.";
+  }
+  identity atm {
+    base iana-interface-type;
+    description
+      "ATM cells.";
+  }
+  identity miox25 {
+    base iana-interface-type;
+    reference
+      "RFC 1461 - SNMP MIB extension for Multiprotocol
+                  Interconnect over X.25";
+  }
+  identity sonet {
+    base iana-interface-type;
+    description
+      "SONET or SDH.";
+  }
+  identity x25ple {
+    base iana-interface-type;
+    reference
+      "RFC 2127 - ISDN Management Information Base using SMIv2";
+  }
+  identity iso88022llc {
+    base iana-interface-type;
+  }
+  identity localTalk {
+    base iana-interface-type;
+  }
+  identity smdsDxi {
+    base iana-interface-type;
+  }
+  identity frameRelayService {
+    base iana-interface-type;
+    description
+      "FRNETSERV-MIB.";
+    reference
+      "RFC 2954 - Definitions of Managed Objects for Frame
+                  Relay Service";
+  }
+  identity v35 {
+    base iana-interface-type;
+  }
+  identity hssi {
+    base iana-interface-type;
+  }
+  identity hippi {
+    base iana-interface-type;
+  }
+  identity modem {
+    base iana-interface-type;
+    description
+      "Generic modem.";
+  }
+  identity aal5 {
+    base iana-interface-type;
+    description
+      "AAL5 over ATM.";
+  }
+  identity sonetPath {
+    base iana-interface-type;
+  }
+  identity sonetVT {
+    base iana-interface-type;
+  }
+  identity smdsIcip {
+    base iana-interface-type;
+    description
+      "SMDS InterCarrier Interface.";
+  }
+  identity propVirtual {
+    base iana-interface-type;
+    description
+      "Proprietary virtual/internal.";
+    reference
+      "RFC 2863 - The Interfaces Group MIB";
+  }
+  identity propMultiplexor {
+    base iana-interface-type;
+    description
+      "Proprietary multiplexing.";
+    reference
+      "RFC 2863 - The Interfaces Group MIB";
+  }
+  identity ieee80212 {
+    base iana-interface-type;
+    description
+      "100BaseVG.";
+  }
+  identity fibreChannel {
+    base iana-interface-type;
+    description
+      "Fibre Channel.";
+  }
+  identity hippiInterface {
+    base iana-interface-type;
+    description
+      "HIPPI interfaces.";
+  }
+  identity frameRelayInterconnect {
+    base iana-interface-type;
+    status obsolete;
+    description
+      "Obsolete; use either
+       frameRelay(32) or frameRelayService(44).";
+  }
+  identity aflane8023 {
+    base iana-interface-type;
+    description
+      "ATM Emulated LAN for 802.3.";
+  }
+  identity aflane8025 {
+    base iana-interface-type;
+    description
+      "ATM Emulated LAN for 802.5.";
+  }
+  identity cctEmul {
+    base iana-interface-type;
+    description
+      "ATM Emulated circuit.";
+  }
+  identity fastEther {
+    base iana-interface-type;
+    status deprecated;
+    description
+      "Obsoleted via RFC 3635.
+       ethernetCsmacd(6) should be used instead.";
+    reference
+      "RFC 3635 - Definitions of Managed Objects for the
+                  Ethernet-like Interface Types";
+  }
+  identity isdn {
+    base iana-interface-type;
+    description
+      "ISDN and X.25.";
+    reference
+      "RFC 1356 - Multiprotocol Interconnect on X.25 and ISDN
+                  in the Packet Mode";
+  }
+  identity v11 {
+    base iana-interface-type;
+    description
+      "CCITT V.11/X.21.";
+  }
+  identity v36 {
+    base iana-interface-type;
+    description
+      "CCITT V.36.";
+  }
+  identity g703at64k {
+    base iana-interface-type;
+    description
+      "CCITT G703 at 64Kbps.";
+  }
+  identity g703at2mb {
+    base iana-interface-type;
+    status obsolete;
+    description
+      "Obsolete; see DS1-MIB.";
+  }
+  identity qllc {
+    base iana-interface-type;
+    description
+      "SNA QLLC.";
+  }
+  identity fastEtherFX {
+    base iana-interface-type;
+    status deprecated;
+    description
+      "Obsoleted via RFC 3635.
+       ethernetCsmacd(6) should be used instead.";
+    reference
+      "RFC 3635 - Definitions of Managed Objects for the
+                  Ethernet-like Interface Types";
+  }
+  identity channel {
+    base iana-interface-type;
+    description
+      "Channel.";
+  }
+  identity ieee80211 {
+    base iana-interface-type;
+    description
+      "Radio spread spectrum.";
+  }
+  identity ibm370parChan {
+    base iana-interface-type;
+    description
+      "IBM System 360/370 OEMI Channel.";
+  }
+  identity escon {
+    base iana-interface-type;
+    description
+      "IBM Enterprise Systems Connection.";
+  }
+  identity dlsw {
+    base iana-interface-type;
+    description
+      "Data Link Switching.";
+  }
+  identity isdns {
+    base iana-interface-type;
+    description
+      "ISDN S/T interface.";
+  }
+  identity isdnu {
+    base iana-interface-type;
+    description
+      "ISDN U interface.";
+  }
+  identity lapd {
+    base iana-interface-type;
+    description
+      "Link Access Protocol D.";
+  }
+  identity ipSwitch {
+    base iana-interface-type;
+    description
+      "IP Switching Objects.";
+  }
+  identity rsrb {
+    base iana-interface-type;
+    description
+      "Remote Source Route Bridging.";
+  }
+  identity atmLogical {
+    base iana-interface-type;
+    description
+      "ATM Logical Port.";
+    reference
+      "RFC 3606 - Definitions of Supplemental Managed Objects
+                  for ATM Interface";
+  }
+  identity ds0 {
+    base iana-interface-type;
+    description
+      "Digital Signal Level 0.";
+    reference
+      "RFC 2494 - Definitions of Managed Objects for the DS0
+                  and DS0 Bundle Interface Type";
+  }
+  identity ds0Bundle {
+    base iana-interface-type;
+    description
+      "Group of ds0s on the same ds1.";
+    reference
+      "RFC 2494 - Definitions of Managed Objects for the DS0
+                  and DS0 Bundle Interface Type";
+  }
+  identity bsc {
+    base iana-interface-type;
+    description
+      "Bisynchronous Protocol.";
+  }
+  identity async {
+    base iana-interface-type;
+    description
+      "Asynchronous Protocol.";
+  }
+  identity cnr {
+    base iana-interface-type;
+    description
+      "Combat Net Radio.";
+  }
+  identity iso88025Dtr {
+    base iana-interface-type;
+    description
+      "ISO 802.5r DTR.";
+  }
+  identity eplrs {
+    base iana-interface-type;
+    description
+      "Ext Pos Loc Report Sys.";
+  }
+  identity arap {
+    base iana-interface-type;
+    description
+      "Appletalk Remote Access Protocol.";
+  }
+  identity propCnls {
+    base iana-interface-type;
+    description
+      "Proprietary Connectionless Protocol.";
+  }
+  identity hostPad {
+    base iana-interface-type;
+    description
+      "CCITT-ITU X.29 PAD Protocol.";
+  }
+  identity termPad {
+    base iana-interface-type;
+    description
+      "CCITT-ITU X.3 PAD Facility.";
+  }
+  identity frameRelayMPI {
+    base iana-interface-type;
+    description
+      "Multiproto Interconnect over FR.";
+  }
+  identity x213 {
+    base iana-interface-type;
+    description
+      "CCITT-ITU X213.";
+  }
+  identity adsl {
+    base iana-interface-type;
+    description
+      "Asymmetric Digital Subscriber Loop.";
+  }
+  identity radsl {
+    base iana-interface-type;
+    description
+      "Rate-Adapt. Digital Subscriber Loop.";
+  }
+  identity sdsl {
+    base iana-interface-type;
+    description
+      "Symmetric Digital Subscriber Loop.";
+  }
+  identity vdsl {
+    base iana-interface-type;
+    description
+      "Very H-Speed Digital Subscrib. Loop.";
+  }
+  identity iso88025CRFPInt {
+    base iana-interface-type;
+    description
+      "ISO 802.5 CRFP.";
+  }
+  identity myrinet {
+    base iana-interface-type;
+    description
+      "Myricom Myrinet.";
+  }
+  identity voiceEM {
+    base iana-interface-type;
+    description
+      "Voice recEive and transMit.";
+  }
+  identity voiceFXO {
+    base iana-interface-type;
+    description
+      "Voice Foreign Exchange Office.";
+  }
+  identity voiceFXS {
+    base iana-interface-type;
+    description
+      "Voice Foreign Exchange Station.";
+  }
+  identity voiceEncap {
+    base iana-interface-type;
+    description
+      "Voice encapsulation.";
+  }
+  identity voiceOverIp {
+    base iana-interface-type;
+    description
+      "Voice over IP encapsulation.";
+  }
+  identity atmDxi {
+    base iana-interface-type;
+    description
+      "ATM DXI.";
+  }
+  identity atmFuni {
+    base iana-interface-type;
+    description
+      "ATM FUNI.";
+  }
+  identity atmIma {
+    base iana-interface-type;
+    description
+      "ATM IMA.";
+  }
+  identity pppMultilinkBundle {
+    base iana-interface-type;
+    description
+      "PPP Multilink Bundle.";
+  }
+  identity ipOverCdlc {
+    base iana-interface-type;
+    description
+      "IBM ipOverCdlc.";
+  }
+  identity ipOverClaw {
+    base iana-interface-type;
+    description
+      "IBM Common Link Access to Workstn.";
+  }
+  identity stackToStack {
+    base iana-interface-type;
+    description
+      "IBM stackToStack.";
+  }
+  identity virtualIpAddress {
+    base iana-interface-type;
+    description
+      "IBM VIPA.";
+  }
+  identity mpc {
+    base iana-interface-type;
+    description
+      "IBM multi-protocol channel support.";
+  }
+  identity ipOverAtm {
+    base iana-interface-type;
+    description
+      "IBM ipOverAtm.";
+    reference
+      "RFC 2320 - Definitions of Managed Objects for Classical IP
+                  and ARP Over ATM Using SMIv2 (IPOA-MIB)";
+  }
+  identity iso88025Fiber {
+    base iana-interface-type;
+    description
+      "ISO 802.5j Fiber Token Ring.";
+  }
+  identity tdlc {
+    base iana-interface-type;
+    description
+      "IBM twinaxial data link control.";
+  }
+  identity gigabitEthernet {
+    base iana-interface-type;
+    status deprecated;
+    description
+      "Obsoleted via RFC 3635.
+       ethernetCsmacd(6) should be used instead.";
+    reference
+      "RFC 3635 - Definitions of Managed Objects for the
+                  Ethernet-like Interface Types";
+  }
+  identity hdlc {
+    base iana-interface-type;
+    description
+      "HDLC.";
+  }
+  identity lapf {
+    base iana-interface-type;
+    description
+      "LAP F.";
+  }
+  identity v37 {
+    base iana-interface-type;
+    description
+      "V.37.";
+  }
+  identity x25mlp {
+    base iana-interface-type;
+    description
+      "Multi-Link Protocol.";
+  }
+  identity x25huntGroup {
+    base iana-interface-type;
+    description
+      "X25 Hunt Group.";
+  }
+  identity transpHdlc {
+    base iana-interface-type;
+    description
+      "Transp HDLC.";
+  }
+  identity interleave {
+    base iana-interface-type;
+    description
+      "Interleave channel.";
+  }
+  identity fast {
+    base iana-interface-type;
+    description
+      "Fast channel.";
+  }
+  identity ip {
+    base iana-interface-type;
+    description
+      "IP (for APPN HPR in IP networks).";
+  }
+  identity docsCableMaclayer {
+    base iana-interface-type;
+    description
+      "CATV Mac Layer.";
+  }
+  identity docsCableDownstream {
+    base iana-interface-type;
+    description
+      "CATV Downstream interface.";
+  }
+  identity docsCableUpstream {
+    base iana-interface-type;
+    description
+      "CATV Upstream interface.";
+  }
+  identity a12MppSwitch {
+    base iana-interface-type;
+    description
+      "Avalon Parallel Processor.";
+  }
+  identity tunnel {
+    base iana-interface-type;
+    description
+      "Encapsulation interface.";
+  }
+  identity coffee {
+    base iana-interface-type;
+    description
+      "Coffee pot.";
+    reference
+      "RFC 2325 - Coffee MIB";
+  }
+  identity ces {
+    base iana-interface-type;
+    description
+      "Circuit Emulation Service.";
+  }
+  identity atmSubInterface {
+    base iana-interface-type;
+    description
+      "ATM Sub Interface.";
+  }
+  identity l2vlan {
+    base iana-interface-type;
+    description
+      "Layer 2 Virtual LAN using 802.1Q.";
+  }
+  identity l3ipvlan {
+    base iana-interface-type;
+    description
+      "Layer 3 Virtual LAN using IP.";
+  }
+  identity l3ipxvlan {
+    base iana-interface-type;
+    description
+      "Layer 3 Virtual LAN using IPX.";
+  }
+  identity digitalPowerline {
+    base iana-interface-type;
+    description
+      "IP over Power Lines.";
+  }
+  identity mediaMailOverIp {
+    base iana-interface-type;
+    description
+      "Multimedia Mail over IP.";
+  }
+  identity dtm {
+    base iana-interface-type;
+    description
+      "Dynamic synchronous Transfer Mode.";
+  }
+  identity dcn {
+    base iana-interface-type;
+    description
+      "Data Communications Network.";
+  }
+  identity ipForward {
+    base iana-interface-type;
+    description
+      "IP Forwarding Interface.";
+  }
+  identity msdsl {
+    base iana-interface-type;
+    description
+      "Multi-rate Symmetric DSL.";
+  }
+  identity ieee1394 {
+    base iana-interface-type;
+
+    description
+      "IEEE1394 High Performance Serial Bus.";
+  }
+  identity if-gsn {
+    base iana-interface-type;
+    description
+      "HIPPI-6400.";
+  }
+  identity dvbRccMacLayer {
+    base iana-interface-type;
+    description
+      "DVB-RCC MAC Layer.";
+  }
+  identity dvbRccDownstream {
+    base iana-interface-type;
+    description
+      "DVB-RCC Downstream Channel.";
+  }
+  identity dvbRccUpstream {
+    base iana-interface-type;
+    description
+      "DVB-RCC Upstream Channel.";
+  }
+  identity atmVirtual {
+    base iana-interface-type;
+    description
+      "ATM Virtual Interface.";
+  }
+  identity mplsTunnel {
+    base iana-interface-type;
+    description
+      "MPLS Tunnel Virtual Interface.";
+  }
+  identity srp {
+    base iana-interface-type;
+    description
+      "Spatial Reuse Protocol.";
+  }
+  identity voiceOverAtm {
+    base iana-interface-type;
+    description
+      "Voice over ATM.";
+  }
+  identity voiceOverFrameRelay {
+    base iana-interface-type;
+    description
+      "Voice Over Frame Relay.";
+  }
+  identity idsl {
+    base iana-interface-type;
+    description
+      "Digital Subscriber Loop over ISDN.";
+  }
+  identity compositeLink {
+    base iana-interface-type;
+    description
+      "Avici Composite Link Interface.";
+  }
+  identity ss7SigLink {
+    base iana-interface-type;
+    description
+      "SS7 Signaling Link.";
+  }
+  identity propWirelessP2P {
+    base iana-interface-type;
+    description
+      "Prop. P2P wireless interface.";
+  }
+  identity frForward {
+    base iana-interface-type;
+    description
+      "Frame Forward Interface.";
+  }
+  identity rfc1483 {
+    base iana-interface-type;
+    description
+      "Multiprotocol over ATM AAL5.";
+    reference
+      "RFC 1483 - Multiprotocol Encapsulation over ATM
+                  Adaptation Layer 5";
+  }
+  identity usb {
+    base iana-interface-type;
+    description
+      "USB Interface.";
+  }
+  identity ieee8023adLag {
+    base iana-interface-type;
+    description
+      "IEEE 802.3ad Link Aggregate.";
+  }
+  identity bgppolicyaccounting {
+    base iana-interface-type;
+    description
+      "BGP Policy Accounting.";
+  }
+  identity frf16MfrBundle {
+    base iana-interface-type;
+    description
+      "FRF.16 Multilink Frame Relay.";
+  }
+  identity h323Gatekeeper {
+    base iana-interface-type;
+    description
+      "H323 Gatekeeper.";
+  }
+  identity h323Proxy {
+    base iana-interface-type;
+    description
+      "H323 Voice and Video Proxy.";
+  }
+  identity mpls {
+    base iana-interface-type;
+    description
+      "MPLS.";
+  }
+  identity mfSigLink {
+    base iana-interface-type;
+    description
+      "Multi-frequency signaling link.";
+  }
+  identity hdsl2 {
+    base iana-interface-type;
+    description
+      "High Bit-Rate DSL - 2nd generation.";
+  }
+  identity shdsl {
+    base iana-interface-type;
+    description
+      "Multirate HDSL2.";
+  }
+  identity ds1FDL {
+    base iana-interface-type;
+    description
+      "Facility Data Link (4Kbps) on a DS1.";
+  }
+  identity pos {
+    base iana-interface-type;
+    description
+      "Packet over SONET/SDH Interface.";
+  }
+  identity dvbAsiIn {
+    base iana-interface-type;
+    description
+      "DVB-ASI Input.";
+  }
+  identity dvbAsiOut {
+    base iana-interface-type;
+    description
+      "DVB-ASI Output.";
+  }
+  identity plc {
+    base iana-interface-type;
+    description
+      "Power Line Communications.";
+  }
+  identity nfas {
+    base iana-interface-type;
+    description
+      "Non-Facility Associated Signaling.";
+  }
+  identity tr008 {
+    base iana-interface-type;
+    description
+      "TR008.";
+  }
+  identity gr303RDT {
+    base iana-interface-type;
+    description
+      "Remote Digital Terminal.";
+  }
+  identity gr303IDT {
+    base iana-interface-type;
+    description
+      "Integrated Digital Terminal.";
+  }
+  identity isup {
+    base iana-interface-type;
+    description
+      "ISUP.";
+  }
+  identity propDocsWirelessMaclayer {
+    base iana-interface-type;
+    description
+      "Cisco proprietary Maclayer.";
+  }
+  identity propDocsWirelessDownstream {
+    base iana-interface-type;
+    description
+      "Cisco proprietary Downstream.";
+  }
+  identity propDocsWirelessUpstream {
+    base iana-interface-type;
+    description
+      "Cisco proprietary Upstream.";
+  }
+  identity hiperlan2 {
+    base iana-interface-type;
+    description
+      "HIPERLAN Type 2 Radio Interface.";
+  }
+  identity propBWAp2Mp {
+    base iana-interface-type;
+    description
+      "PropBroadbandWirelessAccesspt2Multipt (use of this value
+       for IEEE 802.16 WMAN interfaces as per IEEE Std 802.16f
+       is deprecated, and ieee80216WMAN(237) should be used
+       instead).";
+  }
+  identity sonetOverheadChannel {
+    base iana-interface-type;
+    description
+      "SONET Overhead Channel.";
+  }
+  identity digitalWrapperOverheadChannel {
+    base iana-interface-type;
+    description
+      "Digital Wrapper.";
+  }
+  identity aal2 {
+    base iana-interface-type;
+    description
+      "ATM adaptation layer 2.";
+  }
+  identity radioMAC {
+    base iana-interface-type;
+    description
+      "MAC layer over radio links.";
+  }
+  identity atmRadio {
+    base iana-interface-type;
+    description
+      "ATM over radio links.";
+  }
+  identity imt {
+    base iana-interface-type;
+    description
+      "Inter-Machine Trunks.";
+  }
+  identity mvl {
+    base iana-interface-type;
+    description
+      "Multiple Virtual Lines DSL.";
+  }
+  identity reachDSL {
+    base iana-interface-type;
+    description
+      "Long Reach DSL.";
+  }
+  identity frDlciEndPt {
+    base iana-interface-type;
+    description
+      "Frame Relay DLCI End Point.";
+  }
+  identity atmVciEndPt {
+    base iana-interface-type;
+    description
+      "ATM VCI End Point.";
+  }
+  identity opticalChannel {
+    base iana-interface-type;
+    description
+      "Optical Channel.";
+  }
+  identity opticalTransport {
+    base iana-interface-type;
+    description
+      "Optical Transport.";
+  }
+  identity propAtm {
+    base iana-interface-type;
+    description
+      "Proprietary ATM.";
+  }
+  identity voiceOverCable {
+    base iana-interface-type;
+    description
+      "Voice Over Cable Interface.";
+  }
+  identity infiniband {
+    base iana-interface-type;
+    description
+      "Infiniband.";
+  }
+  identity teLink {
+    base iana-interface-type;
+    description
+      "TE Link.";
+  }
+  identity q2931 {
+    base iana-interface-type;
+    description
+      "Q.2931.";
+  }
+  identity virtualTg {
+    base iana-interface-type;
+    description
+      "Virtual Trunk Group.";
+  }
+  identity sipTg {
+    base iana-interface-type;
+    description
+      "SIP Trunk Group.";
+  }
+  identity sipSig {
+    base iana-interface-type;
+    description
+      "SIP Signaling.";
+  }
+  identity docsCableUpstreamChannel {
+    base iana-interface-type;
+    description
+      "CATV Upstream Channel.";
+  }
+  identity econet {
+    base iana-interface-type;
+    description
+      "Acorn Econet.";
+  }
+  identity pon155 {
+    base iana-interface-type;
+    description
+      "FSAN 155Mb Symetrical PON interface.";
+  }
+  identity pon622 {
+    base iana-interface-type;
+    description
+      "FSAN 622Mb Symetrical PON interface.";
+  }
+  identity bridge {
+    base iana-interface-type;
+    description
+      "Transparent bridge interface.";
+  }
+  identity linegroup {
+    base iana-interface-type;
+    description
+      "Interface common to multiple lines.";
+  }
+  identity voiceEMFGD {
+    base iana-interface-type;
+    description
+      "Voice E&M Feature Group D.";
+  }
+  identity voiceFGDEANA {
+    base iana-interface-type;
+    description
+      "Voice FGD Exchange Access North American.";
+  }
+  identity voiceDID {
+    base iana-interface-type;
+    description
+      "Voice Direct Inward Dialing.";
+  }
+  identity mpegTransport {
+    base iana-interface-type;
+    description
+      "MPEG transport interface.";
+  }
+  identity sixToFour {
+    base iana-interface-type;
+    status deprecated;
+    description
+      "6to4 interface (DEPRECATED).";
+    reference
+      "RFC 4087 - IP Tunnel MIB";
+  }
+  identity gtp {
+    base iana-interface-type;
+    description
+      "GTP (GPRS Tunneling Protocol).";
+  }
+  identity pdnEtherLoop1 {
+    base iana-interface-type;
+    description
+      "Paradyne EtherLoop 1.";
+  }
+  identity pdnEtherLoop2 {
+    base iana-interface-type;
+    description
+      "Paradyne EtherLoop 2.";
+  }
+  identity opticalChannelGroup {
+    base iana-interface-type;
+    description
+      "Optical Channel Group.";
+  }
+  identity homepna {
+    base iana-interface-type;
+    description
+      "HomePNA ITU-T G.989.";
+  }
+  identity gfp {
+    base iana-interface-type;
+    description
+      "Generic Framing Procedure (GFP).";
+  }
+  identity ciscoISLvlan {
+    base iana-interface-type;
+    description
+      "Layer 2 Virtual LAN using Cisco ISL.";
+  }
+  identity actelisMetaLOOP {
+    base iana-interface-type;
+    description
+      "Acteleis proprietary MetaLOOP High Speed Link.";
+  }
+  identity fcipLink {
+    base iana-interface-type;
+    description
+      "FCIP Link.";
+  }
+  identity rpr {
+    base iana-interface-type;
+    description
+      "Resilient Packet Ring Interface Type.";
+  }
+  identity qam {
+    base iana-interface-type;
+    description
+      "RF Qam Interface.";
+  }
+  identity lmp {
+    base iana-interface-type;
+    description
+      "Link Management Protocol.";
+    reference
+      "RFC 4327 - Link Management Protocol (LMP) Management
+                  Information Base (MIB)";
+  }
+  identity cblVectaStar {
+    base iana-interface-type;
+    description
+      "Cambridge Broadband Networks Limited VectaStar.";
+  }
+  identity docsCableMCmtsDownstream {
+    base iana-interface-type;
+    description
+      "CATV Modular CMTS Downstream Interface.";
+  }
+  identity adsl2 {
+    base iana-interface-type;
+    status deprecated;
+    description
+      "Asymmetric Digital Subscriber Loop Version 2
+       (DEPRECATED/OBSOLETED - please use adsl2plus(238)
+       instead).";
+    reference
+      "RFC 4706 - Definitions of Managed Objects for Asymmetric
+                  Digital Subscriber Line 2 (ADSL2)";
+  }
+  identity macSecControlledIF {
+    base iana-interface-type;
+    description
+      "MACSecControlled.";
+  }
+  identity macSecUncontrolledIF {
+    base iana-interface-type;
+    description
+      "MACSecUncontrolled.";
+  }
+  identity aviciOpticalEther {
+    base iana-interface-type;
+    description
+      "Avici Optical Ethernet Aggregate.";
+  }
+  identity atmbond {
+    base iana-interface-type;
+    description
+      "atmbond.";
+  }
+  identity voiceFGDOS {
+    base iana-interface-type;
+    description
+      "Voice FGD Operator Services.";
+  }
+  identity mocaVersion1 {
+    base iana-interface-type;
+    description
+      "MultiMedia over Coax Alliance (MoCA) Interface
+       as documented in information provided privately to IANA.";
+  }
+  identity ieee80216WMAN {
+    base iana-interface-type;
+    description
+      "IEEE 802.16 WMAN interface.";
+  }
+  identity adsl2plus {
+    base iana-interface-type;
+    description
+      "Asymmetric Digital Subscriber Loop Version 2 -
+       Version 2 Plus and all variants.";
+  }
+  identity dvbRcsMacLayer {
+    base iana-interface-type;
+    description
+      "DVB-RCS MAC Layer.";
+    reference
+      "RFC 5728 - The SatLabs Group DVB-RCS MIB";
+  }
+  identity dvbTdm {
+    base iana-interface-type;
+    description
+      "DVB Satellite TDM.";
+    reference
+      "RFC 5728 - The SatLabs Group DVB-RCS MIB";
+  }
+  identity dvbRcsTdma {
+    base iana-interface-type;
+    description
+      "DVB-RCS TDMA.";
+    reference
+      "RFC 5728 - The SatLabs Group DVB-RCS MIB";
+  }
+  identity x86Laps {
+    base iana-interface-type;
+    description
+      "LAPS based on ITU-T X.86/Y.1323.";
+  }
+  identity wwanPP {
+    base iana-interface-type;
+    description
+      "3GPP WWAN.";
+  }
+  identity wwanPP2 {
+    base iana-interface-type;
+    description
+      "3GPP2 WWAN.";
+  }
+  identity voiceEBS {
+    base iana-interface-type;
+    description
+      "Voice P-phone EBS physical interface.";
+  }
+  identity ifPwType {
+    base iana-interface-type;
+    description
+      "Pseudowire interface type.";
+    reference
+      "RFC 5601 - Pseudowire (PW) Management Information Base (MIB)";
+  }
+  identity ilan {
+    base iana-interface-type;
+    description
+      "Internal LAN on a bridge per IEEE 802.1ap.";
+  }
+  identity pip {
+    base iana-interface-type;
+    description
+      "Provider Instance Port on a bridge per IEEE 802.1ah PBB.";
+  }
+  identity aluELP {
+    base iana-interface-type;
+    description
+      "Alcatel-Lucent Ethernet Link Protection.";
+  }
+  identity gpon {
+    base iana-interface-type;
+    description
+      "Gigabit-capable passive optical networks (G-PON) as per
+       ITU-T G.984.";
+  }
+  identity vdsl2 {
+    base iana-interface-type;
+    description
+      "Very high speed digital subscriber line Version 2
+       (as per ITU-T Recommendation G.993.2).";
+    reference
+      "RFC 5650 - Definitions of Managed Objects for Very High
+                  Speed Digital Subscriber Line 2 (VDSL2)";
+  }
+  identity capwapDot11Profile {
+    base iana-interface-type;
+    description
+      "WLAN Profile Interface.";
+    reference
+      "RFC 5834 - Control and Provisioning of Wireless Access
+                  Points (CAPWAP) Protocol Binding MIB for
+                  IEEE 802.11";
+  }
+  identity capwapDot11Bss {
+    base iana-interface-type;
+    description
+      "WLAN BSS Interface.";
+    reference
+      "RFC 5834 - Control and Provisioning of Wireless Access
+                  Points (CAPWAP) Protocol Binding MIB for
+                  IEEE 802.11";
+  }
+  identity capwapWtpVirtualRadio {
+    base iana-interface-type;
+    description
+      "WTP Virtual Radio Interface.";
+    reference
+      "RFC 5833 - Control and Provisioning of Wireless Access
+                  Points (CAPWAP) Protocol Base MIB";
+  }
+  identity bits {
+    base iana-interface-type;
+    description
+      "bitsport.";
+  }
+  identity docsCableUpstreamRfPort {
+    base iana-interface-type;
+    description
+      "DOCSIS CATV Upstream RF Port.";
+  }
+  identity cableDownstreamRfPort {
+    base iana-interface-type;
+    description
+      "CATV downstream RF Port.";
+  }
+  identity vmwareVirtualNic {
+    base iana-interface-type;
+    description
+      "VMware Virtual Network Interface.";
+  }
+  identity ieee802154 {
+    base iana-interface-type;
+    description
+      "IEEE 802.15.4 WPAN interface.";
+    reference
+      "IEEE 802.15.4-2006";
+  }
+  identity otnOdu {
+    base iana-interface-type;
+    description
+      "OTN Optical Data Unit.";
+  }
+  identity otnOtu {
+    base iana-interface-type;
+    description
+      "OTN Optical channel Transport Unit.";
+  }
+  identity ifVfiType {
+    base iana-interface-type;
+    description
+      "VPLS Forwarding Instance Interface Type.";
+  }
+  identity g9981 {
+    base iana-interface-type;
+    description
+      "G.998.1 bonded interface.";
+  }
+  identity g9982 {
+    base iana-interface-type;
+    description
+      "G.998.2 bonded interface.";
+  }
+  identity g9983 {
+    base iana-interface-type;
+    description
+      "G.998.3 bonded interface.";
+  }
+
+  identity aluEpon {
+    base iana-interface-type;
+    description
+      "Ethernet Passive Optical Networks (E-PON).";
+  }
+  identity aluEponOnu {
+    base iana-interface-type;
+    description
+      "EPON Optical Network Unit.";
+  }
+  identity aluEponPhysicalUni {
+    base iana-interface-type;
+    description
+      "EPON physical User to Network interface.";
+  }
+  identity aluEponLogicalLink {
+    base iana-interface-type;
+    description
+      "The emulation of a point-to-point link over the EPON
+       layer.";
+  }
+  identity aluGponOnu {
+    base iana-interface-type;
+    description
+      "GPON Optical Network Unit.";
+    reference
+      "ITU-T G.984.2";
+  }
+  identity aluGponPhysicalUni {
+    base iana-interface-type;
+    description
+      "GPON physical User to Network interface.";
+    reference
+      "ITU-T G.984.2";
+  }
+  identity vmwareNicTeam {
+    base iana-interface-type;
+    description
+      "VMware NIC Team.";
+  }
+  identity docsOfdmDownstream {
+    base iana-interface-type;
+    description
+      "CATV Downstream OFDM interface.";
+    reference
+      "Cable Modem Operations Support System Interface 
+       Specification";
+  }
+  identity docsOfdmaUpstream {
+    base iana-interface-type;
+    description
+      "CATV Upstream OFDMA interface.";
+    reference
+      "Cable Modem Operations Support System Interface 
+       Specification";
+  }
+  identity gfast {
+    base iana-interface-type;
+    description
+      "G.fast port.";
+    reference
+      "ITU-T G.9701";
+  }
+  identity sdci {
+    base iana-interface-type;
+    description
+      "SDCI (IO-Link).";
+    reference
+      "IEC 61131-9 Edition 1.0 2013-09";
+  }
+  identity xboxWireless {
+    base iana-interface-type;
+    description
+      "Xbox wireless.";
+  }
+  identity fastdsl {
+    base iana-interface-type;
+    description
+      "FastDSL.";
+    reference
+      "BBF TR-355";
+  }
+  identity docsCableScte55d1FwdOob {
+    base iana-interface-type;
+    description
+      "Cable SCTE 55-1 OOB Forward Channel.";
+    reference
+      "ANSI/SCTE 55-1 2009";
+  }
+  identity docsCableScte55d1RetOob {
+    base iana-interface-type;
+    description
+      "Cable SCTE 55-1 OOB Return Channel.";
+    reference
+      "ANSI/SCTE 55-1 2009";
+  }
+  identity docsCableScte55d2DsOob {
+    base iana-interface-type;
+    description
+      "Cable SCTE 55-2 OOB Downstream Channel.";
+    reference
+      "ANSI/SCTE 55-2 2008";
+  }
+  identity docsCableScte55d2UsOob {
+    base iana-interface-type;
+    description
+      "Cable SCTE 55-2 OOB Upstream Channel.";
+    reference
+      "ANSI/SCTE 55-2 2008";
+  }
+  identity docsCableNdf {
+    base iana-interface-type;
+    description
+      "Cable Narrowband Digital Forward.";
+  }
+  identity docsCableNdr {
+    base iana-interface-type;
+    description
+      "Cable Narrowband Digital Return.";
+  }
+  identity ptm {
+    base iana-interface-type;
+    description
+      "Packet Transfer Mode.";
+    reference
+      "IEEE G.993.1, Annex H; IEEE G.993.2; IEEE G.9701";
+  }
+  identity ghn {
+    base iana-interface-type;
+    description
+      "G.hn port.";
+    reference
+      "IEEE G.9961";
+  }
+  identity otnOtsi {
+    base iana-interface-type;
+    description
+      "Optical Tributary Signal.";
+    reference
+      "ITU-T G.959.1";
+  }
+  identity otnOtuc {
+    base iana-interface-type;
+    description
+      "OTN OTUCn.";
+    reference
+      "ITU-T G.709/Y.1331";
+  }
+  identity otnOduc {
+    base iana-interface-type;
+    description
+      "OTN ODUC.";
+    reference
+      "ITU-T G.709";
+  }
+  identity otnOtsig {
+    base iana-interface-type;
+    description
+      "OTN OTUC Signal.";
+    reference
+      "ITU-T G.709";
+  }
+  identity microwaveCarrierTermination {
+    base iana-interface-type;
+    description
+      "air interface of a single microwave carrier.";
+    reference
+      "RFC 8561 - A YANG Data Model for Microwave Radio Link";
+  }
+  identity microwaveRadioLinkTerminal {
+    base iana-interface-type;
+    description
+      "radio link interface for one or several aggregated microwave carriers.";
+    reference
+      "RFC 8561 - A YANG Data Model for Microwave Radio Link";
+  }
+  identity ieee8021axDrni {
+    base iana-interface-type;
+    description
+      "IEEE 802.1AX Distributed Resilient Network Interface.";
+    reference
+      "IEEE 802.1AX-Rev-d2-0";
+  }
+  identity ax25 {
+    base iana-interface-type;
+    description
+      "AX.25 network interfaces.";
+    reference
+      "AX.25 Link Access Protocol for Amateur Packet Radio version 2.2";
+  }
+  identity ieee19061nanocom {
+    base iana-interface-type;
+    description
+      "Nanoscale and Molecular Communication.";
+    reference
+      "IEEE 1906.1-2015";
+  }
+  identity cpri {
+    base iana-interface-type;
+    description
+      "Common Public Radio Interface.";
+    reference
+      "CPRI v7.0";
+  }
+  identity omni {
+    base iana-interface-type;
+    description
+      "Overlay Multilink Network Interface (OMNI).";
+    reference
+      "draft-templin-6man-omni-00";
+  }
+  identity roe {
+    base iana-interface-type;
+    description
+      "Radio over Ethernet Interface.";
+    reference
+      "1914.3-2018 - IEEE Standard for Radio over Ethernet Encapsulations and Mappings";
+  }
+  identity p2pOverLan {
+    base iana-interface-type;
+    description
+      "Point to Point over LAN interface.";
+    reference
+      "RFC 9296 - ifStackTable for the Point-to-Point (P2P) Interface over a LAN Type: Definition and Examples";
+  }
+}
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/mwt/ieee802-dot1q-bridge.yang b/plugins/org.etsi.mts.tdl.yang2tdl/samples/mwt/ieee802-dot1q-bridge.yang
new file mode 100644
index 0000000000000000000000000000000000000000..2c7d9f9d55ee877fbd50739a15c7f799d8cb735f
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/mwt/ieee802-dot1q-bridge.yang
@@ -0,0 +1,1795 @@
+module ieee802-dot1q-bridge {
+  yang-version "1.1";
+  namespace urn:ieee:std:802.1Q:yang:ieee802-dot1q-bridge;
+  prefix dot1q;
+  import ieee802-types {
+    prefix ieee;
+  }
+  import ietf-yang-types {
+    prefix yang;
+  }
+  import ietf-interfaces {
+    prefix if;
+  }
+  import iana-if-type {
+    prefix ianaif;
+  }
+  import ieee802-dot1q-types {
+    prefix dot1qtypes;
+  }
+  organization
+    "IEEE 802.1 Working Group";
+  contact
+    "WG-URL: http://ieee802.org/1/
+    WG-EMail: stds-802-1-l@ieee.org
+    
+    Contact: IEEE 802.1 Working Group Chair
+    Postal: C/O IEEE 802.1 Working Group
+            IEEE Standards Association
+            445 Hoes Lane
+            Piscataway, NJ 08854
+            USA
+    
+    E-mail: stds-802-1-chairs@ieee.org";
+  description
+    "This YANG module describes the bridge configuration model for the
+    following IEEE 802.1Q Bridges:
+       1) Two Port MAC Relays
+       2) Customer VLAN Bridges
+       3) Provider Bridges.
+    
+    Copyright (C) IEEE (2022).
+    
+    This version of this YANG module is part of IEEE Std 802.1Q; see the
+    standard itself for full legal notices.";
+  revision 2022-05-06 {
+    description
+      "Rebase Qrev with Qcw updates.";
+    reference
+      "IEEE Std 802.1Q-2022, Bridges and Bridged Networks.";
+  }
+  revision 2022-01-19 {
+    description
+      "Published as part of IEEE Std 802.1Q-2022.";
+    reference
+      "IEEE Std 802.1Q-2022, Bridges and Bridged Networks.";
+  }
+  revision 2020-11-06 {
+    description
+      "Published as part of IEEE Std 802.1Qcr-2020. Third version.";
+    reference
+      "IEEE Std 802.1Qcr-2020, Bridges and Bridged Networks -
+      Asynchronous Traffic Shaping.";
+  }
+  revision 2020-06-04 {
+    description
+      "Published as part of IEEE Std 802.1Qcx-2020. Second version.";
+    reference
+      "IEEE Std 802.1Qcx-2020, Bridges and Bridged Networks - YANG Data
+      Model for Connectivity Fault Management.";
+  }
+  revision 2018-03-07 {
+    description
+      "Published as part of IEEE Std 802.1Q-2018. Initial version.";
+    reference
+      "IEEE Std 802.1Q-2018, Bridges and Bridged Networks.";
+  }
+  feature ingress-filtering {
+    description
+      "Each Port may support an Enable Ingress Filtering parameter. A
+      frame received on a Port that is not in the member set (8.8.10)
+      associated with the frames VID shall be discarded if this
+      parameter is set. The default value for this parameter is reset,
+      i.e., Disable Ingress Filtering, for all Ports. Any Port that
+      supports setting this parameter shall also support resetting it.
+      The parameter may be configured by the management operations
+      defined in Clause 12.";
+    reference
+      "8.6.2 of IEEE Std 802.1Q-2022";
+  }
+  feature extended-filtering-services {
+    description
+      "Extended Filtering Services support the filtering behavior
+      required for regions of a network in which potential recipients of
+      multicast frames exist, and where both the potential recipients of
+      frames and the Bridges are able to support dynamic configuration
+      of filtering information for group MAC addresses. In order to
+      integrate this extended filtering behavior with the needs of
+      regions of the network that support only Basic Filtering Services,
+      Bridges that support Extended Filtering Services can be statically
+      and dynamically configured to modify their filtering behavior on a
+      per-group MAC address basis, and also on the basis of the overall
+      filtering service provided by each outbound Port with regard to
+      multicast frames. The latter capability permits configuration of
+      the Ports default forwarding or filtering behavior with regard to
+      group MAC addresses for which no specific static or dynamic
+      filtering information has been configured.";
+    reference
+      "8.8.4, Clause 10 of IEEE Std 802.1Q-2022";
+  }
+  feature port-and-protocol-based-vlan {
+    description
+      "A VLAN-aware bridge component implementation in conformance to
+      the provisions of this standard for Port-and-Protocol-based VLAN
+      classification (5.4.1) shall 1) Support one or more of the
+      following Protocol Classifications and Protocol Template formats:
+      Ethernet, RFC_1042, SNAP_8021H, SNAP_Other, or LLC_Other (6.12);
+      and may 2) Support configuration of the contents of the Protocol
+      Group Database.";
+    reference
+      "5.4.1.2 of IEEE Std 802.1Q-2022";
+  }
+  feature flow-filtering {
+    description
+      "Flow filtering support enables Bridges to distinguish frames
+      belonging to different client flows and to use this information in
+      the forwarding process. Information related to client flows may be
+      used at the boundary of an SPT Domain to generate a flow hash
+      value. The flow hash, carried in an F-TAG, serves to distinguish
+      frames belonging to different flows and can be used in the
+      forwarding process to distribute frames over equal cost paths.
+      This provides for finer granularity load spreading while
+      maintaining frame order for each client flow.";
+    reference
+      "44.2 of IEEE Std 802.1Q-2022";
+  }
+  feature simple-bridge-port {
+    description
+      "A simple bridge port allows underlying (MAC) layers to share the
+      same Interface as the Bridge Port.";
+  }
+  feature flexible-bridge-port {
+    description
+      "A flexible bridge port supports an Interface that is a Bridge
+      Port to be a separate Interface from the underlying (MAC) layer.";
+  }
+  identity type-of-bridge {
+    description
+      "Represents the configured Bridge type.";
+  }
+  identity customer-vlan-bridge {
+    base type-of-bridge;
+    description
+      "Base identity for a Customer VLAN Bridge.";
+  }
+  identity provider-bridge {
+    base type-of-bridge;
+    description
+      "Base identity for a Provider Bridge (PB).";
+  }
+  identity provider-edge-bridge {
+    base type-of-bridge;
+    description
+      "Base identity for a Provider Edge Bridge (PEB).";
+  }
+  identity two-port-mac-relay-bridge {
+    base type-of-bridge;
+    description
+      "Base identity for a Two Port MAC Relay (TPMR).";
+  }
+  identity type-of-component {
+    description
+      "Represents the type of Component.";
+  }
+  identity c-vlan-component {
+    base type-of-component;
+    description
+      "Base identity for a C-VLAN component.";
+  }
+  identity s-vlan-component {
+    base type-of-component;
+    description
+      "Base identity for a S-VLAN component.";
+  }
+  identity d-bridge-component {
+    base type-of-component;
+    description
+      "Base identity for a VLAN unaware component.";
+  }
+  identity edge-relay-component {
+    base type-of-component;
+    description
+      "Base identity for an EVB station ER component.";
+  }
+  identity type-of-port {
+    description
+      "Represents the type of Bridge port.";
+  }
+  identity c-vlan-bridge-port {
+    base type-of-port;
+    description
+      "Indicates the port can be a C-TAG aware port of an enterprise
+      VLAN aware Bridge.";
+  }
+  identity provider-network-port {
+    base type-of-port;
+    description
+      "Indicates the port can be an S-TAG aware port of a Provider
+      Bridge or Backbone Edge Bridge used for connections within a PBN
+      (Provider Bridged Network) or PBBN (Provider Backbone Bridged
+      Network).";
+  }
+  identity customer-network-port {
+    base type-of-port;
+    description
+      "Indicates the port can be an S-TAG aware port of a Provider
+      Bridge or Backbone Edge Bridge used for connections to the
+      exterior of a PBN (Provider Bridged Network) or PBBN (Provider
+      Backbone Bridged Network).";
+  }
+  identity customer-edge-port {
+    base type-of-port;
+    description
+      "Indicates the port can be a C-TAG aware port of a Provider Bridge
+      used for connections to the exterior of a PBN (Provider Bridged
+      Network) or PBBN (Provider Backbone Bridged Network).";
+  }
+  identity d-bridge-port {
+    base type-of-port;
+    description
+      "Indicates the port can be a VLAN-unaware member of an 802.1Q
+      Bridge.";
+  }
+  identity remote-customer-access-port {
+    base type-of-port;
+    description
+      "Indicates the port can be an S-TAG aware port of a Provider
+      Bridge capable of providing Remote Customer Service Interfaces.";
+  }
+  identity bridge-interface {
+    description
+      "Generic interface property that represents any interface that can
+      be associated with an IEEE 802.1Q compliant Bridge component. Any
+      new Interface types would derive from this identity to
+      automatically pick up Bridge related configuration or operational
+      data.";
+  }
+  container bridges {
+    description
+      "Contains the Bridge(s) configuration information.";
+    list bridge {
+      key "name";
+      unique "address";
+      description
+        "Provides configuration data in support of the Bridge
+        Configuration resources. There is a single bridge data node per
+        Bridge.";
+      leaf name {
+        type dot1qtypes:name-type;
+        description
+          "A text string associated with the Bridge, of locally
+          determined significance.";
+        reference
+          "12.4 of IEEE Std 802.1Q-2022";
+      }
+      leaf address {
+        type ieee:mac-address;
+        mandatory true;
+        description
+          "The MAC address for the Bridge from which the Bridge
+          Identifiers used by the STP, RSTP, and MSTP are derived.";
+        reference
+          "12.4 of IEEE Std 802.1Q-2022";
+      }
+      leaf bridge-type {
+        type identityref {
+          base type-of-bridge;
+        }
+        mandatory true;
+        description
+          "The type of Bridge.";
+      }
+      leaf ports {
+        type uint16 {
+          range "1..4095";
+        }
+        config false;
+        description
+          "The number of Bridge Ports (MAC Entities)";
+        reference
+          "12.4 of IEEE Std 802.1Q-2022";
+      }
+      leaf up-time {
+        type yang:zero-based-counter32;
+        units "seconds";
+        config false;
+        description
+          "The count in seconds of the time elapsed since the Bridge was
+          last reset or initialized.";
+        reference
+          "12.4 of IEEE Std 802.1Q-2022";
+      }
+      leaf components {
+        type uint32;
+        config false;
+        description
+          "The number of components associated with the Bridge.";
+      }
+      list component {
+        key "name";
+        description
+          "The set of components associated with a given Bridge. For
+          example, - A TPMR is associated with a single VLAN unaware
+          component. - A Customer VLAN Bridge is associated with a
+          single VLAN aware component. - A Provider Bridge is associated
+          with a single S-VLAN component and zero or more C-VLAN
+          components.";
+        reference
+          "Item 1)a in 12.4.1.5 of IEEE Std 802.1Q-2022";
+        leaf name {
+          type string;
+          description
+            "The name of the Component.";
+        }
+        leaf id {
+          type uint32;
+          description
+            "Unique identifier for a particular Bridge component within
+            the system.";
+          reference
+            "Item l) in 12.3 of IEEE Std 802.1Q-2022";
+        }
+        leaf type {
+          type identityref {
+            base type-of-component;
+          }
+          mandatory true;
+          description
+            "The type of component used to classify a particular Bridge
+            component within a Bridge system comprising multiple
+            components.";
+          reference
+            "Item m) in 12.3 of IEEE Std 802.1Q-2022";
+        }
+        leaf address {
+          type ieee:mac-address;
+          description
+            "Unique EUI-48 Universally Administered MAC address assigned
+            to a Bridge component.";
+          reference
+            "13.24, 8.13.8 of IEEE Std 802.1Q-2022";
+        }
+        leaf traffic-class-enabled {
+          type boolean;
+          default "true";
+          description
+            "Indication of Traffic Classes enablement associated with
+            the Bridge Component. A value of True indicates that Traffic
+            Classes are enabled on this Bridge Component. A value of
+            False indicates that the Bridge Component operates with a
+            single priority level for all traffic.";
+          reference
+            "12.4.1.5.1 of IEEE Std 802.1Q-2022";
+        }
+        leaf ports {
+          type uint16 {
+            range "1..4095";
+          }
+          config false;
+          description
+            "The number of Bridge Ports associated with the Bridge
+            Component.";
+          reference
+            "Item c) in 12.4.1.1.3 of IEEE Std 802.1Q-2022";
+        }
+        leaf-list bridge-port {
+          type if:interface-ref;
+          config false;
+          description
+            "List of bridge-port references.";
+        }
+        container capabilities {
+          config false;
+          description
+            "Array of Boolean values of the feature capabilities
+            associated with a given Bridge Component.";
+          reference
+            "Item b) in 12.10.1.1.3, 12.4.1.5.2 of IEEE Std 802.1Q-2022";
+          leaf extended-filtering {
+            type boolean;
+            default "false";
+            description
+              "Can perform filtering on individual multicast addresses
+              controlled by MMRP.";
+            reference
+              "12.4.1.5.2 of IEEE Std 802.1Q-2022";
+          }
+          leaf traffic-classes {
+            type boolean;
+            default "false";
+            description
+              "Can map priority to multiple traffic classes.";
+            reference
+              "12.4.1.5.2 of IEEE Std 802.1Q-2022";
+          }
+          leaf static-entry-individual-port {
+            type boolean;
+            default "false";
+            description
+              "Static entries per port.";
+            reference
+              "12.4.1.5.2 of IEEE Std 802.1Q-2022";
+          }
+          leaf ivl-capable {
+            type boolean;
+            default "true";
+            description
+              "Independent VLAN Learning (IVL).";
+            reference
+              "12.4.1.5.2 of IEEE Std 802.1Q-2022";
+          }
+          leaf svl-capable {
+            type boolean;
+            default "false";
+            description
+              "Shared VLAN Learning (SVL).";
+            reference
+              "12.4.1.5.2 of IEEE Std 802.1Q-2022";
+          }
+          leaf hybrid-capable {
+            type boolean;
+            default "false";
+            description
+              "Both IVL and SVL simultaneously.";
+            reference
+              "12.4.1.5.2 of IEEE Std 802.1Q-2022";
+          }
+          leaf configurable-pvid-tagging {
+            type boolean;
+            default "false";
+            description
+              "Whether the implementation supports the ability to
+              override the default PVID setting and its egress status
+              (VLAN-tagged or Untagged) on each port.";
+            reference
+              "12.4.1.5.2 of IEEE Std 802.1Q-2022";
+          }
+          leaf local-vlan-capable {
+            type boolean;
+            default "false";
+            description
+              "Can support multiple local Bridges, outside the scope of
+              802.1Q defined VLANs.";
+            reference
+              "12.4.1.5.2 of IEEE Std 802.1Q-2022";
+          }
+        }
+        container filtering-database {
+          when
+            "not(derived-from-or-self(../../bridge-type, "+
+            "'two-port-mac-relay-bridge'))" {
+            description
+              "Applies to non TPMRs.";
+          }
+          description
+            "Contains filtering information used by the Forwarding
+            Process in deciding through which Ports of the Bridge frames
+            should be forwarded.";
+          reference
+            "12.7 of IEEE Std 802.1Q-2022";
+          leaf aging-time {
+            type uint32 {
+              range "10..10000000";
+            }
+            units "seconds";
+            default "300";
+            description
+              "The timeout period in seconds for aging out
+              dynamically-learned forwarding information.";
+            reference
+              "12.7, 8.8.3 of IEEE Std 802.1Q-2022";
+          }
+          leaf size {
+            type yang:gauge32;
+            config false;
+            description
+              "The maximum number of entries that can be held in the
+              FDB.";
+            reference
+              "12.7 of IEEE Std 802.1Q-2022";
+          }
+          leaf static-entries {
+            type yang:gauge32;
+            config false;
+            description
+              "The number of Static Filtering entries currently in the
+              FDB.";
+            reference
+              "12.7, 8.8.1 of IEEE Std 802.1Q-2022";
+          }
+          leaf dynamic-entries {
+            type yang:gauge32;
+            config false;
+            description
+              "The number of Dynamic Filtering entries currently in the
+              FDB.";
+            reference
+              "12.7, 8.8.3 of IEEE Std 802.1Q-2022";
+          }
+          leaf static-vlan-registration-entries {
+            type yang:gauge32;
+            config false;
+            description
+              "The number of Static VLAN Registration entries currently
+              in the FDB.";
+            reference
+              "12.7, 8.8.2 of IEEE Std 802.1Q-2022";
+          }
+          leaf dynamic-vlan-registration-entries {
+            type yang:gauge32;
+            config false;
+            description
+              "The number of Dynamic VLAN Registration entries currently
+              in the FDB.";
+            reference
+              "12.7, 8.8.5 of IEEE Std 802.1Q-2022";
+          }
+          leaf mac-address-registration-entries {
+            if-feature "extended-filtering-services";
+            type yang:gauge32;
+            config false;
+            description
+              "The number of MAC Address Registration entries currently
+              in the FDB.";
+            reference
+              "12.7, 8.8.4 of IEEE Std 802.1Q-2022";
+          }
+          list filtering-entry {
+            key "database-id vids address";
+            description
+              "Information for the entries associated with the Permanent
+              Database.";
+            leaf database-id {
+              type uint32;
+              description
+                "The identity of this Filtering Database.";
+              reference
+                "12.7.7 of IEEE Std 802.1Q-2022";
+            }
+            leaf address {
+              type ieee:mac-address;
+              description
+                "A MAC address (unicast, multicast, broadcast) for which
+                the device has forwarding and/or filtering information.";
+              reference
+                "12.7.7 of IEEE Std 802.1Q-2022";
+            }
+            leaf vids {
+              type dot1qtypes:vid-range-type;
+              description
+                "The set of VLAN identifiers to which this entry
+                applies.";
+              reference
+                "12.7.7 of IEEE Std 802.1Q-2022";
+            }
+            leaf entry-type {
+              type enumeration {
+                enum static {
+                  description
+                    "Static entry type";
+                }
+                enum dynamic {
+                  description
+                    "Dynamic/learnt entry type";
+                }
+              }
+              description
+                "The type of filtering entry. Whether static or dynamic.
+                Static entries can be created, deleted, and retrieved.
+                However, dynamic entries can only be deleted or
+                retrieved by the management entity. Consequently, a
+                Bridge is not required to accept a command that can
+                alter the dynamic entries except delete a dynamic entry.";
+              reference
+                "12.7.7 of IEEE Std 802.1Q-2022";
+            }
+            uses dot1qtypes:port-map-grouping;
+            leaf status {
+              type enumeration {
+                enum other {
+                  description
+                    "None of the following. This may include the case
+                    where some other object is being used to determine
+                    if and how frames addressed to the value of the
+                    corresponding instance of 'address' are being
+                    forwarded.";
+                }
+                enum invalid {
+                  description
+                    "This entry is no longer valid (e.g., it was learned
+                    but has since aged out), but has not yet been
+                    flushed from the table.";
+                }
+                enum learned {
+                  description
+                    "The value of the corresponding instance of the port
+                    node was learned and is being used.";
+                }
+                enum self {
+                  description
+                    "The value of the corresponding instance of the
+                    address node representing one of the devices
+                    address.";
+                }
+                enum mgmt {
+                  description
+                    "The value of the corresponding instance of address
+                    node that is also the value of an existing instance.";
+                }
+              }
+              config false;
+              description
+                "The status of this entry.";
+            }
+          }
+          list vlan-registration-entry {
+            key "database-id vids";
+            description
+              "The VLAN Registration Entries models the operations that
+              can be performed on a single VLAN Registration Entry in
+              the FDB. The set of VLAN Registration Entries within the
+              FDB changes under management control and also as a result
+              of MVRP exchanges";
+            reference
+              "12.7.5 of IEEE Std 802.1Q-2022";
+            leaf database-id {
+              type uint32;
+              description
+                "The identity of this Filtering Database.";
+              reference
+                "12.7.7 of IEEE Std 802.1Q-2022";
+            }
+            leaf vids {
+              type dot1qtypes:vid-range-type;
+              description
+                "The set of VLAN identifiers to which this entry
+                applies.";
+              reference
+                "12.7.7 of IEEE Std 802.1Q-2022";
+            }
+            leaf entry-type {
+              type enumeration {
+                enum static {
+                  description
+                    "Static entry type";
+                }
+                enum dynamic {
+                  description
+                    "Dynamic/learnt entry type";
+                }
+              }
+              description
+                "The type of filtering entry. Whether static or dynamic.
+                Static entries can be created, deleted, and retrieved.
+                However, dynamic entries can only be deleted or
+                retrieved by the management entity. Consequently, a
+                Bridge is not required to accept a command that can
+                alter the dynamic entries except delete a dynamic entry.";
+              reference
+                "12.7.7 of IEEE Std 802.1Q-2022";
+            }
+            uses dot1qtypes:port-map-grouping;
+          }
+        }
+        container permanent-database {
+          description
+            "The Permanent Database container models the operations that
+            can be performed on, or affect, the Permanent Database.
+            There is a single Permanent Database per FDB.";
+          leaf size {
+            type yang:gauge32;
+            config false;
+            description
+              "The maximum number of entries that can be held in the
+              FDB.";
+            reference
+              "12.7.6 of IEEE Std 802.1Q-2022";
+          }
+          leaf static-entries {
+            type yang:gauge32;
+            config false;
+            description
+              "The number of Static Filtering entries currently in the
+              FDB.";
+            reference
+              "12.7.6 of IEEE Std 802.1Q-2022";
+          }
+          leaf static-vlan-registration-entries {
+            type yang:gauge32;
+            config false;
+            description
+              "The number of Static VLAN Registration entries currently
+              in the FDB.";
+            reference
+              "12.7.6 of IEEE Std 802.1Q-2022";
+          }
+          list filtering-entry {
+            key "database-id vids address";
+            description
+              "Information for the entries associated with the Permanent
+              Database.";
+            leaf database-id {
+              type uint32;
+              description
+                "The identity of this Filtering Database.";
+              reference
+                "12.7.7 of IEEE Std 802.1Q-2022";
+            }
+            leaf address {
+              type ieee:mac-address;
+              description
+                "A MAC address (unicast, multicast, broadcast) for which
+                the device has forwarding and/or filtering information.";
+              reference
+                "12.7.7 of IEEE Std 802.1Q-2022";
+            }
+            leaf vids {
+              type dot1qtypes:vid-range-type;
+              description
+                "The set of VLAN identifiers to which this entry
+                applies.";
+              reference
+                "12.7.7 of IEEE Std 802.1Q-2022";
+            }
+            leaf status {
+              type enumeration {
+                enum other {
+                  description
+                    "None of the following. This may include the case
+                    where some other object is being used to determine
+                    if and how frames addressed to the value of the
+                    corresponding instance of 'address' are being
+                    forwarded.";
+                }
+                enum invalid {
+                  description
+                    "This entry is no longer valid (e.g., it was learned
+                    but has since aged out), but has not yet been
+                    flushed from the table.";
+                }
+                enum learned {
+                  description
+                    "The value of the corresponding instance of the port
+                    node was learned and is being used.";
+                }
+                enum self {
+                  description
+                    "The value of the corresponding instance of the
+                    address node representing one of the devices
+                    address.";
+                }
+                enum mgmt {
+                  description
+                    "The value of the corresponding instance of address
+                    node that is also the value of an existing instance.";
+                }
+              }
+              config false;
+              description
+                "The status of this entry.";
+            }
+            uses dot1qtypes:port-map-grouping;
+          }
+        }
+        container bridge-vlan {
+          when
+            "not(derived-from-or-self(../../bridge-type, "+
+            "'two-port-mac-relay-bridge'))" {
+            description
+              "Applies to non TPMRs.";
+          }
+          description
+            "The Bridge VLAN container models configuration information
+            that modify, or inquire about, the overall configuration of
+            the Bridges VLAN resources. There is a single Bridge VLAN
+            Configuration managed object per Bridge.";
+          reference
+            "12.10 of IEEE Std 802.1Q-2022";
+          leaf version {
+            type uint16;
+            config false;
+            description
+              "The version number supported.";
+            reference
+              "12.10.1.3 of IEEE Std 802.1Q-2022";
+          }
+          leaf max-vids {
+            type uint16;
+            config false;
+            description
+              "The maximum number of VIDs supported.";
+            reference
+              "12.10.1.3 of IEEE Std 802.1Q-2022";
+          }
+          leaf override-default-pvid {
+            type boolean;
+            default "false";
+            config false;
+            description
+              "Indicates if the default PVID can be overridden, and its
+              egress status (VLAN-tagged or untagged) on each port.";
+            reference
+              "12.10.1.3 of IEEE Std 802.1Q-2022";
+          }
+          leaf protocol-template {
+            if-feature "port-and-protocol-based-vlan";
+            type dot1qtypes:protocol-frame-format-type;
+            config false;
+            description
+              "The data-link encapsulation format or the
+              detagged_frame_type in a Protocol Template";
+            reference
+              "12.10.1.7 of IEEE Std 802.1Q-2022";
+          }
+          leaf max-msti {
+            type uint16;
+            config false;
+            description
+              "The maximum number of MSTIs supported within an MST
+              region (i.e., the number of spanning tree instances that
+              can be supported in addition to the CIST), for MST
+              Bridges. For SST Bridges, this parameter may be either
+              omitted or reported as 0.";
+            reference
+              "12.10.1.7 of IEEE Std 802.1Q-2022";
+          }
+          list vlan {
+            key "vid";
+            description
+              "List of VLAN related configuration nodes associated with
+              the Bridge.";
+            reference
+              "12.10.2 of IEEE Std 802.1Q-2022";
+            leaf vid {
+              type dot1qtypes:vlan-index-type;
+              description
+                "The VLAN identifier to which this entry applies.";
+              reference
+                "12.10.2 of IEEE Std 802.1Q-2022";
+            }
+            leaf name {
+              type dot1qtypes:name-type;
+              description
+                "A text string of up to 32 characters of locally
+                determined significance.";
+              reference
+                "12.10.2 of IEEE Std 802.1Q-2022";
+            }
+            leaf-list untagged-ports {
+              type if:interface-ref;
+              config false;
+              description
+                "The set of ports in the untagged set for this VID.";
+              reference
+                "12.10.2.1.3, 8.8.2 of IEEE Std 802.1Q-2022";
+            }
+            leaf-list egress-ports {
+              type if:interface-ref;
+              config false;
+              description
+                "The set of egress ports in the member set for this VID.";
+              reference
+                "12.10.2.1.3, 8.8.10 of IEEE Std 802.1Q-2022";
+            }
+          }
+          list protocol-group-database {
+            if-feature "port-and-protocol-based-vlan";
+            key "db-index";
+            description
+              "List of the protocol group database entries.";
+            reference
+              "12.10.1.7, 6.12.3 of IEEE Std 802.1Q-2022";
+            leaf db-index {
+              type uint16;
+              description
+                "The protocol group database index.";
+            }
+            leaf frame-format-type {
+              type dot1qtypes:protocol-frame-format-type;
+              description
+                "The data-link encapsulation format or the
+                detagged_frame_type in a Protocol Template";
+              reference
+                "12.10.1.7 of IEEE Std 802.1Q-2022";
+            }
+            choice frame-format {
+              description
+                "The identification of the protocol above the data-link
+                layer in a Protocol Template. Depending on the frame
+                type, the octet string will have one of the following
+                values: - For ethernet, rfc1042 and snap8021H, this is
+                the 16-bit (2-octet) IEEE 802 Clause 9.3 EtherType
+                field. - For snapOther, this is the 40-bit (5-octet)
+                PID. - For llcOther, this is the 2-octet IEEE 802.2 Link
+                Service Access Point (LSAP) pair: first octet for
+                Destination Service Access Point (DSAP) and second octet
+                for Source Service Access Point (SSAP).";
+              reference
+                "12.10.1.7 of IEEE Std 802.1Q-2022";
+              case ethernet-rfc1042-snap8021H {
+                when
+                  "frame-format-type = 'Ethernet' or "+
+                  "frame-format-type = 'rfc1042' or frame-format-type "+
+                  "= 'snap8021H'" {
+                  description
+                    "Applies to Ethernet, RFC 1042, SNAP 8021H frame
+                    formats.";
+                }
+                description
+                  "Identifier used if Ethenet, RFC1042, or SNAP 8021H.";
+                leaf ethertype {
+                  type dot1qtypes:ethertype-type;
+                  description
+                    "Format containing the 16-bit IEEE 802 EtherType
+                    field.";
+                  reference
+                    "9.3 of IEEE Std 802-2014";
+                }
+              }
+              case snap-other {
+                when
+                  "frame-format-type = 'snapOther'" {
+                  description
+                    "Applies to Snap Other frame formats.";
+                }
+                description
+                  "Identifier used if SNAP other.";
+                leaf protocol-id {
+                  type string {
+                    pattern "[0-9a-fA-F]{2}(-[0-9a-fA-F]{2}){4}";
+                  }
+                  description
+                    "Format containing the 40-bit protocol identifier
+                    (PID). The canonical representation uses uppercase
+                    characters.";
+                  reference
+                    "12.10.1.7.1 of IEEE Std 802.1Q-2022";
+                }
+              }
+              case llc-other {
+                when
+                  "frame-format-type = 'llcOther'" {
+                  description
+                    "Applies to LLC Other frame formats";
+                }
+                description
+                  "Identifier used if LLC other.";
+                container dsap-ssap-pairs {
+                  description
+                    "A pair of ISO/IEC 8802-2 DSAP and SSAP address
+                    field values, for matching frame formats of
+                    LLC_Other.";
+                  leaf llc-address {
+                    type string {
+                      pattern "[0-9a-fA-F]{2}-[0-9a-fA-F]{2}";
+                    }
+                    description
+                      "A pair of ISO/IEC 8802-2 DSAP and SSAP address
+                      field values, for matching frame formats of
+                      LLC_Other. The canonical representation uses
+                      uppercase characters.";
+                    reference
+                      "12.10.1.7.1 of IEEE Std 802.1Q-2022";
+                  }
+                }
+              }
+            }
+            leaf group-id {
+              type uint32;
+              description
+                "Designates a group of protocols in the Protocol Group
+                Database.";
+              reference
+                "6.12.2 of IEEE Std 802.1Q-2022";
+            }
+          }
+          list vid-to-fid-allocation {
+            key "vids";
+            description
+              "This list allows inquiries about VID to FID allocations.";
+            leaf vids {
+              type dot1qtypes:vid-range-type;
+              description
+                "Range of VLAN identifiers.";
+              reference
+                "12.10.3 of IEEE Std 802.1Q-2022";
+            }
+            leaf fid {
+              type uint32;
+              config false;
+              description
+                "The Filtering Database used by a set of VIDs.";
+              reference
+                "12.10.3 of IEEE Std 802.1Q-2022";
+            }
+            leaf allocation-type {
+              type enumeration {
+                enum undefined {
+                  description
+                    "No allocation defined.";
+                }
+                enum fixed {
+                  description
+                    "A fixed allocation to FID is defined.";
+                }
+                enum dynamic {
+                  description
+                    "A dynamic allocation to FID is defined.";
+                }
+              }
+              config false;
+              description
+                "The type of allocation used";
+              reference
+                "12.10.3 of IEEE Std 802.1Q-2022";
+            }
+          }
+          list fid-to-vid-allocation {
+            key "fid";
+            description
+              "The FID to VID allocations managed object models
+              operations that inquire about FID to VID allocations.";
+            leaf fid {
+              type uint32;
+              description
+                "The Filtering Database used by a set of VIDs.";
+              reference
+                "12.10.3 of IEEE Std 802.1Q-2022";
+            }
+            leaf allocation-type {
+              type enumeration {
+                enum undefined {
+                  description
+                    "No allocation defined.";
+                }
+                enum fixed {
+                  description
+                    "A fixed allocation to FID is defined.";
+                }
+                enum dynamic {
+                  description
+                    "A dynamic allocation to FID is defined.";
+                }
+              }
+              config false;
+              description
+                "The type of allocation used";
+              reference
+                "12.10.3 of IEEE Std 802.1Q-2022";
+            }
+            leaf-list vid {
+              type dot1qtypes:vlan-index-type;
+              config false;
+              description
+                "The VLAN identifier to which this entry applies.";
+              reference
+                "12.7.7 of IEEE Std 802.1Q-2022";
+            }
+          }
+          list vid-to-fid {
+            key "vid";
+            description
+              "Fixed allocation of a VID to an FID. The underlying
+              system will ensure that subsequent commands that make
+              changes to the VID to FID mapping can override previous
+              associations.";
+            reference
+              "12.10.3.4, 12.10.3.5 of IEEE Std 802.1Q-2022";
+            leaf vid {
+              type dot1qtypes:vlan-index-type;
+              description
+                "A list of VLAN identifier associated with a given
+                database identifier (i.e., FID).";
+              reference
+                "12.7.7 of IEEE Std 802.1Q-2022";
+            }
+            leaf fid {
+              type uint32;
+              description
+                "The Filtering Database used by this VLAN";
+              reference
+                "12.10.3 of IEEE Std 802.1Q-2022";
+            }
+          }
+        }
+        container bridge-mst {
+          when
+            "not(derived-from-or-self(../../bridge-type, "+
+            "'two-port-mac-relay-bridge'))" {
+            description
+              "Applies to non TPMRs.";
+          }
+          description
+            "The Bridge MST container models configuration information
+            that modify, or inquire about, the overall configuration of
+            the Bridges MST resources.";
+          reference
+            "12.12 of IEEE Std 802.1Q-2022";
+          leaf-list mstid {
+            type dot1qtypes:mstid-type;
+            description
+              "The list of MSTID values that are currently supported by
+              the Bridge";
+          }
+          list fid-to-mstid {
+            key "fid";
+            description
+              "The FID to MSTID allocation table.";
+            reference
+              "12.12.2 of IEEE Std 802.1Q-2022";
+            leaf fid {
+              type uint32;
+              description
+                "The Filtering Database identifier.";
+              reference
+                "12.12.2 of IEEE Std 802.1Q-2022";
+            }
+            leaf mstid {
+              type dot1qtypes:mstid-type;
+              description
+                "The MSTID to which the FID is to be allocated.";
+              reference
+                "12.12.2 of IEEE Std 802.1Q-2022";
+            }
+          }
+          list fid-to-mstid-allocation {
+            key "fids";
+            description
+              "The FID to MSTID allocation table";
+            leaf fids {
+              type dot1qtypes:vid-range-type;
+              description
+                "Range of FIDs.";
+              reference
+                "12.12.2 of IEEE Std 802.1Q-2022";
+            }
+            leaf mstid {
+              type dot1qtypes:mstid-type;
+              description
+                "The MSTID to which the FID is allocated.";
+              reference
+                "12.12.2 of IEEE Std 802.1Q-2022";
+            }
+          }
+        }
+      }
+    }
+  }
+  augment "/if:interfaces/if:interface" {
+    when
+      "derived-from-or-self(if:type,'ianaif:bridge') or "+
+      "derived-from-or-self(if:type,'ianaif:ethernetCsmacd') or "+
+      "derived-from-or-self(if:type,'ianaif:ieee8023adLag') or "+
+      "derived-from-or-self(if:type,'ianaif:ilan')" {
+      description
+        "Applies when a Bridge interface.";
+    }
+    description
+      "Augment the interface model with the Bridge Port";
+    container bridge-port {
+      description
+        "Bridge Port is an extension of the IETF Interfaces model
+        (RFC7223).";
+      leaf bridge-name {
+        type leafref {
+          path "/dot1q:bridges/dot1q:bridge/dot1q:name";
+        }
+        // mandatory true; yang 1.1 only
+        description
+          "Used to reference configured Bridge node.";
+      }  
+      leaf component-name {
+        type leafref {
+          path "/dot1q:bridges/dot1q:bridge[dot1q:name=current()/../bridge-name]/dot1q:component/dot1q:name";
+        }
+        // mandatory true; yang 1.1 only
+        description
+          "Used to reference configured Component node.";
+      }
+      leaf port-type {
+        type identityref {
+          base type-of-port;
+        }
+        description
+          "The port type. Indicates the capabilities of this port.";
+        reference
+          "12.4.2.1 of IEEE Std 802.1Q-2022";
+      }
+      leaf pvid {
+        when "/dot1q:bridges/dot1q:bridge[dot1q:name=current()"+
+          "/../dot1q:bridge-name]/dot1q:component[name=current()"+
+          "/../dot1q:component-name]/dot1q:type != 'dot1q:d-bridge-component'" {  
+          description
+            "Applies to non TPMRs";
+        }
+        type dot1qtypes:vlan-index-type;
+        default "1";
+        description
+          "The primary (default) VID assigned to a specific Bridge Port.";
+        reference
+          "12.10.1, 5.4, item m) of IEEE Std 802.1Q-2022";
+      }
+      leaf default-priority {
+        type dot1qtypes:priority-type;
+        default "0";
+        description
+          "The default priority assigned to a specific Bridge Port.";
+        reference
+          "12.6.2 of IEEE Std 802.1Q-2022";
+      }
+      container priority-regeneration {
+        description
+          "The Priority Regeneration Table parameters associated with a
+          specific Bridge Port. A list of Regenerated User Priorities
+          for each received priority on each port of a Bridge. The
+          regenerated priority value may be used to index the Traffic
+          Class Table for each input port. This only has effect on media
+          that support native priority. The default values for
+          Regenerated User Priorities are the same as the User
+          Priorities";
+        reference
+          "12.6.2, 6.9.4 of IEEE Std 802.1Q-2022";
+        uses dot1qtypes:priority-regeneration-table-grouping;
+      }
+      leaf pcp-selection {
+        type dot1qtypes:pcp-selection-type;
+        default "8P0D";
+        description
+          "The Priority Code Point selection assigned to a specific
+          Bridge Port. This object identifies the rows in the PCP
+          encoding and decoding tables that are used to remark frames on
+          this port if this remarking is enabled";
+        reference
+          "12.6.2, 6.9.3 of IEEE Std 802.1Q-2022";
+      }
+      container pcp-decoding-table {
+        description
+          "The Priority Code Point Decoding Table parameters associated
+          with a specific Bridge Port.";
+        uses dot1qtypes:pcp-decoding-table-grouping;
+      }
+      container pcp-encoding-table {
+        description
+          "The Priority Code Point Encoding Table parameters associated
+          with a specific Bridge Port.";
+        uses dot1qtypes:pcp-encoding-table-grouping;
+      }
+      leaf use-dei {
+        type boolean;
+        default "false";
+        description
+          "The Drop Eligible Indicator. If it is set to True, then the
+          drop_eligible parameter is encoded in the DEI of transmitted
+          frames, and the drop_eligible parameter shall be true(1) for a
+          received frame if the DEI is set in the VLAN tag or the
+          Priority Code Point Decoding Table indicates drop_eligible
+          True for the received PCP value. If this parameter is False,
+          the DEI shall be transmitted as zero and ignored on receipt.";
+        reference
+          "12.6.2, 6.9.3 of IEEE Std 802.1Q-2022";
+      }
+      leaf drop-encoding {
+        type boolean;
+        default "false";
+        description
+          "The Drop Encoding parameter. If a Bridge supports encoding or
+          decoding of drop_eligible from the PCP field of a VLAN tag
+          (6.7.3) on any of its Ports, then it shall implement a Boolean
+          parameter Require Drop Encoding on each of its Ports with
+          default value False. If Require Drop Encoding is True and the
+          Bridge Port cannot encode particular priorities with
+          drop_eligible, then frames queued with those priorities and
+          drop_eligible True shall be discarded and not transmitted.";
+        reference
+          "12.6.2, 6.9.3 of IEEE Std 802.1Q-2022";
+      }
+      leaf service-access-priority-selection {
+        type boolean;
+        default "false";
+        description
+          "The Service Access Priority selection. Indication of whether
+          the Service Access Priority Selection function is supported on
+          the Customer Bridge Port to request priority handling of the
+          frame from a Port-based service interface.";
+        reference
+          "12.6.2, 6.13 of IEEE Std 802.1Q-2022";
+      }
+      container service-access-priority {
+        description
+          "The Service Access Priority table parameters. A table that
+          contains information about the Service Access Priority
+          Selection function for a Provider Bridge. The use of this
+          table enables a mechanism for a Customer Bridge attached to a
+          Provider Bridged Network to request priority handling of
+          frames.";
+        reference
+          "12.6.2, 6.13.1 of IEEE Std 802.1Q-2022";
+        uses dot1qtypes:service-access-priority-table-grouping;
+      }
+      container traffic-class {
+        description
+          "The Traffic Class table parameters. A table mapping evaluated
+          priority to Traffic Class, for forwarding by the Bridge";
+        reference
+          "12.6.3, 8.6.6 of IEEE Std 802.1Q-2022";
+        uses dot1qtypes:traffic-class-table-grouping;
+      }
+      container transmission-selection-algorithm-table {
+        description
+          "The Transmission Selection Algorithm Table for a given Port
+          assigns, for each traffic class that the Port supports, the
+          transmission selection algorithm that is to be used to select
+          frames for transmission from the corresponding queue.
+          Transmission Selection Algorithm Tables may be managed, and
+          allow the identification of vendor-specific transmission
+          selection algorithms. The transmission selection algorithms
+          are identified in the Transmission Selection Algorithm Table
+          by means of integer identifiers.";
+        reference
+          "12.20.2, 8.6.8 of IEEE Std 802.1Q-2022";
+        uses dot1qtypes:transmission-selection-table-grouping;
+      }
+      leaf acceptable-frame {
+        when "/dot1q:bridges/dot1q:bridge[dot1q:name=current()"+
+          "/../dot1q:bridge-name]/dot1q:component[name=current()"+
+          "/../dot1q:component-name]/dot1q:type != 'dot1q:d-bridge-component'" {  
+          description
+            "Applies to non TPMRs";
+        }
+        type enumeration {
+          enum admit-only-VLAN-tagged-frames {
+            description
+              "Admit only VLAN-tagged frames.";
+          }
+          enum admit-only-untagged-and-priority-tagged {
+            description
+              "Admit only untagged and priority-tagged frames.";
+          }
+          enum admit-all-frames {
+            description
+              "Admit all frames.";
+          }
+        }
+        default "admit-all-frames";
+        description
+          "To configure the Acceptable Frame Types parameter associated
+          with one or more Ports";
+        reference
+          "12.10.1.3, 6.9 of IEEE Std 802.1Q-2022";
+      }
+      leaf enable-ingress-filtering {
+        when "/dot1q:bridges/dot1q:bridge[dot1q:name=current()"+
+          "/../dot1q:bridge-name]/dot1q:component[name=current()"+
+          "/../dot1q:component-name]/dot1q:type != 'dot1q:d-bridge-component'" {  
+          description
+            "Applies to non TPMRs";
+        }
+        type boolean;
+        default "false";
+        description
+          "To enable the Ingress Filtering feature associated with one
+          or more Ports.";
+        reference
+          "12.10.1.4, 8.6.2 of IEEE Std 802.1Q-2022";
+      }
+      leaf enable-restricted-vlan-registration {
+        when "/dot1q:bridges/dot1q:bridge[dot1q:name=current()"+
+          "/../dot1q:bridge-name]/dot1q:component[name=current()"+
+          "/../dot1q:component-name]/dot1q:type != 'dot1q:d-bridge-component'" {  
+          description
+            "Applies to non TPMRs";
+        }
+        type boolean;
+        default "false";
+        description
+          "To enable the Restricted VLAN Registration associated with
+          one or more Ports.";
+        reference
+          "11.2.3.2.3, 12.10.1.6 of IEEE Std 802.1Q-2022";
+      }
+      leaf enable-vid-translation-table {
+        when "/dot1q:bridges/dot1q:bridge[dot1q:name=current()"+
+          "/../dot1q:bridge-name]/dot1q:component[name=current()"+
+          "/../dot1q:component-name]/dot1q:type != 'dot1q:d-bridge-component'" {  
+          description
+            "Applies to non TPMRs";
+        }
+        type boolean;
+        default "false";
+        description
+          "To enable VID Translation table associated with a Bridge
+          Port. This is not applicable to Bridge Ports that do no
+          support a VID Translation Table.";
+        reference
+          "12.10.1.8, 6.9 of IEEE Std 802.1Q-2022";
+      }
+      leaf enable-egress-vid-translation-table {
+        when "/dot1q:bridges/dot1q:bridge[dot1q:name=current()"+
+          "/../dot1q:bridge-name]/dot1q:component[name=current()"+
+          "/../dot1q:component-name]/dot1q:type != 'dot1q:d-bridge-component'" {  
+          description
+            "Applies to non TPMRs";
+        }
+        type boolean;
+        default "false";
+        description
+          "To enable Egress VID Translation table associated with a
+          Bridge Port. This is not applicable to Ports that do not
+          support an Egress VID Translation table.";
+        reference
+          "12.10.1.8, 6.9 of IEEE Std 802.1Q-2022";
+      }
+      list protocol-group-vid-set {
+        when "/dot1q:bridges/dot1q:bridge[dot1q:name=current()"+
+          "/../dot1q:bridge-name]/dot1q:component[name=current()"+
+          "/../dot1q:component-name]/dot1q:type != 'dot1q:d-bridge-component'" {  
+          description
+            "Applies to non TPMRs";
+        }
+        if-feature "port-and-protocol-based-vlan";
+        key "group-id";
+        description
+          "The list of VID values associated with the Protocol Group
+          Identifier for this port.";
+        reference
+          "12.10.1.1.3 of IEEE Std 802.1Q-2022";
+        leaf group-id {
+          type uint32;
+          description
+            "The protocol group identifier";
+          reference
+            "12.10.1.7 of IEEE Std 802.1Q-2022";
+        }
+        leaf-list vid {
+          type dot1qtypes:vlanid;
+          description
+            "The VLAN identifier to which this entry applies.";
+          reference
+            "12.10.2 of IEEE Std 802.1Q-2022";
+        }
+      }
+      leaf admin-point-to-point {
+        type enumeration {
+          enum force-true {
+            value 1;
+            description
+              "Indicates that this port should always be treated as if
+              it is connected to a point-to-point link.";
+          }
+          enum force-false {
+            value 2;
+            description
+              "Indicates that this port should be treated as having a
+              shared media connection.";
+          }
+          enum auto {
+            value 3;
+            description
+              "Indicates that this port is considered to have a
+              point-to-point link if it is an Aggregator and all of its
+              members are aggregatable, or if the MAC entity is
+              configured for full duplex operation, either through
+              auto-negotiation or by management means.";
+          }
+        }
+        description
+          "For a port running spanning tree, this object represents the
+          administrative point-to-point status of the LAN segment
+          attached to this port, using the enumeration values of IEEE
+          Std 802.1AC. A value of forceTrue(1) indicates that this port
+          should always be treated as if it is connected to a
+          point-to-point link. A value of forceFalse(2) indicates that
+          this port should be treated as having a shared media
+          connection. A value of auto(3) indicates that this port is
+          considered to have a point-to-point link if it is an
+          Aggregator and all of its members are aggregatable, or if the
+          MAC entity is configured for full duplex operation, either
+          through auto-negotiation or by management means. Manipulating
+          this object changes the underlying adminPointToPointMAC.";
+        reference
+          "12.4.2, 6.8.2 of IEEE Std 802.1Q-2022";
+      }
+      leaf protocol-based-vlan-classification {
+        when "/dot1q:bridges/dot1q:bridge[dot1q:name=current()"+
+          "/../dot1q:bridge-name]/dot1q:component[name=current()"+
+          "/../dot1q:component-name]/dot1q:type != 'dot1q:d-bridge-component'" {  
+          description
+            "Applies to non TPMRs";
+        }
+        if-feature "port-and-protocol-based-vlan";
+        type boolean;
+        config false;
+        description
+          "A boolean indication indicating if Port-and-Protocol-based
+          VLAN classification is supported on a given Port.";
+        reference
+          "5.4.1.2 of IEEE Std 802.1Q-2022";
+      }
+      leaf max-vid-set-entries {
+        when "/dot1q:bridges/dot1q:bridge[dot1q:name=current()"+
+          "/../dot1q:bridge-name]/dot1q:component[name=current()"+
+          "/../dot1q:component-name]/dot1q:type != 'dot1q:d-bridge-component'" {  
+          description
+            "Applies to non TPMRs";
+        }
+        if-feature "port-and-protocol-based-vlan";
+        type uint16;
+        config false;
+        description
+          "The maximum number of entries supported in the VID set on a
+          given Port.";
+        reference
+          "12.10.1.1.3 of IEEE Std 802.1Q-2022";
+      }
+      leaf port-number {
+        type dot1qtypes:port-number-type;
+        config false;
+        description
+          "An integer that uniquely identifies a Bridge Port.";
+        reference
+          "Item i) in 12.3, 17.3.2.2 of IEEE Std 802.1Q-2022";
+      }
+      leaf address {
+        type ieee:mac-address;
+        config false;
+        description
+          "The specific MAC address of the individual MAC Entity
+          associated with the Port.";
+        reference
+          "12.4.2, Item a) in 12.4.2.1.1.3 of IEEE Std 802.1Q-2022";
+      }
+      leaf capabilities {
+        type bits {
+          bit tagging {
+            position 0;
+            description
+              "Supports 802.1Q VLAN tagging of frames and MVRP.";
+          }
+          bit configurable-acceptable-frame-type {
+            position 1;
+            description
+              "Allows modified values of acceptable frame types";
+          }
+          bit ingress-filtering {
+            position 2;
+            description
+              "Supports the discarding of any frame received on a Port
+              whose VLAN classification does not include that Port in
+              its member set.";
+          }
+        }
+        config false;
+        description
+          "The feature capabilities associated with port. Indicates the
+          parts of IEEE 802.1Q that are optional on a per-port basis,
+          that are implemented by this device, and that are manageable.";
+        reference
+          "Item c) in 12.10.1.1.3, 12.4.2 of IEEE Std 802.1Q-2022";
+      }
+      leaf type-capabilties {
+        type bits {
+          bit customer-vlan-port {
+            position 0;
+            description
+              "Indicates the port can be a C-TAG aware port of an
+              enterprise VLAN aware Bridge";
+          }
+          bit provider-network-port {
+            position 1;
+            description
+              "Indicates the port can be an S-TAG aware port of a
+              Provider Bridge or Backbone Edge Bridge used for
+              connections within a PBN or PBBN.";
+          }
+          bit customer-network-port {
+            position 2;
+            description
+              "Indicates the port can be an S-TAG aware port of a
+              Provider Bridge or Backbone Edge Bridge used for
+              connections to the exterior of a PBN or PBBN.";
+          }
+          bit customer-edge-port {
+            position 3;
+            description
+              "Indicates the port can be a C-TAG aware port of a
+              Provider Bridge used for connections to the exterior of a
+              PBN or PBBN.";
+          }
+          bit customer-backbone-port {
+            position 4;
+            description
+              "Indicates the port can be a I-TAG aware port of a
+              Backbone Edge Bridge's B-component.";
+          }
+          bit virtual-instance-port {
+            position 5;
+            description
+              "Indicates the port can be a virtual S-TAG aware port
+              within a Backbone Edge Bridge's I-component which is
+              responsible for handling S-tagged traffic for a specific
+              backbone service instance.";
+          }
+          bit d-bridge-port {
+            position 6;
+            description
+              "Indicates the port can be a VLAN-unaware member of an
+              802.1Q Bridge.";
+          }
+          bit remote-customer-access-port {
+            position 7;
+            description
+              "Indicates the port can be an S-TAG aware port of a
+              Provider Bridge capable of providing Remote Customer
+              Service Interfaces.";
+          }
+          bit station-facing-bridge-port {
+            position 8;
+            description
+              "Indicates the station-facing Bridge Port in a EVB Bridge.";
+          }
+          bit uplink-access-port {
+            position 9;
+            description
+              "Indicates the uplink access port in an EVB Bridge or EVB
+              station.";
+          }
+          bit uplink-relay-port {
+            position 10;
+            description
+              "Indicates the uplink relay port in an EVB station.";
+          }
+        }
+        config false;
+        description
+          "The type of feature capabilities supported with port.
+          Indicates the capabilities of this port.";
+        reference
+          "12.4.2 of IEEE Std 802.1Q-2022";
+      }
+      leaf external {
+        type boolean;
+        config false;
+        description
+          "A boolean indicating whether the port is external. A value of
+          True means the port is external. A value of False means the
+          port is internal.";
+        reference
+          "12.4.2 of IEEE Std 802.1Q-2022";
+      }
+      leaf oper-point-to-point {
+        type boolean;
+        config false;
+        description
+          "For a port running spanning tree, this object represents the
+          operational point-to-point status of the LAN segment attached
+          to this port. It indicates whether a port is considered to
+          have a point-to-point connection.
+          
+          If admin-point-to-point is set to auto(2), then the value of
+          oper-point-to-point is determined in accordance with the
+          specific procedures defined for the MAC entity concerned, as
+          defined in IEEE Std 802.1AC.
+          
+          The value is determined dynamically; that is, it is
+          re-evaluated whenever the value of admin-point-to-point
+          changes, and whenever the specific procedures defined for the
+          MAC entity evaluate a change in its point-to-point status.";
+        reference
+          "IEEE Std 802.1AC;" +
+          "12.4.2 of IEEE Std 802.1Q-2022";
+      }
+      leaf media-dependent-overhead {
+        type uint8;
+        units "octets";
+        config false;
+        description
+          "The portMediaDependentOverhead parameter provides the number
+          of additional octets for media-dependent framing. The overhead
+          includes all octets prior the first octet of the Destination
+          Address field and all octets after the last octet of the frame
+          check sequence.";
+        reference
+          "12.4.2 of IEEE Std 802.1Q-2022";
+      }
+      container statistics {
+        config false;
+        description
+          "Container of operational state node information associated
+          with the bridge port.";
+        uses dot1qtypes:bridge-port-statistics-grouping;
+        leaf discard-on-ingress-filtering {
+          when "/dot1q:bridges/dot1q:bridge[dot1q:name=current()"+
+            "/../../dot1q:bridge-name]/dot1q:component[name=current()"+
+            "/../../dot1q:component-name]/dot1q:type != 'dot1q:d-bridge-component'" {  
+            description
+              "Applies to non TPMRs";
+          }
+          if-feature "ingress-filtering";
+          type yang:counter64;
+          description
+            "The number of frames that were discarded as a result of
+            Ingress Filtering being enabled.
+            
+            Discontinuities in the value of this counter can occur at
+            re-initialization of the management system, and at other
+            times as indicated by the value of 'discontinuity-time'.";
+          reference
+            "12.6.1.1.3 of IEEE Std 802.1Q-2022";
+        }
+      }
+      list vid-translations {
+        when "/dot1q:bridges/dot1q:bridge[dot1q:name=current()"+
+          "/../dot1q:bridge-name]/dot1q:component[name=current()"+
+          "/../dot1q:component-name]/dot1q:type != 'dot1q:d-bridge-component'" {  
+          description
+            "Applies to non TPMRs";
+        }
+        key "local-vid";
+        description
+          "To configure the VID Translation Table (6.9) associated with
+          a Port. This object is not applicable to Ports that do not
+          support a VID Translation Table. The default configuration of
+          the table has the value of the Relay VID equal to the value of
+          the Local VID. If no local VID is configured, then it is
+          assumed that the relay VID is the same value as the local VID.
+          
+          If the port supports an Egress VID translation table, the VID
+          Translation Configuration object configures the Local VID to
+          Relay VID mapping on ingress only. If an Egress VID
+          translation is not supported, the VID Translation
+          Configuration object defines a single bidirectional mapping.
+          In this case, the Bridge should not allow multiple keys
+          ('local-vid') mapped to the same 'relay-vid' value.";
+        leaf local-vid {
+          type dot1qtypes:vlanid;
+          description
+            "The Local VID after translation received at the ISS or
+            EISS.";
+          reference
+            "12.10.1.8, 6.9 of IEEE Std 802.1Q-2022";
+        }
+        leaf relay-vid {
+          type dot1qtypes:vlanid;
+          description
+            "The Relay VID received before translation received at ISS
+            or EISS.";
+          reference
+            "12.10.1.8, 6.9 of IEEE Std 802.1Q-2022";
+        }
+      }
+      list egress-vid-translations {
+        when "/dot1q:bridges/dot1q:bridge[dot1q:name=current()"+
+          "/../dot1q:bridge-name]/dot1q:component[name=current()"+
+          "/../dot1q:component-name]/dot1q:type != 'dot1q:d-bridge-component'" {  
+          description
+            "Applies to non TPMRs";
+        }
+        key "relay-vid";
+        description
+          "To configure the Egress VID Translation Table (6.9)
+          associated with a Port. This object is not applicable to Ports
+          that do not support an Egress VID Translation Table. The
+          default configuration of the table has the value of the Local
+          VID equal to the value of the Relay VID. If no Relay VID is
+          configured, then it is assumed that the local VID is the same
+          value as the relay VID.";
+        leaf relay-vid {
+          type dot1qtypes:vlanid;
+          description
+            "The Relay VID received before translation received at ISS
+            or EISS.";
+          reference
+            "12.10.1.9, 6.9 of IEEE Std 802.1Q-2022";
+        }
+        leaf local-vid {
+          type dot1qtypes:vlanid;
+          description
+            "The Local VID after translation received at the ISS or
+            EISS.";
+          reference
+            "12.10.1.9, 6.9 of IEEE Std 802.1Q-2022";
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/mwt/ieee802-dot1q-bridge.yang-generated.tdltx b/plugins/org.etsi.mts.tdl.yang2tdl/samples/mwt/ieee802-dot1q-bridge.yang-generated.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..8e80b62f95a5bf5cd4d667e9e235711237aeb236
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/mwt/ieee802-dot1q-bridge.yang-generated.tdltx
@@ -0,0 +1,467 @@
+Package generated_from_ieee802_dot1q_bridge_yang {
+    Type String
+    Type TODO_RESOLVE_REFERENCED
+    Use "ieee802-dot1q-bridge.yang" as SOURCE_MAPPING
+    Structure bridge (
+        name_type ^name,
+        mac_address address,
+        identityref bridge_type,
+        uint16 ports,
+        up_time up_time,
+        uint32 components,
+        bridge___component_collection ^component
+    )
+    Type name_type extends string
+    Type string extends string
+    Type mac_address extends string
+    Type identityref
+    Type uint16 extends uint16
+    Type up_time extends zero_based_counter32
+    Type zero_based_counter32
+    Type uint32
+    Structure bridge___component (
+        string ^name,
+        uint32 id,
+        identityref ^type,
+        mac_address address,
+        traffic_class_enabled traffic_class_enabled,
+        uint16 ports,
+        @LeafRefPath : "/if:interfaces/if:interface/if:name"
+        interface_ref_collection bridge_port,
+        component___capabilities capabilities,
+        component___filtering_database filtering_database,
+        component___permanent_database permanent_database,
+        component___bridge_vlan bridge_vlan,
+        component___bridge_mst bridge_mst
+    )
+    Type traffic_class_enabled extends boolean
+    Type boolean
+    Type interface_ref extends leafref
+    Type leafref
+    Collection interface_ref_collection of interface_ref
+    Annotation LeafRefPath
+    Structure component___capabilities (
+        extended_filtering extended_filtering,
+        traffic_classes traffic_classes,
+        static_entry_individual_port static_entry_individual_port,
+        ivl_capable ivl_capable,
+        svl_capable svl_capable,
+        hybrid_capable hybrid_capable,
+        configurable_pvid_tagging configurable_pvid_tagging,
+        local_vlan_capable local_vlan_capable
+    )
+    Type extended_filtering extends boolean
+    Type traffic_classes extends boolean
+    Type static_entry_individual_port extends boolean
+    Type ivl_capable extends boolean
+    Type svl_capable extends boolean
+    Type hybrid_capable extends boolean
+    Type configurable_pvid_tagging extends boolean
+    Type local_vlan_capable extends boolean
+    Structure component___filtering_database (
+        aging_time aging_time,
+        gauge32 ^size,
+        gauge32 static_entries,
+        gauge32 dynamic_entries,
+        gauge32 static_vlan_registration_entries,
+        gauge32 dynamic_vlan_registration_entries,
+        gauge32 mac_address_registration_entries,
+        filtering_database___filtering_entry_collection filtering_entry,
+        filtering_database___vlan_registration_entry_collection vlan_registration_entry
+    )
+    Type aging_time extends uint32
+    Type gauge32 extends uint32
+    Structure filtering_database___filtering_entry (
+        uint32 database_id,
+        mac_address address,
+        vid_range_type vids,
+        enumeration entry_type,
+        filtering_entry___port_map_collection port_map,
+        enumeration status
+    )
+    Type vid_range_type extends string
+    Type enumeration
+    Structure filtering_entry___port_map (
+        port_number_type port_ref,
+        port_map___map_type map_type
+    )
+    Type port_number_type extends uint32
+    Structure port_map___map_type (
+        map_type___static_filtering_entries static_filtering_entries,
+        map_type___static_vlan_registration_entries static_vlan_registration_entries,
+        map_type___mac_address_registration_entries mac_address_registration_entries,
+        map_type___dynamic_vlan_registration_entries dynamic_vlan_registration_entries,
+        map_type___dynamic_reservation_entries dynamic_reservation_entries,
+        map_type___dynamic_filtering_entries dynamic_filtering_entries
+    )
+    Structure map_type___static_filtering_entries (
+        static_filtering_entries___static_filtering_entries static_filtering_entries
+    )
+    Structure static_filtering_entries___static_filtering_entries (
+        enumeration control_element,
+        port_number_type connection_identifier
+    )
+    Structure map_type___static_vlan_registration_entries (
+        static_vlan_registration_entries___static_vlan_registration_entries static_vlan_registration_entries
+    )
+    Structure static_vlan_registration_entries___static_vlan_registration_entries (
+        enumeration registrar_admin_control,
+        enumeration vlan_transmitted
+    )
+    Structure map_type___mac_address_registration_entries (
+        mac_address_registration_entries___mac_address_registration_entries mac_address_registration_entries
+    )
+    Structure mac_address_registration_entries___mac_address_registration_entries (
+        enumeration control_element
+    )
+    Structure map_type___dynamic_vlan_registration_entries (
+        dynamic_vlan_registration_entries___dynamic_vlan_registration_entries dynamic_vlan_registration_entries
+    )
+    Structure dynamic_vlan_registration_entries___dynamic_vlan_registration_entries (
+        enumeration control_element
+    )
+    Structure map_type___dynamic_reservation_entries (
+        dynamic_reservation_entries___dynamic_reservation_entries dynamic_reservation_entries
+    )
+    Structure dynamic_reservation_entries___dynamic_reservation_entries (
+        enumeration control_element
+    )
+    Structure map_type___dynamic_filtering_entries (
+        dynamic_filtering_entries___dynamic_filtering_entries dynamic_filtering_entries
+    )
+    Structure dynamic_filtering_entries___dynamic_filtering_entries (
+        enumeration control_element
+    )
+    Collection filtering_entry___port_map_collection of filtering_entry___port_map
+    Collection filtering_database___filtering_entry_collection of filtering_database___filtering_entry
+    Structure filtering_database___vlan_registration_entry (
+        uint32 database_id,
+        vid_range_type vids,
+        enumeration entry_type,
+        vlan_registration_entry___port_map_collection port_map
+    )
+    Structure vlan_registration_entry___port_map (
+        port_number_type port_ref,
+        port_map___map_type map_type
+    )
+    Collection vlan_registration_entry___port_map_collection of vlan_registration_entry___port_map
+    Collection filtering_database___vlan_registration_entry_collection of filtering_database___vlan_registration_entry
+    Structure component___permanent_database (
+        gauge32 ^size,
+        gauge32 static_entries,
+        gauge32 static_vlan_registration_entries,
+        permanent_database___filtering_entry_collection filtering_entry
+    )
+    Structure permanent_database___filtering_entry (
+        uint32 database_id,
+        mac_address address,
+        vid_range_type vids,
+        enumeration status,
+        filtering_entry___port_map_collection port_map
+    )
+    Collection permanent_database___filtering_entry_collection of permanent_database___filtering_entry
+    Structure component___bridge_vlan (
+        uint16 version,
+        uint16 max_vids,
+        override_default_pvid override_default_pvid,
+        protocol_frame_format_type protocol_template,
+        uint16 max_msti,
+        bridge_vlan___vlan_collection vlan,
+        bridge_vlan___protocol_group_database_collection protocol_group_database,
+        bridge_vlan___vid_to_fid_allocation_collection vid_to_fid_allocation,
+        bridge_vlan___fid_to_vid_allocation_collection fid_to_vid_allocation,
+        bridge_vlan___vid_to_fid_collection vid_to_fid
+    )
+    Type override_default_pvid extends boolean
+    Enumerated protocol_frame_format_type {
+        protocol_frame_format_type Ethernet,
+        protocol_frame_format_type rfc1042,
+        protocol_frame_format_type snap8021H,
+        protocol_frame_format_type snapOther,
+        protocol_frame_format_type llcOther,
+        protocol_frame_format_type Ethernet,
+        protocol_frame_format_type rfc1042,
+        protocol_frame_format_type snap8021H,
+        protocol_frame_format_type snapOther,
+        protocol_frame_format_type llcOther
+    }
+    Structure bridge_vlan___vlan (
+        vlan_index_type vid,
+        name_type ^name,
+        @LeafRefPath : "/if:interfaces/if:interface/if:name"
+        interface_ref_collection untagged_ports,
+        @LeafRefPath : "/if:interfaces/if:interface/if:name"
+        interface_ref_collection egress_ports
+    )
+    Type vlan_index_type extends uint32
+    Collection bridge_vlan___vlan_collection of bridge_vlan___vlan
+    Structure bridge_vlan___protocol_group_database (
+        uint16 db_index,
+        protocol_frame_format_type frame_format_type,
+        protocol_group_database___frame_format frame_format,
+        uint32 group_id
+    )
+    Structure protocol_group_database___frame_format (
+        frame_format___ethernet_rfc1042_snap8021H ethernet_rfc1042_snap8021H,
+        frame_format___snap_other snap_other,
+        frame_format___llc_other llc_other
+    )
+    Structure frame_format___ethernet_rfc1042_snap8021H (
+        ethertype_type ethertype
+    )
+    Type ethertype_type extends string
+    Structure frame_format___snap_other (
+        string protocol_id
+    )
+    Structure frame_format___llc_other (
+        llc_other___dsap_ssap_pairs dsap_ssap_pairs
+    )
+    Structure llc_other___dsap_ssap_pairs (
+        string llc_address
+    )
+    Collection bridge_vlan___protocol_group_database_collection of bridge_vlan___protocol_group_database
+    Structure bridge_vlan___vid_to_fid_allocation (
+        vid_range_type vids,
+        uint32 fid,
+        enumeration allocation_type
+    )
+    Collection bridge_vlan___vid_to_fid_allocation_collection of bridge_vlan___vid_to_fid_allocation
+    Structure bridge_vlan___fid_to_vid_allocation (
+        uint32 fid,
+        enumeration allocation_type,
+        vlan_index_type_collection vid
+    )
+    Collection vlan_index_type_collection of vlan_index_type
+    Collection bridge_vlan___fid_to_vid_allocation_collection of bridge_vlan___fid_to_vid_allocation
+    Structure bridge_vlan___vid_to_fid (
+        vlan_index_type vid,
+        uint32 fid
+    )
+    Collection bridge_vlan___vid_to_fid_collection of bridge_vlan___vid_to_fid
+    Structure component___bridge_mst (
+        mstid_type_collection mstid,
+        bridge_mst___fid_to_mstid_collection fid_to_mstid,
+        bridge_mst___fid_to_mstid_allocation_collection fid_to_mstid_allocation
+    )
+    Type mstid_type extends uint32
+    Collection mstid_type_collection of mstid_type
+    Structure bridge_mst___fid_to_mstid (
+        uint32 fid,
+        mstid_type mstid
+    )
+    Collection bridge_mst___fid_to_mstid_collection of bridge_mst___fid_to_mstid
+    Structure bridge_mst___fid_to_mstid_allocation (
+        vid_range_type fids,
+        mstid_type mstid
+    )
+    Collection bridge_mst___fid_to_mstid_allocation_collection of bridge_mst___fid_to_mstid_allocation
+    Collection bridge___component_collection of bridge___component
+    Collection bridge_collection of bridge
+    Structure interface (
+        string ^name,
+        string description,
+        identityref ^type,
+        enabled enabled,
+        enumeration link_up_down_trap_enable,
+        enumeration admin_status,
+        enumeration oper_status,
+        date_and_time last_change,
+        int32 if_index,
+        phys_address phys_address,
+        @LeafRefPath : "/if:interfaces-state/if:interface/if:name"
+        interface_state_ref_collection higher_layer_if,
+        @LeafRefPath : "/if:interfaces-state/if:interface/if:name"
+        interface_state_ref_collection lower_layer_if,
+        speed speed,
+        interface___statistics statistics,
+        interface___bridge_port bridge_port
+    )
+    Type enabled extends boolean
+    Type date_and_time extends string
+    Type int32 extends int32
+    Type phys_address extends string
+    Type speed extends gauge64
+    Type gauge64
+    Structure interface___statistics (
+        date_and_time discontinuity_time,
+        counter64 in_octets,
+        counter64 in_unicast_pkts,
+        counter64 in_broadcast_pkts,
+        counter64 in_multicast_pkts,
+        counter32 in_discards,
+        counter32 in_errors,
+        counter32 in_unknown_protos,
+        counter64 out_octets,
+        counter64 out_unicast_pkts,
+        counter64 out_broadcast_pkts,
+        counter64 out_multicast_pkts,
+        counter32 out_discards,
+        counter32 out_errors
+    )
+    Type counter64 extends uint64
+    Type uint64
+    Type counter32 extends uint32
+    Structure interface___bridge_port (
+        @LeafRefPath : "/dot1q:bridges/dot1q:bridge/dot1q:name"
+        leafref bridge_name,
+        @LeafRefPath : "/dot1q:bridges/dot1q:bridge[dot1q:name=current()/../bridge-name]/dot1q:component/dot1q:name"
+        leafref component_name,
+        identityref port_type,
+        pvid pvid,
+        default_priority default_priority,
+        bridge_port___priority_regeneration priority_regeneration,
+        pcp_selection pcp_selection,
+        bridge_port___pcp_decoding_map_collection pcp_decoding_table,
+        bridge_port___pcp_encoding_map_collection pcp_encoding_table,
+        use_dei use_dei,
+        drop_encoding drop_encoding,
+        service_access_priority_selection service_access_priority_selection,
+        bridge_port___service_access_priority service_access_priority,
+        bridge_port___traffic_class_map_collection traffic_class,
+        bridge_port___transmission_selection_algorithm_map_collection transmission_selection_algorithm_table,
+        acceptable_frame acceptable_frame,
+        enable_ingress_filtering enable_ingress_filtering,
+        enable_restricted_vlan_registration enable_restricted_vlan_registration,
+        enable_vid_translation_table enable_vid_translation_table,
+        enable_egress_vid_translation_table enable_egress_vid_translation_table,
+        bridge_port___protocol_group_vid_set_collection protocol_group_vid_set,
+        enumeration admin_point_to_point,
+        boolean protocol_based_vlan_classification,
+        uint16 max_vid_set_entries,
+        port_number_type port_number,
+        mac_address address,
+        bits capabilities,
+        bits type_capabilties,
+        boolean external,
+        boolean oper_point_to_point,
+        media_dependent_overhead media_dependent_overhead,
+        bridge_port___statistics statistics,
+        bridge_port___vid_translations_collection vid_translations,
+        bridge_port___egress_vid_translations_collection egress_vid_translations
+    )
+    Type pvid extends vlan_index_type
+    Type default_priority extends priority_type
+    Type priority_type
+    Structure bridge_port___priority_regeneration (
+        priority0 priority0,
+        priority1 priority1,
+        priority2 priority2,
+        priority3 priority3,
+        priority4 priority4,
+        priority5 priority5,
+        priority6 priority6,
+        priority7 priority7
+    )
+    Type priority0
+    Type priority1
+    Type priority2
+    Type priority3
+    Type priority4
+    Type priority5
+    Type priority6
+    Type priority7
+    Enumerated pcp_selection {
+        pcp_selection _1P0D,
+        pcp_selection _1P1D,
+        pcp_selection _1P2D,
+        pcp_selection _1P3D
+    }
+    Structure bridge_port___pcp_decoding_map (
+        pcp_selection_type pcp,
+        pcp_decoding_map___priority_map_collection priority_map
+    )
+    Type pcp_selection_type
+    Structure pcp_decoding_map___priority_map (
+        priority_type priority_code_point,
+        priority_type priority,
+        boolean drop_eligible
+    )
+    Collection pcp_decoding_map___priority_map_collection of pcp_decoding_map___priority_map
+    Collection bridge_port___pcp_decoding_map_collection of bridge_port___pcp_decoding_map
+    Structure bridge_port___pcp_encoding_map (
+        pcp_selection_type pcp,
+        pcp_encoding_map___priority_map_collection priority_map
+    )
+    Structure pcp_encoding_map___priority_map (
+        priority_type priority,
+        boolean dei,
+        priority_type priority_code_point
+    )
+    Collection pcp_encoding_map___priority_map_collection of pcp_encoding_map___priority_map
+    Collection bridge_port___pcp_encoding_map_collection of bridge_port___pcp_encoding_map
+    Type use_dei extends boolean
+    Type drop_encoding extends boolean
+    Type service_access_priority_selection extends boolean
+    Structure bridge_port___service_access_priority (
+        priority0 priority0,
+        priority1 priority1,
+        priority2 priority2,
+        priority3 priority3,
+        priority4 priority4,
+        priority5 priority5,
+        priority6 priority6,
+        priority7 priority7
+    )
+    Structure bridge_port___traffic_class_map (
+        priority_type priority,
+        traffic_class_map___available_traffic_class_collection available_traffic_class
+    )
+    Structure traffic_class_map___available_traffic_class (
+        uint8 num_traffic_class,
+        traffic_class_type traffic_class
+    )
+    Type uint8
+    Type traffic_class_type
+    Collection traffic_class_map___available_traffic_class_collection of traffic_class_map___available_traffic_class
+    Collection bridge_port___traffic_class_map_collection of bridge_port___traffic_class_map
+    Structure bridge_port___transmission_selection_algorithm_map (
+        traffic_class_type traffic_class,
+        identityref transmission_selection_algorithm
+    )
+    Collection bridge_port___transmission_selection_algorithm_map_collection of bridge_port___transmission_selection_algorithm_map
+    Enumerated acceptable_frame {
+        acceptable_frame admit_only_VLAN_tagged_frames,
+        acceptable_frame admit_only_untagged_and_priority_tagged,
+        acceptable_frame admit_all_frames
+    }
+    Type enable_ingress_filtering extends boolean
+    Type enable_restricted_vlan_registration extends boolean
+    Type enable_vid_translation_table extends boolean
+    Type enable_egress_vid_translation_table extends boolean
+    Structure bridge_port___protocol_group_vid_set (
+        uint32 group_id,
+        vlanid_collection vid
+    )
+    Type vlanid extends uint16
+    Collection vlanid_collection of vlanid
+    Collection bridge_port___protocol_group_vid_set_collection of bridge_port___protocol_group_vid_set
+    Type bits
+    Type media_dependent_overhead extends uint8
+    Structure bridge_port___statistics (
+        counter64 discard_on_ingress_filtering,
+        counter64 delay_exceeded_discards,
+        counter64 mtu_exceeded_discards,
+        counter64 frame_rx,
+        counter64 octets_rx,
+        counter64 frame_tx,
+        counter64 octets_tx,
+        counter64 discard_inbound,
+        counter64 forward_outbound,
+        counter64 discard_lack_of_buffers,
+        counter64 discard_transit_delay_exceeded,
+        counter64 discard_on_error
+    )
+    Structure bridge_port___vid_translations (
+        vlanid local_vid,
+        vlanid relay_vid
+    )
+    Collection bridge_port___vid_translations_collection of bridge_port___vid_translations
+    Structure bridge_port___egress_vid_translations (
+        vlanid relay_vid,
+        vlanid local_vid
+    )
+    Collection bridge_port___egress_vid_translations_collection of bridge_port___egress_vid_translations
+    Collection interface_collection of interface
+    Type interface_state_ref extends leafref
+    Collection interface_state_ref_collection of interface_state_ref
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/mwt/ieee802-dot1q-pb.yang b/plugins/org.etsi.mts.tdl.yang2tdl/samples/mwt/ieee802-dot1q-pb.yang
new file mode 100644
index 0000000000000000000000000000000000000000..e25b7b060b9a64bf4adbe6c120b154b98dd58e17
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/mwt/ieee802-dot1q-pb.yang
@@ -0,0 +1,221 @@
+module ieee802-dot1q-pb {
+  yang-version "1.1";
+  namespace urn:ieee:std:802.1Q:yang:ieee802-dot1q-pb;
+  prefix dot1q-pb;
+  import ieee802-dot1q-bridge {
+    prefix dot1q;
+  }
+  import ieee802-dot1q-types {
+    prefix dot1qtypes;
+  }
+  import ietf-interfaces {
+    prefix if;
+  }
+  organization
+    "IEEE 802.1 Working Group";
+  contact
+    "WG-URL: http://ieee802.org/1/
+    WG-EMail: stds-802-1-l@ieee.org
+    
+    Contact: IEEE 802.1 Working Group Chair
+    Postal: C/O IEEE 802.1 Working Group
+           IEEE Standards Association
+           445 Hoes Lane
+           Piscataway, NJ 08854
+           USA
+    
+    E-mail: stds-802-1-chairs@ieee.org";
+  description
+    "This YANG module describes the bridge configuration model for
+    Provider Bridges.
+    
+    Copyright (C) IEEE (2022).
+    
+    This version of this YANG module is part of IEEE Std 802.1Q; see the
+    standard itself for full legal notices.";
+  revision 2022-05-06 {
+    description
+      "Update to rebase on Qcw";
+    reference
+      "IEEE Std 802.1Q-2022, Bridges and Bridged Networks.";
+  }
+  revision 2022-01-19 {
+    description
+      "Published as part of IEEE Std 802.1Q-2022.";
+    reference
+      "IEEE Std 802.1Q-2022, Bridges and Bridged Networks.";
+  }
+  revision 2020-06-04 {
+    description
+      "Published as part of IEEE Std 802.1Qcx-2020. Second version.";
+    reference
+      "IEEE Std 802.1Qcx-2020, Bridges and Bridged Networks - YANG Data
+      Model for Connectivity Fault Management.";
+  }
+  revision 2018-03-07 {
+    description
+      "Published as part of IEEE Std 802.1Q-2018. Initial version.";
+    reference
+      "IEEE Std 802.1Q-2018, Bridges and Bridged Networks.";
+  }
+  augment "/if:interfaces/if:interface/dot1q:bridge-port" {
+    description
+      "Augment the interface model with 802.1Q Bridge Port configuration
+      specific nodes.";
+    leaf svid {
+      type dot1qtypes:vlanid;
+      description
+        "Service VLAN identifier.";
+      reference
+        "12.13.2.1 of IEEE Std 802.1Q-2022";
+    }
+    list cvid-registration {
+      when "/dot1q:bridges/dot1q:bridge[dot1q:name=current()" +
+        "/../dot1q:bridge-name]/dot1q:component[dot1q:name=current()" +
+        "/../dot1q:component-name]/dot1q:type = 'dot1q:c-vlan-component' and "+
+        "../dot1q:port-type = 'dot1q:customer-edge-port'" {
+        description
+          "Applies when the component associated with this interface is
+          a C-VLAN component and the port-type is a customer edge port.";
+      }
+      key "cvid";
+      description
+        "The C-VID Registration Table, provides a mapping between a
+        C-VID and the service instance represented by an S-VID selected
+        for that C-VLAN. This table provides the equivalent
+        functionality of
+           1) Configuring the PVID of the internal CNP on the S-VLAN
+              component
+           2) Adding the corresponding PEP on the C-VLAN component to
+              the member set of the C-VLAN
+           3) Adding the PEP and/or CEP to the untagged set of the
+              C-VLAN (if it is desired that frames forwarded to that
+              port are transmitted untagged for this C-VLAN).";
+      leaf cvid {
+        type dot1qtypes:vlanid;
+        description
+          "Customer VLAN identifiers associated with this bridge port.";
+        reference
+          "12.13.2.1 of IEEE Std 802.1Q-2022";
+      }
+      leaf svid {
+        type dot1qtypes:vlanid;
+        description
+          "Service VLAN identifier.";
+        reference
+          "12.13.2.1 of IEEE Std 802.1Q-2022";
+      }
+      leaf untagged-pep {
+        type boolean;
+        default "true";
+        description
+          "A boolean indicating frames for this C-VLAN should be
+          forwarded untagged through the Provider Edge Port.";
+        reference
+          "12.13.2.1 of IEEE Std 802.1Q-2022";
+      }
+      leaf untagged-cep {
+        type boolean;
+        default "true";
+        description
+          "A boolean indicating frames for this C-VLAN should be
+          forwarded untagged through the Customer Edge Port.";
+        reference
+          "12.13.2.1 of IEEE Std 802.1Q-2022";
+      }
+    }
+    list service-priority-regeneration {
+      when "/dot1q:bridges/dot1q:bridge[dot1q:name=current() " +
+        "/../dot1q:bridge-name]/dot1q:component[dot1q:name=current() " +
+        "/../dot1q:component-name]/dot1q:type = 'dot1q:c-vlan-component' and "+
+        "../dot1q:port-type = 'dot1q:customer-edge-port'" {
+        description
+          "Applies when the component associated with this interface is
+          a C-VLAN component and the port-type is a customer edge port.";
+      }
+      key "svid";
+      description
+        "The Service Priority Regeneration Table, which provides the
+        Priority Regeneration Table (12.6.2) for each internal CNP
+        connected to the C-VLAN component associated with the CEP.";
+      leaf svid {
+        type dot1qtypes:vlanid;
+        description
+          "Service VLAN identifier.";
+        reference
+          "12.13.2.6 of IEEE Std 802.1Q-2022";
+      }
+      container priority-regeneration {
+        description
+          "Contains Service Priority Regeneration table nodal
+          information.";
+        reference
+          "12.13.2.6 of IEEE Std 802.1Q-2022";
+        uses dot1qtypes:priority-regeneration-table-grouping;
+      }
+    }
+    list rcap-internal-interface {
+      when "/dot1q:bridges/dot1q:bridge[dot1q:name=current() " +
+        "/../dot1q:bridge-name]/dot1q:component[dot1q:name=current() " +
+        "/../dot1q:component-name]/dot1q:type = 'dot1q:s-vlan-component' and "+
+        "../dot1q:port-type = 'dot1q:remote-customer-access-port'" {
+        description
+          "Applies when the component associated with this interface is
+          a C-VLAN component and the port-type is a customer edge port.";
+      }
+      key "external-svid";
+      description
+        "Designating an external port as an RCAP automatically creates a
+        Port-mapping S-VLAN component associated with that port. This
+        Port-mapping S-VLAN component includes one internal PNP.";
+      leaf external-svid {
+        type dot1qtypes:vlanid;
+        description
+          "External Service VLAN identifier.";
+        reference
+          "12.13.3.2 of IEEE Std 802.1Q-2022";
+      }
+      leaf internal-port-number {
+        type dot1qtypes:port-number-type;
+        description
+          "The number of the RCAP.";
+        reference
+          "12.13.3.2 of IEEE Std 802.1Q-2022";
+      }
+      leaf internal-svid {
+        type dot1qtypes:vlanid;
+        description
+          "Internal Service VLAN Identifier (not applicable for a
+          C-tagged RCSI).";
+        reference
+          "12.13.3.2 of IEEE Std 802.1Q-2022";
+      }
+      leaf internal-interface-type {
+        type enumeration {
+          enum port-based-rcsi {
+            description
+              "Port-based RCSI";
+          }
+          enum c-tagged-rcsi {
+            description
+              "C-tagged RCSI";
+          }
+          enum pnp {
+            description
+              "Provider Network Port";
+          }
+          enum discard {
+            description
+              "Discard (external S-VID is not associated with an
+              internal port).";
+          }
+        }
+        description
+          "A value indicating the type of internal interface associated
+          with the external S-VID.";
+        reference
+          "12.13.3.2 of IEEE Std 802.1Q-2022";
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/mwt/ieee802-dot1q-pb.yang-generated.tdltx b/plugins/org.etsi.mts.tdl.yang2tdl/samples/mwt/ieee802-dot1q-pb.yang-generated.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..5341030cd26ff08da383f4c6affd3d1348ba8da3
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/mwt/ieee802-dot1q-pb.yang-generated.tdltx
@@ -0,0 +1,552 @@
+Package generated_from_ieee802_dot1q_pb_yang {
+    Type String
+    Type TODO_RESOLVE_REFERENCED
+    Use "ieee802-dot1q-pb.yang" as SOURCE_MAPPING
+    Structure bridge (
+        name_type ^name,
+        mac_address address,
+        identityref bridge_type,
+        uint16 ports,
+        up_time up_time,
+        uint32 components,
+        bridge___component_collection ^component
+    )
+    Type name_type { pattern } extends string
+    Type string { pattern } extends string
+    Constraint pattern
+    Type mac_address { pattern : "[0-9a-fA-F]{2}(-[0-9a-fA-F]{2}){5}" } extends string
+    Type identityref
+    Type uint16 extends uint16
+    Type up_time extends zero_based_counter32
+    Type zero_based_counter32
+    Type uint32
+    Structure bridge___component (
+        string ^name,
+        uint32 id,
+        identityref ^type,
+        mac_address address,
+        traffic_class_enabled traffic_class_enabled,
+        uint16 ports,
+        @LeafRefPath : "/if:interfaces/if:interface/if:name"
+        interface_ref_collection bridge_port,
+        component___capabilities capabilities,
+        component___filtering_database filtering_database,
+        component___permanent_database permanent_database,
+        component___bridge_vlan bridge_vlan,
+        component___bridge_mst bridge_mst
+    )
+    Type traffic_class_enabled extends boolean
+    Type boolean
+    Type interface_ref extends leafref
+    Type leafref
+    Collection interface_ref_collection of interface_ref
+    Annotation LeafRefPath
+    Structure component___capabilities (
+        extended_filtering extended_filtering,
+        traffic_classes traffic_classes,
+        static_entry_individual_port static_entry_individual_port,
+        ivl_capable ivl_capable,
+        svl_capable svl_capable,
+        hybrid_capable hybrid_capable,
+        configurable_pvid_tagging configurable_pvid_tagging,
+        local_vlan_capable local_vlan_capable
+    )
+    Type extended_filtering extends boolean
+    Type traffic_classes extends boolean
+    Type static_entry_individual_port extends boolean
+    Type ivl_capable extends boolean
+    Type svl_capable extends boolean
+    Type hybrid_capable extends boolean
+    Type configurable_pvid_tagging extends boolean
+    Type local_vlan_capable extends boolean
+    Structure component___filtering_database (
+        aging_time aging_time,
+        gauge32 ^size,
+        gauge32 static_entries,
+        gauge32 dynamic_entries,
+        gauge32 static_vlan_registration_entries,
+        gauge32 dynamic_vlan_registration_entries,
+        gauge32 mac_address_registration_entries,
+        filtering_database___filtering_entry_collection filtering_entry,
+        filtering_database___vlan_registration_entry_collection vlan_registration_entry
+    )
+    Type aging_time extends uint32
+    Type gauge32 extends uint32
+    Structure filtering_database___filtering_entry (
+        uint32 database_id,
+        mac_address address,
+        vid_range_type vids,
+        filtering_entry___entry_type entry_type,
+        filtering_entry___port_map_collection port_map,
+        filtering_entry___status status
+    )
+    Type vid_range_type { pattern : "([1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?(,[1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?)*)" } extends string
+    Enumerated filtering_entry___entry_type {
+        filtering_entry___entry_type static,
+        filtering_entry___entry_type dynamic
+    }
+    Structure filtering_entry___port_map (
+        port_number_type port_ref,
+        port_map___map_type map_type
+    )
+    Type port_number_type extends uint32
+    Structure port_map___map_type (
+        map_type___static_filtering_entries static_filtering_entries,
+        map_type___static_vlan_registration_entries static_vlan_registration_entries,
+        map_type___mac_address_registration_entries mac_address_registration_entries,
+        map_type___dynamic_vlan_registration_entries dynamic_vlan_registration_entries,
+        map_type___dynamic_reservation_entries dynamic_reservation_entries,
+        map_type___dynamic_filtering_entries dynamic_filtering_entries
+    )
+    Structure map_type___static_filtering_entries (
+        static_filtering_entries___static_filtering_entries static_filtering_entries
+    )
+    Structure static_filtering_entries___static_filtering_entries (
+        enumeration control_element,
+        port_number_type connection_identifier
+    )
+    Type enumeration
+    Structure map_type___static_vlan_registration_entries (
+        static_vlan_registration_entries___static_vlan_registration_entries static_vlan_registration_entries
+    )
+    Structure static_vlan_registration_entries___static_vlan_registration_entries (
+        enumeration registrar_admin_control,
+        enumeration vlan_transmitted
+    )
+    Structure map_type___mac_address_registration_entries (
+        mac_address_registration_entries___mac_address_registration_entries mac_address_registration_entries
+    )
+    Structure mac_address_registration_entries___mac_address_registration_entries (
+        enumeration control_element
+    )
+    Structure map_type___dynamic_vlan_registration_entries (
+        dynamic_vlan_registration_entries___dynamic_vlan_registration_entries dynamic_vlan_registration_entries
+    )
+    Structure dynamic_vlan_registration_entries___dynamic_vlan_registration_entries (
+        enumeration control_element
+    )
+    Structure map_type___dynamic_reservation_entries (
+        dynamic_reservation_entries___dynamic_reservation_entries dynamic_reservation_entries
+    )
+    Structure dynamic_reservation_entries___dynamic_reservation_entries (
+        enumeration control_element
+    )
+    Structure map_type___dynamic_filtering_entries (
+        dynamic_filtering_entries___dynamic_filtering_entries dynamic_filtering_entries
+    )
+    Structure dynamic_filtering_entries___dynamic_filtering_entries (
+        enumeration control_element
+    )
+    Collection filtering_entry___port_map_collection of filtering_entry___port_map
+    Enumerated filtering_entry___status {
+        filtering_entry___status other,
+        filtering_entry___status invalid,
+        filtering_entry___status learned,
+        filtering_entry___status self,
+        filtering_entry___status mgmt
+    }
+    Collection filtering_database___filtering_entry_collection of filtering_database___filtering_entry
+    Structure filtering_database___vlan_registration_entry (
+        uint32 database_id,
+        vid_range_type vids,
+        vlan_registration_entry___entry_type entry_type,
+        vlan_registration_entry___port_map_collection port_map
+    )
+    Enumerated vlan_registration_entry___entry_type {
+        vlan_registration_entry___entry_type static,
+        vlan_registration_entry___entry_type dynamic
+    }
+    Structure vlan_registration_entry___port_map (
+        port_number_type port_ref,
+        port_map___map_type map_type
+    )
+    Collection vlan_registration_entry___port_map_collection of vlan_registration_entry___port_map
+    Collection filtering_database___vlan_registration_entry_collection of filtering_database___vlan_registration_entry
+    Structure component___permanent_database (
+        gauge32 ^size,
+        gauge32 static_entries,
+        gauge32 static_vlan_registration_entries,
+        permanent_database___filtering_entry_collection filtering_entry
+    )
+    Structure permanent_database___filtering_entry (
+        uint32 database_id,
+        mac_address address,
+        vid_range_type vids,
+        filtering_entry___status status,
+        filtering_entry___port_map_collection port_map
+    )
+    Collection permanent_database___filtering_entry_collection of permanent_database___filtering_entry
+    Structure component___bridge_vlan (
+        uint16 version,
+        uint16 max_vids,
+        override_default_pvid override_default_pvid,
+        protocol_frame_format_type protocol_template,
+        uint16 max_msti,
+        bridge_vlan___vlan_collection vlan,
+        bridge_vlan___protocol_group_database_collection protocol_group_database,
+        bridge_vlan___vid_to_fid_allocation_collection vid_to_fid_allocation,
+        bridge_vlan___fid_to_vid_allocation_collection fid_to_vid_allocation,
+        bridge_vlan___vid_to_fid_collection vid_to_fid
+    )
+    Type override_default_pvid extends boolean
+    Enumerated protocol_frame_format_type {
+        protocol_frame_format_type Ethernet,
+        protocol_frame_format_type rfc1042,
+        protocol_frame_format_type snap8021H,
+        protocol_frame_format_type snapOther,
+        protocol_frame_format_type llcOther
+    }
+    Structure bridge_vlan___vlan (
+        vlan_index_type vid,
+        name_type ^name,
+        @LeafRefPath : "/if:interfaces/if:interface/if:name"
+        interface_ref_collection untagged_ports,
+        @LeafRefPath : "/if:interfaces/if:interface/if:name"
+        interface_ref_collection egress_ports
+    )
+    Type vlan_index_type extends uint32
+    Collection bridge_vlan___vlan_collection of bridge_vlan___vlan
+    Structure bridge_vlan___protocol_group_database (
+        uint16 db_index,
+        protocol_frame_format_type frame_format_type,
+        protocol_group_database___frame_format frame_format,
+        uint32 group_id
+    )
+    Structure protocol_group_database___frame_format (
+        frame_format___ethernet_rfc1042_snap8021H ethernet_rfc1042_snap8021H,
+        frame_format___snap_other snap_other,
+        frame_format___llc_other llc_other
+    )
+    Structure frame_format___ethernet_rfc1042_snap8021H (
+        ethertype_type ethertype
+    )
+    Type ethertype_type { pattern : "[0-9a-fA-F]{2}-[0-9a-fA-F]{2}" } extends string
+    Structure frame_format___snap_other (
+        string protocol_id
+    )
+    Structure frame_format___llc_other (
+        llc_other___dsap_ssap_pairs dsap_ssap_pairs
+    )
+    Structure llc_other___dsap_ssap_pairs (
+        string llc_address
+    )
+    Collection bridge_vlan___protocol_group_database_collection of bridge_vlan___protocol_group_database
+    Structure bridge_vlan___vid_to_fid_allocation (
+        vid_range_type vids,
+        uint32 fid,
+        vid_to_fid_allocation___allocation_type allocation_type
+    )
+    Enumerated vid_to_fid_allocation___allocation_type {
+        vid_to_fid_allocation___allocation_type undefined,
+        vid_to_fid_allocation___allocation_type fixed,
+        vid_to_fid_allocation___allocation_type dynamic
+    }
+    Collection bridge_vlan___vid_to_fid_allocation_collection of bridge_vlan___vid_to_fid_allocation
+    Structure bridge_vlan___fid_to_vid_allocation (
+        uint32 fid,
+        fid_to_vid_allocation___allocation_type allocation_type,
+        vlan_index_type_collection vid
+    )
+    Enumerated fid_to_vid_allocation___allocation_type {
+        fid_to_vid_allocation___allocation_type undefined,
+        fid_to_vid_allocation___allocation_type fixed,
+        fid_to_vid_allocation___allocation_type dynamic
+    }
+    Collection vlan_index_type_collection of vlan_index_type
+    Collection bridge_vlan___fid_to_vid_allocation_collection of bridge_vlan___fid_to_vid_allocation
+    Structure bridge_vlan___vid_to_fid (
+        vlan_index_type vid,
+        uint32 fid
+    )
+    Collection bridge_vlan___vid_to_fid_collection of bridge_vlan___vid_to_fid
+    Structure component___bridge_mst (
+        mstid_type_collection mstid,
+        bridge_mst___fid_to_mstid_collection fid_to_mstid,
+        bridge_mst___fid_to_mstid_allocation_collection fid_to_mstid_allocation
+    )
+    Type mstid_type extends uint32
+    Collection mstid_type_collection of mstid_type
+    Structure bridge_mst___fid_to_mstid (
+        uint32 fid,
+        mstid_type mstid
+    )
+    Collection bridge_mst___fid_to_mstid_collection of bridge_mst___fid_to_mstid
+    Structure bridge_mst___fid_to_mstid_allocation (
+        vid_range_type fids,
+        mstid_type mstid
+    )
+    Collection bridge_mst___fid_to_mstid_allocation_collection of bridge_mst___fid_to_mstid_allocation
+    Collection bridge___component_collection of bridge___component
+    Collection bridge_collection of bridge
+    Structure interface (
+        string ^name,
+        string description,
+        identityref ^type,
+        enabled enabled,
+        interface___link_up_down_trap_enable link_up_down_trap_enable,
+        interface___admin_status admin_status,
+        interface___oper_status oper_status,
+        date_and_time last_change,
+        int32 if_index,
+        phys_address phys_address,
+        @LeafRefPath : "/if:interfaces-state/if:interface/if:name"
+        interface_state_ref_collection higher_layer_if,
+        @LeafRefPath : "/if:interfaces-state/if:interface/if:name"
+        interface_state_ref_collection lower_layer_if,
+        speed speed,
+        interface___statistics statistics,
+        interface___bridge_port bridge_port
+    )
+    Type enabled extends boolean
+    Enumerated interface___link_up_down_trap_enable {
+        interface___link_up_down_trap_enable enabled,
+        interface___link_up_down_trap_enable disabled
+    }
+    Enumerated interface___admin_status {
+        interface___admin_status up,
+        interface___admin_status down,
+        interface___admin_status testing
+    }
+    Enumerated interface___oper_status {
+        interface___oper_status up,
+        interface___oper_status down,
+        interface___oper_status testing,
+        interface___oper_status unknown,
+        interface___oper_status dormant,
+        interface___oper_status not_present,
+        interface___oper_status lower_layer_down
+    }
+    Type date_and_time { pattern : "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[\\+\\-]\\d{2}:\\d{2})" } extends string
+    Type int32 extends int32
+    Type phys_address { pattern : "([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?" } extends string
+    Type speed extends gauge64
+    Type gauge64
+    Structure interface___statistics (
+        date_and_time discontinuity_time,
+        counter64 in_octets,
+        counter64 in_unicast_pkts,
+        counter64 in_broadcast_pkts,
+        counter64 in_multicast_pkts,
+        counter32 in_discards,
+        counter32 in_errors,
+        counter32 in_unknown_protos,
+        counter64 out_octets,
+        counter64 out_unicast_pkts,
+        counter64 out_broadcast_pkts,
+        counter64 out_multicast_pkts,
+        counter32 out_discards,
+        counter32 out_errors
+    )
+    Type counter64 extends uint64
+    Type uint64
+    Type counter32 extends uint32
+    Structure interface___bridge_port (
+        @LeafRefPath : "/dot1q:bridges/dot1q:bridge/dot1q:name"
+        leafref bridge_name,
+        @LeafRefPath : "/dot1q:bridges/dot1q:bridge[dot1q:name=current()/../bridge-name]/dot1q:component/dot1q:name"
+        leafref component_name,
+        identityref port_type,
+        pvid pvid,
+        default_priority default_priority,
+        bridge_port___priority_regeneration priority_regeneration,
+        pcp_selection pcp_selection,
+        bridge_port___pcp_decoding_map_collection pcp_decoding_table,
+        bridge_port___pcp_encoding_map_collection pcp_encoding_table,
+        use_dei use_dei,
+        drop_encoding drop_encoding,
+        service_access_priority_selection service_access_priority_selection,
+        bridge_port___service_access_priority service_access_priority,
+        bridge_port___traffic_class_map_collection traffic_class,
+        bridge_port___transmission_selection_algorithm_map_collection transmission_selection_algorithm_table,
+        acceptable_frame acceptable_frame,
+        enable_ingress_filtering enable_ingress_filtering,
+        enable_restricted_vlan_registration enable_restricted_vlan_registration,
+        enable_vid_translation_table enable_vid_translation_table,
+        enable_egress_vid_translation_table enable_egress_vid_translation_table,
+        bridge_port___protocol_group_vid_set_collection protocol_group_vid_set,
+        bridge_port___admin_point_to_point admin_point_to_point,
+        boolean protocol_based_vlan_classification,
+        uint16 max_vid_set_entries,
+        port_number_type port_number,
+        mac_address address,
+        bits capabilities,
+        bits type_capabilties,
+        boolean external,
+        boolean oper_point_to_point,
+        media_dependent_overhead media_dependent_overhead,
+        bridge_port___statistics statistics,
+        bridge_port___vid_translations_collection vid_translations,
+        bridge_port___egress_vid_translations_collection egress_vid_translations,
+        vlanid svid,
+        bridge_port___cvid_registration_collection cvid_registration,
+        bridge_port___service_priority_regeneration_collection service_priority_regeneration,
+        bridge_port___rcap_internal_interface_collection rcap_internal_interface
+    )
+    Type pvid extends vlan_index_type
+    Type default_priority extends priority_type
+    Type priority_type
+    Structure bridge_port___priority_regeneration (
+        priority0 priority0,
+        priority1 priority1,
+        priority2 priority2,
+        priority3 priority3,
+        priority4 priority4,
+        priority5 priority5,
+        priority6 priority6,
+        priority7 priority7
+    )
+    Type priority0
+    Type priority1
+    Type priority2
+    Type priority3
+    Type priority4
+    Type priority5
+    Type priority6
+    Type priority7
+    Enumerated pcp_selection {
+        pcp_selection _1P0D,
+        pcp_selection _1P1D,
+        pcp_selection _1P2D,
+        pcp_selection _1P3D
+    }
+    Structure bridge_port___pcp_decoding_map (
+        pcp_selection_type pcp,
+        pcp_decoding_map___priority_map_collection priority_map
+    )
+    Type pcp_selection_type
+    Structure pcp_decoding_map___priority_map (
+        priority_type priority_code_point,
+        priority_type priority,
+        boolean drop_eligible
+    )
+    Collection pcp_decoding_map___priority_map_collection of pcp_decoding_map___priority_map
+    Collection bridge_port___pcp_decoding_map_collection of bridge_port___pcp_decoding_map
+    Structure bridge_port___pcp_encoding_map (
+        pcp_selection_type pcp,
+        pcp_encoding_map___priority_map_collection priority_map
+    )
+    Structure pcp_encoding_map___priority_map (
+        priority_type priority,
+        boolean dei,
+        priority_type priority_code_point
+    )
+    Collection pcp_encoding_map___priority_map_collection of pcp_encoding_map___priority_map
+    Collection bridge_port___pcp_encoding_map_collection of bridge_port___pcp_encoding_map
+    Type use_dei extends boolean
+    Type drop_encoding extends boolean
+    Type service_access_priority_selection extends boolean
+    Structure bridge_port___service_access_priority (
+        priority0 priority0,
+        priority1 priority1,
+        priority2 priority2,
+        priority3 priority3,
+        priority4 priority4,
+        priority5 priority5,
+        priority6 priority6,
+        priority7 priority7
+    )
+    Structure bridge_port___traffic_class_map (
+        priority_type priority,
+        traffic_class_map___available_traffic_class_collection available_traffic_class
+    )
+    Structure traffic_class_map___available_traffic_class (
+        uint8 num_traffic_class,
+        traffic_class_type traffic_class
+    )
+    Type uint8
+    Type traffic_class_type
+    Collection traffic_class_map___available_traffic_class_collection of traffic_class_map___available_traffic_class
+    Collection bridge_port___traffic_class_map_collection of bridge_port___traffic_class_map
+    Structure bridge_port___transmission_selection_algorithm_map (
+        traffic_class_type traffic_class,
+        identityref transmission_selection_algorithm
+    )
+    Collection bridge_port___transmission_selection_algorithm_map_collection of bridge_port___transmission_selection_algorithm_map
+    Enumerated acceptable_frame {
+        acceptable_frame admit_only_VLAN_tagged_frames,
+        acceptable_frame admit_only_untagged_and_priority_tagged,
+        acceptable_frame admit_all_frames
+    }
+    Type enable_ingress_filtering extends boolean
+    Type enable_restricted_vlan_registration extends boolean
+    Type enable_vid_translation_table extends boolean
+    Type enable_egress_vid_translation_table extends boolean
+    Structure bridge_port___protocol_group_vid_set (
+        uint32 group_id,
+        vlanid_collection vid
+    )
+    Type vlanid extends uint16
+    Collection vlanid_collection of vlanid
+    Collection bridge_port___protocol_group_vid_set_collection of bridge_port___protocol_group_vid_set
+    Enumerated bridge_port___admin_point_to_point {
+        bridge_port___admin_point_to_point force_true,
+        bridge_port___admin_point_to_point force_false,
+        bridge_port___admin_point_to_point auto
+    }
+    Type bits
+    Type media_dependent_overhead extends uint8
+    Structure bridge_port___statistics (
+        counter64 discard_on_ingress_filtering,
+        counter64 delay_exceeded_discards,
+        counter64 mtu_exceeded_discards,
+        counter64 frame_rx,
+        counter64 octets_rx,
+        counter64 frame_tx,
+        counter64 octets_tx,
+        counter64 discard_inbound,
+        counter64 forward_outbound,
+        counter64 discard_lack_of_buffers,
+        counter64 discard_transit_delay_exceeded,
+        counter64 discard_on_error
+    )
+    Structure bridge_port___vid_translations (
+        vlanid local_vid,
+        vlanid relay_vid
+    )
+    Collection bridge_port___vid_translations_collection of bridge_port___vid_translations
+    Structure bridge_port___egress_vid_translations (
+        vlanid relay_vid,
+        vlanid local_vid
+    )
+    Collection bridge_port___egress_vid_translations_collection of bridge_port___egress_vid_translations
+    Structure bridge_port___cvid_registration (
+        vlanid cvid,
+        vlanid svid,
+        untagged_pep untagged_pep,
+        untagged_cep untagged_cep
+    )
+    Type untagged_pep extends boolean
+    Type untagged_cep extends boolean
+    Collection bridge_port___cvid_registration_collection of bridge_port___cvid_registration
+    Structure bridge_port___service_priority_regeneration (
+        vlanid svid,
+        service_priority_regeneration___priority_regeneration priority_regeneration
+    )
+    Structure service_priority_regeneration___priority_regeneration (
+        priority0 priority0,
+        priority1 priority1,
+        priority2 priority2,
+        priority3 priority3,
+        priority4 priority4,
+        priority5 priority5,
+        priority6 priority6,
+        priority7 priority7
+    )
+    Collection bridge_port___service_priority_regeneration_collection of bridge_port___service_priority_regeneration
+    Structure bridge_port___rcap_internal_interface (
+        vlanid external_svid,
+        port_number_type internal_port_number,
+        vlanid internal_svid,
+        rcap_internal_interface___internal_interface_type internal_interface_type
+    )
+    Enumerated rcap_internal_interface___internal_interface_type {
+        rcap_internal_interface___internal_interface_type port_based_rcsi,
+        rcap_internal_interface___internal_interface_type c_tagged_rcsi,
+        rcap_internal_interface___internal_interface_type pnp,
+        rcap_internal_interface___internal_interface_type discard
+    }
+    Collection bridge_port___rcap_internal_interface_collection of bridge_port___rcap_internal_interface
+    Collection interface_collection of interface
+    Type interface_state_ref extends leafref
+    Collection interface_state_ref_collection of interface_state_ref
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/mwt/ieee802-dot1q-types.yang b/plugins/org.etsi.mts.tdl.yang2tdl/samples/mwt/ieee802-dot1q-types.yang
new file mode 100644
index 0000000000000000000000000000000000000000..cfc46ed9b6c31709268ea4d4fdd7feadef55f760
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/mwt/ieee802-dot1q-types.yang
@@ -0,0 +1,980 @@
+module ieee802-dot1q-types {
+  namespace urn:ieee:std:802.1Q:yang:ieee802-dot1q-types;
+  prefix dot1q-types;
+  import ietf-yang-types {
+    prefix yang;
+  }
+  organization
+    "IEEE 802.1 Working Group";
+  contact
+    "WG-URL: http://ieee802.org/1/
+    WG-EMail: stds-802-1-l@ieee.org
+    
+    Contact: IEEE 802.1 Working Group Chair
+    Postal: C/O IEEE 802.1 Working Group
+           IEEE Standards Association
+           445 Hoes Lane
+           Piscataway, NJ 08854
+           USA
+    
+    E-mail: stds-802-1-chairs@ieee.org";
+  description
+    "Common types used within dot1Q-bridge modules.
+    
+    Copyright (C) IEEE (2022).
+    
+    This version of this YANG module is part of IEEE Std 802.1Q; see the
+    standard itself for full legal notices.";
+  revision 2022-01-19 {
+    description
+      "Published as part of IEEE Std 802.1Q-2022.";
+    reference
+      "IEEE Std 802.1Q-2022, Bridges and Bridged Networks.";
+  }
+  revision 2020-06-04 {
+    description
+      "Published as part of IEEE Std 802.1Qcx-2020. Second version.";
+    reference
+      "IEEE Std 802.1Qcx-2020, Bridges and Bridged Networks - YANG Data
+      Model for Connectivity Fault Management.";
+  }
+  revision 2018-03-07 {
+    description
+      "Published as part of IEEE Std 802.1Q-2018. Initial version.";
+    reference
+      "IEEE Std 802.1Q-2018, Bridges and Bridged Networks.";
+  }
+  identity dot1q-vlan-type {
+    description
+      "Base identity from which all 802.1Q VLAN tag types are derived
+      from.";
+  }
+  identity c-vlan {
+    base dot1q-vlan-type;
+    description
+      "An 802.1Q Customer VLAN, using the 81-00 EtherType";
+    reference
+      "5.5 of IEEE Std 802.1Q-2022";
+  }
+  identity s-vlan {
+    base dot1q-vlan-type;
+    description
+      "An 802.1Q Service VLAN, using the 88-A8 EtherType originally
+      introduced in 802.1ad, and incorporated into 802.1Q (2011)";
+    reference
+      "5.6 of IEEE Std 802.1Q-2022";
+  }
+  identity transmission-selection-algorithm {
+    description
+      "Specify the transmission selection algorithms of IEEE Std
+      802.1Q-2022 Table 8-6";
+  }
+  identity strict-priority {
+    base transmission-selection-algorithm;
+    description
+      "Indicates the strict priority transmission selection algorithm.";
+    reference
+      "Table 8-6 of IEEE Std 802.1Q-2022";
+  }
+  identity credit-based-shaper {
+    base transmission-selection-algorithm;
+    description
+      "Indicates the credit based shaper transmission selection
+      algorithm.";
+    reference
+      "Table 8-6 of IEEE Std 802.1Q-2022";
+  }
+  identity enhanced-transmission-selection {
+    base transmission-selection-algorithm;
+    description
+      "Indicates the enhanced transmission selection algorithm.";
+    reference
+      "Table 8-6 of IEEE Std 802.1Q-2022";
+  }
+  identity asynchronous-traffic-shaping {
+    base transmission-selection-algorithm;
+    description
+      "Indicates the asynchronous transmission selection algorithm.";
+    reference
+      "Table 8-6 of IEEE Std 802.1Q-2022";
+  }
+  identity vendor-specific {
+    base transmission-selection-algorithm;
+    description
+      "Indicates a vendor specific transmission selection algorithm.";
+    reference
+      "Table 8-6 of IEEE Std 802.1Q-2022";
+  }
+  typedef name-type {
+    type string {
+      length "0..32";
+    }
+    description
+      "A text string of up to 32 characters, of locally determined
+      significance.";
+  }
+  typedef port-number-type {
+    type uint32 {
+      range "1..4095";
+    }
+    description
+      "The port number of the Bridge port for which this entry contains
+      Bridge management information.";
+  }
+  typedef priority-type {
+    type uint8 {
+      range "0..7";
+    }
+    description
+      "A range of priorities from 0 to 7 (inclusive). The Priority Code
+      Point (PCP) is a 3-bit field that refers to the class of service
+      associated with an 802.1Q VLAN tagged frame. The field specifies a
+      priority value between 0 and 7, these values can be used by
+      quality of service (QoS) to prioritize different classes of
+      traffic.";
+  }
+  typedef vid-range-type {
+    type string {
+      pattern
+        "([1-9]"+
+        "[0-9]{0,3}"+
+        "(-[1-9][0-9]{0,3})?"+
+        "(,[1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?)*)";
+    }
+    description
+      "A list of VLAN Ids, or non overlapping VLAN ranges, in ascending
+      order, between 1 and 4094.
+      
+      This type is used to match an ordered list of VLAN Ids, or
+      contiguous ranges of VLAN Ids. Valid VLAN Ids must be in the range
+      1 to 4094, and included in the list in non overlapping ascending
+      order.
+      
+      For example: 1,10-100,250,500-1000";
+  }
+  typedef vlanid {
+    type uint16 {
+      range "1..4094";
+    }
+    description
+      "The vlanid type uniquely identifies a VLAN. This is the 12-bit
+      VLAN-ID used in the VLAN Tag header. The range is defined by the
+      referenced specification. This type is in the value set and its
+      semantics equivalent to the VlanId textual convention of the
+      SMIv2.";
+  }
+  typedef vlan-index-type {
+    type uint32 {
+      range "1..4094 | 4096..4294967295";
+    }
+    description
+      "A value used to index per-VLAN tables. Values of 0 and 4095 are
+      not permitted. The range of valid VLAN indices. If the value is
+      greater than 4095, then it represents a VLAN with scope local to
+      the particular agent, i.e., one without a global VLAN-ID assigned
+      to it. Such VLANs are outside the scope of IEEE 802.1Q, but it is
+      convenient to be able to manage them in the same way using this
+      YANG module.";
+    reference
+      "9.6 of IEEE Std 802.1Q-2022";
+  }
+  typedef mstid-type {
+    type uint32 {
+      range "1..4094";
+    }
+    description
+      "In an MSTP Bridge, an MSTID, i.e., a value used to identify a
+      spanning tree (or MST) instance";
+    reference
+      "13.8 of IEEE Std 802.1Q-2022";
+  }
+  typedef pcp-selection-type {
+    type enumeration {
+      enum 8P0D {
+        description
+          "8 priorities, 0 drop eligible";
+      }
+      enum 7P1D {
+        description
+          "7 priorities, 1 drop eligible";
+      }
+      enum 6P2D {
+        description
+          "6 priorities, 2 drop eligible";
+      }
+      enum 5P3D {
+        description
+          "5 priorities, 3 drop eligible";
+      }
+    }
+    description
+      "Priority Code Point selection types.";
+    reference
+      "12.6.2.5.3, 6.9.3 of IEEE Std 802.1Q-2022";
+  }
+  typedef protocol-frame-format-type {
+    type enumeration {
+      enum Ethernet {
+        description
+          "Ethernet frame format";
+      }
+      enum rfc1042 {
+        description
+          "RFC 1042 frame format";
+      }
+      enum snap8021H {
+        description
+          "SNAP 802.1H frame format";
+      }
+      enum snapOther {
+        description
+          "Other SNAP frame format";
+      }
+      enum llcOther {
+        description
+          "Other LLC frame format";
+      }
+    }
+    description
+      "A value representing the frame format to be matched.";
+    reference
+      "12.10.1.7.1 of IEEE Std 802.1Q-2022";
+  }
+  typedef ethertype-type {
+    type string {
+      pattern "[0-9a-fA-F]{2}-[0-9a-fA-F]{2}";
+    }
+    description
+      "The EtherType value represented in the canonical order defined by
+      IEEE 802. The canonical representation uses uppercase characters.";
+    reference
+      "9.2 of IEEE Std 802-2014";
+  }
+  typedef dot1q-tag-type {
+    type identityref {
+      base dot1q-vlan-type;
+    }
+    description
+      "Identifies a specific 802.1Q tag type";
+    reference
+      "9.5 IEEE Std 802.1Q-2022";
+  }
+  typedef traffic-class-type {
+    type uint8 {
+      range "0..7";
+    }
+    description
+      "This is the numerical value associated with a traffic class in a
+      Bridge. Larger values are associated with higher priority traffic
+      classes.";
+    reference
+      "3.273 of IEEE Std 802.1Q-2022";
+  }
+  grouping dot1q-tag-classifier-grouping {
+    description
+      "A grouping which represents an 802.1Q VLAN, matching both the
+      EtherType and a single VLAN Id.";
+    leaf tag-type {
+      type dot1q-tag-type;
+      mandatory true;
+      description
+        "VLAN type";
+    }
+    leaf vlan-id {
+      type vlanid;
+      mandatory true;
+      description
+        "VLAN Id";
+    }
+  }
+  grouping dot1q-tag-or-any-classifier-grouping {
+    description
+      "A grouping which represents an 802.1Q VLAN, matching both the
+      EtherType and a single VLAN Id or 'any' to match on any VLAN Id.";
+    leaf tag-type {
+      type dot1q-tag-type;
+      mandatory true;
+      description
+        "VLAN type";
+    }
+    leaf vlan-id {
+      type union {
+        type vlanid;
+        type enumeration {
+          enum any {
+            value 4095;
+            description
+              "Matches 'any' VLAN in the range 1 to 4094 that is not
+              matched by a more specific VLAN Id match";
+          }
+        }
+      }
+      mandatory true;
+      description
+        "VLAN Id or any";
+    }
+  }
+  grouping dot1q-tag-ranges-classifier-grouping {
+    description
+      "A grouping which represents an 802.1Q VLAN that matches a range
+      of VLAN Ids.";
+    leaf tag-type {
+      type dot1q-tag-type;
+      mandatory true;
+      description
+        "VLAN type";
+    }
+    leaf vlan-ids {
+      type vid-range-type;
+      mandatory true;
+      description
+        "VLAN Ids";
+    }
+  }
+  grouping dot1q-tag-ranges-or-any-classifier-grouping {
+    description
+      "A grouping which represents an 802.1Q VLAN, matching both the
+      EtherType and a single VLAN Id, ordered list of ranges, or 'any'
+      to match on any VLAN Id.";
+    leaf tag-type {
+      type dot1q-tag-type;
+      mandatory true;
+      description
+        "VLAN type";
+    }
+    leaf vlan-id {
+      type union {
+        type vid-range-type;
+        type enumeration {
+          enum any {
+            value 4095;
+            description
+              "Matches 'any' VLAN in the range 1 to 4094.";
+          }
+        }
+      }
+      mandatory true;
+      description
+        "VLAN Ids or any";
+    }
+  }
+  grouping priority-regeneration-table-grouping {
+    description
+      "The priority regeneration table provides the ability to map
+      incoming priority values on a per-Port basis, under management
+      control.";
+    reference
+      "6.9.4 of IEEE Std 802.1Q-2022";
+    leaf priority0 {
+      type priority-type;
+      default "0";
+      description
+        "Priority 0";
+      reference
+        "12.6.2.3, 6.9.4 of IEEE Std 802.1Q-2022";
+    }
+    leaf priority1 {
+      type priority-type;
+      default "1";
+      description
+        "Priority 1";
+      reference
+        "12.6.2.3, 6.9.4 of IEEE Std 802.1Q-2022";
+    }
+    leaf priority2 {
+      type priority-type;
+      default "2";
+      description
+        "Priority 2";
+      reference
+        "12.6.2.3, 6.9.4 of IEEE Std 802.1Q-2022";
+    }
+    leaf priority3 {
+      type priority-type;
+      default "3";
+      description
+        "Priority 3";
+      reference
+        "12.6.2.3, 6.9.4 of IEEE Std 802.1Q-2022";
+    }
+    leaf priority4 {
+      type priority-type;
+      default "4";
+      description
+        "Priority 4";
+      reference
+        "12.6.2.3, 6.9.4 of IEEE Std 802.1Q-2022";
+    }
+    leaf priority5 {
+      type priority-type;
+      default "5";
+      description
+        "Priority 5";
+      reference
+        "12.6.2.3, 6.9.4 of IEEE Std 802.1Q-2022";
+    }
+    leaf priority6 {
+      type priority-type;
+      default "6";
+      description
+        "Priority 6";
+      reference
+        "12.6.2.3, 6.9.4 of IEEE Std 802.1Q-2022";
+    }
+    leaf priority7 {
+      type priority-type;
+      default "7";
+      description
+        "Priority 7";
+      reference
+        "12.6.2.3, 6.9.4 of IEEE Std 802.1Q-2022";
+    }
+  }
+  grouping pcp-decoding-table-grouping {
+    description
+      "The Priority Code Point decoding table enables the decoding of
+      the priority and drop-eligible parameters from the PCP.";
+    reference
+      "6.9.3 of IEEE Std 802.1Q-2022";
+    list pcp-decoding-map {
+      key "pcp";
+      description
+        "This map associates the priority code point field found in the
+        VLAN to a priority and drop eligible value based upon the
+        priority code point selection type.";
+      leaf pcp {
+        type pcp-selection-type;
+        description
+          "The priority code point selection type.";
+        reference
+          "12.6.2.7, 6.9.3 of IEEE Std 802.1Q-2022";
+      }
+      list priority-map {
+        key "priority-code-point";
+        description
+          "This map associated a priority code point value to priority
+          and drop eligible parameters.";
+        leaf priority-code-point {
+          type priority-type;
+          description
+            "Priority associated with the pcp.";
+          reference
+            "12.6.2.7, 6.9.3 of IEEE Std 802.1Q-2022";
+        }
+        leaf priority {
+          type priority-type;
+          description
+            "Priority associated with the pcp.";
+          reference
+            "12.6.2.7, 6.9.3 of IEEE Std 802.1Q-2022";
+        }
+        leaf drop-eligible {
+          type boolean;
+          description
+            "Drop eligible value for pcp";
+          reference
+            "12.6.2.7, 6.9.3 of IEEE Std 802.1Q-2022";
+        }
+      }
+    }
+  }
+  grouping pcp-encoding-table-grouping {
+    description
+      "The Priority Code Point encoding table encodes the priority and
+      drop-eligible parameters in the PCP field of the VLAN tag.";
+    reference
+      "12.6.2.9, 6.9.3 of IEEE Std 802.1Q-2022";
+    list pcp-encoding-map {
+      key "pcp";
+      description
+        "This map associated the priority and drop-eligible parameters
+        to the priority used to encode the PCP of the VLAN based upon
+        the priority code point selection type.";
+      leaf pcp {
+        type pcp-selection-type;
+        description
+          "The priority code point selection type.";
+        reference
+          "12.6.2.7, 6.9.3 of IEEE Std 802.1Q-2022";
+      }
+      list priority-map {
+        key "priority dei";
+        description
+          "This map associated the priority and drop-eligible parameters
+          to the priority code point field of the VLAN tag.";
+        leaf priority {
+          type priority-type;
+          description
+            "Priority associated with the pcp.";
+          reference
+            "12.6.2.7, 6.9.3 of IEEE Std 802.1Q-2022";
+        }
+        leaf dei {
+          type boolean;
+          description
+            "The drop eligible value.";
+          reference
+            "12.6.2, 8.6.6 of IEEE Std 802.1Q-2022";
+        }
+        leaf priority-code-point {
+          type priority-type;
+          description
+            "PCP value for priority when DEI value";
+          reference
+            "12.6.2.9, 6.9.3 of IEEE Std 802.1Q-2022";
+        }
+      }
+    }
+  }
+  grouping service-access-priority-table-grouping {
+    description
+      "The Service Access Priority Table associates a received priority
+      with a serice access priority.";
+    reference
+      "12.6.2.17, 6.13.1 of IEEE Std 802.1Q-2022";
+    leaf priority0 {
+      type priority-type;
+      default "0";
+      description
+        "Service access priority value for priority 0";
+      reference
+        "12.6.2.17, 6.13.1 of IEEE Std 802.1Q-2022";
+    }
+    leaf priority1 {
+      type priority-type;
+      default "1";
+      description
+        "Service access priority value for priority 1";
+      reference
+        "12.6.2.17, 6.13.1 of IEEE Std 802.1Q-2022";
+    }
+    leaf priority2 {
+      type priority-type;
+      default "2";
+      description
+        "Service access priority value for priority 2";
+      reference
+        "12.6.2.17, 6.13.1 of IEEE Std 802.1Q-2022";
+    }
+    leaf priority3 {
+      type priority-type;
+      default "3";
+      description
+        "Service access priority value for priority 3";
+      reference
+        "12.6.2.17, 6.13.1 of IEEE Std 802.1Q-2022";
+    }
+    leaf priority4 {
+      type priority-type;
+      default "4";
+      description
+        "Service access priority value for priority 4";
+      reference
+        "12.6.2.17, 6.13.1 of IEEE Std 802.1Q-2022";
+    }
+    leaf priority5 {
+      type priority-type;
+      default "5";
+      description
+        "Service access priority value for priority 5";
+      reference
+        "12.6.2.17, 6.13.1 of IEEE Std 802.1Q-2022";
+    }
+    leaf priority6 {
+      type priority-type;
+      default "6";
+      description
+        "Service access priority value for priority 6";
+      reference
+        "12.6.2.17, 6.13.1 of IEEE Std 802.1Q-2022";
+    }
+    leaf priority7 {
+      type priority-type;
+      default "7";
+      description
+        "Service access priority value for priority 7";
+      reference
+        "12.6.2.17, 6.13.1 of IEEE Std 802.1Q-2022";
+    }
+  }
+  grouping traffic-class-table-grouping {
+    description
+      "The Traffic Class Table models the operations that can be
+      performed on, or inquire about, the current contents of the
+      Traffic Class Table (8.6.6) for a given Port.";
+    reference
+      "12.6.3, 8.6.6 of IEEE Std 802.1Q-2022";
+    list traffic-class-map {
+      key "priority";
+      description
+        "The priority index into the traffic class table.";
+      leaf priority {
+        type priority-type;
+        description
+          "The priority of the traffic class entry.";
+        reference
+          "8.6.6 of IEEE Std 802.1Q-2022";
+      }
+      list available-traffic-class {
+        key "num-traffic-class";
+        description
+          "The traffic class index associated with a given priority
+          within the traffic class table.";
+        reference
+          "8.6.6 of IEEE Std 802.1Q-2022";
+        leaf num-traffic-class {
+          type uint8 {
+            range "1..8";
+          }
+          description
+            "The available number of traffic classes.";
+          reference
+            "8.6.6 of IEEE Std 802.1Q-2022";
+        }
+        leaf traffic-class {
+          type traffic-class-type;
+          description
+            "The traffic class index associated with a given traffic
+            class entry.";
+          reference
+            "8.6.6 of IEEE Std 802.1Q-2022";
+        }
+      }
+    }
+  }
+  grouping transmission-selection-table-grouping {
+    description
+      "The Transmission Selection Algorithm Table models the operations
+      that can be performed on, or inquire about, the current contents
+      of the Transmission Selection Algorithm Table (12.20.2) for a
+      given Port.";
+    reference
+      "12.20.2, 8.6.8 of IEEE Std 802.1Q-2022";
+    list transmission-selection-algorithm-map {
+      key "traffic-class";
+      description
+        "The traffic class to index into the transmission selection
+        table.";
+      leaf traffic-class {
+        type traffic-class-type;
+        description
+          "The traffic class of the entry.";
+        reference
+          "8.6.6 of IEEE Std 802.1Q-2022";
+      }
+      leaf transmission-selection-algorithm {
+        type identityref {
+          base dot1q-types:transmission-selection-algorithm;
+        }
+        description
+          "Transmission selection algorithm";
+        reference
+          "8.6.8, Table 8-6 of IEEE Std 802.1Q-2022";
+      }
+    }
+  }
+  grouping port-map-grouping {
+    description
+      "A set of control indicators, one for each Port. A Port Map,
+      containing a control element for each outbound Port";
+    reference
+      "8.8.1, 8.8.2 of IEEE Std 802.1Q-2022";
+    list port-map {
+      key "port-ref";
+      description
+        "The list of entries composing the port map.";
+      leaf port-ref {
+        type port-number-type;
+        description
+          "The interface port reference associated with this map.";
+        reference
+          "8.8.1 of IEEE Std 802.1Q-2022";
+      }
+      choice map-type {
+        description
+          "Type of port map";
+        container static-filtering-entries {
+          description
+            "Static filtering entries attributes.";
+          leaf control-element {
+            type enumeration {
+              enum forward {
+                description
+                  "Forwarded, independently of any dynamic filtering
+                  information held by the FDB.";
+              }
+              enum filter {
+                description
+                  "Filtered, independently of any dynamic filtering
+                  information.";
+              }
+              enum forward-filter {
+                description
+                  "Forwarded or filtered on the basis of dynamic
+                  filtering information, or on the basis of the default
+                  Group filtering behavior for the outbound Port (8.8.6)
+                  if no dynamic filtering information is present
+                  specifically for the MAC address.";
+              }
+            }
+            description
+              "containing a control element for each outbound Port,
+              specifying that a frame with a destination MAC address,
+              and in the case of VLAN Bridge components, VID that meets
+              this specification.";
+            reference
+              "8.8.1 of IEEE Std 802.1Q-2022";
+          }
+          leaf connection-identifier {
+            type port-number-type;
+            description
+              "A Port MAP may contain a connection identifier (8.8.12)
+              for each outbound port. The connection identifier may be
+              associated with the Bridge Port value maintained in a
+              Dynamic Filtering Entry of the FDB for Bridge Ports.";
+            reference
+              "8.8.1, 8.8.12 of IEEE Std 802.1Q-2022";
+          }
+        }
+        container static-vlan-registration-entries {
+          description
+            "Static VLAN registration entries.";
+          leaf registrar-admin-control {
+            type enumeration {
+              enum fixed-new-ignored {
+                description
+                  "Registration Fixed (New ignored).";
+              }
+              enum fixed-new-propagated {
+                description
+                  "Registration Fixed (New propagated.";
+              }
+              enum forbidden {
+                description
+                  "Registration Forbidden.";
+              }
+              enum normal {
+                description
+                  "Normal Registration.";
+              }
+            }
+            description
+              "The Registrar Administrative Control values for MVRP and
+              MIRP for the VID.";
+            reference
+              "8.8.2 of IEEE Std 802.1Q-2022";
+          }
+          leaf vlan-transmitted {
+            type enumeration {
+              enum tagged {
+                description
+                  "VLAN-tagged";
+              }
+              enum untagged {
+                description
+                  "VLAN-untagged";
+              }
+            }
+            description
+              "Whether frames are to be VLAN-tagged or untagged when
+              transmitted.";
+            reference
+              "8.8.2 of IEEE Std 802.1Q-2022";
+          }
+        }
+        container mac-address-registration-entries {
+          description
+            "MAC address registration entries attributes.";
+          leaf control-element {
+            type enumeration {
+              enum registered {
+                description
+                  "Forwarded, independently of any dynamic filtering
+                  information held by the FDB.";
+              }
+              enum not-registered {
+                description
+                  "Filtered, independently of any dynamic filtering
+                  information.";
+              }
+            }
+            description
+              "containing a control element for each outbound Port,
+              specifying that a frame with a destination MAC address,
+              and in the case of VLAN Bridge components, VID that meets
+              this specification.";
+            reference
+              "8.8.4 of IEEE Std 802.1Q-2022";
+          }
+        }
+        container dynamic-vlan-registration-entries {
+          description
+            "Dynamic VLAN registration entries attributes.";
+          leaf control-element {
+            type enumeration {
+              enum registered {
+                description
+                  "Forwarded, independently of any dynamic filtering
+                  information held by the FDB.";
+              }
+            }
+            description
+              "containing a control element for each outbound Port,
+              specifying that a frame with a destination MAC address,
+              and in the case of VLAN Bridge components, VID that meets
+              this specification.";
+            reference
+              "8.8.5 of IEEE Std 802.1Q-2022";
+          }
+        }
+        container dynamic-reservation-entries {
+          description
+            "Dynamic reservation entries attributes.";
+          leaf control-element {
+            type enumeration {
+              enum forward {
+                description
+                  "Forwarded, independently of any dynamic filtering
+                  information held by the FDB.";
+              }
+              enum filter {
+                description
+                  "Filtered, independently of any dynamic filtering
+                  information.";
+              }
+            }
+            description
+              "Containing a control element for each outbound Port,
+              specifying that a frame with a destination MAC address,
+              and in the case of VLAN Bridge components, VID that meets
+              this specification.";
+            reference
+              "8.8.7 of IEEE Std 802.1Q-2022";
+          }
+        }
+        container dynamic-filtering-entries {
+          description
+            "Dynamic filtering entries attributes.";
+          leaf control-element {
+            type enumeration {
+              enum forward {
+                description
+                  "Forwarded, independently of any dynamic filtering
+                  information held by the FDB.";
+              }
+            }
+            description
+              "Containing a control element for each outbound Port,
+              specifying that a frame with a destination MAC address,
+              and in the case of VLAN Bridge components, VID that meets
+              this specification.";
+            reference
+              "8.8.3 of IEEE Std 802.1Q-2022";
+          }
+        }
+      }
+    }
+  }
+  grouping bridge-port-statistics-grouping {
+    description
+      "Grouping of bridge port statistics.";
+    reference
+      "12.6.1.1.3 of IEEE Std 802.1Q-2022";
+    leaf delay-exceeded-discards {
+      type yang:counter64;
+      description
+        "The number of frames discarded by this port due to excessive
+        transit delay through the Bridge. It is incremented by both
+        transparent and source route Bridges.";
+      reference
+        "12.6.1.1.3, 8.6.6 of IEEE Std 802.1Q-2022";
+    }
+    leaf mtu-exceeded-discards {
+      type yang:counter64;
+      description
+        "The number of frames discarded by this port due to an excessive
+        size. It is incremented by both transparent and source route
+        Bridges.";
+      reference
+        "Item g) in 12.6.1.1.3 of IEEE Std 802.1Q-2022";
+    }
+    leaf frame-rx {
+      type yang:counter64;
+      description
+        "The number of frames that have been received by this port from
+        its segment. Note that a frame received on the interface
+        corresponding to this port is only counted by this object if and
+        only if it is for a protocol being processed by the local
+        bridging function, including Bridge management frames.";
+      reference
+        "12.6.1.1.3 of IEEE Std 802.1Q-2022";
+    }
+    leaf octets-rx {
+      type yang:counter64;
+      description
+        "The total number of octets in all valid frames received
+        (including BPDUs, frames addressed to the Bridge as an end
+        station, and frames that were submitted to the Forwarding
+        Process).";
+      reference
+        "12.6.1.1.3 of IEEE Std 802.1Q-2022";
+    }
+    leaf frame-tx {
+      type yang:counter64;
+      description
+        "The number of frames that have been transmitted by this port to
+        its segment. Note that a frame transmitted on the interface
+        corresponding to this port is only counted by this object if and
+        only if it is for a protocol being processed by the local
+        bridging function, including Bridge management frames.";
+    }
+    leaf octets-tx {
+      type yang:counter64;
+      description
+        "The total number of octets that have been transmitted by this
+        port to its segment.";
+    }
+    leaf discard-inbound {
+      type yang:counter64;
+      description
+        "Count of received valid frames that were discarded (i.e.,
+        filtered) by the Forwarding Process.";
+      reference
+        "12.6.1.1.3 of IEEE Std 802.1Q-2022";
+    }
+    leaf forward-outbound {
+      type yang:counter64;
+      description
+        "The number of frames forwarded to the associated MAC Entity
+        (8.5).";
+      reference
+        "12.6.1.1.3 of IEEE Std 802.1Q-2022";
+    }
+    leaf discard-lack-of-buffers {
+      type yang:counter64;
+      description
+        "The count of frames that were to be transmitted through the
+        associated Port but were discarded due to lack of buffers.";
+      reference
+        "12.6.1.1.3 of IEEE Std 802.1Q-2022";
+    }
+    leaf discard-transit-delay-exceeded {
+      type yang:counter64;
+      description
+        "The number of frames discarded by this port due to excessive
+        transit delay through the Bridge. It is incremented by both
+        transparent and source route Bridges.";
+      reference
+        "12.6.1.1.3 of IEEE Std 802.1Q-2022";
+    }
+    leaf discard-on-error {
+      type yang:counter64;
+      description
+        "The number of frames that were to be forwarded on the
+        associated MAC but could not be transmitted (e.g., frame would
+        be too large, 6.5.8).";
+      reference
+        "12.6.1.1.3 of IEEE Std 802.1Q-2022";
+    }
+  }
+}
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/mwt/ieee802-dot1q-types.yang-generated.tdltx b/plugins/org.etsi.mts.tdl.yang2tdl/samples/mwt/ieee802-dot1q-types.yang-generated.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..7076fe4a4b7027f89c9ef97128591a70cb223e81
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/mwt/ieee802-dot1q-types.yang-generated.tdltx
@@ -0,0 +1,5 @@
+Package generated_from_ieee802_dot1q_types_yang {
+    Type String
+    Type TODO_RESOLVE_REFERENCED
+    Use "ieee802-dot1q-types.yang" as SOURCE_MAPPING
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/mwt/ieee802-types.yang b/plugins/org.etsi.mts.tdl.yang2tdl/samples/mwt/ieee802-types.yang
new file mode 100644
index 0000000000000000000000000000000000000000..f7bce9974e0d04c7dba82729dd3642d349747896
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/mwt/ieee802-types.yang
@@ -0,0 +1,287 @@
+module ieee802-types {
+  namespace urn:ieee:std:802.1Q:yang:ieee802-types;
+  prefix ieee;
+  organization
+    "IEEE 802.1 Working Group";
+  contact
+    "WG-URL: http://ieee802.org/1/
+    WG-EMail: stds-802-1-l@ieee.org
+    
+    Contact: IEEE 802.1 Working Group Chair
+    Postal: C/O IEEE 802.1 Working Group
+           IEEE Standards Association
+           445 Hoes Lane
+           Piscataway, NJ 08854
+           USA
+    
+    E-mail: stds-802-1-chairs@ieee.org";
+  description
+    "This module contains a collection of generally useful derived data
+    types for IEEE YANG models.
+    
+    Copyright (C) IEEE (2022).
+    
+    This version of this YANG module is part of IEEE Std 802.1Q; see the
+    standard itself for full legal notices.";
+  revision 2022-05-19 {
+    description
+      "Published as part of IEEE Std 802.1Q-2022.";
+    reference
+      "IEEE Std 802.1Q-2022, Bridges and Bridged Networks.";
+  }
+  revision 2021-08-25 {
+    description
+      "Published as part of IEEE Std 802.1ABcu";
+    reference
+      "IEEE Std 802.1AB-2016";
+  }
+  revision 2020-06-04 {
+    description
+      "Published as part of IEEE Std 802.1Qcx-2020. Second version.";
+    reference
+      "IEEE Std 802.1Qcx-2020, Bridges and Bridged Networks - YANG Data
+      Model for Connectivity Fault Management.";
+  }
+  revision 2018-03-07 {
+    description
+      "Published as part of IEEE Std 802.1Q-2018. Initial version.";
+    reference
+      "IEEE Std 802.1Q-2018, Bridges and Bridged Networks.";
+  }
+  typedef mac-address {
+    type string {
+      pattern "[0-9a-fA-F]{2}(-[0-9a-fA-F]{2}){5}";
+    }
+    description
+      "The mac-address type represents a MAC address in the canonical
+      format and hexadecimal format specified by IEEE Std 802. The
+      hexidecimal representation uses uppercase characters.";
+    reference
+      "3.1, 8.1 of IEEE Std 802-2014";
+  }
+  typedef chassis-id-subtype-type {
+    type enumeration {
+      enum chassis-component {
+        value 1;
+        description
+          "Represents a chassis identifier based on the value of
+          entPhysicalAlias object (defined in IETF RFC 2737) for a
+          chassis component (i.e., an entPhysicalClass value of
+          chassis(3))";
+      }
+      enum interface-alias {
+        value 2;
+        description
+          "Represents a chassis identifier based on the value of ifAlias
+          object (defined in IETF RFC 2863) for an interface on the
+          containing chassis.";
+      }
+      enum port-component {
+        value 3;
+        description
+          "Represents a chassis identifier based on the value of
+          entPhysicalAlias object (defined in IETF RFC 2737) for a port
+          or backplane component (i.e., entPhysicalClass value of
+          port(10) or backplane(4)), within the containing chassis.";
+      }
+      enum mac-address {
+        value 4;
+        description
+          "Represents a chassis identifier based on the value of a
+          unicast source address (encoded in network byte order and IEEE
+          802.3 canonical bit order), of a port on the containing
+          chassis as defined in IEEE Std 802-2001.";
+      }
+      enum network-address {
+        value 5;
+        description
+          "Represents a chassis identifier based on a network address,
+          associated with a particular chassis. The encoded address is
+          actually composed of two fields. The first field is a single
+          octet, representing the IANA AddressFamilyNumbers value for
+          the specific address type, and the second field is the network
+          address value.";
+      }
+      enum interface-name {
+        value 6;
+        description
+          "Represents a chassis identifier based on the value of ifName
+          object (defined in IETF RFC 2863) for an interface on the
+          containing chassis.";
+      }
+      enum local {
+        value 7;
+        description
+          "Represents a chassis identifier based on a locally defined
+          value.";
+      }
+    }
+    description
+      "The source of a chassis identifier.";
+    reference
+      "IEEE Std 802-2014;" +
+      "IETF RFC 2737;" +
+      "IETF RFC 2863";
+  }
+  typedef chassis-id-type {
+    type string {
+      length "1..255";
+    }
+    description
+      "The format of a chassis identifier string. Objects of this type
+      are always used with an associated lldp-chassis-is-subtype object,
+      which identifies the format of the particular lldp-chassis-id
+      object instance.
+      
+      If the associated lldp-chassis-id-subtype object has a value of
+      chassis-component, then the octet string identifies a particular
+      instance of the entPhysicalAlias object (defined in IETF RFC 2737)
+      for a chassis component (i.e., an entPhysicalClass value of
+      chassis(3)).
+      
+      If the associated lldp-chassis-id-subtype object has a value of
+      interface-alias, then the octet string identifies a particular
+      instance of the ifAlias object (defined in IETF RFC 2863) for an
+      interface on the containing chassis. If the particular ifAlias
+      object does not contain any values, another chassis identifier
+      type should be used.
+      
+      If the associated lldp-chassis-id-subtype object has a value of
+      port-component, then the octet string identifies a particular
+      instance of the entPhysicalAlias object (defined in IETF RFC 2737)
+      for a port or backplane component within the containing chassis.
+      
+      If the associated lldp-chassis-id-subtype object has a value of
+      mac-address, then this string identifies a particular unicast
+      source address (encoded in network byte order and IEEE 802.3
+      canonical bit order), of a port on the containing chassis as
+      defined in IEEE Std 802-2001.
+      
+      If the associated lldp-chassis-id-subtype object has a value of
+      network-address, then this string identifies a particular network
+      address, encoded in network byte order, associated with one or
+      more ports on the containing chassis. The first octet contains the
+      IANA Address Family Numbers enumeration value for the specific
+      address type, and octets 2 through N contain the network address
+      value in network byte order.
+      
+      If the associated lldp-chassis-id-subtype object has a value of
+      interface-name, then the octet string identifies a particular
+      instance of the ifName object (defined in IETF RFC 2863) for an
+      interface on the containing chassis. If the particular ifName
+      object does not contain any values, another chassis identifier
+      type should be used.
+      
+      If the associated lldp-chassis-id-subtype object has a value of
+      local, then this string identifies a locally assigned Chassis ID.";
+    reference
+      "IEEE Std 802-2014;" +
+      "IETF RFC 2737;" +
+      "IETF RFC 2863";
+  }
+  typedef port-id-subtype-type {
+    type enumeration {
+      enum interface-alias {
+        value 1;
+        description
+          "Represents a port identifier based on the ifAlias MIB object,
+          defined in IETF RFC 2863.";
+      }
+      enum port-component {
+        value 2;
+        description
+          "Represents a port identifier based on the value of
+          entPhysicalAlias (defined in IETF RFC 2737) for a port
+          component (i.e., entPhysicalClass value of port(10)), within
+          the containing chassis.";
+      }
+      enum mac-address {
+        value 3;
+        description
+          "Represents a port identifier based on a unicast source
+          address (encoded in network byte order and IEEE 802.3
+          canonical bit order), which has been detected by the agent and
+          associated with a particular port (IEEE Std 802-2001).";
+      }
+      enum network-address {
+        value 4;
+        description
+          "Represents a port identifier based on a network address,
+          detected by the agent and associated with a particular port.";
+      }
+      enum interface-name {
+        value 5;
+        description
+          "Represents a port identifier based on the ifName MIB object,
+          defined in IETF RFC 2863.";
+      }
+      enum agent-circuit-id {
+        value 6;
+        description
+          "Represents a port identifier based on the agent-local
+          identifier of the circuit (defined in RFC 3046), detected by
+          the agent and associated with a particular port.";
+      }
+      enum local {
+        value 7;
+        description
+          "Represents a port identifier based on a value locally
+          assigned.";
+      }
+    }
+    description
+      "The source of a particular type of port identifier used in the
+      LLDP YANG module.";
+  }
+  typedef port-id-type {
+    type string {
+      length "1..255";
+    }
+    description
+      "The format of a port identifier string. Objects of this type are
+      always used with an associated port-id-subtype object, which
+      identifies the format of the particular lldp-port-id object
+      instance.
+      
+      If the associated port-id-subtype object has a value of
+      interface-alias, then the octet string identifies a particular
+      instance of the ifAlias object (defined in IETF RFC 2863). If the
+      particular ifAlias object does not contain any values, another
+      port identifier type should be used.
+      
+      If the associated port-id-subtype object has a value of
+      port-component, then the octet string identifies a particular
+      instance of the entPhysicalAlias object (defined in IETF RFC 2737)
+      for a port or backplane component.
+      
+      If the associated port-id-subtype object has a value of
+      mac-address, then this string identifies a particular unicast
+      source address (encoded in network byte order and IEEE 802.3
+      canonical bit order) associated with the port (IEEE Std 802-2001).
+      
+      If the associated port-id-subtype object has a value of
+      network-address, then this string identifies a network address
+      associated with the port. The first octet contains the IANA
+      AddressFamilyNumbers enumeration value for the specific address
+      type, and octets 2 through N contain the networkAddress address
+      value in network byte order.
+      
+      If the associated port-id-subtype object has a value of
+      interface-name, then the octet string identifies a particular
+      instance of the ifName object (defined in IETF RFC 2863). If the
+      particular ifName object does not contain any values, another port
+      identifier type should be used.
+      
+      If the associated port-id-subtype object has a value of
+      agent-circuit-id, then this string identifies a agent-local
+      identifier of the circuit (defined in RFC 3046).
+      
+      If the associated port-id-subtype object has a value of
+      local, then this string identifies a locally assigned port ID.";
+    reference
+      "IEEE Std 802-2014;" +
+      "IETF RFC 2737;" +
+      "IETF RFC 2863," +
+      "IETF RFC 3046";
+  }
+}
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/mwt/ietf-interfaces@2018-02-20.yang b/plugins/org.etsi.mts.tdl.yang2tdl/samples/mwt/ietf-interfaces@2018-02-20.yang
new file mode 100644
index 0000000000000000000000000000000000000000..f66c205ce076e65b2ded1d388c944a91829a48b5
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/mwt/ietf-interfaces@2018-02-20.yang
@@ -0,0 +1,1123 @@
+module ietf-interfaces {
+  yang-version 1.1;
+  namespace "urn:ietf:params:xml:ns:yang:ietf-interfaces";
+  prefix if;
+
+  import ietf-yang-types {
+    prefix yang;
+  }
+
+  organization
+    "IETF NETMOD (Network Modeling) Working Group";
+
+  contact
+    "WG Web:   <https://datatracker.ietf.org/wg/netmod/>
+     WG List:  <mailto:netmod@ietf.org>
+
+     Editor:   Martin Bjorklund
+               <mailto:mbj@tail-f.com>";
+
+  description
+    "This module contains a collection of YANG definitions for
+     managing network interfaces.
+
+     Copyright (c) 2018 IETF Trust and the persons identified as
+     authors of the code.  All rights reserved.
+
+     Redistribution and use in source and binary forms, with or
+     without modification, is permitted pursuant to, and subject
+     to the license terms contained in, the Simplified BSD License
+     set forth in Section 4.c of the IETF Trust's Legal Provisions
+     Relating to IETF Documents
+     (https://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC 8343; see
+     the RFC itself for full legal notices.";
+
+  revision 2018-02-20 {
+    description
+      "Updated to support NMDA.";
+    reference
+      "RFC 8343: A YANG Data Model for Interface Management";
+  }
+
+  revision 2014-05-08 {
+    description
+      "Initial revision.";
+    reference
+      "RFC 7223: A YANG Data Model for Interface Management";
+  }
+
+  /*
+   * Typedefs
+   */
+
+  typedef interface-ref {
+    type leafref {
+      path "/if:interfaces/if:interface/if:name";
+    }
+    description
+      "This type is used by data models that need to reference
+       interfaces.";
+  }
+
+  /*
+   * Identities
+   */
+
+  identity interface-type {
+    description
+      "Base identity from which specific interface types are
+       derived.";
+  }
+
+  /*
+   * Features
+   */
+
+  feature arbitrary-names {
+    description
+      "This feature indicates that the device allows user-controlled
+       interfaces to be named arbitrarily.";
+  }
+  feature pre-provisioning {
+    description
+      "This feature indicates that the device supports
+       pre-provisioning of interface configuration, i.e., it is
+       possible to configure an interface whose physical interface
+       hardware is not present on the device.";
+  }
+  feature if-mib {
+    description
+      "This feature indicates that the device implements
+       the IF-MIB.";
+    reference
+      "RFC 2863: The Interfaces Group MIB";
+  }
+
+  /*
+   * Data nodes
+   */
+
+  container interfaces {
+    description
+      "Interface parameters.";
+
+    list interface {
+      key "name";
+
+      description
+        "The list of interfaces on the device.
+
+         The status of an interface is available in this list in the
+         operational state.  If the configuration of a
+         system-controlled interface cannot be used by the system
+         (e.g., the interface hardware present does not match the
+         interface type), then the configuration is not applied to
+         the system-controlled interface shown in the operational
+         state.  If the configuration of a user-controlled interface
+         cannot be used by the system, the configured interface is
+         not instantiated in the operational state.
+
+         System-controlled interfaces created by the system are
+         always present in this list in the operational state,
+         whether or not they are configured.";
+
+     leaf name {
+        type string;
+        description
+          "The name of the interface.
+
+           A device MAY restrict the allowed values for this leaf,
+           possibly depending on the type of the interface.
+           For system-controlled interfaces, this leaf is the
+           device-specific name of the interface.
+
+           If a client tries to create configuration for a
+           system-controlled interface that is not present in the
+           operational state, the server MAY reject the request if
+           the implementation does not support pre-provisioning of
+           interfaces or if the name refers to an interface that can
+           never exist in the system.  A Network Configuration
+           Protocol (NETCONF) server MUST reply with an rpc-error
+           with the error-tag 'invalid-value' in this case.
+
+           If the device supports pre-provisioning of interface
+           configuration, the 'pre-provisioning' feature is
+           advertised.
+
+           If the device allows arbitrarily named user-controlled
+           interfaces, the 'arbitrary-names' feature is advertised.
+
+           When a configured user-controlled interface is created by
+           the system, it is instantiated with the same name in the
+           operational state.
+
+           A server implementation MAY map this leaf to the ifName
+           MIB object.  Such an implementation needs to use some
+           mechanism to handle the differences in size and characters
+           allowed between this leaf and ifName.  The definition of
+           such a mechanism is outside the scope of this document.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifName";
+      }
+
+      leaf description {
+        type string;
+        description
+          "A textual description of the interface.
+
+           A server implementation MAY map this leaf to the ifAlias
+           MIB object.  Such an implementation needs to use some
+           mechanism to handle the differences in size and characters
+           allowed between this leaf and ifAlias.  The definition of
+           such a mechanism is outside the scope of this document.
+
+           Since ifAlias is defined to be stored in non-volatile
+           storage, the MIB implementation MUST map ifAlias to the
+           value of 'description' in the persistently stored
+           configuration.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifAlias";
+      }
+
+      leaf type {
+        type identityref {
+          base interface-type;
+        }
+        mandatory true;
+        description
+          "The type of the interface.
+
+           When an interface entry is created, a server MAY
+           initialize the type leaf with a valid value, e.g., if it
+           is possible to derive the type from the name of the
+           interface.
+
+           If a client tries to set the type of an interface to a
+           value that can never be used by the system, e.g., if the
+           type is not supported or if the type does not match the
+           name of the interface, the server MUST reject the request.
+           A NETCONF server MUST reply with an rpc-error with the
+           error-tag 'invalid-value' in this case.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifType";
+      }
+
+      leaf enabled {
+        type boolean;
+        default "true";
+        description
+          "This leaf contains the configured, desired state of the
+           interface.
+
+           Systems that implement the IF-MIB use the value of this
+           leaf in the intended configuration to set
+           IF-MIB.ifAdminStatus to 'up' or 'down' after an ifEntry
+           has been initialized, as described in RFC 2863.
+
+           Changes in this leaf in the intended configuration are
+           reflected in ifAdminStatus.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifAdminStatus";
+      }
+
+      leaf link-up-down-trap-enable {
+        if-feature if-mib;
+        type enumeration {
+          enum enabled {
+            value 1;
+            description
+              "The device will generate linkUp/linkDown SNMP
+               notifications for this interface.";
+          }
+          enum disabled {
+            value 2;
+            description
+              "The device will not generate linkUp/linkDown SNMP
+               notifications for this interface.";
+          }
+        }
+        description
+          "Controls whether linkUp/linkDown SNMP notifications
+           should be generated for this interface.
+
+           If this node is not configured, the value 'enabled' is
+           operationally used by the server for interfaces that do
+           not operate on top of any other interface (i.e., there are
+           no 'lower-layer-if' entries), and 'disabled' otherwise.";
+        reference
+          "RFC 2863: The Interfaces Group MIB -
+                     ifLinkUpDownTrapEnable";
+      }
+
+      leaf admin-status {
+        if-feature if-mib;
+        type enumeration {
+          enum up {
+            value 1;
+            description
+              "Ready to pass packets.";
+          }
+          enum down {
+            value 2;
+            description
+              "Not ready to pass packets and not in some test mode.";
+          }
+          enum testing {
+            value 3;
+            description
+              "In some test mode.";
+          }
+        }
+        config false;
+        mandatory true;
+        description
+          "The desired state of the interface.
+
+           This leaf has the same read semantics as ifAdminStatus.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifAdminStatus";
+      }
+
+      leaf oper-status {
+        type enumeration {
+          enum up {
+            value 1;
+            description
+              "Ready to pass packets.";
+          }
+          enum down {
+            value 2;
+
+            description
+              "The interface does not pass any packets.";
+          }
+          enum testing {
+            value 3;
+            description
+              "In some test mode.  No operational packets can
+               be passed.";
+          }
+          enum unknown {
+            value 4;
+            description
+              "Status cannot be determined for some reason.";
+          }
+          enum dormant {
+            value 5;
+            description
+              "Waiting for some external event.";
+          }
+          enum not-present {
+            value 6;
+            description
+              "Some component (typically hardware) is missing.";
+          }
+          enum lower-layer-down {
+            value 7;
+            description
+              "Down due to state of lower-layer interface(s).";
+          }
+        }
+        config false;
+        mandatory true;
+        description
+          "The current operational state of the interface.
+
+           This leaf has the same semantics as ifOperStatus.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifOperStatus";
+      }
+
+      leaf last-change {
+        type yang:date-and-time;
+        config false;
+        description
+          "The time the interface entered its current operational
+           state.  If the current state was entered prior to the
+           last re-initialization of the local network management
+           subsystem, then this node is not present.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifLastChange";
+      }
+
+      leaf if-index {
+        if-feature if-mib;
+        type int32 {
+          range "1..2147483647";
+        }
+        config false;
+        mandatory true;
+        description
+          "The ifIndex value for the ifEntry represented by this
+           interface.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifIndex";
+      }
+
+      leaf phys-address {
+        type yang:phys-address;
+        config false;
+        description
+          "The interface's address at its protocol sub-layer.  For
+           example, for an 802.x interface, this object normally
+           contains a Media Access Control (MAC) address.  The
+           interface's media-specific modules must define the bit
+           and byte ordering and the format of the value of this
+           object.  For interfaces that do not have such an address
+           (e.g., a serial line), this node is not present.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifPhysAddress";
+      }
+
+      leaf-list higher-layer-if {
+        type interface-ref;
+        config false;
+        description
+          "A list of references to interfaces layered on top of this
+           interface.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifStackTable";
+      }
+
+      leaf-list lower-layer-if {
+        type interface-ref;
+        config false;
+
+        description
+          "A list of references to interfaces layered underneath this
+           interface.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifStackTable";
+      }
+
+      leaf speed {
+        type yang:gauge64;
+        units "bits/second";
+        config false;
+        description
+            "An estimate of the interface's current bandwidth in bits
+             per second.  For interfaces that do not vary in
+             bandwidth or for those where no accurate estimation can
+             be made, this node should contain the nominal bandwidth.
+             For interfaces that have no concept of bandwidth, this
+             node is not present.";
+        reference
+          "RFC 2863: The Interfaces Group MIB -
+                     ifSpeed, ifHighSpeed";
+      }
+
+      container statistics {
+        config false;
+        description
+          "A collection of interface-related statistics objects.";
+
+        leaf discontinuity-time {
+          type yang:date-and-time;
+          mandatory true;
+          description
+            "The time on the most recent occasion at which any one or
+             more of this interface's counters suffered a
+             discontinuity.  If no such discontinuities have occurred
+             since the last re-initialization of the local management
+             subsystem, then this node contains the time the local
+             management subsystem re-initialized itself.";
+        }
+
+        leaf in-octets {
+          type yang:counter64;
+          description
+            "The total number of octets received on the interface,
+             including framing characters.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifHCInOctets";
+        }
+
+        leaf in-unicast-pkts {
+          type yang:counter64;
+          description
+            "The number of packets, delivered by this sub-layer to a
+             higher (sub-)layer, that were not addressed to a
+             multicast or broadcast address at this sub-layer.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifHCInUcastPkts";
+        }
+
+        leaf in-broadcast-pkts {
+          type yang:counter64;
+          description
+            "The number of packets, delivered by this sub-layer to a
+             higher (sub-)layer, that were addressed to a broadcast
+             address at this sub-layer.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB -
+                       ifHCInBroadcastPkts";
+        }
+
+        leaf in-multicast-pkts {
+          type yang:counter64;
+          description
+            "The number of packets, delivered by this sub-layer to a
+             higher (sub-)layer, that were addressed to a multicast
+             address at this sub-layer.  For a MAC-layer protocol,
+             this includes both Group and Functional addresses.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB -
+                       ifHCInMulticastPkts";
+        }
+
+        leaf in-discards {
+          type yang:counter32;
+          description
+            "The number of inbound packets that were chosen to be
+             discarded even though no errors had been detected to
+             prevent their being deliverable to a higher-layer
+             protocol.  One possible reason for discarding such a
+             packet could be to free up buffer space.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifInDiscards";
+        }
+
+        leaf in-errors {
+          type yang:counter32;
+          description
+            "For packet-oriented interfaces, the number of inbound
+             packets that contained errors preventing them from being
+             deliverable to a higher-layer protocol.  For character-
+             oriented or fixed-length interfaces, the number of
+             inbound transmission units that contained errors
+             preventing them from being deliverable to a higher-layer
+             protocol.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifInErrors";
+        }
+
+        leaf in-unknown-protos {
+          type yang:counter32;
+
+          description
+            "For packet-oriented interfaces, the number of packets
+             received via the interface that were discarded because
+             of an unknown or unsupported protocol.  For
+             character-oriented or fixed-length interfaces that
+             support protocol multiplexing, the number of
+             transmission units received via the interface that were
+             discarded because of an unknown or unsupported protocol.
+             For any interface that does not support protocol
+             multiplexing, this counter is not present.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos";
+        }
+
+        leaf out-octets {
+          type yang:counter64;
+          description
+            "The total number of octets transmitted out of the
+             interface, including framing characters.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifHCOutOctets";
+        }
+
+        leaf out-unicast-pkts {
+          type yang:counter64;
+          description
+            "The total number of packets that higher-level protocols
+             requested be transmitted and that were not addressed
+             to a multicast or broadcast address at this sub-layer,
+             including those that were discarded or not sent.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifHCOutUcastPkts";
+        }
+
+        leaf out-broadcast-pkts {
+          type yang:counter64;
+          description
+            "The total number of packets that higher-level protocols
+             requested be transmitted and that were addressed to a
+             broadcast address at this sub-layer, including those
+             that were discarded or not sent.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB -
+                       ifHCOutBroadcastPkts";
+        }
+
+        leaf out-multicast-pkts {
+          type yang:counter64;
+          description
+            "The total number of packets that higher-level protocols
+             requested be transmitted and that were addressed to a
+             multicast address at this sub-layer, including those
+             that were discarded or not sent.  For a MAC-layer
+             protocol, this includes both Group and Functional
+             addresses.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB -
+                       ifHCOutMulticastPkts";
+        }
+
+        leaf out-discards {
+          type yang:counter32;
+          description
+            "The number of outbound packets that were chosen to be
+             discarded even though no errors had been detected to
+             prevent their being transmitted.  One possible reason
+             for discarding such a packet could be to free up buffer
+             space.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifOutDiscards";
+        }
+
+        leaf out-errors {
+          type yang:counter32;
+          description
+            "For packet-oriented interfaces, the number of outbound
+             packets that could not be transmitted because of errors.
+             For character-oriented or fixed-length interfaces, the
+             number of outbound transmission units that could not be
+             transmitted because of errors.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifOutErrors";
+        }
+      }
+
+    }
+  }
+
+  /*
+   * Legacy typedefs
+   */
+
+  typedef interface-state-ref {
+    type leafref {
+      path "/if:interfaces-state/if:interface/if:name";
+    }
+    status deprecated;
+    description
+      "This type is used by data models that need to reference
+       the operationally present interfaces.";
+  }
+
+  /*
+   * Legacy operational state data nodes
+   */
+
+  container interfaces-state {
+    config false;
+    status deprecated;
+    description
+      "Data nodes for the operational state of interfaces.";
+
+    list interface {
+      key "name";
+      status deprecated;
+
+      description
+        "The list of interfaces on the device.
+
+         System-controlled interfaces created by the system are
+         always present in this list, whether or not they are
+         configured.";
+
+      leaf name {
+        type string;
+        status deprecated;
+        description
+          "The name of the interface.
+
+           A server implementation MAY map this leaf to the ifName
+           MIB object.  Such an implementation needs to use some
+           mechanism to handle the differences in size and characters
+           allowed between this leaf and ifName.  The definition of
+           such a mechanism is outside the scope of this document.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifName";
+      }
+
+      leaf type {
+        type identityref {
+          base interface-type;
+        }
+        mandatory true;
+        status deprecated;
+        description
+          "The type of the interface.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifType";
+      }
+
+      leaf admin-status {
+        if-feature if-mib;
+        type enumeration {
+          enum up {
+            value 1;
+            description
+              "Ready to pass packets.";
+          }
+          enum down {
+            value 2;
+            description
+              "Not ready to pass packets and not in some test mode.";
+          }
+          enum testing {
+            value 3;
+            description
+              "In some test mode.";
+          }
+        }
+        mandatory true;
+        status deprecated;
+        description
+          "The desired state of the interface.
+
+           This leaf has the same read semantics as ifAdminStatus.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifAdminStatus";
+      }
+
+      leaf oper-status {
+        type enumeration {
+          enum up {
+            value 1;
+            description
+              "Ready to pass packets.";
+          }
+          enum down {
+            value 2;
+            description
+              "The interface does not pass any packets.";
+          }
+          enum testing {
+            value 3;
+            description
+              "In some test mode.  No operational packets can
+               be passed.";
+          }
+          enum unknown {
+            value 4;
+            description
+              "Status cannot be determined for some reason.";
+          }
+          enum dormant {
+            value 5;
+            description
+              "Waiting for some external event.";
+          }
+          enum not-present {
+            value 6;
+            description
+              "Some component (typically hardware) is missing.";
+          }
+          enum lower-layer-down {
+            value 7;
+            description
+              "Down due to state of lower-layer interface(s).";
+          }
+        }
+        mandatory true;
+        status deprecated;
+        description
+          "The current operational state of the interface.
+
+           This leaf has the same semantics as ifOperStatus.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifOperStatus";
+      }
+
+      leaf last-change {
+        type yang:date-and-time;
+        status deprecated;
+        description
+          "The time the interface entered its current operational
+           state.  If the current state was entered prior to the
+           last re-initialization of the local network management
+           subsystem, then this node is not present.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifLastChange";
+      }
+
+      leaf if-index {
+        if-feature if-mib;
+        type int32 {
+          range "1..2147483647";
+        }
+        mandatory true;
+        status deprecated;
+        description
+          "The ifIndex value for the ifEntry represented by this
+           interface.";
+
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifIndex";
+      }
+
+      leaf phys-address {
+        type yang:phys-address;
+        status deprecated;
+        description
+          "The interface's address at its protocol sub-layer.  For
+           example, for an 802.x interface, this object normally
+           contains a Media Access Control (MAC) address.  The
+           interface's media-specific modules must define the bit
+           and byte ordering and the format of the value of this
+           object.  For interfaces that do not have such an address
+           (e.g., a serial line), this node is not present.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifPhysAddress";
+      }
+
+      leaf-list higher-layer-if {
+        type interface-state-ref;
+        status deprecated;
+        description
+          "A list of references to interfaces layered on top of this
+           interface.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifStackTable";
+      }
+
+      leaf-list lower-layer-if {
+        type interface-state-ref;
+        status deprecated;
+        description
+          "A list of references to interfaces layered underneath this
+           interface.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifStackTable";
+      }
+
+      leaf speed {
+        type yang:gauge64;
+        units "bits/second";
+        status deprecated;
+        description
+            "An estimate of the interface's current bandwidth in bits
+             per second.  For interfaces that do not vary in
+             bandwidth or for those where no accurate estimation can
+
+             be made, this node should contain the nominal bandwidth.
+             For interfaces that have no concept of bandwidth, this
+             node is not present.";
+        reference
+          "RFC 2863: The Interfaces Group MIB -
+                     ifSpeed, ifHighSpeed";
+      }
+
+      container statistics {
+        status deprecated;
+        description
+          "A collection of interface-related statistics objects.";
+
+        leaf discontinuity-time {
+          type yang:date-and-time;
+          mandatory true;
+          status deprecated;
+          description
+            "The time on the most recent occasion at which any one or
+             more of this interface's counters suffered a
+             discontinuity.  If no such discontinuities have occurred
+             since the last re-initialization of the local management
+             subsystem, then this node contains the time the local
+             management subsystem re-initialized itself.";
+        }
+
+        leaf in-octets {
+          type yang:counter64;
+          status deprecated;
+          description
+            "The total number of octets received on the interface,
+             including framing characters.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifHCInOctets";
+        }
+
+        leaf in-unicast-pkts {
+          type yang:counter64;
+          status deprecated;
+          description
+            "The number of packets, delivered by this sub-layer to a
+             higher (sub-)layer, that were not addressed to a
+             multicast or broadcast address at this sub-layer.
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifHCInUcastPkts";
+        }
+
+        leaf in-broadcast-pkts {
+          type yang:counter64;
+          status deprecated;
+          description
+            "The number of packets, delivered by this sub-layer to a
+             higher (sub-)layer, that were addressed to a broadcast
+             address at this sub-layer.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB -
+                       ifHCInBroadcastPkts";
+        }
+
+        leaf in-multicast-pkts {
+          type yang:counter64;
+          status deprecated;
+          description
+            "The number of packets, delivered by this sub-layer to a
+             higher (sub-)layer, that were addressed to a multicast
+             address at this sub-layer.  For a MAC-layer protocol,
+             this includes both Group and Functional addresses.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB -
+                       ifHCInMulticastPkts";
+        }
+
+        leaf in-discards {
+          type yang:counter32;
+          status deprecated;
+
+          description
+            "The number of inbound packets that were chosen to be
+             discarded even though no errors had been detected to
+             prevent their being deliverable to a higher-layer
+             protocol.  One possible reason for discarding such a
+             packet could be to free up buffer space.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifInDiscards";
+        }
+
+        leaf in-errors {
+          type yang:counter32;
+          status deprecated;
+          description
+            "For packet-oriented interfaces, the number of inbound
+             packets that contained errors preventing them from being
+             deliverable to a higher-layer protocol.  For character-
+             oriented or fixed-length interfaces, the number of
+             inbound transmission units that contained errors
+             preventing them from being deliverable to a higher-layer
+             protocol.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifInErrors";
+        }
+
+        leaf in-unknown-protos {
+          type yang:counter32;
+          status deprecated;
+          description
+            "For packet-oriented interfaces, the number of packets
+             received via the interface that were discarded because
+             of an unknown or unsupported protocol.  For
+             character-oriented or fixed-length interfaces that
+             support protocol multiplexing, the number of
+             transmission units received via the interface that were
+             discarded because of an unknown or unsupported protocol.
+             For any interface that does not support protocol
+             multiplexing, this counter is not present.
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos";
+        }
+
+        leaf out-octets {
+          type yang:counter64;
+          status deprecated;
+          description
+            "The total number of octets transmitted out of the
+             interface, including framing characters.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifHCOutOctets";
+        }
+
+        leaf out-unicast-pkts {
+          type yang:counter64;
+          status deprecated;
+          description
+            "The total number of packets that higher-level protocols
+             requested be transmitted and that were not addressed
+             to a multicast or broadcast address at this sub-layer,
+             including those that were discarded or not sent.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifHCOutUcastPkts";
+        }
+
+        leaf out-broadcast-pkts {
+          type yang:counter64;
+          status deprecated;
+
+          description
+            "The total number of packets that higher-level protocols
+             requested be transmitted and that were addressed to a
+             broadcast address at this sub-layer, including those
+             that were discarded or not sent.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB -
+                       ifHCOutBroadcastPkts";
+        }
+
+        leaf out-multicast-pkts {
+          type yang:counter64;
+          status deprecated;
+          description
+            "The total number of packets that higher-level protocols
+             requested be transmitted and that were addressed to a
+             multicast address at this sub-layer, including those
+             that were discarded or not sent.  For a MAC-layer
+             protocol, this includes both Group and Functional
+             addresses.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB -
+                       ifHCOutMulticastPkts";
+        }
+
+        leaf out-discards {
+          type yang:counter32;
+          status deprecated;
+          description
+            "The number of outbound packets that were chosen to be
+             discarded even though no errors had been detected to
+             prevent their being transmitted.  One possible reason
+             for discarding such a packet could be to free up buffer
+             space.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifOutDiscards";
+        }
+
+        leaf out-errors {
+          type yang:counter32;
+          status deprecated;
+          description
+            "For packet-oriented interfaces, the number of outbound
+             packets that could not be transmitted because of errors.
+             For character-oriented or fixed-length interfaces, the
+             number of outbound transmission units that could not be
+             transmitted because of errors.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifOutErrors";
+        }
+      }
+    }
+  }
+}
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/nfv/etsi-nfv-common.yang b/plugins/org.etsi.mts.tdl.yang2tdl/samples/nfv/etsi-nfv-common.yang
new file mode 100644
index 0000000000000000000000000000000000000000..0a1c361eddba042598317e1bec71d6797a287d03
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/nfv/etsi-nfv-common.yang
@@ -0,0 +1,736 @@
+submodule etsi-nfv-common {
+  yang-version 1.1;
+  belongs-to etsi-nfv-descriptors {
+    prefix nfv;
+  }
+  organization
+    "European Telecommunications Standards Institute (ETSI)";
+
+  description
+    "Common data types for ETSI data models.";
+
+  revision 2019-04-25 {
+    description
+      "Initial revision
+
+       Common data structures to support VNFD and NSD according to:
+       ETSI GS NFV-IFA 014 Ed261v252
+       ETSI GS NFV-IFA 011 Ed261v254";
+  }
+
+  /*
+   * Identities.
+   */
+  identity layer-protocol {
+  }
+  identity ethernet {
+    base layer-protocol;
+  }
+  identity mpls {
+    base layer-protocol;
+  }
+  identity odu2 {
+    base layer-protocol;
+  }
+  identity ipv4 {
+    base layer-protocol;
+  }
+  identity ipv6 {
+    base layer-protocol;
+  }
+  identity pseudo-wire {
+    base layer-protocol;
+  }
+
+  identity address-type {
+    description
+      "Describes the type of the address to be assigned to the CP
+       instantiated from the parent CPD.
+       Value:
+       • MAC address.
+       • IP address.
+       • …
+       The content type shall be aligned with the address type
+       supported by the layerProtocol attribute of the parent CPD.";
+    reference
+      "GS NFV IFA011: Section 7.1.3.3, AddressData information
+       element.";
+  }
+  identity mac-address {
+    base address-type;
+  }
+  identity ip-address {
+    base address-type;
+  }
+
+  identity supported-operation {
+    description
+      "Indicates which operations are available for this DF via the
+       VNF LCM interface. Instantiate VNF, Query VNF and Terminate
+       VNF are supported in all DF and therefore need not be
+       included in this list.";
+    reference
+      "GS NFV IFA011: Section 7.1.8.2 VnfDf information element";
+  }
+  identity instantiate-vnf {
+    base supported-operation;
+    description
+      "This operation instantiates a particular DF of a VNF based on
+       the definition in the VNFD.";
+    reference
+      "GS NFV IFA007: Section 7.2.3 Instantiate VNF Operation";
+  }
+  identity scale-vnf {
+    base supported-operation;
+    description
+      "This operation provides methods to request scaling a VNF in
+       multiple ways:
+       • horizontal scaling:
+         - scale out: adding additional VNFC instances to the VNF to
+           increase capacity
+         - scale in: removing VNFC instances from the VNF, in order to
+           release unused capacity";
+    reference
+      "GS NFV IFA007: Section 7.2.4 Scale VNF Operation";
+  }
+  identity scale-vnf-to-level {
+    base supported-operation;
+    description
+      "This operation scales an instantiated VNF of a particular DF to
+       a target size. The target size is either expressed as an
+       instantiation level of that DF as defined in the VNFD, or given
+       as a list of scale levels, one per scaling aspect of that DF.
+       Instantiation levels and scaling aspects are declared in the
+       VNFD. Typically, the result of this operation is adding and/or
+       removing Network Functions Virtualization Infrastructure (NFVI)
+       resources to/from the VNF.";
+    reference
+      "GS NFV IFA007: Section 7.2.5 Scale VNF To Level Operation";
+  }
+  identity change-vnf-flavour {
+    base supported-operation;
+    description
+      "This operation changes the DF of a VNF instance.";
+    reference
+      "GS NFV IFA007: Section 7.2.6 Change VNF Flavour Operation";
+  }
+  identity terminate-vnf {
+    base supported-operation;
+    description
+      "This operation terminates a VNF.
+
+       A VNF can be terminated gracefully or forcefully. Graceful
+       termination means that the VNFM arranges to take the
+       VNF out of service, e.g. by asking the VNF's EM to take the
+       VNF out of service, and only after that shuts down the
+       VNF and releases the resources. Forceful termination means that
+       the VNFM immediately shuts down the VNF and releases the
+       resources. A time interval can be specified for taking the VNF
+       out of service, after which the VNF is shut down if taking it
+       out of service has not completed.";
+    reference
+      "GS NFV IFA007: Section 7.2.7 Terminate VNF Operation";
+  }
+  identity query-vnf {
+    base supported-operation;
+    description
+      "This operation provides information about VNF instances. The
+       applicable VNF instances can be chosen based on
+       filtering criteria, and the information can be restricted to
+       selected attributes.";
+    reference
+      "GS NFV IFA007: Section 7.2.9 Query VNF Operation";
+  }
+  identity heal-vnf {
+    base supported-operation;
+    description
+      "This operation enables the NFVO to request a VNFM to perform a
+       VNF healing procedure.";
+    reference
+      "GS NFV IFA007: Section 7.2.10 Heal VNF Operation";
+  }
+  identity operate-vnf {
+    base supported-operation;
+    description
+      "This operation enables requesting to change the state of a VNF
+       instance, including starting and stopping the VNF instance.";
+    reference
+      "GS NFV IFA007: Section 7.2.11 Operate VNF Operation";
+  }
+  identity modify-vnf-information {
+    base supported-operation;
+    description
+      "This operation allows updating information about a VNF
+       instance.";
+    reference
+      "GS NFV IFA007: Section 7.2.12 Modify VNF Operation";
+  }
+
+  identity cp-role {
+    description
+      "Identifies the role of the port in the context of the traffic
+       flow patterns in the VNF or parent NS.";
+    reference
+      "GS NFV IFA011: Section 7.1.6.3 Cpd information element";
+  }
+  identity root {
+    base cp-role;
+  }
+  identity leaf {
+    base cp-role;
+  }
+
+  identity checksum-algorithm {
+    description
+      "Identifies the algorithms supported for the purpose of
+       calculating the checksum.";
+    reference
+      "GS NFV IFA011: Section 7.1.6.10 Checksum information element.";
+  }
+
+  identity sha-224 {
+    base checksum-algorithm;
+    description
+      "SHA-224.";
+    reference
+      "GS NFV IFA011: Section 7.1.6.10 Checksum information element.";
+  }
+
+  identity sha-256 {
+    base checksum-algorithm;
+    description
+      "SHA-256.";
+    reference
+      "GS NFV IFA011: Section 7.1.6.10 Checksum information element.";
+  }
+
+  identity sha-384 {
+    base checksum-algorithm;
+    description
+      "SHA-384.";
+    reference
+      "GS NFV IFA011: Section 7.1.6.10 Checksum information element.";
+  }
+
+  identity sha-512 {
+    base checksum-algorithm;
+    description
+      "SHA-512.";
+    reference
+      "GS NFV IFA011: Section 7.1.6.10 Checksum information element.";
+  }
+
+  identity storage-type {
+    description
+      "Base type of storage that identities can derive from.";
+  }
+
+  identity root-storage {
+    base storage-type;
+    description
+      "Root type of storage.";
+  }
+
+  identity swap-storage {
+    base storage-type;
+    description
+      "Swap type of storage.";
+  }
+
+  identity ephemeral-storage {
+    base storage-type;
+    description
+      "Ephemeral type of storage.";
+  }
+
+  /*
+   * Typedefs
+   */
+
+  typedef flow-pattern {
+    type enumeration {
+      enum line;
+      enum tree;
+      enum mesh;
+    }
+  }
+
+  typedef affinity-type {
+    type enumeration {
+      enum "affinity";
+      enum "anti-affinity";
+    }
+  }
+
+  typedef affinity-scope {
+    type enumeration {
+      enum "nfvi-node";
+      enum "zone-group";
+      enum "zone";
+      enum "nfvi-pop";
+    }
+  }
+
+  typedef internal-lifecycle-management-script-event {
+    type enumeration {
+      enum "start-instantiation";
+      enum "end-instantiation";
+      enum "start-scaling";
+      enum "end-scaling";
+      enum "start-healing";
+      enum "end-healing";
+      enum "start-termination";
+      enum "end-termination";
+      enum "start-vnf-flavour-change";
+      enum "end-vnf-flavour-change";
+      enum "start-vnf-operation-change";
+      enum "end-vnf-operation-change";
+      enum "start-vnf-ext-conn-change";
+      enum "end-vnf-ext-conn-change";
+      enum "start-vnfinfo-modification";
+      enum "end-vnfinfo-modification";
+    }
+  }
+
+  grouping local-affinity-or-anti-affinity-rule {
+    list local-affinity-or-anti-affinity-rule {
+      key "affinity-type affinity-scope";
+      leaf affinity-type {
+        type affinity-type;
+        description
+          "Specifies whether the rule is an affinity rule or an
+           anti-affinity rule.";
+        reference
+          "GS NFV IFA011: Section 7.1.8.11,
+           LocalAffinityOrAntiAffinityRule information element.";
+      }
+
+      leaf affinity-scope {
+        type affinity-scope;
+        description
+          "Specifies the scope of the rule, possible values are
+           'NFVI-PoP', 'Zone', 'ZoneGroup', 'NFVI-node'.";
+        reference
+          "GS NFV IFA011: Section 7.1.8.11,
+           LocalAffinityOrAntiAffinityRule information element.";
+      }
+    }
+  }
+
+  grouping connectivity-type {
+    container connectivity-type {
+      leaf-list layer-protocol {
+        type identityref {
+          base layer-protocol;
+        }
+        description
+          "Identifies the protocols that the VL uses (Ethernet,
+           MPLS, ODU2, IPV4, IPV6, Pseudo-Wire). The top layer
+           protocol of the VL protocol stack shall always be provided.
+           The lower layer protocols may be included when there are
+           specific requirements on these layers.";
+        reference
+          "GS NFV IFA011: Section 7.1.7.3, ConnectivityType
+           information element.";
+      }
+
+      leaf flow-pattern {
+        type flow-pattern;
+        description
+          "Identifies the flow pattern of the connectivity (Line,
+           Tree, Mesh).";
+        reference
+          "GS NFV IFA011: Section 7.1.7.3, ConnectivityType
+           information element.";
+      }
+    }
+  }
+
+  grouping link-bitrate-requirements {
+    leaf root {
+      type uint64;
+      units "Mbps";
+      mandatory true;
+      description
+        "Specifies the throughput requirement of
+         the link (e.g. bitrate of E-Line, root bitrate
+         of E-Tree, aggregate capacity of E-LAN).";
+      reference
+        "GS NFV IFA011: Section 7.1.8.6, LinkBitrateRequirements
+         information element.";
+    }
+
+    leaf leaf {
+      type uint64;
+      units "Mbps";
+      description
+        "Specifies the throughput requirement of
+        leaf connections to the link when
+        applicable to the connectivity type (e.g. for
+        E-Tree and E-LAN branches).";
+      reference
+        "GS NFV IFA011: Section 7.1.8.6, LinkBitrateRequirements
+         information element.";
+    }
+  }
+
+  grouping monitoring-parameter {
+    leaf name {
+      type string;
+      description
+        "Human readable name of the monitoring parameter.";
+      reference
+        "GS NFV IFA011: Section 7.1.11.3, MonitoringParameter
+         information element.";
+    }
+    leaf performance-metric {
+      type string;
+      description
+        "Performance metric that is monitored. This attribute shall
+         contain the related 'Measurement Name' value as defined in
+         clause 7.2 of ETSI GS NFV-IFA 027";
+      reference
+        "GS NFV IFA011: Section 7.1.11.3, MonitoringParameter
+         information element and Section 7.2 of ETSI GS NFV-IFA 027.";
+    }
+    leaf collection-period {
+      type uint64;
+      units "ms";
+      description
+        "An attribute that describes the recommended periodicity at
+         which to collect the performance information. VNFM determines
+         if this parameter is considered.
+
+         The vendor may provide this information as a guidance for
+         creating PmJobs if needed.";
+      reference
+        "GS NFV IFA011: Section 7.1.11.3, MonitoringParameter
+         information element.";
+    }
+  }
+
+  grouping security-parameters {
+    leaf signature {
+      type string;
+      description
+        "Provides the signature of the signed part of the
+         descriptor.";
+      reference
+        "GS NFV IFA014: Section 6.2.5, SecurityParameters
+         information element.";
+    }
+    leaf algorithm {
+      type string;
+      description
+        "Identifies the algorithm used to compute the signature.";
+      reference
+        "GS NFV IFA014: Section 6.2.5, SecurityParameters
+         information element.";
+    }
+    leaf certificate {
+      type string;
+      description
+        "Provides a certificate or a reference to a certificate to
+         validate the signature.";
+      reference
+        "GS NFV IFA014: Section 6.2.5, SecurityParameters
+         information element.";
+    }
+  }
+
+  grouping cpd {
+    description
+      "A Cpd information element describes network
+       connectivity to a compute resource or a VL.";
+    reference
+      "GS NFV IFA011: Section 7.1.6.3 Cpd information element";
+
+    leaf id {
+      type string;
+      description
+        "Identifier of this Cpd information element.";
+      reference
+        "GS NFV IFA011: Section 7.1.6.3 Cpd information element";
+    }
+
+    leaf-list layer-protocol {
+      default ethernet;
+      type identityref {
+        base layer-protocol;
+      }
+      description
+        "Identifies a protocol that the connection points
+         corresponding to the CPD support for connectivity purposes
+         (e.g. Ethernet, MPLS, ODU2, IPV4, IPV6, Pseudo-Wire, etc.).";
+      reference
+        "GS NFV IFA011: Section 7.1.6.3 Cpd information element";
+    }
+
+    leaf role {
+      type identityref {
+        base cp-role;
+      }
+      description
+        "Identifies the role of the connection points
+         corresponding to the CPD in the context of the traffic
+         flow patterns in the VNF, PNF or NS. For example an NS with
+         a tree flow pattern within the NS will have legal cpRoles
+         of ROOT and LEAF.";
+      reference
+        "GS NFV IFA011: Section 7.1.6.3 Cpd information element";
+    }
+
+    leaf description {
+      type string;
+      description
+        "Provides human-readable information on the purpose of the
+         connection point (e.g. connection point for control plane
+         traffic).";
+      reference
+        "GS NFV IFA011: Section 7.1.6.3 Cpd information element";
+    }
+
+    list protocol {
+      key "associated-layer-protocol";
+
+      leaf associated-layer-protocol {
+        type identityref {
+          base layer-protocol;
+        }
+        description
+          "One of the values of the attribute layerProtocol of the Cpd
+           IE.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.8 CpProtocolData information
+           element";
+      }
+
+      list address-data {
+        key "type";
+
+        leaf type {
+          type identityref {
+            base address-type;
+          }
+          description
+            "Describes the type of the address to be assigned to the
+             CP instantiated from the parent CPD.
+             Value:
+               • MAC address.
+               • IP address.
+               • Etc.
+             The content type shall be aligned with the address type
+             supported by the layerProtocol attribute of the parent
+             CPD.";
+          reference
+            "GS NFV IFA011: Section 7.1.3.3 AddressData information
+             element";
+        }
+
+        container l2-address-data {
+          when "../type='mac-address'";
+          leaf mac-address-assignment {
+            type boolean;
+            mandatory true;
+            description
+              "Specify if the MAC address assignment is the
+               responsibility of management and orchestration function
+               or not. If it is set to True, it is the management and
+               orchestration function responsibility. If it is set to
+               False, it will be provided by an external entity,
+               e.g. OSS/BSS.";
+            reference
+              "GS NFV IFA011: Section 7.1.3.5 L2AddressData
+               information element";
+          }
+
+          description
+            "Provides the information on the MAC addresses to be
+             assigned to the CP(s) instantiated from the parent CPD.
+             Shall be present when the addressType is MAC address.";
+          reference
+            "GS NFV IFA011: Section 7.1.3.3 AddressData information
+             element";
+        }
+
+        container l3-address-data {
+          when "../type='ip-address'";
+          leaf ip-address-assignment {
+            type boolean;
+            mandatory true;
+            description
+              "Specify if the address assignment is the responsibility
+               of management and orchestration function or not. If it
+               is set to True, it is the management and orchestration
+               function responsibility. ";
+            reference
+              "GS NFV IFA011: Section 7.1.3.4, L3AddressData
+               information element.";
+          }
+
+          leaf floating-ip-activated {
+            type boolean;
+            mandatory true;
+            description
+              "Specify if the floating IP scheme is activated on the CP
+               or not.";
+            reference
+              "GS NFV IFA011: Section 7.1.3.4, L3AddressData
+               information element.";
+          }
+
+          leaf ip-address-type {
+            type enumeration {
+              enum "ipv4";
+              enum "ipv6";
+            }
+            description
+              "Define address type. The address type should be aligned
+               with the address type supported by the layerProtocol
+               attribute of the parent VnfExtCpd.";
+            reference
+              "GS NFV IFA011: Section 7.1.3.4, L3AddressData
+               information element.";
+          }
+
+          leaf number-of-ip-addresses {
+            type uint32;
+            description
+              "Minimum number of IP addresses to be assigned based on
+               this L3AddressData information element.";
+            reference
+              "GS NFV IFA011: Section 7.1.3.4, L3AddressData
+               information element.";
+          }
+        }
+        description
+          "Provides information on the addresses to be assigned to the
+           CP(s) instantiated from the CPD.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.8 CpProtocolData information
+           element";
+      }
+      description
+        "Identifies the protocol layering information the CP uses for
+         connectivity purposes and associated information. There shall
+         be one cpProtocol for each layer protocol as indicated by the
+         attribute layerProtocol. When a PnfExtCpd as defined in ETSI
+         GS NFV-IFA 014 [i.8] is inherited from this Cpd, the
+         cardinality is set to 0.";
+      reference
+        "GS NFV IFA011: Section 7.1.6.3 Cpd information element";
+    }
+
+    leaf trunk-mode {
+      type boolean;
+      description
+        "Information about whether the Cp instantiated from this CPD
+         is in Trunk mode (802.1Q or other). When operating in
+         'trunk mode', the Cp is capable of carrying traffic for
+         several VLANs. A cardinality of 0 implies that trunkMode
+         is not configured for the Cp i.e. It is equivalent to
+         Boolean value 'false'.";
+      reference
+        "GS NFV IFA011: Section 7.1.6.3 Cpd information element";
+    }
+  }
+
+  grouping security-group-rule {
+    list security-group-rule {
+      key "id";
+
+      leaf id {
+        type string;
+        description
+          "Identifier of this SecurityGroupRule information
+           element.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.9, SecurityGroupRule
+           information element.";
+      }
+
+      leaf description {
+        type string;
+        description
+          "Human readable description of the security group rule.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.9, SecurityGroupRule
+           information element.";
+      }
+
+      leaf direction {
+        type enumeration {
+          enum ingress;
+          enum egress;
+        }
+        default "ingress";
+        description
+          "The direction in which the security group rule is applied.
+           Permitted values: INGRESS, EGRESS. Defaults to INGRESS.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.9, SecurityGroupRule
+           information element.";
+      }
+
+      leaf ether-type {
+        type enumeration {
+          enum ipv4;
+          enum ipv6;
+        }
+        default "ipv4";
+        description
+          "Indicates the protocol carried over the Ethernet layer.
+           Permitted values: IPV4, IPV6. Defaults to IPV4.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.9, SecurityGroupRule
+           information element.";
+      }
+
+      leaf protocol {
+        type enumeration {
+          enum tcp;
+          enum udp;
+          enum icmp;
+        }
+        default "tcp";
+        description
+          "Indicates the protocol carried over the IP layer.
+           Permitted values: any protocol defined in the IANA
+           protocol registry, e.g. TCP, UDP, ICMP, etc. Defaults
+           to TCP.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.9, SecurityGroupRule
+           information element.";
+      }
+
+      leaf port-range-min {
+        must ". <= ../port-range-max";
+        type uint16;
+        default "0";
+        description
+          "Indicates minimum port number in the range that is
+           matched by the security group rule. Defaults to 0.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.9, SecurityGroupRule
+           information element.";
+      }
+
+      leaf port-range-max {
+        must ". >= ../port-range-min";
+        type uint16;
+        default "65535";
+        description
+          "Indicates maximum port number in the range that is
+           matched by the security group rule. Defaults to 65535.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.9, SecurityGroupRule
+           information element.";
+      }
+
+      description
+        "Defines security group rules to be used by the VNF.";
+      reference
+        "GS NFV IFA011: Section 7.1.2, VNFD information element.";
+    }
+  }
+}
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/nfv/etsi-nfv-descriptors.yang b/plugins/org.etsi.mts.tdl.yang2tdl/samples/nfv/etsi-nfv-descriptors.yang
new file mode 100644
index 0000000000000000000000000000000000000000..afedb3b7a4a8daf1178ce22f92df35c9b96188f9
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/nfv/etsi-nfv-descriptors.yang
@@ -0,0 +1,65 @@
+module etsi-nfv-descriptors {
+  yang-version 1.1;
+  namespace "urn:etsi:nfv:yang:etsi-nfv-descriptors";
+  prefix nfv;
+
+  include etsi-nfv-common;
+  include etsi-nfv-ns;
+  include etsi-nfv-vnf;
+  include etsi-nfv-pnf;
+
+  organization
+    "European Telecommunications Standards Institute (ETSI)";
+
+  description
+    "Network Function Virtualization Descriptors";
+
+  revision 2019-04-25 {
+    description
+      "Initial revision.
+       NSD and PNFD according to ETSI GS NFV-IFA 014 Ed261v252
+       VNFD according to ETSI GS NFV-IFA 011 Ed261v254";
+  }
+
+  container nfv {
+    list vnfd {
+      key "id";
+      description
+        "A VNF Descriptor (VNFD) is a deployment template which
+         describes a VNF in terms of deployment and operational
+         behaviour requirements. It also contains connectivity,
+         interface and virtualised resource requirements";
+      reference
+        "GS NFV-IFA011: Section 7.1.2, VNFD information element";
+
+      uses vnfd;
+    }
+
+    list nsd {
+      key "id";
+
+      description
+        "The NSD information element is a deployment template whose
+         instances are used by the NFVO for the lifecycle
+         management of NSs.";
+      reference
+        "GS NFV-IFA014: Section 6.2.2, Network Service Descriptor
+         information element.";
+
+      uses nsd;
+    }
+
+    list pnfd {
+      key "id";
+
+      description
+	"The Pnfd information element is a deployment template
+         enabling on-boarding PNFs and referencing them from an
+         NSD. It focuses on connectivity aspects only.";
+      reference
+        "GS NFV-IFA014: Section 6.6.2, Pnfd information element.";
+
+      uses pnfd;
+    }
+  }
+}
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/nfv/etsi-nfv-ns.yang b/plugins/org.etsi.mts.tdl.yang2tdl/samples/nfv/etsi-nfv-ns.yang
new file mode 100644
index 0000000000000000000000000000000000000000..1eb49ce02f133723d16093debe9c6aef98d1397a
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/nfv/etsi-nfv-ns.yang
@@ -0,0 +1,1585 @@
+submodule etsi-nfv-ns {
+  yang-version 1.1;
+  belongs-to etsi-nfv-descriptors {
+    prefix nfv;
+  }
+
+  include etsi-nfv-common;
+  include etsi-nfv-vnf;
+  include etsi-nfv-pnf;
+
+  description
+    "Models for NS according to ETSI GS NFV-IFA 014.";
+
+  revision 2019-04-25 {
+    description
+      "Initial revision
+       Common data structure to support NSD according to:
+       ETSI GS NFV-IFA 014 Ed261v252";
+
+    reference
+      "ETSI GS NFV-IFA 014 Ed261v252";
+  }
+
+  grouping resource-handle {
+    leaf vim-id {
+      type string;
+    }
+    leaf resource-provider-id {
+      type string;
+    }
+    leaf resource-id {
+      type string;
+    }
+  }
+
+
+  grouping nsd {
+    leaf id {
+      type string;
+      description
+        "Identifier of this NSD information element. It Globally
+         uniquely identifies an instance of the NSD.";
+      reference
+        "GS NFV IFA014: Section 6.2.2.2 Network Service Descriptor
+         information element";
+    }
+
+    leaf designer {
+      type string;
+      description
+        "Identifies the designer of the NSD.";
+      reference
+        "GS NFV IFA014: Section 6.2.2.2 Network Service Descriptor
+         information element";
+    }
+
+    leaf version {
+      type string;
+      description
+        "Identifies the version of the NSD.";
+      reference
+        "GS NFV IFA014: Section 6.2.2.2 Network Service Descriptor
+         information element";
+    }
+
+    leaf name {
+      type string;
+      description
+        "Provides the human readable name of the NSD.";
+      reference
+        "GS NFV IFA014: Section 6.2.2.2 Network Service Descriptor
+         information element";
+    }
+
+    leaf invariant-id {
+      type string;
+      description
+        "Identifies an NSD in a version independent manner. This
+         attribute is invariant across versions of the network
+         service descriptor.";
+      reference
+        "GS NFV IFA014: Section 6.2.2.2 Network Service Descriptor
+         information element";
+    }
+
+    leaf-list nested-nsd-id {
+      must ". != ../id";
+      type leafref {
+        path "../../nsd/id";
+      }
+      description
+        "References the NSD of a constituent nested NS.";
+      reference
+        "GS NFV IFA014: Section 6.2.2.2 Network Service Descriptor
+         information element";
+    }
+
+    leaf-list vnfd-id {
+      type leafref {
+        path "../../vnfd/id";
+      }
+      description
+        "References the VNFD of a constituent VNF.";
+      reference
+        "GS NFV IFA014: Section 6.2.2.2 Network Service Descriptor
+         information element";
+    }
+
+    leaf-list pnfd-id {
+      type leafref {
+        path "../../pnfd/id";
+      }
+      description
+        "References the PNFD of a constituent PNF.";
+      reference
+        "GS NFV IFA014: Section 6.2.2.2 Network Service Descriptor
+         information element";
+    }
+
+    list sapd {
+      key "id";
+      description
+        "Provides the descriptor of a service access point of the
+         network service.";
+      reference
+        "GS NFV IFA014: Section 6.2.2.2 Network Service Descriptor
+         information element";
+
+      leaf id {
+        type string;
+        description
+          "Identifier of this Cpd information element.";
+        reference
+          "GS NFV IFA014: Section 6.6.3.1 Cpd information element";
+      }
+
+      leaf address-assignment {
+        type boolean;
+        description
+          "Specify whether the SAP address assignment is under the
+           responsibility of management and orchestration functions
+           or not. If it is set to True, management and
+           orchestration functions are responsible for assigning
+           addresses to the access points instantiated from this
+           SAPD.";
+        reference
+          "GS NFV IFA014: Section 6.2.3.2 Sapd information element";
+      }
+
+      choice cpd-or-virtual-link {
+        leaf virtual-link-desc {
+          type leafref {
+            path "../../virtual-link-desc/id";
+          }
+          description
+            "References the descriptor of the NS VL instance to
+             which the SAP instantiated from this SAPD connects to.";
+          reference
+            "GS NFV IFA014: Section 6.2.3.2 Sapd information element";
+        }
+
+        choice associated-cpd-id {
+          container vnf {
+            leaf vnfd-id {
+              mandatory true;
+              type leafref {
+                path "../../../../vnfd/id";
+              }
+              must "boolean(../../../vnfd-id[.=current()])";
+            }
+
+            leaf ext-cpd-id {
+              mandatory true;
+              type leafref {
+                path "deref(../vnfd-id)/../ext-cpd/id";
+              }
+            }
+          }
+
+          container pnf {
+            leaf pnfd-id {
+              mandatory true;
+              type leafref {
+                path "../../../../pnfd/id";
+              }
+              must "boolean(../pnfd-id[.=current()])";
+            }
+
+            leaf ext-cpd-id {
+              mandatory true;
+              type leafref {
+                path "deref(../pnfd-id)/../ext-cpd/id";
+              }
+            }
+          }
+          container ns {
+            leaf nsd-id {
+              mandatory true;
+              type leafref {
+                path "../../../../nsd/id";
+              }
+              must "boolean(../nsd-id[.=current()])";
+            }
+
+            leaf ext-cpd-id {
+              mandatory true;
+              type leafref {
+                path "deref(../nsd-id)/../sapd/id";
+              }
+            }
+          }
+        }
+      }
+    }
+
+    list virtual-link-desc {
+      key "id";
+      description
+        "Provides the constituent VLDs.";
+      reference
+        "GS NFV IFA014: Section 6.2.2.2 Network Service Descriptor
+         information element";
+      leaf id {
+        type string;
+        description
+          "Identifier of the NsVirtualLinkDesc information element.
+           It uniquely identifies a VLD.";
+        reference
+          "GS NFV IFA014: Section 6.5.2.2 NsVirtualLinkDesc
+           information element";
+      }
+
+      uses connectivity-type;
+
+      list df {
+        key "id";
+
+        description
+          "The VirtualLinkDf information element specifies
+           properties for instantiating a VL according to a
+           specific flavour.";
+        reference
+          "GS NFV IFA014: Section 6.5.2.2 NsVirtualLinkDesc
+           information element";
+
+        leaf id {
+          type string;
+          description
+            "Identifies this VirtualLinkDf information element
+             within a VLD.";
+          reference
+            "GS NFV IFA014: Section 6.5.4.2 VirtualLinkDf
+             information element";
+        }
+
+        container qos {
+          presence "VL QoS parameters";
+          description
+            "The QoS information element specifies quality of
+             service parameters applicable to a VL.";
+          reference
+            "GS NFV IFA014: Section 6.5.4.2 VirtualLinkDf
+             information element";
+
+          leaf latency {
+            mandatory true;
+            type uint32;
+            units "ms";
+            description
+              "Specifies the maximum latency in ms.";
+            reference
+              "GS NFV IFA014: Section 6.5.6.2 QoS information
+               element";
+          }
+
+          leaf packet-delay-variation {
+            mandatory true;
+            type uint32;
+            units "ms";
+            description
+              "Specifies the maximum jitter in ms.";
+            reference
+              "GS NFV IFA014: Section 6.5.6.2 QoS information
+               element";
+          }
+
+          leaf packet-loss-ratio {
+            type decimal64 {
+              fraction-digits "2";
+              range "0..1.00";
+            }
+            description
+              "Specifies the maximum packet loss ratio.";
+            reference
+              "GS NFV IFA014: Section 6.5.6.2 QoS information
+               element";
+          }
+
+          leaf priority {
+            type uint32;
+            description
+              "Specifies the priority level in case of
+               congestion on the underlying physical links.";
+            reference
+              "GS NFV IFA014: Section 6.5.6.2 QoS information
+               element";
+          }
+        }
+
+        leaf service-availability-level {
+          type enumeration {
+            enum "level-1";
+            enum "level-2";
+            enum "level-3";
+          }
+          description
+            "Specifies one of the three levels defined in ETSI
+             ETSI GS NFV-REL 001 [i.5]
+               * Level 1.
+               * Level 2.
+               * Level 3.";
+          reference
+            "GS NFV IFA014: Section 6.5.4.2 VirtualLinkDf
+             information element";
+        }
+      }
+
+      leaf test-access {
+        type enumeration {
+          enum none;
+          enum passive-monitoring;
+          enum active;
+        }
+        description
+          "Specifies test access facilities expected on the VL.";
+        reference
+          "GS NFV IFA014: Section 6.5.2.2 NsVirtualLinkDesc
+           information element";
+      }
+
+      leaf description {
+        type string;
+        description
+          "Provides human-readable information on the purpose of
+           the virtual link (e.g. VL for control plane traffic).";
+        reference
+          "GS NFV IFA014: Section 6.5.2.2 NsVirtualLinkDesc
+           information element";
+      }
+      uses security-parameters;
+    }
+
+    list vnffgd {
+      key "id";
+
+      description
+        "Provides the descriptors of the applicable forwarding
+         graphs.";
+      reference
+        "GS NFV IFA014: Section 6.2.2.2 Network Service Descriptor
+         information element";
+
+      leaf id {
+        type string;
+        description
+          "Identifier of this Vnffgd information element. It
+           uniquely identifies a VNFFGD.";
+        reference
+          "GS NFV IFA014: Section 6.4.2.2 Vnffgd information
+             element";
+      }
+
+      leaf-list vnf-profile-id {
+        type leafref {
+          path "../../df/vnf-profile/id";
+        }
+        description
+          "References the VnfProfile of a constituent VNF.";
+        reference
+          "GS NFV IFA014: Section 6.4.2.2 Vnffgd information
+           element";
+      }
+
+      leaf-list pnf-profile-id {
+        type leafref {
+          path "../../df/pnf-profile/id";
+        }
+        description
+          "References the PnfProfile of a constituent PNF.";
+        reference
+          "GS NFV IFA014: Section 6.4.2.2 Vnffgd information
+           element";
+      }
+
+      leaf-list nested-ns-profile-id {
+        type leafref {
+          path "../../df/ns-profile/id";
+        }
+        description
+          "References the NsProfile of a nestedNS.";
+        reference
+          "GS NFV IFA014: Section 6.4.2.2 Vnffgd information
+           element";
+      }
+
+      leaf virtual-link-profile-id {
+        type leafref {
+          path "../../df/virtual-link-profile/id";
+        }
+        description
+          "References the Virtual Link Profile of a constituent
+             VL.";
+        reference
+          "GS NFV IFA014: Section 6.4.2.2 Vnffgd information
+           element";
+      }
+
+      list cpd-pool {
+        key "id";
+
+        description
+          "Describes a pool of descriptors of connection points
+           attached to one of the constituent VNFs and PNFs and/or
+           one of the SAPs of the parent NS or of a nested NS.";
+        reference
+          "GS NFV IFA014: Section 6.4.2.2 Vnffgd information
+           element";
+
+        leaf id {
+          type string;
+        }
+
+        choice constituent-base-element-id {
+          mandatory "true";
+          container vnf-profile {
+            leaf vnf-profile-id {
+              must ". = deref(../../vnfd-profile-id)" {
+              }
+              type leafref {
+                path "../../../../../nsd/df/vnf-profile/id";
+              }
+            }
+          }
+          container pnf-profile {
+            leaf pnf-profile-id {
+              must ". = deref(../../pnfd-profile-id)" {
+              }
+              type leafref {
+                path "../../../../../nsd/df/pnf-profile/id";
+              }
+            }
+          }
+          container ns-profile {
+            leaf ns-profile-id {
+              must ". = deref(../../ns-profile-id)" {
+              }
+              type leafref {
+                path "../../../../../nsd/df/ns-profile/id";
+              }
+            }
+          }
+          description
+            "Reference to the profile of an NS constituent.";
+          reference
+            "GS NFV IFA014: Section 6.4.8 CpdInConstituentElement
+             information element";
+        }
+
+        choice constituent-cpd-id {
+          container vnf {
+            leaf vnfd-id {
+              must ". = deref(../../vnfd-profile-id)/../vnfd-id" {
+              }
+              type leafref {
+                path "../../../../../vnfd/id";
+              }
+            }
+            leaf cpd-id {
+              type leafref {
+                path "deref(../vnfd-id)/../ext-cpd/id";
+              }
+            }
+          }
+          container pnf {
+            leaf pnfd-id {
+              must ". = deref(../../pnfd-profile-id)/../pnfd-id" {
+              }
+              type leafref {
+                path "../../../../../pnfd/id";
+              }
+            }
+            leaf pnf-cpd-id {
+              type leafref {
+                path "deref(../pnfd-id)/../ext-cpd/id";
+              }
+            }
+          }
+          container ns {
+            leaf nsd-id {
+              must ". = deref(../../nested-ns-profile-id)/" +
+                   "../nsd-id" {
+              }
+
+              type leafref {
+                path "../../../../../nsd/id";
+              }
+            }
+            leaf sap-cpd-id {
+              type leafref {
+                path "deref(../nsd-id)/../sapd/id";
+              }
+            }
+          }
+          description
+            "A reference to the descriptor of a connection point
+             attached to one of the constituent VNFs and PNFs or to
+             the descriptor of a NS SAP.";
+          reference
+            "GS NFV IFA014: Section 6.4.4.2 CpdPool information
+             element";
+        }
+      }
+
+      list nfpd {
+        key "id";
+
+        description
+          "The network forwarding path associated to the VNFFG.";
+        reference
+          "GS NFV IFA014: Section 6.4.2.2 Vnffgd information
+           element";
+
+        leaf id {
+          type string;
+          description
+            "Identifies this nfpd information element within a
+             VNFFGD.";
+          reference
+            "GS NFV IFA014: Section 6.4.3.2 Nfpd information
+             element";
+        }
+
+        leaf rule {
+          type string;
+          description
+            "Provides an NFP classification and selection rule.
+             The rule may be expressed as a criteria constructed
+             out of atomic assertions linked by Boolean operators
+             AND, OR and NOT.";
+          reference
+            "GS NFV IFA014: Section 6.4.3.2 Nfpd information
+             element";
+        }
+
+        list position-desc-id {
+          key "id";
+
+          description
+            "Describes a position in the NFP in terms of one or
+             more CP profiles and rules for distributing the
+             traffic among CP and SAP instances created from the
+             CPD or SAPD associated to these profiles. This shall
+             be connection point profile, which is either a CPD
+             associated with the VnfProfile of a constituent VNF,
+             or a CPD associated with the PnfProfile of a
+             constituent PNF, or a SAPD associated with the
+             NsProfile of a nested NS. The related VnfProfile,
+             PnfProfile and NsProfile shall be included in the
+             parent VNFFGD.";
+          reference
+            "GS NFV IFA014: Section 6.4.3.2 Nfpd information
+             element";
+
+          leaf id {
+            type string;
+            description
+              "Identifier of this NfpPositionDesc element.";
+            reference
+              "GS NFV IFA014: Section 6.4.5.2 NfpPositionDesc
+               information element";
+          }
+
+          list cp-profile-id {
+            key "id";
+
+            description
+              "References the profile of a connection point to be
+               traversed by the traffic flows matching the criteria.
+               This shall be a connection point attached to one of
+               the constituent VNFs and PNFs of the parent VNFFG,
+               or a SAP of one of the constituent nested NSs of the
+               parent VNFFG.";
+            reference
+              "GS NFV IFA014: Section 6.4.5.2 NfpPositionDesc
+               information element";
+
+            leaf id {
+              type string;
+              description
+                "Identifier of this CpProfile information element.
+                 It uniquely identifies a CpProfile.";
+              reference
+                "GS NFV IFA014: Section 6.4.6.2 CpProfile
+                 information element";
+            }
+
+            list constituent-profile-elements {
+              key "id";
+
+              description
+                "Specifies the constituents of the CpProfile.";
+              reference
+                "GS NFV IFA014: Section 6.4.6.2 CpProfile
+                 information element";
+
+              leaf id {
+                type string;
+                description
+                  "Specifies the constituents of the CpProfile.";
+                reference
+                  "GS NFV IFA014: Section 6.4.7.2
+                   ConstituentProfileElements information element";
+              }
+
+              leaf cpd-id {
+                type string;
+                description
+                  "References the VNF external CPD for a given
+                   VnfProfile, or the PNF external CPD for a given
+                   PnfProfile, or a NS SAPD for a give NsProfile
+                   identified by the constituentBasedElementId.";
+                reference
+                  "GS NFV IFA014: Section 6.4.7.2
+                   ConstituentProfileElements information element";
+              }
+            }
+          }
+        }
+      }
+    }
+
+    leaf-list autoscale-rule {
+      type string;
+    }
+    list lifecycle-management-script {
+      key "event";
+      leaf event {
+        type string;
+      }
+      leaf script {
+        type string;
+      }
+    }
+
+    list df {
+      min-elements 1;
+      must "default-instantiation-level or " +
+           "count(ns-instantiation-level) = 1" {
+        error-message
+          "default-instantiation-level must be present if there " +
+          "multiple instantion-level";
+        reference
+          "GS NFV IFA014: Section 6.3.2.2 NsDf information element";
+      }
+
+      key "id";
+      description
+        "Identifies a DF within the scope of an NSD.";
+      reference
+        "GS NFV IFA014: Section 6.2.2.2 Network Service Descriptor
+         information element";
+
+      leaf id {
+        type string;
+        description
+          "Identifies this NsDf information element. It identifies
+           a NS DF within the NSD.";
+        reference
+          "GS NFV IFA014: Section 6.3.2.2 NsDf information element";
+      }
+
+      leaf flavour-key {
+        type leafref {
+          path "../monitored-info/id";
+        }
+        description
+          "Assurance parameter against which this flavour is being
+           described.
+
+           The key can be a combination of multiple assurance
+           parameters with a logical relationship between them.
+           The parameters should be present as a monitoredInfo
+           attribute in the NSD.";
+        reference
+          "GS NFV IFA014: Section 6.3.2.2 NsDf information element";
+      }
+
+      list vnf-profile {
+        must "min-number-of-instances <= max-number-of-instances";
+        must "boolean(../../vnfd-id[.=current()/vnfd-id])" {
+          error-message "VNFDs in the profile has to be listed as a " +
+                        "dependency of the network service " +
+                        "descriptor.";
+        }
+        key "id";
+        description
+          "VNF profile to be used for the NS flavour.";
+        reference
+          "GS NFV IFA014: Section 6.3.2.2 NsDf information element";
+
+        leaf id {
+          type string;
+          description
+            "Identifier of this vnfProfile information element. It
+             uniquely identifies a VnfProfile.";
+          reference
+            "GS NFV IFA014: Section 6.3.3.2 VnfProfile information
+             element";
+        }
+
+        leaf vnfd-id {
+          mandatory true;
+          type leafref {
+            path "../../../../vnfd/id";
+          }
+          description
+            "References a VNFD.";
+          reference
+            "GS NFV IFA014: Section 6.3.3.2 VnfProfile information
+             element";
+        }
+
+        leaf flavour-id {
+          mandatory true;
+          type leafref {
+            path "deref(../vnfd-id)/../df/id";
+          }
+          description
+            "Identifies a flavour within the VNFD.";
+          reference
+            "GS NFV IFA014: Section 6.3.3.2 VnfProfile information
+             element";
+        }
+
+        leaf instantiation-level {
+          mandatory true;
+          type leafref {
+            path "deref(../flavour-id)/../instantiation-level/id";
+          }
+          description
+            "Identifier of the instantiation level of the VNF DF
+             to be used for instantiation. If not present, the
+             default instantiation level as declared in the VNFD
+             shall be used.";
+          reference
+            "GS NFV IFA014: Section 6.3.3.2 VnfProfile information
+             element";
+        }
+
+        leaf min-number-of-instances {
+          default 1;
+          type uint16;
+          description
+            "Minimum number of instances of the VNF based on this
+             VNFD that is permitted to exist for this VnfProfile.";
+          reference
+            "GS NFV IFA014: Section 6.3.3.2 VnfProfile information
+             element";
+        }
+
+        leaf max-number-of-instances {
+          default 1;
+          type uint16;
+          description
+            "Maximum number of instances of the VNF based on this
+             VNFD that is permitted to exist for this VnfProfile.";
+          reference
+            "GS NFV IFA014: Section 6.3.3.2 VnfProfile information
+             element";
+        }
+
+        uses local-affinity-or-anti-affinity-rule;
+
+        list affinity-or-anti-affinity-group {
+          key "id";
+
+          description
+            "Identifier(s) of the affinity or anti-affinity
+             group(s) the VnfProfile belongs to.";
+          reference
+            "GS NFV IFA014: Section 6.3.3.2 VnfProfile information
+             element";
+
+          leaf id {
+            type leafref {
+              path "../../../affinity-or-anti-affinity-group/id";
+            }
+          }
+        }
+
+        list virtual-link-connectivity {
+          key "virtual-link-profile-id";
+
+          description
+            "Defines the connection information of the VNF, it
+             contains connection relationship between a VNF
+             connection point and a NS Virtual Link.";
+          reference
+            "GS NFV IFA014: Section 6.3.3.2 VnfProfile information
+               element";
+
+          leaf virtual-link-profile-id {
+            type leafref {
+              path "../../../virtual-link-profile/id";
+            }
+            description
+              "Reference an NS VL profile.";
+            reference
+              "GS NFV IFA014: Section 6.3.7.2, NsVirutalLinkConnectivity
+               information element.";
+          }
+
+          list constituent-cpd-id {
+            key "constituent-base-element-id";
+
+            description
+              "Describes a connection point on a VNF/PNF or a SAP
+               which connects to virtual links instantiated from
+               the profile identified in the virtualLinkProfileId
+               attribute.";
+            reference
+              "GS NFV IFA014: Section 6.3.7
+               NsVirtualLinkConnectivity information element";
+
+            leaf constituent-base-element-id {
+              type leafref {
+                path "../../../id";
+              }
+              description
+                "Reference to the profile of an NS constituent.";
+              reference
+                "GS NFV IFA014: Section 6.4.8
+                 CpdInConstituentElement information element";
+            }
+
+            leaf constituent-cpd-id {
+              type leafref {
+                path "deref(../../../vnfd-id)/../ext-cpd/id";
+              }
+              description
+                "A reference to the descriptor of a connection point
+                 attached to one of the constituent VNFs and PNFs or to
+                 the descriptor of a NS SAP.";
+              reference
+                "GS NFV IFA014: Section 6.4.4.2 CpdPool information
+                 element";
+            }
+          }
+        }
+      }
+
+      list pnf-profile {
+        key "id";
+        must "boolean(../../pnfd-id[.=current()/pnfd-id])" {
+          error-message "PNFDs in the profile has to be listed as a " +
+                        "dependency of the network service " +
+                        "descriptor.";
+        }
+
+        leaf id {
+          type string;
+          description
+            "Identifier of this PnfProfile information element.
+             It uniquely identifies a PnfProfile.";
+          reference
+            "GS NFV IFA014: Section 6.3.6.2 PnfProfile information
+             element";
+        }
+
+        leaf pnfd-id {
+          type leafref {
+            path "../../../../pnfd/id";
+          }
+          description
+            "References a PNFD.";
+          reference
+            "GS NFV IFA014: Section 6.3.6.2 PnfProfile information
+             element";
+        }
+
+        list virtual-link-connectivity {
+          key "virtual-link-profile-id";
+
+          description
+            "Defines the connection information of the PNF, it
+             contains connection relationship between a PNF
+             connection point and a NS Virtual Link.";
+          reference
+            "GS NFV IFA014: Section 6.3.6.2 PnfProfile information
+             element";
+
+          leaf virtual-link-profile-id {
+            type leafref {
+              path "../../../virtual-link-profile/id";
+            }
+            description
+              "Reference an NS VL profile.";
+            reference
+              "GS NFV IFA014: Section 6.3.7.2, NsVirutalLinkConnectivity
+               information element.";
+          }
+
+          list constituent-cpd-id {
+            key "constituent-base-element-id";
+
+            description
+              "Describes a connection point on a VNF/PNF or a SAP
+               which connects to virtual links instantiated from
+               the profile identified in the virtualLinkProfileId
+               attribute.";
+            reference
+              "GS NFV IFA014: Section 6.3.7
+               NsVirtualLinkConnectivity information element";
+
+            leaf constituent-base-element-id {
+              type leafref {
+                path "../../../id";
+              }
+              description
+                "Reference to the profile of an NS constituent.";
+              reference
+                "GS NFV IFA014: Section 6.4.8
+                 CpdInConstituentElement information element";
+            }
+
+            leaf constituent-cpd-id {
+              type leafref {
+                path "deref(../../../pnfd-id)/../ext-cpd/id";
+              }
+              description
+                "A reference to the descriptor of a connection point
+                 attached to one of the constituent VNFs and PNFs or to
+                 the descriptor of a NS SAP.";
+              reference
+                "GS NFV IFA014: Section 6.4.4.2 CpdPool information
+                 element";
+            }
+          }
+        }
+      }
+
+      list virtual-link-profile {
+        key "id";
+
+        description
+          "VL profile to be used for the NS flavour.";
+        reference
+          "GS NFV IFA014: Section 6.3.2.2 NsDf information element";
+
+        leaf id {
+          type string;
+          description
+            "Uniquely identifies this VirtualLinkProfile
+             information element.";
+          reference
+            "GS NFV IFA014: Section 6.3.2.2 VirtualLinkProfile
+             information element";
+        }
+
+        leaf virtual-link-desc-id {
+          mandatory true;
+          type leafref {
+            path "../../../virtual-link-desc/id";
+          }
+          description
+            "Uniquely references a VLD.";
+          reference
+            "GS NFV IFA014: Section 6.3.2.2 VirtualLinkProfile
+             information element";
+        }
+
+        leaf flavour-id {
+          mandatory true;
+          type leafref {
+            path "deref(../virtual-link-desc-id)/../df/id";
+          }
+          description
+            "Identifies a flavour within the VLD.";
+          reference
+            "GS NFV IFA014: Section 6.3.2.2 VirtualLinkProfile
+             information element";
+        }
+
+        uses local-affinity-or-anti-affinity-rule;
+
+        list affinity-or-anti-affinity-group {
+          key "id";
+
+          description
+            "Identifies an affinity or anti-affinity group the
+             VLs instantiated according to the VlProfile belong
+             to.";
+          reference
+            "GS NFV IFA014: Section 6.3.4.2 VirtualLinkProfile
+             information element";
+
+          leaf id {
+            type leafref {
+              path "../../../affinity-or-anti-affinity-group/id";
+            }
+          }
+        }
+
+        container max-bitrate-requirements {
+          description
+            "Specifies the maximum bitrate requirements for a VL
+             instantiated according to this profile.";
+          reference
+            "GS NFV IFA014: Section 6.3.4.2 VirtualLinkProfile
+             information element";
+          uses link-bitrate-requirements;
+        }
+        container min-bitrate-requirements {
+          description
+            "Specifies the minimum bitrate requirements for a VL
+             instantiated according to this profile.";
+          reference
+            "GS NFV IFA014: Section 6.3.4.2 VirtualLinkProfile
+             information element";
+          uses link-bitrate-requirements;
+        }
+      }
+
+      list scaling-aspect {
+        key "id";
+
+        description
+          "The scaling aspects supported by this DF of the NS.";
+        reference
+          "GS NFV IFA014: Section 6.3.2.2 NsDf information element";
+
+        leaf id {
+          type string;
+          description
+            "Identifier of this NsScalingAspect information element.
+             It uniquely identifies the NS scaling aspect in an
+             NSD.";
+          reference
+            "GS NFV IFA014: Section 6.7.2.2 NsScalingAspect
+             information element";
+        }
+
+        leaf name {
+          type string;
+          description
+            "Provides a human readable name of the NS scaling
+             aspect.";
+          reference
+            "GS NFV IFA014: Section 6.7.2.2 NsScalingAspect
+             information element";
+        }
+
+        leaf description {
+          type string;
+          description
+            "Provides a human readable description of the NS
+             scaling aspect.";
+          reference
+            "GS NFV IFA014: Section 6.7.2.2 NsScalingAspect
+             information element";
+        }
+
+        leaf scaling-level {
+          type leafref {
+            path "../../ns-instantiation-level/id";
+          }
+          description
+            "Describes the details of an NS level.";
+          reference
+            "GS NFV IFA014: Section 6.7.2.2 NsScalingAspect
+             information element";
+        }
+      }
+
+      list affinity-or-anti-affinity-group {
+        key "id";
+
+        description
+          "Specifies affinity or anti-affinity relationship
+           applicable between the VNF instances created using
+           different VNFDs, the Virtual Link instances created
+           using different NsVirtualLinkDescs or the nested NS
+           instances created using different NSDs in the same
+           affinity or anti-affinity group.";
+        reference
+          "GS NFV IFA014: Section 6.3.2.2 NsDf information element";
+
+        leaf id {
+          type string;
+          description
+            "Identifier of Identifier of this
+             AffinityOrAntiAffinityGroup information element.";
+          reference
+            "GS NFV IFA014: Section 6.3.5.2 AffinityOrAntiAffinity
+             information element";
+        }
+
+        leaf type {
+          mandatory true;
+          type affinity-type;
+          description
+            "Specifies the type of relationship that the members of
+             the group have: 'affinity' or 'anti-affinity.'";
+          reference
+            "GS NFV IFA014: Section 6.3.5.2 AffinityOrAntiAffinity
+             information element";
+        }
+
+        leaf scope {
+          mandatory true;
+          type affinity-scope;
+          description
+            "Specifies the scope of the affinity or anti-affinity
+             relationship e.g. a NFVI node, an NFVI PoP, etc.";
+          reference
+            "GS NFV IFA014: Section 6.3.5.2 AffinityOrAntiAffinity
+             information element";
+        }
+      }
+
+      list ns-instantiation-level {
+        min-elements 1;
+        key "id";
+
+        description
+          "Describes the details of an NS level.";
+        reference
+          "GS NFV IFA014: Section 6.3.2.2 NsDf information element
+           GS NFV IFA014: Section 6.7.2.2 NsScaling information
+           element";
+
+        leaf id {
+          type string;
+          description
+            "Identifier of this NsLevel information element. It
+             uniquely identifies an NS level within the DF.";
+          reference
+            "GS NFV IFA014: Section 6.3.9.2 NsLevel information
+             element";
+        }
+
+        leaf description {
+          type string;
+          description
+            "Human readable description of the NS level.";
+          reference
+            "GS NFV IFA014: Section 6.3.9.2 NsLevel information
+             element";
+        }
+
+        list vnf-to-level-mapping {
+          key "vnf-profile-id";
+
+          description
+            "Specifies the profile of the VNFs involved in this NS
+             level and, for each of them, the required number of
+             instances.";
+          reference
+            "GS NFV IFA014: Section 6.3.9.2 NsLevel information
+             element";
+
+          leaf vnf-profile-id {
+            type leafref {
+              path "../../../vnf-profile/id";
+            }
+            description
+              "Identifies the profile to be used for a VNF
+               involved in an NS level.";
+            reference
+              "GS NFV IFA014: Section 6.7.4.2 VnfToLevelMapping
+               information element";
+          }
+
+          leaf number-of-instances {
+            default 1;
+            type uint32;
+            description
+              "Specifies the number of VNF instances required for
+               an NS level.";
+            reference
+              "GS NFV IFA014: Section 6.7.4.2 VnfToLevelMapping
+               information element";
+          }
+        }
+
+        list virtual-link-to-level-mapping {
+          key "virtual-link-profile-id";
+
+          description
+            "Specifies the profile of the VLs involved in this NS
+             level and, for each of them, the needed bandwidth.";
+          reference
+            "GS NFV IFA014: Section 6.3.9.2 NsLevel information
+             element";
+
+          leaf virtual-link-profile-id {
+            type leafref {
+              path "../../../virtual-link-profile/id";
+            }
+            description
+              "Identifies the profile to be used for a VL involved
+               in an NS level.";
+            reference
+              "GS NFV IFA014: Section 6.7.5.2
+               VirtualLinkToLevelMapping information element";
+          }
+
+          uses link-bitrate-requirements;
+        }
+
+        list ns-to-level-mapping {
+          key "ns-profile-id";
+
+          description
+            "Specifies the profile of the nested NSs involved in
+             this NS level and, for each of them, the required
+             number of instances.";
+          reference
+            "GS NFV IFA014: Section 6.3.9.2 NsLevel information
+             element";
+
+          leaf ns-profile-id {
+            type leafref {
+              path "../../../ns-profile/id";
+            }
+            description
+              "Identifies the profile to be used for a nested NS
+               involved in the NS level.";
+            reference
+              "GS NFV IFA014: Section 6.7.6.2 NsToLevel information
+               element";
+          }
+
+          leaf number-of-instances {
+            default 1;
+            type uint32;
+            description
+              "Specifies the number of nested NS instances required
+               for the NS scale level.";
+            reference
+              "GS NFV IFA014: Section 6.7.6.2 NsToLevel information
+               element";
+          }
+        }
+
+        must "(count(vnf-to-level-mapping) + " +
+             "count(virtual-link-to-level-mapping) + " +
+             "count(ns-to-level-mapping)) > 0" {
+          error-message
+	    "At least one attribute between " +
+            "vnf-to-level-mapping, " +
+            "virtual-link-to-level-mapping and " +
+            "ns-to-level-mapping shall be present.";
+          description
+            "At least one attribute between vnfToLevelMapping,
+             vlirtualLinkToLevelMapping and nsToLevelMapping shall
+             be present.";
+          reference
+            "GS NFV IFA014: Section 6.3.9.2 NsLevel information
+             element";
+        }
+      }
+
+      leaf default-instantiation-level {
+        type leafref {
+          path "../ns-instantiation-level/id";
+        }
+        description
+          "Identifies the NS level which represents the default NS
+           instantiation level for this DF. It shall be present if
+           there are multiple 'nsIinstantiationLevel' entries.";
+        reference
+          "GS NFV IFA014: Section 6.3.2.2 NsDf information element";
+      }
+
+      list ns-profile {
+        must "min-number-of-instances <= max-number-of-instances" {
+          error-message
+            "min-number-of-instances has to be less than or equal" +
+            "max-number-of-instances.";
+        }
+        must "boolean(../../nested-nsd-id[.=current()/nsd-id])" {
+          error-message
+	    "PNFDs in the profile has to be listed as a " +
+            "dependency of the network service " +
+            "descriptor.";
+        }
+        key "id";
+
+        description
+          "Specifies a NS Profile supported by this NS DF.";
+        reference
+          "GS NFV IFA014: Section 6.3.2.2 NsDf information element";
+
+        leaf id {
+          type string;
+          description
+            "Identifies an NS profile.";
+          reference
+            "GS NFV IFA014: Section 6.3.11.2 NsProfile information
+             element";
+        }
+
+        leaf nsd-id {
+          mandatory true;
+          type leafref {
+            path "../../../../nsd/id";
+          }
+          description
+            "Identifies the NSD applicable to NS instantiated
+             according to this profile.";
+          reference
+            "GS NFV IFA014: Section 6.3.11.2 NsProfile information
+             element";
+        }
+
+	leaf ns-df-id {
+          mandatory true;
+          type leafref {
+            path "deref(../nsd-id)/../df/id";
+          }
+          description
+            "Identifies the applicable network service DF within
+             the scope of the NSD.";
+          reference
+            "GS NFV IFA014: Section 6.3.11.2 NsProfile information
+             element";
+        }
+
+	leaf instantiation-level-id {
+          mandatory true;
+          type leafref {
+            path "deref(../ns-df-id)/../ns-instantiation-level/id";
+          }
+          description
+            "Identifies the NS level within the referenced NS DF to
+             be used in the context of the parent NS instantiation.
+             If not present, the default NS instantiation level as
+             declared in the referenced NSD shall be used.";
+          reference
+            "GS NFV IFA014: Section 6.3.11.2 NsProfile information
+             element";
+        }
+
+	leaf min-number-of-instances {
+          type uint16;
+          default 1;
+          description
+            "Minimum number of nested NS instances based on the
+             referenced NSD that is permitted to exist for this
+             NsProfile.";
+          reference
+            "GS NFV IFA014: Section 6.3.11.2 NsProfile information
+             element";
+        }
+
+	leaf max-number-of-instances {
+          type uint16;
+          default 1;
+          description
+            "Maximum number of nested NS instances based on the
+             referenced NSD that is permitted to exist for this
+             NsProfile.";
+          reference
+            "GS NFV IFA014: Section 6.3.11.2 NsProfile information
+             element";
+        }
+
+        list affinity-or-anti-affinity-group-id {
+          key "id";
+
+          description
+            "Identifies an affinity or anti-affinity group the NSs
+             created according to this NsProfile belongs to.";
+          reference
+            "GS NFV IFA014: Section 6.3.11.2 NsProfile information
+             element";
+
+          leaf id {
+            type leafref {
+              path "../../../affinity-or-anti-affinity-group/id";
+            }
+          }
+        }
+
+        list virtual-link-connectivity {
+          key "virtual-link-profile-id";
+
+          leaf virtual-link-profile-id {
+            type leafref {
+              path "../../../virtual-link-profile/id";
+            }
+            description
+              "Reference an NS VL profile.";
+            reference
+              "GS NFV IFA014: Section 6.3.7.2, NsVirutalLinkConnectivity
+               information element.";
+          }
+
+          list constituent-cpd-id {
+            key "constituent-base-element-id";
+
+            description
+              "Describes a connection point on a VNF/PNF or a SAP
+               which connects to virtual links instantiated from
+               the profile identified in the virtualLinkProfileId
+               attribute.";
+            reference
+              "GS NFV IFA014: Section 6.3.7
+               NsVirtualLinkConnectivity information element";
+
+            leaf constituent-base-element-id {
+              type leafref {
+                path "../../../id";
+              }
+              description
+                "Reference to the profile of an NS constituent.";
+              reference
+                "GS NFV IFA014: Section 6.4.8
+                 CpdInConstituentElement information element";
+            }
+
+            leaf constituent-cpd-id {
+              type leafref {
+                path "deref(../../../nsd-id)/../sapd/id";
+              }
+              description
+                "A reference to the descriptor of a connection point
+                 attached to one of the constituent VNFs and PNFs or to
+                 the descriptor of a NS SAP.";
+              reference
+                "GS NFV IFA014: Section 6.4.4.2 CpdPool information
+                 element";
+            }
+          }
+        }
+      }
+
+      list dependencies {
+        key "id";
+
+        description
+          "Specifies the order in which instances of the VNFs and/or
+           nested NSs have to be created.";
+        reference
+          "GS NFV IFA014: Section 6.3.2.2 NsDf information element";
+
+        leaf id {
+          type string;
+        }
+
+        choice primary-id {
+          leaf primary-vnf-profile {
+            type leafref {
+              path "../../vnf-profile/vnfd-id";
+            }
+          }
+          leaf primary-ns-profile {
+            type leafref {
+              path "../../ns-profile/nsd-id";
+            }
+          }
+          description
+            "References a VnfProfile or NsProfile.";
+          reference
+            "GS NFV IFA014: Section 6.3.12.2 Dependencies
+             information element";
+        }
+
+	choice secondary-id {
+          leaf secondary-vnf-profile {
+            type leafref {
+              path "../../vnf-profile/vnfd-id";
+            }
+          }
+          leaf secondary-ns-profile {
+            type leafref {
+              path "../../ns-profile/nsd-id";
+            }
+          }
+          description
+            "References a VnfProfile or NsProfile.";
+          reference
+            "GS NFV IFA014: Section 6.3.12.2 Dependencies
+             information element";
+        }
+      }
+
+      list monitored-info {
+        key "id";
+
+        leaf id {
+          type string;
+        }
+
+        container vnf-indicator-info {
+          leaf vnfd-id {
+            type leafref {
+              path "../../../../../vnfd/id";
+            }
+            description
+              "Identifies a VNFD.";
+            reference
+              "GS NFV IFA014: Section 6.2.7.2 VnfIndicatorData
+               information element";
+          }
+
+	  leaf vnf-indicator {
+            mandatory true;
+            type leafref {
+              path "deref(../vnfd-id)/../indicator/id";
+            }
+            description
+              "Identifies a VNF indicator within the VNFD.";
+            reference
+              "GS NFV IFA014: Section 6.2.7.2 VnfIndicatorData
+               information element";
+          }
+          description
+            "Uniquely identifies this VNF Indicator information
+             element.";
+          reference
+            "GS NFV IFA014: Section 6.2.6.2 MonitoredData
+             information element";
+        }
+
+        // monitoringParameter in IFA014 is defined by MonitoredData
+        // whereas monitoringParameter in IFA011 is defined by
+        // MonitoringParameter.
+        container monitoring-parameter {
+          leaf id {
+            type string;
+            description
+              "Unique identifier of this monitoring parameter
+               information element.";
+            reference
+              "GS NFV IFA014: Section 6.2.8.2 MonitoringParameter
+               information element";
+          }
+
+          leaf name {
+            type string;
+            description
+              "Human readable name of the monitoring parameter.";
+            reference
+              "GS NFV IFA014: Section 6.2.8.2 MonitoringParameter
+               information element";
+          }
+
+          leaf performance-metric {
+            mandatory true;
+            type string;
+            description
+              "Defines the virtualised resource-related performance
+               metric.";
+            reference
+              "GS NFV IFA014: Section 6.2.8.2 MonitoringParameter
+               information element";
+          }
+
+          leaf collection-period {
+            type string;
+            description
+              "An attribute that describes the periodicity at
+               which to collect the performance information.";
+            reference
+              "GS NFV IFA014: Section 6.2.8.2 MonitoringParameter
+               information element";
+          }
+        }
+      }
+    }
+    uses security-parameters;
+  }
+}
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/nfv/etsi-nfv-nsd.yang b/plugins/org.etsi.mts.tdl.yang2tdl/samples/nfv/etsi-nfv-nsd.yang
new file mode 100644
index 0000000000000000000000000000000000000000..52cd50858104cbfdf6de45381c30bdd3f4dc4fd6
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/nfv/etsi-nfv-nsd.yang
@@ -0,0 +1,62 @@
+module etsi-nfv-nsd {
+  yang-version 1.1;
+  namespace "urn:etsi:nfv:yang:etsi-nfv-nsd";
+  prefix nsd;
+
+  import etsi-nfv-descriptors {
+    prefix vnf;
+  }
+
+  organization
+    "European Telecommunications Standards Institute (ETSI)";
+
+  description
+    "Network Services Descriptors";
+
+  revision 2019-04-25 {
+    description
+      "Initial revision.
+       NSD according to ETSI GS NFV-IFA 014 Ed261v252.";
+  }
+
+  container nsd {
+    list vnfd {
+      key "id";
+      description
+        "A VNF Descriptor (VNFD) is a deployment template which
+         describes a VNF in terms of deployment and operational
+         behaviour requirements. It also contains connectivity,
+         interface and virtualised resource requirements";
+      reference
+        "GS NFV-IFA011: Section 7.1.2, VNFD information element";
+
+      uses vnf:vnfd;
+    }
+
+    list nsd {
+      key "id";
+      max-elements 1;
+      uses vnf:nsd;
+      description
+	"The NSD information element is a deployment template whose
+         instances are used by the NFVO for the lifecycle management
+         of NSs.";
+      reference
+        "GS NFV-IFA014: Section 6.2.2, Network Service Descriptor
+         information element";
+    }
+
+    list pnfd {
+      key "id";
+
+      description
+	"The Pnfd information element is a deployment template
+         enabling on-boarding PNFs and referencing them from an
+         NSD. It focuses on connectivity aspects only.";
+      reference
+        "GS NFV-IFA014: Section 6.6.2, Pnfd information element.";
+
+      uses vnf:pnfd;
+    }
+  }
+}
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/nfv/etsi-nfv-pnf.yang b/plugins/org.etsi.mts.tdl.yang2tdl/samples/nfv/etsi-nfv-pnf.yang
new file mode 100644
index 0000000000000000000000000000000000000000..ffe5d064004831f8c62fe68b97f6811f745dfd2a
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/nfv/etsi-nfv-pnf.yang
@@ -0,0 +1,121 @@
+submodule etsi-nfv-pnf {
+  yang-version 1.1;
+  belongs-to etsi-nfv-descriptors {
+    prefix nfv;
+  }
+
+  /*
+   * Import
+   */
+  include etsi-nfv-common;
+
+  description
+    "Models for PNFD according to GS NFV-IFA 014.";
+
+  revision 2019-04-25 {
+    description
+      "Initial revision.
+
+       Common data structure to support VNFD according to:
+       ETSI GS NFV-IFA 014 Ed261v252";
+
+    reference
+      "ETSI GS NFV-IFA 014 Ed261v252";
+  }
+
+  grouping pnfd {
+    description
+      "The Pnfd information element is a deployment template
+       enabling on-boarding PNFs and referencing them from an NSD.
+       It focuses on connectivity aspects only";
+    reference
+      "GS NFV-IFA014: Section 6.6.2, Pnfd information element";
+
+    leaf id {
+      type string;
+      description
+        "Identifier of this Pnfd information element. It uniquely
+         identifies the PNFD.";
+      reference
+        "GS NFV-IFA014: Section 6.6.2, Pnfd information element";
+    }
+
+    leaf function-description {
+      type string;
+      description
+        "Describes the PNF function.";
+      reference
+        "GS NFV-IFA014: Section 6.6.2, Pnfd information element";
+    }
+
+    leaf provider {
+      type string;
+      description
+        "Identifies the provider of the PNFD.";
+      reference
+        "GS NFV-IFA014: Section 6.6.2, Pnfd information element";
+    }
+
+    leaf version {
+      type string;
+      mandatory true;
+      description
+        "Identifies the version of the PNFD.";
+      reference
+        "GS NFV-IFA014: Section 6.6.2, Pnfd information element";
+    }
+
+    leaf invariant-id {
+      type string;
+      description
+        "Identifies a PNFD in a version independent manner. This
+         attribute is invariant across versions of PNFD.";
+      reference
+        "GS NFV-IFA014: Section 6.6.2, Pnfd information element";
+    }
+
+    leaf name {
+      type string;
+      description
+        "Provides the human readable name of the PNFD.";
+      reference
+        "GS NFV-IFA014: Section 6.6.2, Pnfd information element";
+    }
+
+    list ext-cpd {
+      key "id";
+      uses cpd;
+      description
+        "Specifies the characteristics of one or more connection
+         points where to connect the PNF to a VL.";
+      reference
+        "GS NFV-IFA014: Section 6.6.2, Pnfd information element";
+    }
+
+    list security {
+      key "signature";
+      uses security-parameters;
+      description
+        "Provides a signature to prevent tampering.
+         Editor's Note: While IFA014 does specify that the PNFD
+         includes a security parameter. SOL001 does not have one.
+         We need to harmonize SOL001 & SOL006 on this point.";
+      reference
+        "GS NFV-IFA014: Section 6.6.2, Pnfd information element";
+    }
+
+    leaf geographical-location-info {
+      type string;
+      description
+        "It provides information about the geographical location
+         (e.g. geographic coordinates or address of the building,
+         etc.) of the PNF. The cardinality 0 is used when the
+         location is unknown.
+         Editor's Note: The type is TBD in SOL001. We need to make
+         a common SOL001/SOL006 decision.";
+      reference
+        "GS NFV-IFA014: Section 6.6.2, Pnfd information element";
+    }
+    uses security-group-rule;
+  }
+}
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/nfv/etsi-nfv-pnfd.yang b/plugins/org.etsi.mts.tdl.yang2tdl/samples/nfv/etsi-nfv-pnfd.yang
new file mode 100644
index 0000000000000000000000000000000000000000..a365e0189d31d9342ab067369ec328691cd22563
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/nfv/etsi-nfv-pnfd.yang
@@ -0,0 +1,26 @@
+module etsi-nfv-pnfd {
+  yang-version 1.1;
+  namespace "urn:etsi:nfv:yang:etsi-nfv-pnfd";
+  prefix pnfd;
+
+  import etsi-nfv-descriptors {
+    prefix vnf;
+  }
+
+  organization
+    "European Telecommunications Standards Institute (ETSI)";
+
+  description
+    "Physcial Network Function Descriptor.";
+
+  revision 2019-04-25 {
+    description
+      "Initial revision.
+       NSD according to ETSI GS NFV-IFA 014 Ed261v252.";
+  }
+
+  container pnfd {
+    presence "PNFD container.";
+    uses vnf:pnfd;
+  }
+}
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/nfv/etsi-nfv-vnf.yang b/plugins/org.etsi.mts.tdl.yang2tdl/samples/nfv/etsi-nfv-vnf.yang
new file mode 100644
index 0000000000000000000000000000000000000000..43c11095fa644be600e48c843e9c5fca838e2be8
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/nfv/etsi-nfv-vnf.yang
@@ -0,0 +1,2795 @@
+submodule etsi-nfv-vnf {
+  yang-version 1.1;
+  belongs-to etsi-nfv-descriptors {
+    prefix nfv;
+  }
+
+  include etsi-nfv-common;
+
+  import ietf-inet-types {
+    prefix inet;
+  }
+  import ietf-yang-types {
+    prefix yang;
+  }
+
+  description
+    "Models for VNFD according to GS NFV-IFA 011.";
+
+  revision 2019-03-18 {
+    description
+      "Initial revision.
+
+       Common data structure to support VNFD according to:
+       VNFD according to ETSI GS NFV-IFA 011 Ed261v254";
+
+    reference
+      "ETSI GS NFV-IFA 011 Ed261v254";
+  }
+
+  grouping virtual-network-interface-requirements {
+    list virtual-network-interface-requirement {
+      key "name";
+      description
+        "Specifies requirements on a virtual network interface
+         realising the CPs instantiated from this CPD.";
+      reference
+        "GS NFV-IFA011: Section 7.1.6.4, VduCpd information
+         element";
+
+      leaf name {
+        type string;
+        description
+          "Provides a human readable name for the requirement.";
+        reference
+          "GS NFV-IFA011: Section 7.1.6.6,
+           VirtualNetworkInterfaceRequirements information element";
+      }
+
+      leaf description {
+        type string;
+        description
+          "Provides a human readable description of the requirement.";
+        reference
+          "GS NFV-IFA011: Section 7.1.6.6,
+           VirtualNetworkInterfaceRequirements information element";
+      }
+
+      leaf support-mandatory {
+        default "false";
+        type boolean;
+        description
+          "Indicates whether fulfilling the constraint is
+           mandatory (true) for successful operation or desirable
+           (false).";
+        reference
+          "GS NFV-IFA011: Section 7.1.6.6,
+           VirtualNetworkInterfaceRequirements information element";
+      }
+
+      list network-interface-requirements {
+        key "key";
+        min-elements "1";
+        max-elements "1";
+
+        leaf key {
+          type string;
+        }
+        leaf value {
+          type string;
+        }
+        description
+          "The network interface requirements. An element from an
+           array of key-value pairs that articulate the network
+           interface deployment requirements.";
+        reference
+          "GS NFV-IFA011: Section 7.1.6.6,
+           VirtualNetworkInterfaceRequirements information element";
+      }
+    }
+  }
+
+  grouping vnfd {
+    leaf id {
+      type string;
+      description
+        "Identifier of this VNFD information element. This attribute
+         shall be globally unique. The format will be defined in the
+         data model specification phase.";
+      reference
+        "GS NFV-IFA011: Section 7.1.2, VNFD information element";
+    }
+
+    leaf provider {
+      type string;
+      mandatory true;
+      description
+        "Provider of the VNF and of the VNFD";
+      reference
+        "GS NFV-IFA011: Section 7.1.2, VNFD information element";
+    }
+
+    leaf product-name {
+      type string;
+      mandatory true;
+      description
+        "Name to identify the VNF Product. Invariant for the VNF
+         Product lifetime.";
+      reference
+        "GS NFV-IFA011: Section 7.1.2, VNFD information element";
+    }
+
+    leaf software-version {
+      type string;
+      mandatory true;
+      description
+        "Software version of the VNF. This is changed when there is
+         any change to the software that is included in the VNF
+         Package";
+      reference
+        "GS NFV-IFA011: Section 7.1.2, VNFD information element";
+    }
+
+    leaf version {
+      type string;
+      mandatory true;
+      description
+        "Identifies the version of the VNFD";
+      reference
+        "GS NFV-IFA011: Section 7.1.2, VNFD information element";
+    }
+
+    leaf product-info-name {
+      type string;
+      description
+        "Human readable name of the VNFD. Can change
+         during the VNF Product lifetime.";
+      reference
+        "GS NFV-IFA011: Section 7.1.2, VNFD information element";
+    }
+
+    leaf product-info-description {
+      type string;
+      description
+        "Human readable description of the VNFD. Can change during
+         the VNF Product lifetime.";
+      reference
+        "GS NFV-IFA011: Section 7.1.2, VNFD information element";
+    }
+
+    leaf-list vnfm-info {
+      type string;
+      min-elements 1;
+      description
+        "Identifies VNFM(s) compatible with the VNF described in
+         this version of the VNFD.";
+      reference
+        "GS NFV-IFA011: Section 7.1.2, VNFD information element";
+    }
+
+    leaf localization-language {
+      type string;
+      description
+        "Information about the language of the VNF.";
+      reference
+        "GS NFV-IFA011: Section 7.1.2, VNFD information element";
+    }
+
+    leaf default-localization-language {
+      when "../localization-language";
+      type string;
+      description
+        "Default localization language that is instantiated if no
+         information about selected localization language is
+         available. Shall be present if 'localization-language'
+         is present and shall be absent otherwise.";
+      reference
+        "GS NFV-IFA011: Section 7.1.2, VNFD information element";
+    }
+
+    list vdu {
+      key "id";
+      min-elements 1;
+      description
+        "The Virtualisation Deployment Unit (VDU) is a construct supporting
+         the description of the deployment and operational behaviour of a
+         VNF component, or the entire VNF if it was not componentized in
+         components.";
+      reference
+        "GS NFV IFA011: Section 7.1.2, VNFD information element";
+
+      leaf id {
+        type string;
+        description
+          "Unique identifier of this VDU in VNFD.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.2, Vdu information element";
+      }
+
+      leaf name {
+        type string;
+        mandatory true;
+        description
+          "Human readable name of the VDU.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.2, Vdu information element";
+      }
+
+      leaf description {
+        type string;
+        description
+          "Human readable description of the VDU.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.2, Vdu information element";
+      }
+
+      list int-cpd {
+        key "id";
+        min-elements 1;
+        description
+          "A internal-connection-point element is a type of
+           connection point and describes network connectivity
+           between a VDU instance and an internal Virtual Link or
+           an external connection point.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.2, Vdu information element";
+
+        leaf int-virtual-link-desc {
+          type leafref {
+            path "../../../int-virtual-link-desc/id";
+          }
+          description
+            "Reference of the internal VLD which this internal CPD
+             connects to.";
+          reference
+            "GS NFV IFA011: Section 7.1.6.4, VduCpd information
+             element";
+        }
+
+        leaf bitrate-requirement {
+          type uint64;
+          units "Mbps";
+          description
+            "Bitrate requirement on this CP.";
+          reference
+            "GS NFV IFA011: Section 7.1.6.4, VduCpd information
+             element.";
+        }
+        uses virtual-network-interface-requirements;
+
+        leaf nicio-requirements {
+          type leafref {
+            path "../../../virtual-compute-desc/id";
+          }
+          description
+            "This references (couples) the CPD with any logical node I/O
+             requirements (for network devices) that may have been
+             created. Linking these attributes is necessary so that so
+             that I/O requirements that need to be articulated at the
+             logical node level can be associated with the network
+             interface requirements associated with the CPD.";
+          reference
+            "GS NFV-IFA011: Section 7.1.6.6,
+             VirtualNetworkInterfaceRequirements information element";
+        }
+
+        leaf-list order {
+          type uint32;
+          description
+            "The order of the NIC to be assigned on the compute
+             instance (e.g. 2 for eth2).
+
+             Note: when binding more than one port to a single
+             compute (aka multi vNICs) and ordering is desired, it
+             is mandatory that all ports will be set with an order
+             value. The order values shall represent a positive,
+             arithmetic progression that starts with 0 (i.e. 0, 1,
+             2,..., n).
+
+             If the property is not present, it shall be left to the
+             VIM to assign a value when creating the instance.";
+          reference
+            "GS NFV IFA011: Section 7.1.6.4, VduCpd information
+             element.";
+        }
+        uses cpd;
+
+        leaf security-group-rule-id {
+          type leafref {
+            path "../../../security-group-rule/id";
+          }
+          description
+            "Reference of the security group rules bound to this
+             CPD.";
+          reference
+            "GS NFV IFA011: Section 7.1.6.3 Cpd information element";
+        }
+      }
+
+      leaf virtual-compute-desc {
+        type leafref {
+          path "../../virtual-compute-desc/id";
+        }
+        must "../../virtual-compute-desc[id=current()]/" +
+             "virtual-memory/size >=" +
+             "../../sw-image-desc[id=current()/" +
+             "../sw-image-desc]/min-ram" {
+        }
+        description
+          "Describes CPU, Memory and acceleration requirements of
+           the Virtualisation Container realizing this VDU.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.2, VDU information
+           element, and Section 7.1.9.2.2, VirtualComputeDesc
+           information element.";
+      }
+
+      leaf-list virtual-storage-desc {
+        type leafref {
+          path "../../virtual-storage-desc/id";
+        }
+        description
+          "Describes storage requirements for a VirtualStorage
+           instance attached to the virtualisation container
+           created from virtualComputeDesc defined for this VDU.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.2, VDU information
+           element, and Section 7.1.9.4, Information elements
+           related to Virtual Storage.";
+      }
+
+      list boot-order {
+        ordered-by user;
+        key "key";
+
+        leaf key {
+          type uint32;
+        }
+
+        leaf value {
+          type leafref {
+            path "../../virtual-storage-desc";
+          }
+        }
+        description
+          "The key indicates the boot index (lowest index defines
+           highest boot priority). The Value references a descriptor
+           from which a valid boot device is created e.g.
+           VirtualStorageDesc from which a VirtualStorage instance
+           is created.
+
+           Editor's note: The boot-order node requires further
+           study.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.2, Vdu information
+           element.";
+      }
+
+      leaf sw-image-desc {
+        type leafref {
+          path "../../sw-image-desc/id";
+        }
+        description
+          "Describes the software image which is directly loaded on
+           the virtualisation container realising this Vdu.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.2, Vdu information
+           element.";
+      }
+
+      leaf-list nfvi-constraint {
+        type string;
+        description
+          "Describes constraints on the NFVI for the VNFC
+           instance(s) created from this Vdu. For example, aspects
+           of a secure hosting environment for the VNFC instance
+           that involve additional entities or processes.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.2, VDU Information
+           element.";
+      }
+
+      list monitoring-parameter {
+        key "id";
+        leaf id {
+          type string;
+          description
+            "Unique identifier of the monitoring parameter.";
+          reference
+            "GS NFV IFA011: Section 7.1.11.3, MonitoringParameter
+             information element.";
+        }
+        uses monitoring-parameter;
+      }
+
+      list configurable-properties {
+        key "key";
+        leaf key {
+          type string;
+        }
+        leaf value {
+          type string;
+        }
+        description
+          "It provides VNFC configurable properties that can be
+           modified using the ModifyVnfInfo operation.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.7,
+           VnfcConfigurableProperties Information element.";
+      }
+
+      leaf boot-data {
+        type string;
+        description
+          "Contains a string or a URL to a file contained in the
+           VNF package used to customize a virtualised compute
+           resource at boot time. The bootData may contain variable
+           parts that are replaced by deployment specific values
+           before being sent to the VIM.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.7,
+           VnfcConfigurableProperties Information element.";
+      }
+    }
+
+    list virtual-compute-desc {
+      key "id";
+      description
+        "Defines descriptors of virtual compute resources to be
+         used by the VNF.";
+      leaf id {
+        type string;
+        description
+          "Unique identifier of this VirtualComputeDesc in the
+           VNFD.";
+        reference
+          "GS NFV IFA011: Section 7.1.9.2, Information elements
+           related to Virtual CPU.";
+      }
+
+      list logical-node {
+        key "id";
+
+        leaf id {
+          type string;
+          description
+            "Identifies this set of logical node requirements.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.6, LogicalNodeRequirements
+             Information elements.";
+        }
+
+        list requirement-detail {
+          key "key";
+
+          leaf key {
+            type string;
+          }
+
+          leaf value {
+            type string;
+          }
+          description
+            "The logical node-level compute, memory and I/O
+             requirements. An array of key-value pairs that
+             articulate the deployment requirements.
+
+             This could include the number of CPU cores on this
+             logical node, a memory configuration specific to a
+             logical node (e.g. such as available in the Linux
+             kernel via the libnuma library) or a requirement
+             related to the association of an I/O device with the
+             logical node.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.6, LogicalNodeRequirements
+             information element.";
+        }
+        description
+          "The logical node requirements.";
+        reference
+          "GS NFV IFA011: Section 7.1.9.2, VirtualComputeDesc
+           information element.";
+      }
+
+      list request-additional-capability {
+        key "name";
+
+        leaf name {
+          type string;
+          description
+            "Identifies a requested additional capability for the
+             VDU. ETSI GS NFV-IFA 002 [i.1] describes acceleration
+             capabilities.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.5,
+             RequestedAdditionalCapabilityData Information element.";
+        }
+
+        leaf support-mandatory {
+          type boolean;
+          description
+            "Indicates whether the requested additional capability
+             is mandatory for successful operation.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.5,
+             RequestedAdditionalCapabilityData Information
+             element.";
+        }
+
+        leaf min-version {
+          type string;
+          description
+            "Identifies the minimum version of the requested
+             additional capability.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.5,
+             RequestedAdditionalCapabilityData Information element.";
+        }
+
+        leaf preferred-version {
+          type string;
+          description
+            "Identifies the preferred version of the requested
+             additional capability.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.5,
+             RequestedAdditionalCapabilityData Information element.";
+        }
+
+        list target-performance-parameters {
+          key "key";
+
+          leaf key {
+            type string;
+          }
+
+          leaf value {
+            type string;
+          }
+          description
+            "Identifies specific attributes, dependent on the
+             requested additional capability type.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.5,
+             RequestedAdditionalCapabilityData Information element.";
+        }
+      }
+
+      leaf compute-requirements {
+        type string;
+        description
+          "Specifies compute requirements.";
+        reference
+          "GS NFV IFA011: Section 7.1.9.2.2, VirtualComputeDesc
+           Information element.";
+      }
+
+      container virtual-memory {
+        leaf size {
+          type decimal64 {
+            fraction-digits 1;
+            range "0..max";
+          }
+          units "GB";
+          default 1;
+          description
+            "Amount of virtual memory in GB.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.3, Information elements
+             related to Virtual Memory.";
+        }
+
+        leaf over-subscription-policy {
+          type string;
+          description
+            "The memory core oversubscription policy in terms of
+             virtual memory to physical memory on the platform.
+             The cardinality can be 0 during the allocation
+             request, if no particular value is requested.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.3, Information elements
+             related to Virtual Memory.";
+        }
+
+        list vdu-mem-requirements {
+          key "key";
+
+          leaf key {
+            type string;
+          }
+
+          leaf value {
+            type string;
+          }
+          description
+            "Array of key-value pair requirements on the memory for
+             the VDU.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.3.2, VirtualMemoryData
+             information element.";
+        }
+
+        leaf numa-enabled {
+          type boolean;
+          description
+            "It specifies the memory allocation to be cognisant of
+             the relevant process/core allocation. The cardinality
+             can be 0 during the allocation request, if no
+             particular value is requested.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.3, Information elements
+             related to Virtual Memory.";
+        }
+        description
+          "The virtual memory of the virtualised compute.";
+        reference
+          "GS NFV IFA011: Section 7.1.9.2.2, VirtualComputeDesc
+           Information element.";
+      }
+
+      container virtual-cpu {
+        description
+          "The virtual CPU(s)of the virtualised compute.";
+        reference
+          "GS NFV IFA011: Section 7.1.9.2.2, VirtualComputeDesc
+           Information element.";
+
+        leaf cpu-architecture {
+          type string;
+          description
+            "CPU architecture type. Examples are x86, ARM. The
+             cardinality can be 0 during the allocation request,
+             if no particular CPU architecture type is requested.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.2.3, VirtualCpuData
+             information elements.";
+        }
+
+        leaf num-virtual-cpu {
+          type uint16 {
+            range "1..max";
+          }
+          default 1;
+          description
+            "Number of virtual CPUs.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.2.3, VirtualCpuData
+             information elements.";
+        }
+
+        leaf clock {
+          type uint32;
+          units "MHz";
+          description
+            "Minimum virtual CPU clock rate (e.g. in MHz). The
+             cardinality can be 0 during the allocation request,
+             if no particular value is requested.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.2.3, VirtualCpuData
+             information elements.";
+        }
+
+        leaf oversubscription-policy {
+          type string;
+          description
+            "The CPU core oversubscription policy e.g. the relation
+             of virtual CPU cores to physical CPU cores/threads.
+             The cardinality can be 0 during the allocation request,
+             if no particular value is requested.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.2.3, VirtualCpuData
+             information elements.";
+        }
+
+        list vdu-cpu-requirements {
+          key "key";
+
+          leaf key {
+            type string;
+          }
+
+          leaf value {
+            type string;
+          }
+          description
+            "Array of key-value pair requirements on the compute
+             (CPU) for the VDU.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.3.2, VirtualCpuData
+             information element.";
+        }
+
+        container pinning {
+          presence "Set to specify CPU pinning.";
+
+          leaf policy {
+            default "dynamic";
+            type enumeration {
+              enum "static";
+              enum "dynamic";
+            }
+            description
+              "The policy can take values of 'static' or 'dynamic'.
+               In case of 'static' the virtual CPU cores are
+               requested to be allocated to logical CPU cores
+               according to the rules defined in
+               virtualCpuPinningRules. In case of 'dynamic' the
+               allocation of virtual CPU cores to logical CPU cores
+               is decided by the VIM. (e.g. SMT (Simultaneous
+               MultiThreading) requirements).";
+            reference
+              "GS NFV IFA011: Section 7.1.9.2.4,
+               VirtualCpuPinningData information element.";
+          }
+
+          list rule {
+            when "../policy = 'static'";
+            key "key";
+
+            leaf key {
+              type string;
+            }
+            leaf value {
+              type string;
+            }
+            description
+              "A list of rules that should be considered during the
+               allocation of the virtual CPUs to logical CPUs in case
+               of 'static' virtualCpuPinningPolicy.";
+            reference
+              "GS NFV IFA011: Section 7.1.9.2.4,
+               VirtualCpuPinningData information element.";
+          }
+          description
+            "The virtual CPU pinning configuration for the
+             virtualised compute resource.";
+          reference
+            "GS NFV IFA011: Section 7.1.9.2.3,
+             VirtualCpuData information element.";
+        }
+      }
+    }
+
+    list virtual-storage-desc {
+      key "id";
+      description
+        "Storage requirements for a Virtual Storage instance
+         attached to the VNFC created from this VDU";
+      leaf id {
+        type string;
+        description
+          "Unique identifier of this VirtualStorageDesc in the
+           VNFD.";
+        reference
+          "GS NFV IFA011: Section 7.1.9.4, Information elements
+           related to Virtual Storage.";
+      }
+
+      leaf type-of-storage {
+        // Needed to be able to onboard images
+        default root-storage;
+        type identityref {
+          base storage-type;
+        }
+        description
+          "Type of virtualised storage resource (e.g. volume,
+           object).";
+        reference
+          "GS NFV IFA011: Section 7.1.9.4, Information elements
+           related to Virtual Storage.";
+      }
+
+      leaf size-of-storage {
+        type uint64;
+        units "GB";
+        default 0;
+        description
+          "Size of virtualised storage resource (e.g. size of
+           volume, in GB)";
+        reference
+          "GS NFV IFA011: Section 7.1.9.4, Information elements
+           related to Virtual Storage.";
+      }
+
+      list vdu-storage-requirements {
+        key "key";
+
+        leaf key {
+          type string;
+        }
+
+        leaf value {
+          type string;
+        }
+        description
+          "Array of key-value pairs that articulate the storage
+           deployment requirements.";
+        reference
+          "GS NFV IFA011: Section 7.1.9.4.2, VirtualStorageDesc
+           information element.";
+      }
+
+      leaf rdma-enabled {
+        type boolean;
+        description
+          "Indicate if the storage support RDMA.";
+        reference
+          "GS NFV IFA011: Section 7.1.9.4, Information elements
+           related to Virtual Storage.";
+      }
+
+      leaf sw-image-desc {
+        type leafref {
+          path "../../sw-image-desc/id";
+        }
+        must "../size-of-storage >=" +
+          "../../sw-image-desc[id=current()]/min-disk" {
+        }
+        description
+          "Software image to be loaded on the VirtualStorage
+           resource created based on this VirtualStorageDesc.";
+        reference
+          "GS NFV IFA011: Section 7.1.9.4, Information elements
+           related to Virtual Storage.";
+      }
+    }
+
+    list sw-image-desc {
+      key "id";
+      description
+        "Defines descriptors of software images to be used by the
+         VNF.";
+      reference
+        "GS NFV IFA011: Section 7.1.2, VNFD Information element.";
+
+      leaf id {
+        type string;
+        description
+          "The identifier of this software image.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.5, SwImageDesc information
+           element";
+      }
+
+      leaf name {
+        mandatory true;
+        type string;
+        description
+          "The name of this software image.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.5 SwImageDesc
+           information element.";
+      }
+
+      leaf version {
+        mandatory true;
+        type string;
+        description
+          "The version of this software image.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.5 SwImageDesc
+           information element.";
+      }
+
+      container checksum {
+
+        leaf algorithm {
+          mandatory true;
+          type identityref {
+            base checksum-algorithm;
+          }
+          description
+            "Species the algorithm used to obtain the checksum
+             value.";
+          reference
+            "GS NFV IFA011: Section 7.1.6.10 ChecksumData
+             information element.";
+        }
+
+        leaf hash {
+          mandatory true;
+          type string;
+          description
+            "Contains the result of applying the algorithm
+             indicated by the algorithm attribute to the data to
+             which this ChecksumData refers.";
+          reference
+            "GS NFV IFA011: Section 7.1.6.10 ChecksumData
+             information element.";
+        }
+        description
+          "The checksum of the software image file.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.5 SwImageDesc
+           information element.";
+      }
+
+      leaf container-format {
+        default "bare";
+        type enumeration {
+          enum "aki" {
+            description
+              "An Amazon kernel image.";
+          }
+          enum "ami" {
+            description
+              "An Amazon machine image.";
+          }
+          enum "ari" {
+            description
+              "An Amazon ramdisk image.";
+          }
+          enum "bare" {
+            description
+              "The image does not have a container or metadata
+               envelope.";
+          }
+          enum "docker" {
+            description
+              "A docker container format.";
+          }
+          enum "ova" {
+            description
+              "An OVF package in a tarfile.";
+          }
+          enum "ovf" {
+            description
+              "The OVF container format.";
+          }
+        }
+        description
+          "The container format describes the container file
+           format in which software image is provided.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.5 SwImageDesc
+           information element.";
+      }
+
+      leaf disk-format {
+        default "qcow2";
+        type enumeration {
+          enum "aki" {
+            description
+              "An Amazon kernel image.";
+          }
+          enum "ami" {
+            description
+              "An Amazon machine image.";
+          }
+          enum "ari" {
+            description
+              "An Amazon ramdisk image.";
+          }
+          enum "iso" {
+            description
+              "An archive format for the data contents of an
+               disk, such as CD-ROM.";
+          }
+          enum "qcow2" {
+            description
+              "Supported by the QEMU emulator that can expand
+               dynamically and supports Copy on Write.";
+          }
+          enum "raw" {
+            description
+              "An unstructured disk image format; if you have a
+               file without an extension it is possibly a raw
+               format.";
+          }
+          enum "vdi" {
+            description
+              "Supported by VirtualBox virtual machine monitor
+               and the QEMU emulator.";
+          }
+          enum "vhd" {
+            description
+              "The VHD disk format, a common disk format used by
+               virtual machine monitors from VMware, Xen,
+               Microsoft, VirtualBox, and others.";
+          }
+          enum "vhdx" {
+            description
+              "The VHDX disk format, an enhanced version of the
+               VHD format, which supports larger disk sizes among
+               other features.";
+          }
+          enum "vmdk" {
+            description
+              "Common disk format supported by many common virtual
+               machine monitors.";
+          }
+        }
+        description
+          "The disk format of a software image is the format of
+           the underlying disk image.";
+      }
+
+        leaf min-disk {
+          type uint64;
+          units "GB";
+          mandatory true;
+          description
+            "The minimal disk size requirement for this software
+             image. The value of the 'size of storage' attribute
+             of the VirtualStorageDesc referencing this
+             SwImageDesc shall not be smaller than the value of
+             minDisk.";
+          reference
+            "GS NFV IFA011: Section 7.1.6.5, SwImageDesc
+             information element.";
+        }
+
+      leaf min-ram {
+        type decimal64 {
+          fraction-digits 1;
+          range "0..max";
+        }
+        units "GB";
+        default 0;
+        description
+          "The minimal RAM requirement for this software image.
+           The value of the 'size' attribute of
+           VirtualMemoryData of the Vdu referencing this
+           SwImageDesc shall not be smaller than the value of
+           minRam.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.5, SwImageDesc
+           information element.";
+      }
+
+      leaf size {
+        mandatory true;
+        type uint64;
+        units "GB";
+        description
+          "The size of this software image.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.5, SwImageDesc
+           information element.";
+      }
+
+      leaf image {
+        default ".";
+        type inet:uri;
+        description
+          "This is a reference to the actual software image.
+           The reference can be relative to the root of the VNF
+           Package or can be a URL";
+        reference
+          "GS NFV IFA011: Section 7.1.6.5, SwImageDesc
+           information element.";
+      }
+
+      leaf operating-system {
+        type string;
+        description
+          "Identifies the operating system used in the software
+           image. This attribute may also identify if a 32 bit
+           or 64 bit software image is used.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.5, SwImageDesc
+           information element.";
+      }
+
+      leaf-list supported-virtualization-environment {
+        type string;
+        description
+          "Identifies the virtualisation environments
+           (e.g. hypervisor) compatible with this software
+           image.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.5, SwImageDesc
+           information element.";
+      }
+    }
+
+    list int-virtual-link-desc {
+      key "id";
+      description
+        "Represents the type of network connectivity mandated by the
+         VNF provider between two or more CPs which includes at
+         least one internal CP.";
+      reference
+        "GS NFV IFA011: Section 7.1.2, Vnfd information element.";
+
+      leaf id {
+        type string;
+        description
+          "Unique identifier of this internal VLD in VNFD.";
+        reference
+          "GS NFV IFA011: Section 7.1.7.2, VnfVirtualLinkDesc
+           Information elements.";
+      }
+
+      list flavour {
+        key "id";
+        description
+          "Describes a specific flavour of the VL with specific
+             bitrate requirements.";
+        reference
+          "GS NFV IFA011: Section 7.1.7.2, VnfVirtualLinkDesc
+           Information elements.";
+
+        leaf id {
+          type string;
+          description
+            "Identifies a flavour within a VnfVirtualLinkDesc.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.5, VirtualLinkDescFlavour
+             information element.";
+        }
+
+        container qos {
+          presence "VL QoS parameters";
+          description
+            "QoS of the VL.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.5, VirtualLinkDescFlavour
+             information element.";
+
+          leaf latency {
+            type uint32;
+            units "ms";
+            mandatory true;
+            description
+              "Specifies the maximum latency in ms.";
+            reference
+              "GS NFV IFA011: Section 7.1.8.10, QoS information
+               element.";
+          }
+
+          leaf packet-delay-variation {
+            type uint32;
+            units "ms";
+            mandatory true;
+            description
+              "Specifies the maximum jitter in ms.";
+            reference
+              "GS NFV IFA011: Section 7.1.8.10, QoS information
+               element.";
+          }
+
+          leaf packet-loss-ratio {
+            type decimal64 {
+              fraction-digits "2";
+              range "0..1.00";
+            }
+            description
+              "Specifies the maximum packet loss ratio.";
+            reference
+              "GS NFV IFA011: Section 7.1.8.10, QoS information
+               element.";
+          }
+        }
+      }
+
+      uses connectivity-type;
+
+      leaf-list test-access {
+        type string;
+        description
+          "Specifies test access facilities expected on the VL
+           (e.g. none, passive monitoring, or active (intrusive)
+           loopbacks at endpoints.";
+        reference
+          "GS NFV IFA011: Section 7.1.7.2, VnfVirtualLinkDesc
+           information element.";
+      }
+
+      leaf description {
+        type string;
+        description
+          "Provides human-readable information on the purpose of
+           the VL (e.g. control plane traffic).";
+        reference
+          "GS NFV IFA011: Section 7.1.7.2, VnfVirtualLinkDesc
+           information element.";
+      }
+
+      list monitoring-parameters {
+        key "id";
+
+        leaf id {
+          type string;
+          description
+            "Unique identifier of the monitoring parameter.";
+          reference
+            "GS NFV IFA011: Section 7.1.11.3, MonitoringParameter
+             information element.";
+        }
+        uses monitoring-parameter;
+      }
+    }
+
+    uses security-group-rule;
+
+    list ext-cpd {
+      key "id";
+      min-elements 1;
+
+      description
+        "Describes an external interface exposed by this VNF enabling
+         connection with a Virual Link";
+      reference
+        "GS NFV IFA011: Section 7.1.2, VNFD information element.";
+
+      choice cp-connection {
+        leaf int-virtual-link-desc {
+          description
+            "Reference to the internal Virtual Link Descriptor (VLD)
+             to which CPs instantiated from this external CP
+             Descriptor (CPD) connect. Either intVirtualLinkDesc or
+             intCpd shall be present.";
+          type leafref {
+            path "../../int-virtual-link-desc/id";
+          }
+        }
+
+        container int-cpd {
+          leaf vdu-id {
+            type leafref {
+              path "../../../vdu/id";
+            }
+          }
+
+          leaf cpd {
+            type leafref {
+              path "deref(../vdu-id)/../int-cpd/id";
+            }
+          }
+        }
+      }
+      uses virtual-network-interface-requirements;
+
+      leaf nicio-requirements {
+        type leafref {
+          path "../../virtual-compute-desc/id";
+        }
+        description
+          "This references (couples) the CPD with any logical node I/O
+           requirements (for network devices) that may have been
+           created. Linking these attributes is necessary so that so
+           that I/O requirements that need to be articulated at the
+           logical node level can be associated with the network
+           interface requirements associated with the CPD.";
+        reference
+          "GS NFV-IFA011: Section 7.1.6.6,
+           VirtualNetworkInterfaceRequirements information element";
+      }
+      uses cpd;
+
+      leaf security-group-rule-id {
+        type leafref {
+          path "../../security-group-rule/id";
+        }
+        description
+          "Reference of the security group rules bound to this
+           CPD.";
+        reference
+          "GS NFV IFA011: Section 7.1.6.3 Cpd information element";
+      }
+    }
+
+    list df {
+      must "default-instantiation-level or " +
+           "count(instantiation-level) = 1";
+      key "id";
+      min-elements 1;
+      description
+        "Describes a specific Deployment Flavour (DF) of a VNF with
+         specific requirements for capacity and performance.";
+      reference
+        "GS NFV IFA011: Section 7.1.2, VNFD information element.";
+
+      leaf id {
+        type string;
+        description
+          "Identifier of this DF within the VNFD.";
+        reference
+          "GS NFV IFA011: Section 7.1.8, Information elements
+           to the DeploymentFlavour.";
+      }
+
+      leaf description {
+        type string;
+        description
+          "Human readable description of the deployment flavour";
+        reference
+          "GS NFV IFA011: Section 7.1.8, Information elements
+           to the DeploymentFlavour.";
+      }
+
+      list vdu-profile {
+        key "id";
+        min-elements 1;
+        description
+          "The Vduprofile describes additional instantiation data for
+           a given VDU used in a deployment flavour.";
+        reference
+          "GS NFV IFA011: Section 7.1.8, Information elements
+           to the DeploymentFlavour.";
+
+        leaf id {
+          type leafref {
+            path "../../../vdu/id";
+          }
+          reference
+            "GS NFV IFA011: Section 7.1.8.3, VduProfile information
+             element.";
+        }
+
+        leaf min-number-of-instances {
+          type uint16;
+          default 1;
+          description
+            "Minimum number of instances of the VNFC based on this
+             VDU that is permitted to exist for this flavour.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.3, VduProfile information
+             element.";
+        }
+
+        leaf max-number-of-instances {
+          type uint16;
+          default 1;
+          must ". >= ../min-number-of-instances";
+          reference
+            "GS NFV IFA011: Section 7.1.8.3, VduProfile information
+             element.";
+        }
+        uses local-affinity-or-anti-affinity-rule;
+
+        list affinity-or-anti-affinity-group {
+          key "id";
+
+          description
+            "Identifier(s) of the affinity or anti-affinity
+             group(s) the VDU belongs to.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.3, VduProfile information
+             element.";
+          leaf id {
+            type leafref {
+              path "../../../" +
+                "affinity-or-anti-affinity-group/id";
+            }
+            description
+              "Identifies an affinity or anti-affinity group to
+               which the affinity or anti-affinity rule applies.";
+            reference
+              "GS NFV IFA011: Section 7.1.8.12, AffinityOrAntiAffinity
+               information element.";
+          }
+        }
+      }
+
+      list virtual-link-profile {
+        key "id flavour";
+        description
+          "Defines the internal VLD along with additional data which
+           is used in this DF.";
+        reference
+          "GS NFV IFA011: Section 7.1.8.2, VnfDf information
+           element.";
+
+        leaf id {
+          type leafref {
+            path "../../../int-virtual-link-desc/id";
+          }
+          description
+            "Uniquely identifies a Vnf VLD.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.4, VirtualLinkProfile
+             information element.";
+        }
+
+        leaf flavour {
+          type leafref {
+            path "deref(../../../ext-cpd/int-virtual-link-desc)" +
+                 "/../flavour/id";
+          }
+          description
+            "Identifies a flavour within the VnfVirtualLinkDesc.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.4, VirtualLinkProfile
+             information element.";
+        }
+        uses local-affinity-or-anti-affinity-rule;
+
+        list affinity-or-anti-affinity-group {
+          key "id";
+          leaf id {
+            type leafref {
+              path "../../../affinity-or-anti-affinity-group/id";
+            }
+          }
+          description
+            "Identifier(s) of the affinity or anti-affinity
+             group(s) the VnfVirtualLinkDesc belongs to.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.4, VirtualLinkProfile
+             information element.";
+        }
+
+        container max-bit-rate-requirements {
+          leaf root {
+            mandatory "true";
+            type uint32;
+            description
+              "Throughput requirement of the link (e.g. bitrate of
+               E-Line, root bitrate of E-Tree, aggregate capacity
+               of E-LAN).";
+            reference
+              "GS NFV IFA011: Section 7.1.8.6,
+               LinkBitrateRequirements information element.";
+          }
+
+          leaf leaf {
+            type uint32;
+            description
+              "Throughput requirement of leaf connections to the
+               link when applicable to the connectivity type
+               (e.g. for E-Tree and E-LAN branches).";
+            reference
+              "GS NFV IFA011: Section 7.1.8.6,
+               LinkBitrateRequirements information element.";
+          }
+          description
+            "Specifies the maximum bitrate requirements for a VL
+             instantiated according to this profile.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.4, VirtualLinkProfile
+             information element.";
+        }
+
+        container min-bit-rate-requirements {
+          leaf root {
+            mandatory "true";
+            type uint32;
+            description
+              "Throughput requirement of the link (e.g. bitrate of
+               E-Line, root bitrate of E-Tree, aggregate capacity
+               of E-LAN).";
+            reference
+              "GS NFV IFA011: Section 7.1.8.6,
+               LinkBitrateRequirements information element.";
+          }
+
+          leaf leaf {
+            type uint32;
+            description
+              "Throughput requirement of leaf connections to the
+               link when applicable to the connectivity type
+               (e.g. for E-Tree and E-LAN branches).";
+            reference
+              "GS NFV IFA011: Section 7.1.8.6,
+               LinkBitrateRequirements information element.";
+          }
+          description
+            "Specifies the minimum bitrate requirements for a VL
+             instantiated according to this profile.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.4, VirtualLinkProfile
+             information element.";
+        }
+
+        container virtual-link-protocol-data {
+          leaf associated-layer-protocol {
+            type identityref {
+              base layer-protocol;
+            }
+            description
+              "One of the values of the attribute layerProtocol of
+               the ConnectivityType IE.";
+            reference
+              "GS NFV IFA011: Section 7.1.8.13,
+               VirtualLinkProtocolData information element.";
+          }
+
+          container l2-protocol-data {
+            when "(../associated-layer-protocol = 'Ethernet') or " +
+                 "(../associated-layer-protocol = 'MPLS') or " +
+                 "(../associated-layer-protocol = 'ODU2') or " +
+                 "(../associated-layer-protocol = 'Pseudo-Wire')";
+
+            leaf name {
+              type string;
+              description
+                "Network name associated with this L2 protocol.";
+              reference
+                "GS NFV IFA011: Section 7.1.8.14,
+                 L2ProtocolData information element.";
+            }
+
+            leaf network-type {
+              type enumeration {
+                enum flat;
+                enum vlan;
+                enum vxlan;
+                enum gre;
+              }
+              description
+                "Specifies the network type for this L2 protocol.
+                 Possible values: FLAT, VLAN, VXLAN, GRE.";
+              reference
+                "GS NFV IFA011: Section 7.1.8.14,
+                 L2ProtocolData information element.";
+            }
+
+            leaf vlan-transparent {
+              type boolean;
+              description
+                "Specifies whether to support VLAN transparency for
+                 this L2 protocol or not.";
+              reference
+                "GS NFV IFA011: Section 7.1.8.14,
+                 L2ProtocolData information element.";
+            }
+
+            leaf mtu {
+              type uint16;
+              description
+                "Specifies the maximum transmission unit (MTU) value
+                 for this L2 protocol.";
+              reference
+                "GS NFV IFA011: Section 7.1.8.14,
+                 L2ProtocolData information element.";
+            }
+            description
+              "Specifies the L2 protocol data for this virtual link.
+               Shall be present when the associatedLayerProtocol
+               attribute indicates a L2 protocol and shall be absent
+               otherwise.";
+            reference
+              "GS NFV IFA011: Section 7.1.8.13,
+               VirtualLinkProtocolData information element.";
+          }
+
+          container l3-protocol-data {
+            when "(../associated-layer-protocol = 'IPv4') or " +
+                 "(../associated-layer-protocol = 'IPv6')";
+
+            leaf name {
+              type string;
+              description
+                "Network name associated with this L3 protocol.";
+              reference
+                "GS NFV IFA011: Section 7.1.8.15,
+                 L3ProtocolData information element.";
+            }
+
+            leaf ip-version {
+              type enumeration {
+                enum ipv4;
+                enum ipv6;
+              }
+              default "ipv4";
+              description
+                "Specifies IP version of this L3 protocol.
+                 Value:
+                 • IPV4.
+                 • IPV6.";
+              reference
+                "GS NFV IFA011: Section 7.1.8.15,
+                 L3ProtocolData information element.";
+            }
+
+            leaf cidr {
+              type string;
+              description
+                "Specifies the CIDR (Classless InterDomain Routing)
+                 of this L3 protocol.";
+              reference
+                "GS NFV IFA011: Section 7.1.8.15,
+                 L3ProtocolData information element.";
+            }
+
+            leaf-list ip-allocation-pools {
+              type string;
+              description
+                "Specifies the allocation pools with start and end
+                 IP addresses for this L3 protocol.";
+              reference
+                "GS NFV IFA011: Section 7.1.8.15,
+                 L3ProtocolData information element.";
+            }
+
+            leaf gateway-ip {
+              type inet:ip-address;
+              description
+                "Specifies the gateway IP address for this L3
+                 protocol.";
+              reference
+                "GS NFV IFA011: Section 7.1.8.15,
+                 L3ProtocolData information element.";
+            }
+
+            leaf dhcp-enabled {
+              type boolean;
+              default "true";
+              description
+                "Indicates whether DHCP (Dynamic Host Configuration
+                 Protocol) is enabled or disabled for this L3
+                 protocol.";
+              reference
+                "GS NFV IFA011: Section 7.1.8.15,
+                 L3ProtocolData information element.";
+            }
+
+            leaf ipv6-address-mode {
+              when "../ip-version = 'ipv6'";
+              type enumeration {
+                enum slaac;
+                enum dhcpv6-stateful;
+                enum dhcpv6-stateless;
+              }
+              description
+                "Specifies IPv6 address mode. Possible values:
+                 • SLAAC.
+                 • DHCPV6-STATEFUL.
+                 • DHCPV6-STATELESS.
+                 May be present when the value of the ipVersion
+                 attribute is 'IPV6' and shall be absent otherwise.";
+              reference
+                "GS NFV IFA011: Section 7.1.8.15,
+                 L3ProtocolData information element.";
+            }
+            description
+              "Specifies the L3 protocol data for this virtual link.
+               Shall be present when the associatedLayerProtocol
+               attribute indicates a L3 protocol and shall be absent
+               otherwise.";
+            reference
+              "GS NFV IFA011: Section 7.1.8.13,
+               VirtualLinkProtocolData information element.";
+          }
+          description
+            "Specifies the protocol data for a VL instantiated
+             according to this profile. Cardinality 0 is used when
+             no protocol data needs to be specified.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.4, VirtualLinkProfile
+             information element.";
+        }
+      }
+
+      list instantiation-level {
+        key "id";
+        min-elements 1;
+        description
+          "Describes the various levels of resources that can be
+           used to instantiate the VNF using this flavour.
+           Examples: Small, Medium, Large. If there is only one
+           'instantiationLevel' entry, it shall be treated as the
+           default instantiation level for this DF.
+
+           The InstantiationLevel information element describes a
+           given level of resources to be instantiated within a
+           deployment flavour in term of the number of VNFC instances
+           to be created from each VDU.
+           All the VDUs referenced in the level shall be part of the
+           corresponding deployment flavour and their number shall
+           be within the range (min/max) for this deployment flavour.";
+        reference
+          "GS NFV IFA011: Section 7.1.8.2 VnfDf information element";
+
+        leaf id {
+          type string;
+          description
+            "Uniquely identifies a level with the DF.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.7 InstantiationLevel
+             information element";
+        }
+
+        leaf description {
+          type string;
+          description
+            "Human readable description of the instantiation level";
+          reference
+            "GS NFV IFA011: Section 7.1.8.7 InstantiationLevel
+             information element";
+        }
+
+        list vdu-level {
+          key "vdu-id";
+          min-elements 1;
+          description
+            "Sets the number of instances for the VDU in this
+             instantiation level.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.7 InstantiationLevel
+             information element";
+
+          leaf vdu-id {
+            type leafref {
+              path "../../../../vdu/id";
+            }
+            description
+              "Uniquely identifies a VDU.";
+            reference
+              "GS NFV IFA011: Section 7.1.8.9 VduLevel information
+               element";
+          }
+
+          leaf number-of-instances {
+            type uint16;
+            must ". <= ../../../../df/" +
+                 "vdu-profile[id=current()/../vdu-id]/" +
+                 "max-number-of-instances";
+            must ". >= ../../../../df/" +
+                 "vdu-profile[id=current()/../vdu-id]/" +
+                 "min-number-of-instances";
+            default 1;
+            description
+              "Number of instances of VNFC based on this VDU to
+               deploy for this level.";
+            reference
+              "GS NFV IFA011: Section 7.1.8.9 VduLevel information
+               element";
+          }
+        }
+
+        list scaling-info {
+          key "scaling-aspect-id";
+          description
+            "The InstantiationLevel information element describes a
+             given level of resources to be instantiated within a
+             DF in term of the number of VNFC instances to be
+             created from each VDU.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.7 InstantiationLevel
+             information element";
+
+          leaf scaling-aspect-id {
+            type leafref {
+              path "../../../scaling-aspect/id";
+            }
+            description
+              "Identifier of the scaling aspect.";
+            reference
+              "GS NFV IFA011: Section 7.1.8.8 ScaleInfo information
+               element";
+          }
+
+          leaf scale-level {
+            type uint32;
+            description
+              "The scale level, greater than or equal to 0.";
+            reference
+              "GS NFV IFA011: Section 7.1.8.8 ScaleInfo information
+               element";
+          }
+        }
+      }
+
+      leaf default-instantiation-level {
+        type leafref {
+          path "../instantiation-level/id";
+        }
+        description
+          "This attribute references the 'instantiationLevel'
+           entry which defines the default instantiation level for
+           this DF. It shall be present if there are multiple
+           'instantiationLevel' entries.";
+        reference
+          "GS NFV IFA011: Section 7.1.8.2 VnfDf information
+           element";
+      }
+
+      leaf-list supported-operation {
+        type identityref {
+          base supported-operation;
+        }
+        description
+          "Indicates which operations are available for this DF via
+           the VNF LCM interface. Instantiate VNF, Query VNF and
+           Terminate VNF are supported in all DF and therefore
+           need not be included in this list.";
+        reference
+          "GS NFV IFA011: Section 7.1.8.2 VnfDf information
+           element";
+      }
+
+      container lcm-operations-configuration {
+        description
+          "This information element is a container for all
+           attributes that affect the invocation of the VNF
+           Lifecycle Management operations, structured by
+           operation.";
+        reference
+          "GS NFV IFA011: Section 7.1.8.2 VnfDf information
+           element";
+
+        container instantiate-vnf-op-config {
+          list parameter {
+            key "key";
+
+            leaf key {
+              type string;
+            }
+
+            leaf value {
+              type string;
+            }
+            description
+              "Array of KVP requirements for VNF-specific parameters
+               to be passed when invoking the InstantiateVnf
+               operation.";
+            reference
+              "GS NFV IFA011: Section 7.1.5.3
+               InstantiateVnfOpConfig information element";
+          }
+          description
+            "Configuration parameters for the InstantiateVnf
+             operation.";
+          reference
+            "GS NFV IFA011: Section 7.1.5.2
+             VnfLcmOperationsConfiguration information element";
+        }
+
+        container scale-vnf-op-config {
+          description
+            "Configuration parameters for the ScaleVnf operation.";
+          reference
+            "GS NFV IFA011: Section 7.1.5.2
+             VnfLcmOperationsConfiguration information element";
+
+          list parameter {
+            key "key";
+
+            leaf key {
+              type string;
+            }
+
+            leaf value {
+              type string;
+            }
+            description
+              "Array of KVP requirements for VNFspecific parameters
+               to be passed when invoking the ScaleVnf operation.";
+            reference
+              "GS NFV IFA011: Section 7.1.5.4 ScaleVnfOpConfig
+               information element";
+          }
+
+          leaf scaling-by-more-than-one-step-supported {
+            type boolean;
+            default false;
+            description
+              "Signals whether passing a value larger than one in
+               the numScalingSteps parameter of the ScaleVnf
+               operation is supported by this VNF.
+               Default is FALSE, i.e. 'not supported'.";
+            reference
+              "GS NFV IFA011: Section 7.1.5.4
+               ScaleVnfOpConfig information element";
+          }
+        }
+
+        container scale-vnf-to-level-op-config {
+          description
+            "This information element defines attributes that
+             affect the invocation of the ScaleVnfToLevel
+             operation.";
+          reference
+            "GS NFV IFA011: Section 7.1.5.2
+             VnfLcmOperationsConfiguration information element";
+
+          list parameter {
+            key "key";
+            leaf key {
+              type string;
+            }
+            leaf value {
+              type string;
+            }
+            description
+              "Array of KVP requirements for VNF-specific parameters
+               to be passed when invoking the ScaleVnfToLevel
+               operation.";
+            reference
+              "GS NFV IFA011: Section 7.1.5.5
+               ScaleVnfToLevelOpConfig information element";
+          }
+
+          leaf arbitrary-target-levels-supported {
+            type boolean;
+            default "false";
+            description
+              "Signals whether scaling according to the parameter
+               'scaleInfo' is supported by this VNF.";
+            reference
+              "GS NFV IFA011: Section 7.1.5.5
+               ScaleVnfToLevelOpConfig information element";
+          }
+        }
+
+        container heal-vnf-op-config {
+          description
+            "This information element defines attributes that
+             affect the invocation of the HealVnf operation.";
+          reference
+            "GS NFV IFA011: Section 7.1.5.2
+             VnfLcmOperationsConfiguration information element";
+
+          list parameter {
+            key "key";
+
+            leaf key {
+              type string;
+            }
+
+            leaf value {
+              type string;
+            }
+            description
+              "Array of KVP requirements for VNF-specific parameters
+               to be passed when invoking the HealVnf operation.";
+            reference
+              "GS NFV IFA011: Section 7.1.5.6 HealVnfOpConfig
+               information element";
+          }
+
+          leaf-list cause {
+            type string;
+            description
+              "Supported 'cause' parameter values.";
+            reference
+              "GS NFV IFA011: Section 7.1.5.6 HealVnfOpConfig
+               information element";
+          }
+        }
+
+        container terminate-vnf-op-config {
+          description
+            "This information element defines attributes that
+             affect the invocation of the TerminateVnf operation.";
+          reference
+            "GS NFV IFA011: Section 7.1.5.2
+             VnfLcmOperationsConfiguration information element";
+
+          leaf min-graceful-termination {
+            type yang:timeticks;
+            default "1";
+            description
+              "Minimum timeout value for graceful termination of
+               a VNF instance.";
+            reference
+              "GS NFV IFA011: Section 7.1.5.7
+               TerminateVnfOpConfig information element";
+          }
+
+          leaf max-recommended-graceful-termination {
+            type yang:timeticks;
+            description
+              "Maximum recommended timeout value that can be needed
+               to gracefully terminate a VNF instance of a
+               particular type under certain conditions, such as
+               maximum load condition. This is provided by VNF
+               provider as information for the operator
+               facilitating the selection of optimal timeout value.
+               This value is not used as constraint.";
+            reference
+              "GS NFV IFA011: Section 7.1.5.7
+               TerminateVnfOpConfig information element";
+          }
+
+          list parameter {
+            key "key";
+            leaf key {
+              type string;
+            }
+            leaf value {
+              type string;
+            }
+            description
+              "Array of KVP requirements for VNF-specific parameters
+               to be passed when invoking the TerminateVnf
+               operation.";
+            reference
+              "GS NFV IFA011: Section 7.1.5.7
+               TerminateVnfOpConfig information element";
+          }
+        }
+
+        container operate-vnf-op-config {
+          description
+            "This information element defines attributes that
+             affect the invocation of the OperateVnf operation.";
+          reference
+            "GS NFV IFA011: Section 7.1.5.2
+             VnfLcmOperationsConfiguration information element";
+
+          leaf min-graceful-stop-timeout {
+            type yang:timeticks;
+            default "1";
+            description
+              "Minimum timeout value for graceful stop of a VNF
+               instance.";
+            reference
+              "GS NFV IFA011: Section 7.1.5.8
+               OperateVnfOpConfig information element";
+          }
+
+          leaf max-recommended-graceful-stop-timeout {
+            type yang:timeticks;
+            description
+              "Maximum recommended timeout value that can be
+               needed to gracefully stop a VNF instance of a
+               particular type under certain conditions, such as
+               maximum load condition. This is provided by VNF
+               provider as information for the operator facilitating
+               the selection of optimal timeout value. This value
+               is not used as constraint.";
+            reference
+              "GS NFV IFA011: Section 7.1.5.8
+               OperateVnfOpConfig information element";
+          }
+
+          list parameter {
+            key "key";
+            leaf key {
+              type string;
+            }
+            leaf value {
+              type string;
+            }
+            description
+              "Array of KVP requirements for VNF-specific parameters
+               to be passed when invoking the OperateVnf
+               operation.";
+            reference
+              "GS NFV IFA011: Section 7.1.5.8
+               OperateVnfOpConfig information element";
+          }
+        }
+
+        container change-vnf-flavour-op-config {
+          list parameter {
+            key "key";
+            leaf key {
+              type string;
+            }
+            leaf value {
+              type string;
+            }
+            description
+              "Array of KVP requirements for VNF-specific parameters
+               to be passed when invoking the OperateVnf
+               operation.";
+            reference
+              "GS NFV IFA011: Section 7.1.5.9
+               ChangeVnfFlavour information element";
+          }
+          description
+            "Configuration parameters for the ChangeVnfFlavour
+             operation.";
+          reference
+            "GS NFV IFA011: Section 7.1.5.2
+             VnfLcmOperationsConfiguration information element";
+        }
+
+        container change-ext-vnf-connectivity-op-config {
+          list parameter {
+            key "key";
+            leaf key {
+              type string;
+            }
+            leaf value {
+              type string;
+            }
+            description
+              "Array of KVP requirements for VNF-specific parameters
+               to be passed when invoking the
+               ChangeExtVnfConnectivity operation.";
+            reference
+              "GS NFV IFA011: Section 7.1.5.10
+               ChangeExtVnfConnectivityOpConfig information
+               element";
+          }
+          description
+            "Configuration parameters for the
+             ChangeExtVnfConnectivity operation.";
+          reference
+            "GS NFV IFA011: Section 7.1.5.2
+             VnfLcmOperationsConfiguration information element";
+        }
+      }
+
+      list affinity-or-anti-affinity-group {
+        key "id";
+        description
+          "The AffinityOrAntiAffinityGroup describes the affinity
+           or anti-affinity relationship applicable between the
+           virtualization containers to be created based on
+           different VDUs, or between internal VLs to be created
+           based on different VnfVirtualLinkDesc(s).
+
+           Per VNF, the affinity/anti-affinity rules defined using
+           this information element, using the
+           LocalAffinityOrAntiAffinityRule information element, and
+           using the placement constraints in the
+           GrantLifecycleOperation as defined in ETSI GS NFV-IFA
+           007 [i.3] should be conflict-free. In case of conflicts,
+           the placement constraints in the
+           GrantLifecycleOperation shall take precedence.";
+
+        reference
+          "GS NFV IFA011: Section 7.1.8.2 VnfDf information
+           element";
+
+        leaf id {
+          type string;
+          description
+            "Identifies an affinity or anti-affinity group to which
+             the affinity or anti-affinity rule applies.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.12
+             AffinityOrAntiAffinityGroup information element";
+        }
+
+        leaf type {
+          mandatory true;
+          type affinity-type;
+          description
+            "Specifies whether the rule is an affinity rule or an
+             anti-affinity rule.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.12
+             AffinityOrAntiAffinityGroup information element";
+        }
+
+        leaf scope {
+          mandatory true;
+          type affinity-scope;
+          description
+            "Specifies the scope of the rule, possible values are
+             'NFVI-PoP', 'Zone', 'ZoneGroup', 'NFVI-node'.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.12
+             AffinityOrAntiAffinityGroup information element";
+        }
+      }
+
+      list indicator {
+        key "id";
+
+        leaf id {
+          type string;
+          description
+            "Unique identifier.";
+          reference
+            "GS NFV IFA011: Section 7.1.11.2 VnfIndicator
+             information element";
+        }
+
+        leaf name {
+          type string;
+          description
+            "The human readable name of the VnfIndicator.";
+          reference
+            "GS NFV IFA011: Section 7.1.11.2 VnfIndicator
+             information element";
+        }
+
+        leaf indicator-value {
+          type string;
+          description
+            "Defines the allowed values or value ranges of this
+             indicator.";
+          reference
+            "GS NFV IFA011: Section 7.1.11.2 VnfIndicator
+             information element";
+        }
+
+        leaf source {
+          type enumeration {
+            enum vnf;
+            enum em;
+            enum both;
+          }
+          description
+            "Describe the source of the indicator. The possible
+             values are:
+             • VNF.
+             • EM.
+             • Both.
+
+             This tells the consumer where to send the subscription
+             request.";
+          reference
+            "GS NFV IFA011: Section 7.1.11.2 VnfIndicator
+             information element";
+        }
+
+        description
+          "Declares the VNF indicators that are supported by this
+           VNF (specific to this DF).";
+        reference
+          "GS NFV IFA011: Section 7.1.8.2 VnfDf information
+             element";
+      }
+
+      list supported-vnf-interfaces {
+        key "name";
+
+        leaf name {
+          type enumeration {
+            enum vnf-configuration;
+            enum vnf-indicator;
+          }
+          description
+            "Identifies an interface produced by the VNF. Valid
+             values:
+             - VNF_CONFIGURATION
+             - VNF_INDICATOR";
+          reference
+            "GS NFV IFA011: Section 7.1.8.16 VnfInterfaceDetails
+             information element";
+        }
+
+        leaf-list cpd-id {
+          type leafref {
+            path "../../../ext-cpd/id";
+          }
+          description
+            "References one or more CPDs from which to instantiate
+             external CPs through which interface endpoints on the
+             VNF side can be reached by the VNFM.";
+          reference
+            "GS NFV IFA011: Section 7.1.8.16 VnfInterfaceDetails
+             information element";
+        }
+
+        list interface-details {
+          key "key";
+
+          leaf key {
+            type string;
+          }
+
+          leaf value {
+            type string;
+          }
+        }
+
+        description
+          "Indicates which interfaces the VNF produces and provides
+           additional details on how to access the interface
+           endpoints.";
+        reference
+          "GS NFV IFA011: Section 7.1.8.2 VnfDf information
+             element";
+      }
+
+      list monitoring-parameter {
+        key "id";
+
+        description
+          "Defines the virtualised resources monitoring parameters
+           on VNF level.";
+        reference
+          "GS NFV IFA011: Section 7.1.8.2 VnfDf information
+           element";
+
+        leaf id {
+          type string;
+          description
+            "Unique identifier of the monitoring parameter.";
+          reference
+            "GS NFV IFA011: Section 7.1.11.3 MonitoringParameter
+             information element";
+        }
+        uses monitoring-parameter;
+      }
+
+      list scaling-aspect {
+        key "id";
+
+        description
+          "The scaling aspects supported by this DF of the VNF.
+           scalingAspect shall be present if the VNF supports
+           scaling.";
+        reference
+          "GS NFV IFA011: Section 7.1.8.2 VnfDf information
+           element";
+
+        leaf id {
+          type string;
+          description
+            "Unique identifier of this aspect in the VNFD.";
+          reference
+            "GS NFV IFA011: Section 7.1.10.2 ScalingAspect
+               information element";
+        }
+
+        leaf name {
+          type string;
+          description
+            "Human readable name of the aspect.";
+          reference
+            "GS NFV IFA011: Section 7.1.10.2 ScalingAspect
+             information element";
+        }
+
+        leaf description {
+          type string;
+          description
+            "Human readable description of the aspect.";
+          reference
+            "GS NFV IFA011: Section 7.1.10.2 ScalingAspect
+             information element";
+        }
+
+        leaf max-scale-level {
+          type uint32 {
+            range "1..max";
+          }
+          description
+            "The maximum scaleLevel for total number of scaling
+             steps that can be applied w.r.t. this aspect. The
+             value of this attribute corresponds to the number of
+             scaling steps can be applied to this aspect when
+             scaling it from the minimum scale level (i.e. 0) to the
+             maximum scale level defined by this attribute.";
+          reference
+            "GS NFV IFA011: Section 7.1.10.2 ScalingAspect
+             information element";
+        }
+
+        container aspect-delta-details {
+          list deltas {
+            key "id";
+            min-elements 1;
+
+            leaf id {
+              type string;
+              description
+                "Identifier of this scaling delta.";
+              reference
+                "GS NFV IFA011: Section 7.1.10.4 ScalingDelta
+                 information element";
+            }
+
+            list vdu-delta {
+              key "id";
+
+              leaf id {
+                type leafref {
+                  path "../../../../../../vdu/id";
+                }
+                description
+                  "Uniquely identifies a VDU.";
+                reference
+                  "GS NFV IFA011: Section 7.1.8.9 VduLevel
+                   information element";
+              }
+
+              leaf number-of-instances {
+                type uint32 {
+                  range "0..max";
+                }
+                description
+                  "Number of instances of VNFC based on this VDU to
+                   deploy for an instantiation level or for a
+                   scaling delta. Shall be zero or greater.";
+                reference
+                  "GS NFV IFA011: Section 7.1.8.9 VduLevel
+                   information element";
+              }
+              description
+                "The number of VNFC instances based on particular
+                 VDUs to be created or removed.";
+              reference
+                "GS NFV IFA011: Section 7.1.10.4 ScalingDelta
+                 information element";
+            }
+
+            list virtual-link-bit-rate-delta {
+              key "id";
+
+              leaf id {
+                type string;
+                description
+                  "Uniquely identifies a VnfVirtualLinkDesc.";
+                reference
+                  "GS NFV IFA011: Section 7.1.10.5
+                   VirtualLinkBitRateLevel information element";
+              }
+
+              container bit-rate-requirements {
+                leaf root {
+                  type uint32;
+                  units bits/sec;
+                  mandatory true;
+                  description
+                    "Throughput requirement of the link (e.g.
+                     bitrate of E-Line, root bitrate of E-Tree,
+                     aggregate capacity of E-LAN).";
+                  reference
+                    "GS NFV IFA011: Section 7.1.8.6
+                     LinkBitrateRequirements information element";
+                }
+
+                leaf leaf {
+                  type uint32;
+                  units bits/sec;
+                  description
+                    "Throughput requirement of leaf connections to
+                     the link when applicable to the connectivity
+                     type (e.g. for E-Tree and E-LAN branches).";
+                  reference
+                    "GS NFV IFA011: Section 7.1.8.6
+                     LinkBitrateRequirements information element";
+                }
+                description
+                  "Bitrate requirements for an instantiation level
+                   or bitrate delta for a scaling step.";
+                reference
+                  "GS NFV IFA011: Section 7.1.10.5
+                   VirtualLinkBitRateLevel information element";
+              }
+              description
+                "The bitrate to be added or removed to virtual links
+                 created from particular virtual link descriptors.";
+              reference
+                "GS NFV IFA011: Section 7.1.10.4 ScalingDelta
+                 information element";
+            }
+            description
+              "Declares different scaling deltas, each of which is
+               applied for one or more scaling steps of this
+               aspect.";
+            reference
+              "GS NFV IFA011: Section 7.1.10.3 AspectDeltaDetails
+               information element";
+          }
+
+          leaf step-deltas {
+            type leafref {
+              path "../deltas/id";
+            }
+            description
+              "Identifiers of the individual scaling deltas to be
+               applied for the subsequent scaling steps of this
+               aspect. The first entry in the array shall correspond
+               to the first scaling step (between scale levels 0 to
+               1) and the last entry in the array shall correspond
+               to the last scaling step (between maxScaleLevel-1
+               and maxScaleLevel).
+
+               Each referenced scaling delta shall be declared in
+               the 'deltas' attribute.";
+            reference
+              "GS NFV IFA011: Section 7.1.10.3 AspectDeltaDetails
+               information element";
+          }
+          description
+            "A specification of the deltas in terms of number of
+             instances of VNFCs and virtual link bit rates that
+             correspond to the scaling steps of this aspect. A
+             cardinality of zero indicates that this mapping has to
+             be specified in a lifecycle management script or be
+             otherwise known to the VNFM. The information in this
+             attribute, if provided, shall be consistent with the
+             information provided in the 'InstantiationLevel'
+             information element. If this attribute is provided, it
+             shall be provided for all scaling aspects.";
+          reference
+            "GS NFV IFA011: Section 7.1.10.2 ScalingAspect
+             information element";
+        }
+      }
+    }
+
+    container configurable-properties {
+      description
+        "Describes the configurable properties of the VNF
+         (e.g. related to auto scaling and auto healing).";
+      reference
+        "GS NFV IFA011: Section 7.1.2 VNFD information element";
+
+      leaf is-auto-scalable-enabled {
+        type boolean;
+        description
+          "It permits to enable (TRUE) / disable (FALSE) the
+           auto-scaling functionality.";
+        reference
+          "GS NFV IFA011: Section 7.1.12 VnfConfigurableProperties
+           information element";
+      }
+
+      leaf is-auto-heal-enabled {
+        type boolean;
+        description
+          "It permits to enable (TRUE) / disable (FALSE) the
+           auto-healing functionality.";
+        reference
+          "GS NFV IFA011: Section 7.1.12 VnfConfigurableProperties
+           information element";
+      }
+
+      list additional-configurable-property {
+        key "key";
+
+        leaf key {
+          type string;
+        }
+
+        leaf value {
+          type string;
+        }
+        description
+          "It provides VNF specific configurable properties that can
+           be modified using the ModifyVnfConfiguration operation.";
+        reference
+          "GS NFV IFA011: Section 7.1.12 VnfConfigurableProperties
+           information element";
+      }
+    }
+
+    container modifiable-attributes {
+      description
+        "Describes the modifiable attributes of the VNF.";
+      reference
+        "GS NFV IFA011: Section 7.1.2 VNFD information element";
+
+      leaf-list extension {
+        type string;
+        description
+          "Additional VNF-specific attributes of VnfInfo that
+           affect the lifecycle management of a VNF instance and
+           that are writeable.
+
+           For each VNF instance, these attributes are stored
+           persistently by the VNFM and can be queried and
+           modified through the VNFM.
+
+           These attributes are intended to be consumed by the
+           VNFM or by the lifecycle management scripts during the
+           execution of VNF lifecycle management operations.
+
+           Modifying these values has no direct effect on the VNF
+           instance; however, modified values can be considered
+           during subsequent VNF lifecycle management operations,
+           which means that the modified values can indirectly
+           affect the configuration of the VNF instance.";
+        reference
+          "GS NFV IFA011: Section 7.1.14 VnfInfoModifiableAttributes
+           information element";
+      }
+
+      leaf-list metadata {
+        type string;
+        description
+          "Additional VNF-specific attributes of VnfInfo that are
+           writeable and that provide metadata describing the VNF
+           instance.
+
+           For each VNF instance, these attributes are stored
+           persistently by the VNFM and can be queried and modified
+           through the VNFM.
+
+           These attributes are intended to provide information to
+           functional blocks external to the VNFM and will not be
+           used by the VNFM or the VNF lifecycle management
+           scripts when executing lifecycle management operations.
+
+           Modifying these attributes has no effect on the VNF
+           instance. It only affects the attribute values stored by
+           the VNFM.";
+        reference
+          "GS NFV IFA011: Section 7.1.14 VnfInfoModifiableAttributes
+           information element";
+      }
+    }
+
+    list lifecycle-management-script {
+      key "id";
+      description
+        "Includes a list of events and corresponding management
+         scripts performed for the VNF.";
+      reference
+        "GS NFV IFA011: Section 7.1.2 VNFD information element";
+
+      leaf id {
+        type string;
+        description
+          "A unique string that identfies the script in question.";
+      }
+
+      leaf-list event {
+        type internal-lifecycle-management-script-event;
+        description
+          "Describes VNF lifecycle event(s) or an external stimulus
+           detected on a VNFM reference point.";
+        reference
+          "GS NFV IFA011: Section 7.1.13 LifeCycleManagementScript
+           information element";
+      }
+
+      leaf-list lcm-transition-event {
+        type string;
+        description
+          "Describes the transition VNF lifecycle event(s) that
+           cannot be mapped to any of the enumerated values
+           defined for the event attribute.";
+        reference
+          "GS NFV IFA011: Section 7.1.13 LifeCycleManagementScript
+           information element";
+      }
+
+      leaf script {
+        type string;
+        description
+          "Includes a VNF LCM script (e.g. written in a DSL as
+           specified in requirement VNF_PACK.LCM.001) triggered to
+           react to one of the events listed in the event
+           attribute.";
+        reference
+          "GS NFV IFA011: Section 7.1.13 LifeCycleManagementScript
+           information element";
+      }
+
+      leaf script-dsl {
+        type string;
+        description
+          "Defines the domain specific language (i.e. the type) of
+           script that is provided. Types of scripts could include
+           bash, python, etc.";
+        reference
+          "GS NFV IFA011: Section 7.1.13 LifeCycleManagementScript
+           information element";
+      }
+
+      list script-input {
+        key "key";
+
+        leaf key {
+          type string;
+          description
+            "Includes a VNF LCM script (e.g. written in a DSL as
+             specified in requirement VNF_PACK.LCM.001) triggered to
+             react to one of the events listed in the event
+             attribute.
+
+             The string value specified here is a path to a file in
+             the VNF package.";
+          reference
+            "GS NFV IFA011: Section 7.1.13 LifeCycleManagementScript
+             information element";
+        }
+
+        leaf value {
+          type string;
+        }
+        description
+          "Array of KVP requirements with the key as the parameter
+           name and the value as the parameter that need to be
+           passed as an input to the script.";
+        reference
+          "GS NFV IFA011: Section 7.1.13 LifeCycleManagementScript
+           information element";
+      }
+    }
+
+    list element-group {
+      key "id";
+      description
+        "Describes the associated elements of a VNFD for a certain
+         purpose during VNF lifecycle management.";
+      reference
+        "GS NFV IFA011: Section 7.1.2 VNFD information element";
+
+      leaf id {
+        type string;
+        description
+          "Unique identifier of this group in the VNFD.";
+        reference
+          "GS NFV IFA011: Section 7.1.4 VnfdElementGroup
+           information element";
+      }
+
+      leaf description {
+        type string;
+        description
+          "Human readable description of the group.";
+        reference
+          "GS NFV IFA011: Section 7.1.4 VnfdElementGroup
+           information element";
+      }
+
+      leaf-list vdu {
+        type leafref {
+          path "../../vdu/id";
+        }
+        description
+          "References to Vdus that are part of this group.";
+        reference
+          "GS NFV IFA011: Section 7.1.4 VnfdElementGroup
+           information element";
+      }
+
+      leaf-list virtual-link-desc {
+        type leafref {
+          path "../../int-virtual-link-desc/id";
+        }
+        description
+          "References to VnfVirtualLinkDesc that are part of this
+           group.";
+        reference
+          "GS NFV IFA011: Section 7.1.4 VnfdElementGroup
+           information element";
+      }
+    }
+
+    list indicator {
+      key "id";
+      description
+        "Declares the VNF indicators that are supported by this
+         VNF.";
+      reference
+        "GS NFV IFA011: Section 7.1.2 VNFD information element";
+
+      leaf id {
+        type string;
+        description
+          "Unique identifier";
+        reference
+          "GS NFV IFA011: Section 7.1.11.2 VnfdIndicator
+           information element";
+      }
+
+      leaf name {
+        type string;
+        description
+          "The human readable name of the VnfIndicator.";
+        reference
+          "GS NFV IFA011: Section 7.1.11.2 VnfdIndicator
+           information element";
+      }
+
+      leaf-list indicator-value {
+        type string;
+        description
+          "Defines the allowed values or value ranges of this
+           indicator.";
+        reference
+          "GS NFV IFA011: Section 7.1.11.2 VnfdIndicator
+           information element";
+      }
+
+      leaf source {
+        type enumeration {
+          enum "vnf";
+          enum "em";
+          enum "both";
+        }
+        description
+          "Describe the source of the indicator. The possible values
+           are:
+           • VNF.
+           • EM.
+           • Both.
+           This tells the consumer where to send the subscription
+           request.";
+        reference
+          "GS NFV IFA011: Section 7.1.11.2 VnfdIndicator
+           information element";
+      }
+    }
+
+    leaf-list auto-scale {
+      type string;
+      description
+        "Rule that determines when a scaling action needs to be
+         triggered on a VNF instance e.g. based on certain VNF
+         indicator values or VNF indicator value changes or a
+         combination of VNF indicator value(s) and monitoring
+         parameter(s).";
+      reference
+        "GS NFV IFA011: Section 7.1.2 VNFD information element";
+    }
+  }
+}
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/nfv/etsi-nfv-vnfd.yang b/plugins/org.etsi.mts.tdl.yang2tdl/samples/nfv/etsi-nfv-vnfd.yang
new file mode 100644
index 0000000000000000000000000000000000000000..5ded801b6d367dece55ad824c3fbef16c1c53f0a
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/nfv/etsi-nfv-vnfd.yang
@@ -0,0 +1,26 @@
+module etsi-nfv-vnfd {
+  yang-version 1.1;
+  namespace "urn:etsi:nfv:yang:etsi-nfv-vnfd";
+  prefix vnfd;
+
+  import etsi-nfv-descriptors {
+    prefix vnf;
+  }
+
+  organization
+    "European Telecommunications Standards Institute (ETSI)";
+
+  description
+    "Virtual Network Function Descriptor.";
+
+  revision 2019-03-18 {
+    description
+      "Initial revision.
+       VNFD according to ETSI GS NFV-IFA 011 Ed261v254.";
+  }
+
+  container vnfd {
+    presence "VNFD container.";
+    uses vnf:vnfd;
+  }
+}
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple.tdltx b/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..3e0cd8a8ec2c370d40c33831f75478af4d09fa8e
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple.tdltx
@@ -0,0 +1,591 @@
+Package generated_from_simple {
+    Type String
+    Type TODO_RESOLVE_REFERENCED
+    Use "simple" as SOURCE_MAPPING
+    Use "TODO" as TARGET_MAPPING
+    Structure system (
+        string host_name,
+        string_collection domain_search,
+        system___login login
+    )
+    Type string { pattern }
+    Map string to "BaseStringType{name=(urn:ietf:params:xml:ns:yang:1)string, status=CURRENT, patterns=[]" in SOURCE_MAPPING as string_SOURCE_MAPPING
+    Map string to "target://BaseStringType{name=(urn:ietf:params:xml:ns:yang:1)string, status=CURRENT, patterns=[]" in TARGET_MAPPING as string_TARGET_MAPPING
+    Constraint pattern
+    Collection string_collection of string
+    Map string_collection to "BaseStringType{name=(urn:ietf:params:xml:ns:yang:1)string, status=CURRENT, patterns=[]" in SOURCE_MAPPING as string_collection_SOURCE_MAPPING
+    Map string_collection to "target://BaseStringType{name=(urn:ietf:params:xml:ns:yang:1)string, status=CURRENT, patterns=[]" in TARGET_MAPPING as string_collection_TARGET_MAPPING
+    Structure system___login (
+        string message,
+        login___user_collection user
+    )
+    Structure login___user (
+        string ^name,
+        string full_name,
+        string class
+    )
+    Map login___user to "(http://acme.example.com/system?revision=2007-06-09)user" in SOURCE_MAPPING as login___user_SOURCE_MAPPING {
+        ^name -> "name",
+        full_name -> "full_name",
+        class -> "class"
+    }
+    Map login___user to "target://(http://acme.example.com/system?revision=2007-06-09)user" in TARGET_MAPPING as login___user_TARGET_MAPPING {
+        ^name -> "name",
+        full_name -> "full_name",
+        class -> "class"
+    }
+    Collection login___user_collection of login___user
+    Map login___user_collection to "(http://acme.example.com/system?revision=2007-06-09)user" in SOURCE_MAPPING as login___user_collection_SOURCE_MAPPING
+    Map login___user_collection to "target://(http://acme.example.com/system?revision=2007-06-09)user" in TARGET_MAPPING as login___user_collection_TARGET_MAPPING
+    Map system___login to "(http://acme.example.com/system?revision=2007-06-09)login" in SOURCE_MAPPING as system___login_SOURCE_MAPPING {
+        message -> "message",
+        user -> "user"
+    }
+    Map system___login to "target://(http://acme.example.com/system?revision=2007-06-09)login" in TARGET_MAPPING as system___login_TARGET_MAPPING {
+        message -> "message",
+        user -> "user"
+    }
+    Map system to "(http://acme.example.com/system?revision=2007-06-09)system" in SOURCE_MAPPING as system_SOURCE_MAPPING {
+        host_name -> "host_name",
+        domain_search -> "domain_search",
+        login -> "login"
+    }
+    Map system to "target://(http://acme.example.com/system?revision=2007-06-09)system" in TARGET_MAPPING as system_TARGET_MAPPING {
+        host_name -> "host_name",
+        domain_search -> "domain_search",
+        login -> "login"
+    }
+    Structure parent_container (
+        parent_container___parent_ordered_list_collection child_container
+    )
+    Structure parent_container___parent_ordered_list (
+        string parent_key_leaf,
+        string parent_ordinary_leaf,
+        parent_ordered_list___child_ordered_list_collection child_ordered_list
+    )
+    Structure parent_ordered_list___child_ordered_list (
+        string child_key_leaf,
+        string child_ordinary_leaf
+    )
+    Map parent_ordered_list___child_ordered_list to "(opendaylight.org/example-module)child-ordered-list" in SOURCE_MAPPING as parent_ordered_list___child_ordered_list_SOURCE_MAPPING {
+        child_key_leaf -> "child_key_leaf",
+        child_ordinary_leaf -> "child_ordinary_leaf"
+    }
+    Map parent_ordered_list___child_ordered_list to "target://(opendaylight.org/example-module)child-ordered-list" in TARGET_MAPPING as parent_ordered_list___child_ordered_list_TARGET_MAPPING {
+        child_key_leaf -> "child_key_leaf",
+        child_ordinary_leaf -> "child_ordinary_leaf"
+    }
+    Collection parent_ordered_list___child_ordered_list_collection of parent_ordered_list___child_ordered_list
+    Map parent_ordered_list___child_ordered_list_collection to "(opendaylight.org/example-module)child-ordered-list" in SOURCE_MAPPING as parent_ordered_list___child_ordered_list_collection_SOURCE_MAPPING
+    Map parent_ordered_list___child_ordered_list_collection to "target://(opendaylight.org/example-module)child-ordered-list" in TARGET_MAPPING as parent_ordered_list___child_ordered_list_collection_TARGET_MAPPING
+    Map parent_container___parent_ordered_list to "(opendaylight.org/example-module)parent-ordered-list" in SOURCE_MAPPING as parent_container___parent_ordered_list_SOURCE_MAPPING {
+        parent_key_leaf -> "parent_key_leaf",
+        parent_ordinary_leaf -> "parent_ordinary_leaf",
+        child_ordered_list -> "child_ordered_list"
+    }
+    Map parent_container___parent_ordered_list to "target://(opendaylight.org/example-module)parent-ordered-list" in TARGET_MAPPING as parent_container___parent_ordered_list_TARGET_MAPPING {
+        parent_key_leaf -> "parent_key_leaf",
+        parent_ordinary_leaf -> "parent_ordinary_leaf",
+        child_ordered_list -> "child_ordered_list"
+    }
+    Collection parent_container___parent_ordered_list_collection of parent_container___parent_ordered_list
+    Map parent_container___parent_ordered_list_collection to "(opendaylight.org/example-module)parent-ordered-list" in SOURCE_MAPPING as parent_container___parent_ordered_list_collection_SOURCE_MAPPING
+    Map parent_container___parent_ordered_list_collection to "target://(opendaylight.org/example-module)parent-ordered-list" in TARGET_MAPPING as parent_container___parent_ordered_list_collection_TARGET_MAPPING
+    Map parent_container to "(opendaylight.org/example-module)parent-container" in SOURCE_MAPPING as parent_container_SOURCE_MAPPING {
+        child_container -> "child_container"
+    }
+    Map parent_container to "target://(opendaylight.org/example-module)parent-container" in TARGET_MAPPING as parent_container_TARGET_MAPPING {
+        child_container -> "child_container"
+    }
+    Structure sports (
+        sports___person_collection person,
+        sports___team_collection team,
+        sports___protocol_collection protocol
+    )
+    Structure sports___person (
+        string ^name,
+        date_and_time birthday
+    )
+    Type date_and_time { pattern : "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[\\+\\-]\\d{2}:\\d{2})" } extends string
+    Map date_and_time to "\\d{4-\\d{2-\\d{2T\\d{2:\\d{2:\\d{2(\\.\\d+)?(Z|[\\+\\-]\\d{2:\\d{2)], description=The date-and-time type is a profile of the ISO 8601\nstandard for representation of dates and times using the\nGregorian calendar.  The profile is defined by the\ndate-time production in Section 5.6 of RFC 3339.\n\nThe date-and-time type is compatible with the dateTime XML\nschema type with the following notable exceptions:\n\n(a) The date-and-time type does not allow negative years.\n\n(b) The date-and-time time-offset -00:00 indicates an unknown\n    time zone (see RFC 3339) while -00:00 and +00:00 and Z\n    all represent the same time zone in dateTime.\n\n(c) The canonical format (see below) of data-and-time values\n    differs from the canonical format used by the dateTime XML\n    schema type, which requires all times to be in UTC using\n    the time-offset \'Z\'.\n\nThis type is not equivalent to the DateAndTime textual\nconvention of the SMIv2 since RFC 3339 uses a different\nseparator between full-date and full-time and provides\nhigher resolution of time-secfrac.\n\nThe canonical format for date-and-time values with a known time\nzone uses a numeric time zone offset that is calculated using\nthe device\'s configured known offset to UTC time.  A change of\nthe device\'s offset to UTC time will cause date-and-time values\nto change accordingly.  Such changes might happen periodically\nin case a server follows automatically daylight saving time\n(DST) time zone offset changes.  The canonical format for\ndate-and-time values with an unknown time zone (usually\nreferring to the notion of local time) uses the time-offset\n-00:00., qname=(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)date-and-time, reference=RFC 3339: Date and Time on the Internet: Timestamps\nRFC 2579: Textual Conventions for SMIv2\nXSD-TYPES: XML Schema Part 2: Datatypes Second Edition, status=CURRENT" in SOURCE_MAPPING as date_and_time_SOURCE_MAPPING
+    Map date_and_time to "target://\\d{4-\\d{2-\\d{2T\\d{2:\\d{2:\\d{2(\\.\\d+)?(Z|[\\+\\-]\\d{2:\\d{2)], description=The date-and-time type is a profile of the ISO 8601\nstandard for representation of dates and times using the\nGregorian calendar.  The profile is defined by the\ndate-time production in Section 5.6 of RFC 3339.\n\nThe date-and-time type is compatible with the dateTime XML\nschema type with the following notable exceptions:\n\n(a) The date-and-time type does not allow negative years.\n\n(b) The date-and-time time-offset -00:00 indicates an unknown\n    time zone (see RFC 3339) while -00:00 and +00:00 and Z\n    all represent the same time zone in dateTime.\n\n(c) The canonical format (see below) of data-and-time values\n    differs from the canonical format used by the dateTime XML\n    schema type, which requires all times to be in UTC using\n    the time-offset \'Z\'.\n\nThis type is not equivalent to the DateAndTime textual\nconvention of the SMIv2 since RFC 3339 uses a different\nseparator between full-date and full-time and provides\nhigher resolution of time-secfrac.\n\nThe canonical format for date-and-time values with a known time\nzone uses a numeric time zone offset that is calculated using\nthe device\'s configured known offset to UTC time.  A change of\nthe device\'s offset to UTC time will cause date-and-time values\nto change accordingly.  Such changes might happen periodically\nin case a server follows automatically daylight saving time\n(DST) time zone offset changes.  The canonical format for\ndate-and-time values with an unknown time zone (usually\nreferring to the notion of local time) uses the time-offset\n-00:00., qname=(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)date-and-time, reference=RFC 3339: Date and Time on the Internet: Timestamps\nRFC 2579: Textual Conventions for SMIv2\nXSD-TYPES: XML Schema Part 2: Datatypes Second Edition, status=CURRENT" in TARGET_MAPPING as date_and_time_TARGET_MAPPING
+    Map sports___person to "(http://example.com/example-sports)person" in SOURCE_MAPPING as sports___person_SOURCE_MAPPING {
+        ^name -> "name",
+        birthday -> "birthday"
+    }
+    Map sports___person to "target://(http://example.com/example-sports)person" in TARGET_MAPPING as sports___person_TARGET_MAPPING {
+        ^name -> "name",
+        birthday -> "birthday"
+    }
+    Collection sports___person_collection of sports___person
+    Map sports___person_collection to "(http://example.com/example-sports)person" in SOURCE_MAPPING as sports___person_collection_SOURCE_MAPPING
+    Map sports___person_collection to "target://(http://example.com/example-sports)person" in TARGET_MAPPING as sports___person_collection_TARGET_MAPPING
+    Structure sports___team (
+        string ^name,
+        team___player_collection player,
+        protocol protocol,
+        team___vlan_id vlan_id
+    )
+    Structure team___player (
+        @LeafRefPath : "/sports/person/name"
+        leafref ^name,
+        season season,
+        uint16 number,
+        scores scores,
+        uint16_collection score_list
+    )
+    Type leafref
+    Map leafref to "BaseLeafrefType{name=(http://example.com/ns/link)leafref, status=CURRENT, pathStatement=ParsedPathExpression{steps=LocationPathSteps{locationPath=YangLocationPath{absolute=true, steps=[Step{axis=child, qname=Unqualified{localName=config, Step{axis=child, qname=Unqualified{localName=links, Step{axis=child, qname=Unqualified{localName=link, Step{axis=child, qname=Unqualified{localName=name], originalString=/config/links/link/name" in SOURCE_MAPPING as leafref_SOURCE_MAPPING
+    Map leafref to "target://BaseLeafrefType{name=(http://example.com/ns/link)leafref, status=CURRENT, pathStatement=ParsedPathExpression{steps=LocationPathSteps{locationPath=YangLocationPath{absolute=true, steps=[Step{axis=child, qname=Unqualified{localName=config, Step{axis=child, qname=Unqualified{localName=links, Step{axis=child, qname=Unqualified{localName=link, Step{axis=child, qname=Unqualified{localName=name], originalString=/config/links/link/name" in TARGET_MAPPING as leafref_TARGET_MAPPING
+    Annotation LeafRefPath
+    Type season { pattern } extends string
+    Map season to "DerivedStringType{baseType=BaseStringType{name=(urn:ietf:params:xml:ns:yang:1)string, status=CURRENT, patterns=[], description=The name of a sports season, including the type and the year, e.g,\n\'Champions League 2014/2015\'., qname=(http://example.com/example-sports)season, status=CURRENT" in SOURCE_MAPPING as season_SOURCE_MAPPING
+    Map season to "target://DerivedStringType{baseType=BaseStringType{name=(urn:ietf:params:xml:ns:yang:1)string, status=CURRENT, patterns=[], description=The name of a sports season, including the type and the year, e.g,\n\'Champions League 2014/2015\'., qname=(http://example.com/example-sports)season, status=CURRENT" in TARGET_MAPPING as season_TARGET_MAPPING
+    Type uint16
+    Map uint16 to "BaseUint16Type{name=(urn:ietf:params:xml:ns:yang:1)uint16, status=CURRENT, range=ResolvedRangeConstraint{ranges=[[0..65535]]" in SOURCE_MAPPING as uint16_SOURCE_MAPPING
+    Map uint16 to "target://BaseUint16Type{name=(urn:ietf:params:xml:ns:yang:1)uint16, status=CURRENT, range=ResolvedRangeConstraint{ranges=[[0..65535]]" in TARGET_MAPPING as uint16_TARGET_MAPPING
+    Type scores extends uint16
+    Map scores to "DerivedUint16Type{baseType=BaseUint16Type{name=(urn:ietf:params:xml:ns:yang:1)uint16, status=CURRENT, range=ResolvedRangeConstraint{ranges=[[0..65535]], default=0, qname=(http://example.com/example-sports)scores, status=CURRENT" in SOURCE_MAPPING as scores_SOURCE_MAPPING
+    Map scores to "target://DerivedUint16Type{baseType=BaseUint16Type{name=(urn:ietf:params:xml:ns:yang:1)uint16, status=CURRENT, range=ResolvedRangeConstraint{ranges=[[0..65535]], default=0, qname=(http://example.com/example-sports)scores, status=CURRENT" in TARGET_MAPPING as scores_TARGET_MAPPING
+    Collection uint16_collection of uint16
+    Map uint16_collection to "BaseUint16Type{name=(urn:ietf:params:xml:ns:yang:1)uint16, status=CURRENT, range=ResolvedRangeConstraint{ranges=[[0..65535]]" in SOURCE_MAPPING as uint16_collection_SOURCE_MAPPING
+    Map uint16_collection to "target://BaseUint16Type{name=(urn:ietf:params:xml:ns:yang:1)uint16, status=CURRENT, range=ResolvedRangeConstraint{ranges=[[0..65535]]" in TARGET_MAPPING as uint16_collection_TARGET_MAPPING
+    Map team___player to "(http://example.com/example-sports)player" in SOURCE_MAPPING as team___player_SOURCE_MAPPING {
+        ^name -> "name",
+        season -> "season",
+        number -> "number",
+        scores -> "scores",
+        score_list -> "score_list"
+    }
+    Map team___player to "target://(http://example.com/example-sports)player" in TARGET_MAPPING as team___player_TARGET_MAPPING {
+        ^name -> "name",
+        season -> "season",
+        number -> "number",
+        scores -> "scores",
+        score_list -> "score_list"
+    }
+    Collection team___player_collection of team___player
+    Map team___player_collection to "(http://example.com/example-sports)player" in SOURCE_MAPPING as team___player_collection_SOURCE_MAPPING
+    Map team___player_collection to "target://(http://example.com/example-sports)player" in TARGET_MAPPING as team___player_collection_TARGET_MAPPING
+    Enumerated protocol {
+        protocol tcp,
+        protocol udp,
+        protocol icmp
+    }
+    Map protocol to "DerivedEnumerationType{baseType=BaseEnumerationType{name=(http://example.com/example-sports)enumeration, status=CURRENT, values=[EnumPairImpl{name=tcp, value=0, EnumPairImpl{name=udp, value=1, EnumPairImpl{name=icmp, value=2], default=tcp, qname=(http://example.com/example-sports)protocol, status=CURRENT" in SOURCE_MAPPING as protocol_SOURCE_MAPPING
+    Map protocol to "target://DerivedEnumerationType{baseType=BaseEnumerationType{name=(http://example.com/example-sports)enumeration, status=CURRENT, values=[EnumPairImpl{name=tcp, value=0, EnumPairImpl{name=udp, value=1, EnumPairImpl{name=icmp, value=2], default=tcp, qname=(http://example.com/example-sports)protocol, status=CURRENT" in TARGET_MAPPING as protocol_TARGET_MAPPING
+    Type team___vlan_id { union : "vid_range_type","team___vlan_id___enumeration" }
+    Constraint union
+    Type vid_range_type { pattern : "([1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?(,[1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?)*)" } extends string
+    Map vid_range_type to "([1-9][0-9]{0,3(-[1-9][0-9]{0,3)?(,[1-9][0-9]{0,3(-[1-9][0-9]{0,3)?)*)], description=A list of VLAN Ids, or non overlapping VLAN ranges, in ascending\norder, between 1 and 4094.\n\nThis type is used to match an ordered list of VLAN Ids, or\ncontiguous ranges of VLAN Ids. Valid VLAN Ids must be in the range\n1 to 4094, and included in the list in non overlapping ascending\norder.\n\nFor example: 1,10-100,250,500-1000, qname=(http://example.com/example-sports)vid-range-type, status=CURRENT" in SOURCE_MAPPING as vid_range_type_SOURCE_MAPPING
+    Map vid_range_type to "target://([1-9][0-9]{0,3(-[1-9][0-9]{0,3)?(,[1-9][0-9]{0,3(-[1-9][0-9]{0,3)?)*)], description=A list of VLAN Ids, or non overlapping VLAN ranges, in ascending\norder, between 1 and 4094.\n\nThis type is used to match an ordered list of VLAN Ids, or\ncontiguous ranges of VLAN Ids. Valid VLAN Ids must be in the range\n1 to 4094, and included in the list in non overlapping ascending\norder.\n\nFor example: 1,10-100,250,500-1000, qname=(http://example.com/example-sports)vid-range-type, status=CURRENT" in TARGET_MAPPING as vid_range_type_TARGET_MAPPING
+    Enumerated team___vlan_id___enumeration {
+        team___vlan_id___enumeration ^any
+    }
+    Map team___vlan_id___enumeration to "BaseEnumerationType{name=(http://example.com/example-sports)enumeration, status=CURRENT, values=[EnumPairImpl{name=any, value=4095]" in SOURCE_MAPPING as team___vlan_id___enumeration_SOURCE_MAPPING
+    Map team___vlan_id___enumeration to "target://BaseEnumerationType{name=(http://example.com/example-sports)enumeration, status=CURRENT, values=[EnumPairImpl{name=any, value=4095]" in TARGET_MAPPING as team___vlan_id___enumeration_TARGET_MAPPING
+    Map team___vlan_id to "([1-9][0-9]{0,3(-[1-9][0-9]{0,3)?(,[1-9][0-9]{0,3(-[1-9][0-9]{0,3)?)*)], description=A list of VLAN Ids, or non overlapping VLAN ranges, in ascending\norder, between 1 and 4094.\n\nThis type is used to match an ordered list of VLAN Ids, or\ncontiguous ranges of VLAN Ids. Valid VLAN Ids must be in the range\n1 to 4094, and included in the list in non overlapping ascending\norder.\n\nFor example: 1,10-100,250,500-1000, qname=(http://example.com/example-sports)vid-range-type, status=CURRENT, BaseEnumerationType{name=(http://example.com/example-sports)enumeration, status=CURRENT, values=[EnumPairImpl{name=any, value=4095]]" in SOURCE_MAPPING as team___vlan_id_SOURCE_MAPPING
+    Map team___vlan_id to "target://([1-9][0-9]{0,3(-[1-9][0-9]{0,3)?(,[1-9][0-9]{0,3(-[1-9][0-9]{0,3)?)*)], description=A list of VLAN Ids, or non overlapping VLAN ranges, in ascending\norder, between 1 and 4094.\n\nThis type is used to match an ordered list of VLAN Ids, or\ncontiguous ranges of VLAN Ids. Valid VLAN Ids must be in the range\n1 to 4094, and included in the list in non overlapping ascending\norder.\n\nFor example: 1,10-100,250,500-1000, qname=(http://example.com/example-sports)vid-range-type, status=CURRENT, BaseEnumerationType{name=(http://example.com/example-sports)enumeration, status=CURRENT, values=[EnumPairImpl{name=any, value=4095]]" in TARGET_MAPPING as team___vlan_id_TARGET_MAPPING
+    Map sports___team to "(http://example.com/example-sports)team" in SOURCE_MAPPING as sports___team_SOURCE_MAPPING {
+        ^name -> "name",
+        player -> "player",
+        protocol -> "protocol",
+        vlan_id -> "vlan_id"
+    }
+    Map sports___team to "target://(http://example.com/example-sports)team" in TARGET_MAPPING as sports___team_TARGET_MAPPING {
+        ^name -> "name",
+        player -> "player",
+        protocol -> "protocol",
+        vlan_id -> "vlan_id"
+    }
+    Collection sports___team_collection of sports___team
+    Map sports___team_collection to "(http://example.com/example-sports)team" in SOURCE_MAPPING as sports___team_collection_SOURCE_MAPPING
+    Map sports___team_collection to "target://(http://example.com/example-sports)team" in TARGET_MAPPING as sports___team_collection_TARGET_MAPPING
+    Structure sports___protocol (
+        string associated_layer_protocol,
+        protocoly protocoly,
+        protocol___ext_cpd_collection ext_cpd,
+        protocol___case_ext_cpd_collection case_ext_cpd,
+        string protocolz,
+        protocol___port_map_collection port_map
+    )
+    Enumerated protocoly {
+        protocoly tcp,
+        protocoly udp,
+        protocoly icmp
+    }
+    Map protocoly to "DerivedEnumerationType{baseType=BaseEnumerationType{name=(http://example.com/example-sports)enumeration, status=CURRENT, values=[EnumPairImpl{name=tcp, value=0, EnumPairImpl{name=udp, value=1, EnumPairImpl{name=icmp, value=2], default=tcp, qname=(http://example.com/example-sports)protocoly, status=CURRENT" in SOURCE_MAPPING as protocoly_SOURCE_MAPPING
+    Map protocoly to "target://DerivedEnumerationType{baseType=BaseEnumerationType{name=(http://example.com/example-sports)enumeration, status=CURRENT, values=[EnumPairImpl{name=tcp, value=0, EnumPairImpl{name=udp, value=1, EnumPairImpl{name=icmp, value=2], default=tcp, qname=(http://example.com/example-sports)protocoly, status=CURRENT" in TARGET_MAPPING as protocoly_TARGET_MAPPING
+    Structure protocol___ext_cpd (
+        string k,
+        ext_cpd___cp_connection cp_connection
+    )
+    Structure ext_cpd___cp_connection (
+        cp_connection___int_virtual_link_desc int_virtual_link_desc,
+        cp_connection___int_cpd int_cpd
+    )
+    Structure cp_connection___int_virtual_link_desc (
+        string int_virtual_link_desc
+    )
+    Map cp_connection___int_virtual_link_desc to "(http://example.com/example-sports)int-virtual-link-desc" in SOURCE_MAPPING as cp_connection___int_virtual_link_desc_SOURCE_MAPPING {
+        int_virtual_link_desc -> "int_virtual_link_desc"
+    }
+    Map cp_connection___int_virtual_link_desc to "target://(http://example.com/example-sports)int-virtual-link-desc" in TARGET_MAPPING as cp_connection___int_virtual_link_desc_TARGET_MAPPING {
+        int_virtual_link_desc -> "int_virtual_link_desc"
+    }
+    Structure cp_connection___int_cpd (
+        int_cpd___int_cpd int_cpd
+    )
+    Structure int_cpd___int_cpd (
+        string vdu_id,
+        string cpd
+    )
+    Map int_cpd___int_cpd to "(http://example.com/example-sports)int-cpd" in SOURCE_MAPPING as int_cpd___int_cpd_SOURCE_MAPPING {
+        vdu_id -> "vdu_id",
+        cpd -> "cpd"
+    }
+    Map int_cpd___int_cpd to "target://(http://example.com/example-sports)int-cpd" in TARGET_MAPPING as int_cpd___int_cpd_TARGET_MAPPING {
+        vdu_id -> "vdu_id",
+        cpd -> "cpd"
+    }
+    Map cp_connection___int_cpd to "(http://example.com/example-sports)int-cpd" in SOURCE_MAPPING as cp_connection___int_cpd_SOURCE_MAPPING {
+        int_cpd -> "int_cpd"
+    }
+    Map cp_connection___int_cpd to "target://(http://example.com/example-sports)int-cpd" in TARGET_MAPPING as cp_connection___int_cpd_TARGET_MAPPING {
+        int_cpd -> "int_cpd"
+    }
+    Map ext_cpd___cp_connection to "(http://example.com/example-sports)cp-connection" in SOURCE_MAPPING as ext_cpd___cp_connection_SOURCE_MAPPING {
+        int_virtual_link_desc -> "int_virtual_link_desc",
+        int_cpd -> "int_cpd"
+    }
+    Map ext_cpd___cp_connection to "target://(http://example.com/example-sports)cp-connection" in TARGET_MAPPING as ext_cpd___cp_connection_TARGET_MAPPING {
+        int_virtual_link_desc -> "int_virtual_link_desc",
+        int_cpd -> "int_cpd"
+    }
+    Map protocol___ext_cpd to "(http://example.com/example-sports)ext-cpd" in SOURCE_MAPPING as protocol___ext_cpd_SOURCE_MAPPING {
+        k -> "k",
+        cp_connection -> "cp_connection"
+    }
+    Map protocol___ext_cpd to "target://(http://example.com/example-sports)ext-cpd" in TARGET_MAPPING as protocol___ext_cpd_TARGET_MAPPING {
+        k -> "k",
+        cp_connection -> "cp_connection"
+    }
+    Collection protocol___ext_cpd_collection of protocol___ext_cpd
+    Map protocol___ext_cpd_collection to "(http://example.com/example-sports)ext-cpd" in SOURCE_MAPPING as protocol___ext_cpd_collection_SOURCE_MAPPING
+    Map protocol___ext_cpd_collection to "target://(http://example.com/example-sports)ext-cpd" in TARGET_MAPPING as protocol___ext_cpd_collection_TARGET_MAPPING
+    Structure protocol___case_ext_cpd (
+        string k,
+        case_ext_cpd___cp_connection cp_connection
+    )
+    Structure case_ext_cpd___cp_connection (
+        cp_connection___a ^a,
+        cp_connection___b b
+    )
+    Structure cp_connection___a (
+        string int_virtual_link_desc
+    )
+    Map cp_connection___a to "(http://example.com/example-sports)a" in SOURCE_MAPPING as cp_connection___a_SOURCE_MAPPING {
+        int_virtual_link_desc -> "int_virtual_link_desc"
+    }
+    Map cp_connection___a to "target://(http://example.com/example-sports)a" in TARGET_MAPPING as cp_connection___a_TARGET_MAPPING {
+        int_virtual_link_desc -> "int_virtual_link_desc"
+    }
+    Structure cp_connection___b (
+        b___int_cpd int_cpd
+    )
+    Structure b___int_cpd (
+        string vdu_id,
+        string cpd
+    )
+    Map b___int_cpd to "(http://example.com/example-sports)int-cpd" in SOURCE_MAPPING as b___int_cpd_SOURCE_MAPPING {
+        vdu_id -> "vdu_id",
+        cpd -> "cpd"
+    }
+    Map b___int_cpd to "target://(http://example.com/example-sports)int-cpd" in TARGET_MAPPING as b___int_cpd_TARGET_MAPPING {
+        vdu_id -> "vdu_id",
+        cpd -> "cpd"
+    }
+    Map cp_connection___b to "(http://example.com/example-sports)b" in SOURCE_MAPPING as cp_connection___b_SOURCE_MAPPING {
+        int_cpd -> "int_cpd"
+    }
+    Map cp_connection___b to "target://(http://example.com/example-sports)b" in TARGET_MAPPING as cp_connection___b_TARGET_MAPPING {
+        int_cpd -> "int_cpd"
+    }
+    Map case_ext_cpd___cp_connection to "(http://example.com/example-sports)cp-connection" in SOURCE_MAPPING as case_ext_cpd___cp_connection_SOURCE_MAPPING {
+        ^a -> "a",
+        b -> "b"
+    }
+    Map case_ext_cpd___cp_connection to "target://(http://example.com/example-sports)cp-connection" in TARGET_MAPPING as case_ext_cpd___cp_connection_TARGET_MAPPING {
+        ^a -> "a",
+        b -> "b"
+    }
+    Map protocol___case_ext_cpd to "(http://example.com/example-sports)case-ext-cpd" in SOURCE_MAPPING as protocol___case_ext_cpd_SOURCE_MAPPING {
+        k -> "k",
+        cp_connection -> "cp_connection"
+    }
+    Map protocol___case_ext_cpd to "target://(http://example.com/example-sports)case-ext-cpd" in TARGET_MAPPING as protocol___case_ext_cpd_TARGET_MAPPING {
+        k -> "k",
+        cp_connection -> "cp_connection"
+    }
+    Collection protocol___case_ext_cpd_collection of protocol___case_ext_cpd
+    Map protocol___case_ext_cpd_collection to "(http://example.com/example-sports)case-ext-cpd" in SOURCE_MAPPING as protocol___case_ext_cpd_collection_SOURCE_MAPPING
+    Map protocol___case_ext_cpd_collection to "target://(http://example.com/example-sports)case-ext-cpd" in TARGET_MAPPING as protocol___case_ext_cpd_collection_TARGET_MAPPING
+    Structure protocol___port_map (
+        string port_ref,
+        port_map___map_type map_type
+    )
+    Structure port_map___map_type (
+        map_type___static_filtering_entries static_filtering_entries,
+        map_type___static_vlan_registration_entries static_vlan_registration_entries
+    )
+    Structure map_type___static_filtering_entries (
+        static_filtering_entries___static_filtering_entries static_filtering_entries
+    )
+    Structure static_filtering_entries___static_filtering_entries (
+        static_filtering_entries___control_element control_element,
+        string connection_identifier
+    )
+    Enumerated static_filtering_entries___control_element {
+        static_filtering_entries___control_element forward,
+        static_filtering_entries___control_element filter
+    }
+    Map static_filtering_entries___control_element to "BaseEnumerationType{name=(http://example.com/example-sports)enumeration, status=CURRENT, values=[EnumPairImpl{name=forward, value=0, EnumPairImpl{name=filter, value=1]" in SOURCE_MAPPING as static_filtering_entries___control_element_SOURCE_MAPPING
+    Map static_filtering_entries___control_element to "target://BaseEnumerationType{name=(http://example.com/example-sports)enumeration, status=CURRENT, values=[EnumPairImpl{name=forward, value=0, EnumPairImpl{name=filter, value=1]" in TARGET_MAPPING as static_filtering_entries___control_element_TARGET_MAPPING
+    Map static_filtering_entries___static_filtering_entries to "(http://example.com/example-sports)static-filtering-entries" in SOURCE_MAPPING as static_filtering_entries___static_filtering_entries_SOURCE_MAPPING {
+        control_element -> "control_element",
+        connection_identifier -> "connection_identifier"
+    }
+    Map static_filtering_entries___static_filtering_entries to "target://(http://example.com/example-sports)static-filtering-entries" in TARGET_MAPPING as static_filtering_entries___static_filtering_entries_TARGET_MAPPING {
+        control_element -> "control_element",
+        connection_identifier -> "connection_identifier"
+    }
+    Map map_type___static_filtering_entries to "(http://example.com/example-sports)static-filtering-entries" in SOURCE_MAPPING as map_type___static_filtering_entries_SOURCE_MAPPING {
+        static_filtering_entries -> "static_filtering_entries"
+    }
+    Map map_type___static_filtering_entries to "target://(http://example.com/example-sports)static-filtering-entries" in TARGET_MAPPING as map_type___static_filtering_entries_TARGET_MAPPING {
+        static_filtering_entries -> "static_filtering_entries"
+    }
+    Structure map_type___static_vlan_registration_entries (
+        static_vlan_registration_entries___static_vlan_registration_entries static_vlan_registration_entries
+    )
+    Structure static_vlan_registration_entries___static_vlan_registration_entries (
+        static_vlan_registration_entries___registrar_admin_control registrar_admin_control
+    )
+    Enumerated static_vlan_registration_entries___registrar_admin_control {
+        static_vlan_registration_entries___registrar_admin_control fixed_new_ignored,
+        static_vlan_registration_entries___registrar_admin_control forbidden
+    }
+    Map static_vlan_registration_entries___registrar_admin_control to "BaseEnumerationType{name=(http://example.com/example-sports)enumeration, status=CURRENT, values=[EnumPairImpl{name=fixed-new-ignored, value=0, EnumPairImpl{name=forbidden, value=1]" in SOURCE_MAPPING as static_vlan_registration_entries___registrar_admin_control_SOURCE_MAPPING
+    Map static_vlan_registration_entries___registrar_admin_control to "target://BaseEnumerationType{name=(http://example.com/example-sports)enumeration, status=CURRENT, values=[EnumPairImpl{name=fixed-new-ignored, value=0, EnumPairImpl{name=forbidden, value=1]" in TARGET_MAPPING as static_vlan_registration_entries___registrar_admin_control_TARGET_MAPPING
+    Map static_vlan_registration_entries___static_vlan_registration_entries to "(http://example.com/example-sports)static-vlan-registration-entries" in SOURCE_MAPPING as static_vlan_registration_entries___static_vlan_registration_entries_SOURCE_MAPPING {
+        registrar_admin_control -> "registrar_admin_control"
+    }
+    Map static_vlan_registration_entries___static_vlan_registration_entries to "target://(http://example.com/example-sports)static-vlan-registration-entries" in TARGET_MAPPING as static_vlan_registration_entries___static_vlan_registration_entries_TARGET_MAPPING {
+        registrar_admin_control -> "registrar_admin_control"
+    }
+    Map map_type___static_vlan_registration_entries to "(http://example.com/example-sports)static-vlan-registration-entries" in SOURCE_MAPPING as map_type___static_vlan_registration_entries_SOURCE_MAPPING {
+        static_vlan_registration_entries -> "static_vlan_registration_entries"
+    }
+    Map map_type___static_vlan_registration_entries to "target://(http://example.com/example-sports)static-vlan-registration-entries" in TARGET_MAPPING as map_type___static_vlan_registration_entries_TARGET_MAPPING {
+        static_vlan_registration_entries -> "static_vlan_registration_entries"
+    }
+    Map port_map___map_type to "(http://example.com/example-sports)map-type" in SOURCE_MAPPING as port_map___map_type_SOURCE_MAPPING {
+        static_filtering_entries -> "static_filtering_entries",
+        static_vlan_registration_entries -> "static_vlan_registration_entries"
+    }
+    Map port_map___map_type to "target://(http://example.com/example-sports)map-type" in TARGET_MAPPING as port_map___map_type_TARGET_MAPPING {
+        static_filtering_entries -> "static_filtering_entries",
+        static_vlan_registration_entries -> "static_vlan_registration_entries"
+    }
+    Map protocol___port_map to "(http://example.com/example-sports)port-map" in SOURCE_MAPPING as protocol___port_map_SOURCE_MAPPING {
+        port_ref -> "port_ref",
+        map_type -> "map_type"
+    }
+    Map protocol___port_map to "target://(http://example.com/example-sports)port-map" in TARGET_MAPPING as protocol___port_map_TARGET_MAPPING {
+        port_ref -> "port_ref",
+        map_type -> "map_type"
+    }
+    Collection protocol___port_map_collection of protocol___port_map
+    Map protocol___port_map_collection to "(http://example.com/example-sports)port-map" in SOURCE_MAPPING as protocol___port_map_collection_SOURCE_MAPPING
+    Map protocol___port_map_collection to "target://(http://example.com/example-sports)port-map" in TARGET_MAPPING as protocol___port_map_collection_TARGET_MAPPING
+    Map sports___protocol to "(http://example.com/example-sports)protocol" in SOURCE_MAPPING as sports___protocol_SOURCE_MAPPING {
+        associated_layer_protocol -> "associated_layer_protocol",
+        protocoly -> "protocoly",
+        ext_cpd -> "ext_cpd",
+        case_ext_cpd -> "case_ext_cpd",
+        protocolz -> "protocolz",
+        port_map -> "port_map"
+    }
+    Map sports___protocol to "target://(http://example.com/example-sports)protocol" in TARGET_MAPPING as sports___protocol_TARGET_MAPPING {
+        associated_layer_protocol -> "associated_layer_protocol",
+        protocoly -> "protocoly",
+        ext_cpd -> "ext_cpd",
+        case_ext_cpd -> "case_ext_cpd",
+        protocolz -> "protocolz",
+        port_map -> "port_map"
+    }
+    Collection sports___protocol_collection of sports___protocol
+    Map sports___protocol_collection to "(http://example.com/example-sports)protocol" in SOURCE_MAPPING as sports___protocol_collection_SOURCE_MAPPING
+    Map sports___protocol_collection to "target://(http://example.com/example-sports)protocol" in TARGET_MAPPING as sports___protocol_collection_TARGET_MAPPING
+    Map sports to "(http://example.com/example-sports)sports" in SOURCE_MAPPING as sports_SOURCE_MAPPING {
+        person -> "person",
+        team -> "team",
+        protocol -> "protocol"
+    }
+    Map sports to "target://(http://example.com/example-sports)sports" in TARGET_MAPPING as sports_TARGET_MAPPING {
+        person -> "person",
+        team -> "team",
+        protocol -> "protocol"
+    }
+    Structure config (
+        config___link_collection links,
+        config___queueDiscipline_collection queueDisciplines,
+        config___linkLimitation_collection linkLimitations,
+        config___defaultLink defaultLink
+    )
+    Structure config___link (
+        string ^name,
+        link___flags flags,
+        mac_address addr,
+        mac_address brd,
+        mtu mtu
+    )
+    Structure link___flags (
+        empty UP,
+        empty NOARP,
+        empty BROADCAST,
+        empty MULTICAST,
+        empty LOOPBACK,
+        empty NOTRAILERS
+    )
+    Type empty
+    Map empty to "BaseEmptyType{name=(urn:ietf:params:xml:ns:yang:1)empty, status=CURRENT" in SOURCE_MAPPING as empty_SOURCE_MAPPING
+    Map empty to "target://BaseEmptyType{name=(urn:ietf:params:xml:ns:yang:1)empty, status=CURRENT" in TARGET_MAPPING as empty_TARGET_MAPPING
+    Map link___flags to "(http://example.com/ns/link)flags" in SOURCE_MAPPING as link___flags_SOURCE_MAPPING {
+        UP -> "UP",
+        NOARP -> "NOARP",
+        BROADCAST -> "BROADCAST",
+        MULTICAST -> "MULTICAST",
+        LOOPBACK -> "LOOPBACK",
+        NOTRAILERS -> "NOTRAILERS"
+    }
+    Map link___flags to "target://(http://example.com/ns/link)flags" in TARGET_MAPPING as link___flags_TARGET_MAPPING {
+        UP -> "UP",
+        NOARP -> "NOARP",
+        BROADCAST -> "BROADCAST",
+        MULTICAST -> "MULTICAST",
+        LOOPBACK -> "LOOPBACK",
+        NOTRAILERS -> "NOTRAILERS"
+    }
+    Type mac_address { pattern : "[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}" } extends string
+    Map mac_address to "[0-9a-fA-F]{2(:[0-9a-fA-F]{2){5], description=The mac-address type represents an IEEE 802 MAC address.\nThe canonical representation uses lowercase characters.\n\nIn the value set and its semantics, this type is equivalent\nto the MacAddress textual convention of the SMIv2., qname=(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)mac-address, reference=IEEE 802: IEEE Standard for Local and Metropolitan Area\n          Networks: Overview and Architecture\nRFC 2579: Textual Conventions for SMIv2, status=CURRENT" in SOURCE_MAPPING as mac_address_SOURCE_MAPPING
+    Map mac_address to "target://[0-9a-fA-F]{2(:[0-9a-fA-F]{2){5], description=The mac-address type represents an IEEE 802 MAC address.\nThe canonical representation uses lowercase characters.\n\nIn the value set and its semantics, this type is equivalent\nto the MacAddress textual convention of the SMIv2., qname=(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)mac-address, reference=IEEE 802: IEEE Standard for Local and Metropolitan Area\n          Networks: Overview and Architecture\nRFC 2579: Textual Conventions for SMIv2, status=CURRENT" in TARGET_MAPPING as mac_address_TARGET_MAPPING
+    Type mtu extends uint32
+    Type uint32
+    Map mtu to "DerivedUint32Type{baseType=BaseUint32Type{name=(urn:ietf:params:xml:ns:yang:1)uint32, status=CURRENT, range=ResolvedRangeConstraint{ranges=[[0..4294967295]], default=1500, qname=(http://example.com/ns/link)mtu, status=CURRENT" in SOURCE_MAPPING as mtu_SOURCE_MAPPING
+    Map mtu to "target://DerivedUint32Type{baseType=BaseUint32Type{name=(urn:ietf:params:xml:ns:yang:1)uint32, status=CURRENT, range=ResolvedRangeConstraint{ranges=[[0..4294967295]], default=1500, qname=(http://example.com/ns/link)mtu, status=CURRENT" in TARGET_MAPPING as mtu_TARGET_MAPPING
+    Map config___link to "(http://example.com/ns/link)link" in SOURCE_MAPPING as config___link_SOURCE_MAPPING {
+        ^name -> "name",
+        flags -> "flags",
+        addr -> "addr",
+        brd -> "brd",
+        mtu -> "mtu"
+    }
+    Map config___link to "target://(http://example.com/ns/link)link" in TARGET_MAPPING as config___link_TARGET_MAPPING {
+        ^name -> "name",
+        flags -> "flags",
+        addr -> "addr",
+        brd -> "brd",
+        mtu -> "mtu"
+    }
+    Collection config___link_collection { maxLength : 1024 } of config___link
+    Map config___link_collection to "(http://example.com/ns/link)link" in SOURCE_MAPPING as config___link_collection_SOURCE_MAPPING
+    Map config___link_collection to "target://(http://example.com/ns/link)link" in TARGET_MAPPING as config___link_collection_TARGET_MAPPING
+    Constraint maxLength
+    Structure config___queueDiscipline (
+        @LeafRefPath : "/config/links/link/name"
+        leafref linkName,
+        QueueDisciplineType ^type,
+        uint32 length
+    )
+    Enumerated QueueDisciplineType {
+        QueueDisciplineType pfifo_fast,
+        QueueDisciplineType noqueue,
+        QueueDisciplineType noop,
+        QueueDisciplineType htb
+    }
+    Map QueueDisciplineType to "DerivedEnumerationType{baseType=BaseEnumerationType{name=(http://example.com/ns/link)enumeration, status=CURRENT, values=[EnumPairImpl{name=pfifo_fast, value=0, EnumPairImpl{name=noqueue, value=1, EnumPairImpl{name=noop, value=2, EnumPairImpl{name=htb, value=3], qname=(http://example.com/ns/link)QueueDisciplineType, status=CURRENT" in SOURCE_MAPPING as QueueDisciplineType_SOURCE_MAPPING
+    Map QueueDisciplineType to "target://DerivedEnumerationType{baseType=BaseEnumerationType{name=(http://example.com/ns/link)enumeration, status=CURRENT, values=[EnumPairImpl{name=pfifo_fast, value=0, EnumPairImpl{name=noqueue, value=1, EnumPairImpl{name=noop, value=2, EnumPairImpl{name=htb, value=3], qname=(http://example.com/ns/link)QueueDisciplineType, status=CURRENT" in TARGET_MAPPING as QueueDisciplineType_TARGET_MAPPING
+    Map uint32 to "BaseUint32Type{name=(urn:ietf:params:xml:ns:yang:1)uint32, status=CURRENT, range=ResolvedRangeConstraint{ranges=[[0..4294967295]]" in SOURCE_MAPPING as uint32_SOURCE_MAPPING
+    Map uint32 to "target://BaseUint32Type{name=(urn:ietf:params:xml:ns:yang:1)uint32, status=CURRENT, range=ResolvedRangeConstraint{ranges=[[0..4294967295]]" in TARGET_MAPPING as uint32_TARGET_MAPPING
+    Map config___queueDiscipline to "(http://example.com/ns/link)queueDiscipline" in SOURCE_MAPPING as config___queueDiscipline_SOURCE_MAPPING {
+        linkName -> "linkName",
+        ^type -> "type",
+        length -> "length"
+    }
+    Map config___queueDiscipline to "target://(http://example.com/ns/link)queueDiscipline" in TARGET_MAPPING as config___queueDiscipline_TARGET_MAPPING {
+        linkName -> "linkName",
+        ^type -> "type",
+        length -> "length"
+    }
+    Collection config___queueDiscipline_collection { maxLength : 1024 } of config___queueDiscipline
+    Map config___queueDiscipline_collection to "(http://example.com/ns/link)queueDiscipline" in SOURCE_MAPPING as config___queueDiscipline_collection_SOURCE_MAPPING
+    Map config___queueDiscipline_collection to "target://(http://example.com/ns/link)queueDiscipline" in TARGET_MAPPING as config___queueDiscipline_collection_TARGET_MAPPING
+    Structure config___linkLimitation (
+        @LeafRefPath : "/config/links/link/name"
+        leafref linkName,
+        linkLimitation___limitations limitations
+    )
+    Structure linkLimitation___limitations (
+        only10Mbps only10Mbps,
+        onlyHalfDuplex onlyHalfDuplex
+    )
+    Type only10Mbps extends boolean
+    Type boolean
+    Map only10Mbps to "DerivedBooleanType{baseType=BaseBooleanType{name=(urn:ietf:params:xml:ns:yang:1)boolean, status=CURRENT, default=false, qname=(http://example.com/ns/link)only10Mbps, status=CURRENT" in SOURCE_MAPPING as only10Mbps_SOURCE_MAPPING
+    Map only10Mbps to "target://DerivedBooleanType{baseType=BaseBooleanType{name=(urn:ietf:params:xml:ns:yang:1)boolean, status=CURRENT, default=false, qname=(http://example.com/ns/link)only10Mbps, status=CURRENT" in TARGET_MAPPING as only10Mbps_TARGET_MAPPING
+    Type onlyHalfDuplex extends boolean
+    Map onlyHalfDuplex to "DerivedBooleanType{baseType=BaseBooleanType{name=(urn:ietf:params:xml:ns:yang:1)boolean, status=CURRENT, default=false, qname=(http://example.com/ns/link)onlyHalfDuplex, status=CURRENT" in SOURCE_MAPPING as onlyHalfDuplex_SOURCE_MAPPING
+    Map onlyHalfDuplex to "target://DerivedBooleanType{baseType=BaseBooleanType{name=(urn:ietf:params:xml:ns:yang:1)boolean, status=CURRENT, default=false, qname=(http://example.com/ns/link)onlyHalfDuplex, status=CURRENT" in TARGET_MAPPING as onlyHalfDuplex_TARGET_MAPPING
+    Map linkLimitation___limitations to "(http://example.com/ns/link)limitations" in SOURCE_MAPPING as linkLimitation___limitations_SOURCE_MAPPING {
+        only10Mbps -> "only10Mbps",
+        onlyHalfDuplex -> "onlyHalfDuplex"
+    }
+    Map linkLimitation___limitations to "target://(http://example.com/ns/link)limitations" in TARGET_MAPPING as linkLimitation___limitations_TARGET_MAPPING {
+        only10Mbps -> "only10Mbps",
+        onlyHalfDuplex -> "onlyHalfDuplex"
+    }
+    Map config___linkLimitation to "(http://example.com/ns/link)linkLimitation" in SOURCE_MAPPING as config___linkLimitation_SOURCE_MAPPING {
+        linkName -> "linkName",
+        limitations -> "limitations"
+    }
+    Map config___linkLimitation to "target://(http://example.com/ns/link)linkLimitation" in TARGET_MAPPING as config___linkLimitation_TARGET_MAPPING {
+        linkName -> "linkName",
+        limitations -> "limitations"
+    }
+    Collection config___linkLimitation_collection of config___linkLimitation
+    Map config___linkLimitation_collection to "(http://example.com/ns/link)linkLimitation" in SOURCE_MAPPING as config___linkLimitation_collection_SOURCE_MAPPING
+    Map config___linkLimitation_collection to "target://(http://example.com/ns/link)linkLimitation" in TARGET_MAPPING as config___linkLimitation_collection_TARGET_MAPPING
+    Structure config___defaultLink (
+        @LeafRefPath : "/config/links/link/name"
+        leafref linkName
+    )
+    Map config___defaultLink to "(http://example.com/ns/link)defaultLink" in SOURCE_MAPPING as config___defaultLink_SOURCE_MAPPING {
+        linkName -> "linkName"
+    }
+    Map config___defaultLink to "target://(http://example.com/ns/link)defaultLink" in TARGET_MAPPING as config___defaultLink_TARGET_MAPPING {
+        linkName -> "linkName"
+    }
+    Map config to "(http://example.com/ns/link)config" in SOURCE_MAPPING as config_SOURCE_MAPPING {
+        links -> "links",
+        queueDisciplines -> "queueDisciplines",
+        linkLimitations -> "linkLimitations",
+        defaultLink -> "defaultLink"
+    }
+    Map config to "target://(http://example.com/ns/link)config" in TARGET_MAPPING as config_TARGET_MAPPING {
+        links -> "links",
+        queueDisciplines -> "queueDisciplines",
+        linkLimitations -> "linkLimitations",
+        defaultLink -> "defaultLink"
+    }
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple/acme.yang b/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple/acme.yang
new file mode 100644
index 0000000000000000000000000000000000000000..197595e2daaf3ac644c4d085ed3e2664fdcc2231
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple/acme.yang
@@ -0,0 +1,47 @@
+// Contents of "acme-system.yang"
+module acme-system {
+    namespace "http://acme.example.com/system";
+    prefix "acme";
+
+    organization "ACME Inc.";
+    contact "joe@acme.example.com";
+    description
+        "The module for entities implementing the ACME system.";
+
+    revision 2007-06-09 {
+        description "Initial revision.";
+    }
+
+    container system {
+        leaf host-name {
+            type string;
+            description "Hostname for this system";
+        }
+
+        leaf-list domain-search {
+            type string;
+            description "List of domain names to search";
+        }
+
+        container login {
+            leaf message {
+                type string;
+                description
+                    "Message given at start of login session";
+            }
+
+            list user {
+                key "name";
+                leaf name {
+                    type string;
+                }
+                leaf full-name {
+                    type string;
+                }
+                leaf class {
+                    type string;
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple/acme.yang-generated.tdltx b/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple/acme.yang-generated.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..35a3f347539cc0621735d287e5aaea4bd233383d
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple/acme.yang-generated.tdltx
@@ -0,0 +1,22 @@
+Package generated_from_acme_yang {
+    Type String
+    Type TODO_RESOLVE_REFERENCED
+    Use "acme.yang" as SOURCE_MAPPING
+    Structure system (
+        string host_name,
+        string_collection domain_search,
+        system___login login
+    )
+    Type string
+    Collection string_collection of string
+    Structure system___login (
+        string message,
+        login___user_collection user
+    )
+    Structure login___user (
+        string ^name,
+        string full_name,
+        string class
+    )
+    Collection login___user_collection of login___user
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple/acme.yang.tdltx b/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple/acme.yang.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..9a0202a2cf0e3938871bde6e479c531d398dd549
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple/acme.yang.tdltx
@@ -0,0 +1,27 @@
+Package generated_from_acme_yang {
+    Type String
+    Type TODO_RESOLVE_REFERENCED
+    Use "acme.yang" as SOURCE_MAPPING
+    Structure system (
+        system___host_name host_name,
+        string_collection domain_search,
+        system___login login
+    )
+    Type system___host_name
+    Type string
+    Collection string_collection of string
+    Structure system___login (
+        login___message message,
+        login___user_collection user
+    )
+    Type login___message
+    Structure login___user (
+        user___name ^name,
+        user___full_name full_name,
+        user___class class
+    )
+    Type user___name
+    Type user___full_name
+    Type user___class
+    Collection login___user_collection of login___user
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple/example.yang b/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple/example.yang
new file mode 100644
index 0000000000000000000000000000000000000000..d667828fa284eabb7153c74c539e12e959b6e2aa
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple/example.yang
@@ -0,0 +1,36 @@
+module example-module {
+    namespace "opendaylight.org/example-module";
+    prefix "example";
+
+    container parent-container {
+        container child-container {
+            list parent-ordered-list {
+                ordered-by user;
+
+                key "parent-key-leaf";
+
+                leaf parent-key-leaf {
+                    type string;
+                }
+
+                leaf parent-ordinary-leaf {
+                    type string;
+                }
+
+                list child-ordered-list {
+                    ordered-by user;
+
+                    key "child-key-leaf";
+
+                    leaf child-key-leaf {
+                        type string;
+                    }
+
+                    leaf child-ordinary-leaf {
+                        type string;
+                    }
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple/example.yang.tdltx b/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple/example.yang.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..c53a018db00c0a6f86d616605ab423b05eb81b26
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple/example.yang.tdltx
@@ -0,0 +1,26 @@
+Package generated_from_example_yang {
+    Type String
+    Type TODO_RESOLVE_REFERENCED
+    Use "example.yang" as SOURCE_MAPPING
+    Structure parent_container (
+        parent_container___child_container child_container
+    )
+    Structure parent_container___child_container (
+        child_container___parent_ordered_list_collection parent_ordered_list
+    )
+    Structure child_container___parent_ordered_list (
+        parent_ordered_list___parent_key_leaf parent_key_leaf,
+        parent_ordered_list___parent_ordinary_leaf parent_ordinary_leaf,
+        parent_ordered_list___child_ordered_list_collection child_ordered_list
+    )
+    Type parent_ordered_list___parent_key_leaf
+    Type parent_ordered_list___parent_ordinary_leaf
+    Structure parent_ordered_list___child_ordered_list (
+        child_ordered_list___child_key_leaf child_key_leaf,
+        child_ordered_list___child_ordinary_leaf child_ordinary_leaf
+    )
+    Type child_ordered_list___child_key_leaf
+    Type child_ordered_list___child_ordinary_leaf
+    Collection parent_ordered_list___child_ordered_list_collection of parent_ordered_list___child_ordered_list
+    Collection child_container___parent_ordered_list_collection of child_container___parent_ordered_list
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple/links.yang b/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple/links.yang
new file mode 100644
index 0000000000000000000000000000000000000000..65de24507353714b0c6328cd70e14ea984abd3c0
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple/links.yang
@@ -0,0 +1,119 @@
+module links {
+    namespace "http://example.com/ns/link";
+    prefix link;
+
+    import ietf-yang-types {
+        prefix yang;
+    }
+
+
+    grouping LinkFlagsType {
+        leaf UP {
+            type empty;
+        }
+        leaf NOARP {
+            type empty;
+        }
+        leaf BROADCAST {
+            type empty;
+        }
+        leaf MULTICAST {
+            type empty;
+        }
+        leaf LOOPBACK {
+            type empty;
+      }
+        leaf NOTRAILERS {
+            type empty;
+        }
+    }
+
+    typedef QueueDisciplineType {
+        type enumeration {
+            enum pfifo_fast;
+            enum noqueue;
+            enum noop;
+            enum htb;
+        }
+    }
+    typedef QueueDisciplineTypeX {
+        type enumeration {
+            enum pfifo_fast;
+            enum noqueue;
+            enum noop;
+            enum htb;
+        }
+    }
+    container config {
+        container links {
+            list link {
+                key name;
+                unique addr;
+                max-elements 1024;
+                leaf name {
+                    type string;
+                }
+                container flags {
+                    uses LinkFlagsType;
+                }
+                leaf addr {
+                    type yang:mac-address;
+                    mandatory true;
+                }
+                leaf brd {
+                    type yang:mac-address;
+                    mandatory true;
+                }
+                leaf mtu {
+                    type uint32;
+                    default 1500;
+                }
+            }
+        }
+        container queueDisciplines {
+            list queueDiscipline {
+                key linkName;
+                max-elements 1024;
+                leaf linkName {
+                    type leafref {
+                        path "/config/links/link/name";
+                    }
+                }
+                leaf type {
+                    type QueueDisciplineType;
+                    mandatory true;
+                }
+                leaf length {
+                    type uint32;
+                }
+            }
+        }
+        container linkLimitations {
+            list linkLimitation {
+                key linkName;
+                leaf linkName {
+                    type leafref {
+                        path "/config/links/link/name";
+                    }
+                }
+                container limitations {
+                    leaf only10Mbps {
+                        type boolean;
+                        default false;
+                    }
+                    leaf onlyHalfDuplex {
+                        type boolean;
+                        default false;
+                    }
+                }
+            }
+        }
+        container defaultLink {
+            leaf linkName {
+                type leafref {
+                    path "/config/links/link/name";
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple/links.yang-generated.tdltx b/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple/links.yang-generated.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..f10679ca0a19faa5068d9abc6ecf08eff58b4205
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple/links.yang-generated.tdltx
@@ -0,0 +1,64 @@
+Package generated_from_links_yang {
+    Type String
+    Type TODO_RESOLVE_REFERENCED
+    Use "links.yang" as SOURCE_MAPPING
+    Structure config (
+        config___link_collection links,
+        config___queueDiscipline_collection queueDisciplines,
+        config___linkLimitation_collection linkLimitations,
+        config___defaultLink defaultLink
+    )
+    Structure config___link (
+        string ^name,
+        link___flags flags,
+        mac_address addr,
+        mac_address brd,
+        mtu mtu
+    )
+    Type string
+    Structure link___flags (
+        empty UP,
+        empty NOARP,
+        empty BROADCAST,
+        empty MULTICAST,
+        empty LOOPBACK,
+        empty NOTRAILERS
+    )
+    Type empty
+    Type mac_address extends string
+    Type mtu extends uint32
+    Type uint32
+    Collection config___link_collection of config___link
+    Structure config___queueDiscipline (
+        @LeafRefPath : "/config/links/link/name"
+        leafref linkName,
+        QueueDisciplineType ^type,
+        uint32 length
+    )
+    Type leafref
+    Annotation LeafRefPath
+    Enumerated QueueDisciplineType {
+        QueueDisciplineType pfifo_fast,
+        QueueDisciplineType noqueue,
+        QueueDisciplineType noop,
+        QueueDisciplineType htb
+    }
+    Collection config___queueDiscipline_collection of config___queueDiscipline
+    Structure config___linkLimitation (
+        @LeafRefPath : "/config/links/link/name"
+        leafref linkName,
+        linkLimitation___limitations limitations
+    )
+    Structure linkLimitation___limitations (
+        only10Mbps only10Mbps,
+        onlyHalfDuplex onlyHalfDuplex
+    )
+    Type only10Mbps extends boolean
+    Type boolean
+    Type onlyHalfDuplex extends boolean
+    Collection config___linkLimitation_collection of config___linkLimitation
+    Structure config___defaultLink (
+        @LeafRefPath : "/config/links/link/name"
+        leafref linkName
+    )
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple/links.yang.tdltx b/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple/links.yang.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..d92705d8472cf48cb28ac7db4f2b8388e6b1021e
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple/links.yang.tdltx
@@ -0,0 +1,66 @@
+Package generated_from_links_yang {
+    Type String
+    Type TODO_RESOLVE_REFERENCED
+    Use "links.yang" as SOURCE_MAPPING
+    Structure config (
+        config___link_collection links,
+        config___queueDiscipline_collection queueDisciplines,
+        config___linkLimitation_collection linkLimitations,
+        config___defaultLink defaultLink
+    )
+    Structure config___link (
+        link___name ^name,
+        link___flags flags,
+        link___addr addr,
+        link___brd brd,
+        link___mtu mtu
+    )
+    Type link___name
+    Structure link___flags (
+        flags___UP UP,
+        flags___NOARP NOARP,
+        flags___BROADCAST BROADCAST,
+        flags___MULTICAST MULTICAST,
+        flags___LOOPBACK LOOPBACK,
+        flags___NOTRAILERS NOTRAILERS
+    )
+    Type flags___UP
+    Type flags___NOARP
+    Type flags___BROADCAST
+    Type flags___MULTICAST
+    Type flags___LOOPBACK
+    Type flags___NOTRAILERS
+    Type link___addr extends string
+    Type string
+    Type link___brd extends string
+    Type link___mtu extends uint32
+    Type uint32
+    Collection config___link_collection of config___link
+    Structure config___queueDiscipline (
+        queueDiscipline___linkName linkName,
+        queueDiscipline___type ^type,
+        queueDiscipline___length length
+    )
+    Type queueDiscipline___linkName
+    Type queueDiscipline___type extends enumeration
+    Type enumeration
+    Type queueDiscipline___length
+    Collection config___queueDiscipline_collection of config___queueDiscipline
+    Structure config___linkLimitation (
+        linkLimitation___linkName linkName,
+        linkLimitation___limitations limitations
+    )
+    Type linkLimitation___linkName
+    Structure linkLimitation___limitations (
+        limitations___only10Mbps only10Mbps,
+        limitations___onlyHalfDuplex onlyHalfDuplex
+    )
+    Type limitations___only10Mbps extends boolean
+    Type boolean
+    Type limitations___onlyHalfDuplex extends boolean
+    Collection config___linkLimitation_collection of config___linkLimitation
+    Structure config___defaultLink (
+        defaultLink___linkName linkName
+    )
+    Type defaultLink___linkName
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple/sports.yang b/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple/sports.yang
new file mode 100644
index 0000000000000000000000000000000000000000..86872bd0f053bedaf9c789cecce1588494e972d7
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple/sports.yang
@@ -0,0 +1,221 @@
+module example-sports {
+
+    namespace "http://example.com/example-sports";
+    prefix sports;
+
+    import ietf-yang-types {
+        prefix yang;
+    }
+
+    typedef season {
+        type string;
+        description
+          "The name of a sports season, including the type and the year, e.g,
+           'Champions League 2014/2015'.";
+    }
+
+    container sports {
+        config true;
+
+        list person {
+            key "name";
+            leaf name {
+                type string;
+            }
+            leaf birthday {
+                type yang:date-and-time;
+                mandatory true;
+            }
+        }
+
+        list team {
+            key "name";
+            leaf name {
+                type string;
+            }
+            list player {
+                key "name season";
+                unique number;
+                leaf name {
+                    type leafref {
+                        path "/sports/person/name";
+                    }
+                }
+                leaf season {
+                    type season;
+                }
+                leaf number {
+                    type uint16;
+                    mandatory true;
+                }
+                leaf scores {
+                    type uint16;
+                    default 0;
+                }
+                leaf-list score-list {
+                    type uint16;
+                }
+            }
+            leaf protocol {
+                type enumeration {
+                    enum tcp;
+                    enum udp;
+                    enum icmp;
+                }
+                default "tcp";
+            }
+            leaf vlan-id {
+              type union {
+                type vid-range-type;
+                type enumeration {
+                  enum any {
+                    value 4095;
+                    description
+                      "Matches 'any' VLAN in the range 1 to 4094.";
+                  }
+                }
+              }
+              mandatory true;
+              description
+                "VLAN Ids or any";
+            }
+            
+            
+        }
+        list protocol {
+            key "associated-layer-protocol";
+            leaf associated-layer-protocol {
+                type string;
+
+                description
+                  "One of the values of the attribute layerProtocol of the Cpd
+                   IE.";
+                reference
+                  "GS NFV IFA011: Section 7.1.6.8 CpProtocolData information
+                   element";
+            }
+            uses g1;
+            uses g2;
+        }
+    }
+    grouping g1 {
+        leaf protocoly {
+            type enumeration {
+                enum tcp;
+                enum udp;
+                enum icmp;
+            }
+            default "tcp";
+        }
+        list ext-cpd {
+        	key "k";
+        	leaf k {
+        		type string;
+        	}
+            choice cp-connection {
+                // no case
+                leaf int-virtual-link-desc {
+                    type string;
+                }
+                container int-cpd {
+                    leaf vdu-id {
+                        type string;
+                    }
+                    leaf cpd {
+                        type string;
+                    }
+                }
+            }
+        }
+        list case-ext-cpd {
+        	key "k";
+        	leaf k {
+        		type string;
+        	}
+            choice cp-connection {
+                // case
+                case a {
+                    leaf int-virtual-link-desc {
+                        type string;
+                    }
+                }
+                case b {
+
+                    container int-cpd {
+                        leaf vdu-id {
+                            type string;
+                        }
+                        leaf cpd {
+                            type string;
+                        }
+                    }
+                }
+            }
+        }
+
+    }
+    grouping g2 {
+        leaf protocolz {
+            type string;
+        }
+        list port-map {
+            key "port-ref";
+            leaf port-ref {
+                type string;
+            }
+            choice map-type {
+                // no case
+                container static-filtering-entries {
+                    leaf control-element {
+                        type enumeration {
+                            enum forward;
+                            enum filter;
+                        }
+                    }
+                    leaf connection-identifier {
+                        type string;
+                    }
+                }
+                container static-vlan-registration-entries {
+                    leaf registrar-admin-control {
+                        type enumeration {
+                            enum fixed-new-ignored;
+                            enum forbidden;
+                        }
+                    }
+                }
+            }
+        }
+    }
+    typedef vid-range-type {
+      type string {
+        pattern
+          "([1-9]"+
+          "[0-9]{0,3}"+
+          "(-[1-9][0-9]{0,3})?"+
+          "(,[1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?)*)";
+      }
+      description
+        "A list of VLAN Ids, or non overlapping VLAN ranges, in ascending
+        order, between 1 and 4094.
+        
+        This type is used to match an ordered list of VLAN Ids, or
+        contiguous ranges of VLAN Ids. Valid VLAN Ids must be in the range
+        1 to 4094, and included in the list in non overlapping ascending
+        order.
+        
+        For example: 1,10-100,250,500-1000";
+    }
+    typedef vlanid {
+      type uint16 {
+        range "1..4094";
+      }
+      description
+        "The vlanid type uniquely identifies a VLAN. This is the 12-bit
+        VLAN-ID used in the VLAN Tag header. The range is defined by the
+        referenced specification. This type is in the value set and its
+        semantics equivalent to the VlanId textual convention of the
+        SMIv2.";
+    }
+      
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple/sports.yang-generated.tdltx b/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple/sports.yang-generated.tdltx
new file mode 100644
index 0000000000000000000000000000000000000000..89428f05e99badc3ee1ad005c8027f839c19de4c
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/samples/simple/sports.yang-generated.tdltx
@@ -0,0 +1,134 @@
+Package generated_from_sports_yang {
+    Type String
+    Type TODO_RESOLVE_REFERENCED
+    Use "sports.yang" as SOURCE_MAPPING
+    Structure sports (
+        sports___person_collection person,
+        sports___team_collection team,
+        sports___protocol_collection protocol
+    )
+    Structure sports___person (
+        string ^name,
+        date_and_time birthday
+    )
+    Type string { pattern }
+    Type date_and_time extends string
+    Collection sports___person_collection of sports___person
+    Structure sports___team (
+        string ^name,
+        team___player_collection player,
+        protocol protocol,
+        team___vlan_id vlan_id
+    )
+    Structure team___player (
+        @LeafRefPath : "/sports/person/name"
+        leafref ^name,
+        season season,
+        uint16 number,
+        scores scores,
+        uint16_collection score_list
+    )
+    Type leafref
+    Annotation LeafRefPath
+    Type season extends string
+    Type uint16
+    Type scores extends uint16
+    Collection uint16_collection of uint16
+    Collection team___player_collection of team___player
+    Enumerated protocol {
+        protocol tcp,
+        protocol udp,
+        protocol icmp
+    }
+    Type team___vlan_id { union : "vid_range_type","team___vlan_id___enumeration" }
+    Constraint union
+    Type vid_range_type { pattern : "([1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?(,[1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?)*)" } extends string
+   
+    Constraint pattern
+    Enumerated team___vlan_id___enumeration {
+        team___vlan_id___enumeration ^any
+    }
+    Collection sports___team_collection of sports___team
+    Structure sports___protocol (
+        string associated_layer_protocol,
+        protocoly protocoly,
+        protocol___ext_cpd_collection ext_cpd,
+        protocol___case_ext_cpd_collection case_ext_cpd,
+        string protocolz,
+        protocol___port_map_collection port_map
+    )
+    Enumerated protocoly {
+        protocoly tcp,
+        protocoly udp,
+        protocoly icmp
+    }
+    Structure protocol___ext_cpd (
+        string k,
+        ext_cpd___cp_connection cp_connection
+    )
+    Structure ext_cpd___cp_connection (
+        cp_connection___int_virtual_link_desc int_virtual_link_desc,
+        cp_connection___int_cpd int_cpd
+    )
+    Structure cp_connection___int_virtual_link_desc (
+        string int_virtual_link_desc
+    )
+    Structure cp_connection___int_cpd (
+        int_cpd___int_cpd int_cpd
+    )
+    Structure int_cpd___int_cpd (
+        string vdu_id,
+        string cpd
+    )
+    Collection protocol___ext_cpd_collection of protocol___ext_cpd
+    Structure protocol___case_ext_cpd (
+        string k,
+        case_ext_cpd___cp_connection cp_connection
+    )
+    Structure case_ext_cpd___cp_connection (
+        cp_connection___a ^a,
+        cp_connection___b b
+    )
+    Structure cp_connection___a (
+        string int_virtual_link_desc
+    )
+    Structure cp_connection___b (
+        b___int_cpd int_cpd
+    )
+    Structure b___int_cpd (
+        string vdu_id,
+        string cpd
+    )
+    Collection protocol___case_ext_cpd_collection of protocol___case_ext_cpd
+    Structure protocol___port_map (
+        string port_ref,
+        port_map___map_type map_type
+    )
+    Structure port_map___map_type (
+        map_type___static_filtering_entries static_filtering_entries,
+        map_type___static_vlan_registration_entries static_vlan_registration_entries
+    )
+    Structure map_type___static_filtering_entries (
+        static_filtering_entries___static_filtering_entries static_filtering_entries
+    )
+    Structure static_filtering_entries___static_filtering_entries (
+        static_filtering_entries___control_element control_element,
+        string connection_identifier
+    )
+    Enumerated static_filtering_entries___control_element {
+        static_filtering_entries___control_element forward,
+        static_filtering_entries___control_element filter
+    }
+    Structure map_type___static_vlan_registration_entries (
+        static_vlan_registration_entries___static_vlan_registration_entries static_vlan_registration_entries
+    )
+    Structure static_vlan_registration_entries___static_vlan_registration_entries (
+        static_vlan_registration_entries___registrar_admin_control registrar_admin_control
+    )
+    Enumerated static_vlan_registration_entries___registrar_admin_control {
+        static_vlan_registration_entries___registrar_admin_control fixed_new_ignored,
+        static_vlan_registration_entries___registrar_admin_control forbidden
+    }
+    Collection protocol___port_map_collection of protocol___port_map
+    Collection sports___protocol_collection of sports___protocol
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/src/org/etsi/mts/tdl/yang2tdl/PropertyPage.java b/plugins/org.etsi.mts.tdl.yang2tdl/src/org/etsi/mts/tdl/yang2tdl/PropertyPage.java
new file mode 100644
index 0000000000000000000000000000000000000000..f1b14baaaacb119b57593de932ac6fb942b8ab1e
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/src/org/etsi/mts/tdl/yang2tdl/PropertyPage.java
@@ -0,0 +1,178 @@
+package org.etsi.mts.tdl.yang2tdl;
+
+import java.util.Arrays;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ProjectScope;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.preference.FieldEditor;
+import org.eclipse.jface.preference.FieldEditorPreferencePage;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.StringButtonFieldEditor;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IWorkbenchPropertyPage;
+import org.eclipse.ui.dialogs.ContainerSelectionDialog;
+import org.eclipse.ui.preferences.ScopedPreferenceStore;
+
+public class PropertyPage extends FieldEditorPreferencePage implements IWorkbenchPropertyPage {
+	
+	public static final String YANG_SPEC_LOCATION = "YangFilesLocation";
+
+	public static final String PREFERENCE_SCOPE = "org.etsi.mts.tdl.yang2tdl";
+
+	private static final List<String> REQUIRED_SETTINGS = Arrays.asList(new String[] { /* TODO */ });
+
+	protected IAdaptable element;
+
+	protected Map<FieldEditor, String> fields = new Hashtable<FieldEditor, String>();
+
+//	private StringFieldEditor javaApiPackage;
+
+	public PropertyPage() {
+		super(GRID);
+	}
+
+	@Override
+	public IAdaptable getElement() {
+		return element;
+	}
+
+	@Override
+	public void setElement(IAdaptable element) {
+		this.element = element;
+	}
+
+	@Override
+	protected IPreferenceStore doGetPreferenceStore() {
+		ProjectScope ps = new ProjectScope((IProject) this.element);
+		ScopedPreferenceStore scopedStore = new ScopedPreferenceStore(ps, PREFERENCE_SCOPE);
+//		scopedStore.setDefault(JAVA_GENERATOR, "java");
+		return scopedStore;
+	}
+
+	@Override
+	protected void initialize() {
+		for (FieldEditor e : fields.keySet()) {
+			String value = getPreferenceStore().getString(e.getPreferenceName());
+			fields.put(e, value);
+			initialize(e.getPreferenceName(), value, e);
+		}
+		super.initialize();
+	}
+
+	protected void initialize(String name, String value, FieldEditor e) {
+//		if (name.equals(GENERATE_JAVA_MAPPING)) {
+//			javaApiPackage.setEnabled(
+//					Boolean.valueOf(value),
+//					getFieldEditorParent());
+//		}
+	}
+
+	@Override
+	protected void addField(FieldEditor editor) {
+		super.addField(editor);
+		fields.put(editor, "");
+	}
+
+	@Override
+	public void propertyChange(PropertyChangeEvent event) {
+		super.propertyChange(event);
+		if (event.getProperty().equals(FieldEditor.VALUE)) {
+			FieldEditor e = (FieldEditor) event.getSource();
+
+			String name = e.getPreferenceName();
+			Object valueObj = event.getNewValue();
+			String value = valueObj.toString();
+
+			fields.put(e, value);
+
+			initialize(name, value, e);
+
+			checkState();
+		}
+	}
+
+	@Override
+	protected void checkState() {
+		setErrorMessage(null);
+		super.checkState();
+	}
+
+	@Override
+	protected void createFieldEditors() {
+
+		Composite parent = getFieldEditorParent();
+		FieldEditor yangSpecLocation = new ContainerFieldEditor(YANG_SPEC_LOCATION, "Yang files location", parent) {
+			@Override
+			public boolean isValid() {
+				return PropertyPage.this.isValid(this) && doCheckState();
+			}
+		};
+		addField(yangSpecLocation);
+		
+		// TODO
+	}
+
+	private boolean isValid(FieldEditor e) {
+		String name = e.getPreferenceName();
+		String value = fields.get(e);
+
+		if (REQUIRED_SETTINGS.contains(name)) {
+			if (value.isEmpty()) {
+				setErrorMessage(String.format("%s must be selected!", e.getLabelText()));
+				return false;
+			}
+		}
+
+		return true;
+	}
+
+}
+
+class ContainerFieldEditor extends StringButtonFieldEditor {
+
+	public ContainerFieldEditor(String name, String label, Composite parent) {
+		super(name, label, parent);
+	}
+
+	@Override
+	protected String changePressed() {
+
+		IContainer root = ResourcesPlugin.getWorkspace().getRoot();
+		ContainerSelectionDialog d = new ContainerSelectionDialog(getShell(), root, true, "Select output folder");
+		int result = d.open();
+		if (result == 0) {
+			Object[] dir = d.getResult();
+			if (dir.length > 0)
+				return dir[0].toString();
+		}
+		return null;
+	}
+
+	@Override
+	protected boolean doCheckState() {
+		String pathText = getTextControl().getText();
+		IPath path = new Path(pathText);
+		IContainer root = ResourcesPlugin.getWorkspace().getRoot();
+		IFolder f;
+		try {
+			f = root.getFolder(path);
+		} catch (IllegalArgumentException e) {
+			setErrorMessage(e.getMessage());
+			return false;
+		}
+		if (!f.exists())
+			setErrorMessage(pathText + " does not exist!");
+		return f != null && f.exists();
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/src/org/etsi/mts/tdl/yang2tdl/YANGConverter.java b/plugins/org.etsi.mts.tdl.yang2tdl/src/org/etsi/mts/tdl/yang2tdl/YANGConverter.java
new file mode 100644
index 0000000000000000000000000000000000000000..6226d38a5780d6370879d056c96f2031bff2ccee
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/src/org/etsi/mts/tdl/yang2tdl/YANGConverter.java
@@ -0,0 +1,63 @@
+package org.etsi.mts.tdl.yang2tdl;
+
+import java.io.File;
+import java.util.ArrayList;
+
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.etsi.mts.tdl.PackageableElement;
+import org.etsi.mts.tdl.helper.TDLHelper;
+
+public class YANGConverter {
+	public static void main(String[] args) {
+		String inputPath = "samples/simple/sports.yang";
+//		inputPath = "samples/simple/links.yang";
+//		inputPath = "samples/simple/example.yang";
+//		inputPath = "samples/simple/acme.yang";
+		inputPath = "samples/simple";
+//		inputPath = "samples";
+		String output = processToString(inputPath, inputPath+".tdltx");
+		System.out.println(output);
+	}
+	public static String processToString(String inputPath, String outputPath) {
+		return processToString(inputPath, outputPath, "SOURCE_MAPPING", "TARGET_MAPPING");
+	}
+	
+	//TODO: will need to resolve related files as well
+	public static String processToString(String inputPath, String outputPath, String sourceMapping, String targetMapping) {
+		System.out.println("Exporting: "+outputPath+ " : "+ new File(outputPath).getAbsolutePath());
+		Yang2TDLTranslator translator = new Yang2TDLTranslator();
+		String content = "Package imported {}";
+		try {
+//			Resource tr = TDLHelper.create(outputPath+".tdl");
+			Resource tr = TDLHelper.create(outputPath);
+			translator.setTargetResource(tr);
+			translator.initTargetResource(translator.getCleanName(new File(inputPath).getName()));
+			translator.translate(inputPath);
+			//update non-unique names
+			//TODO: does not quite work yet
+			//TODO: references not updated?
+//			int s = 0;
+//			ArrayList<String> names = new ArrayList<String>();
+//			for (PackageableElement e : translator.getGeneratedPackage().getPackagedElement()) {
+//				if (names.contains(e.getName()) ) {
+//					e.setName(e.getName()+s);
+//					s++;
+//				} 
+//				names.add(e.getName());
+//			}
+			content = TDLHelper.getText(tr);
+			TDLHelper.store(tr, true);
+//			Resource tdl = TDLHelper.load(outputPath+".tdl");
+//			Resource tdltx = TDLHelper.create(outputPath);
+//			tdltx.getContents().addAll(EcoreUtil.copyAll(tdl.getContents()));
+//			content = TDLHelper.getText(tdltx);
+//			TDLHelper.store(tdltx);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return content;
+	}
+
+}
+
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/src/org/etsi/mts/tdl/yang2tdl/Yang2TDLTranslator.java b/plugins/org.etsi.mts.tdl.yang2tdl/src/org/etsi/mts/tdl/yang2tdl/Yang2TDLTranslator.java
new file mode 100644
index 0000000000000000000000000000000000000000..f41e75eef433dc700affcf188320d112e94618d3
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/src/org/etsi/mts/tdl/yang2tdl/Yang2TDLTranslator.java
@@ -0,0 +1,715 @@
+package org.etsi.mts.tdl.yang2tdl;
+
+import java.io.File;
+import java.io.IOException;
+import java.math.BigInteger;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Collection;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ProjectScope;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.etsi.mts.tdl.Annotation;
+import org.etsi.mts.tdl.AnnotationType;
+import org.etsi.mts.tdl.CollectionDataType;
+import org.etsi.mts.tdl.Constraint;
+import org.etsi.mts.tdl.DataElementMapping;
+import org.etsi.mts.tdl.DataResourceMapping;
+import org.etsi.mts.tdl.DataType;
+import org.etsi.mts.tdl.ElementImport;
+import org.etsi.mts.tdl.EnumDataType;
+import org.etsi.mts.tdl.Extension;
+import org.etsi.mts.tdl.LiteralValueUse;
+import org.etsi.mts.tdl.Member;
+import org.etsi.mts.tdl.Package;
+import org.etsi.mts.tdl.PackageableElement;
+import org.etsi.mts.tdl.SimpleDataInstance;
+import org.etsi.mts.tdl.SimpleDataType;
+import org.etsi.mts.tdl.StructuredDataType;
+import org.etsi.mts.tdl.tdlFactory;
+import org.etsi.mts.tdl.tdlPackage;
+import org.etsi.mts.tdl.helper.TDLHelper;
+import org.etsi.mts.tdl.transform.AbstractTranslator;
+import org.opendaylight.yangtools.odlext.parser.MountStatementSupport;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.common.QNameModule;
+import org.opendaylight.yangtools.yang.common.Revision;
+import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ContainerLike;
+import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
+import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.model.api.SchemaNode;
+import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.stmt.LeafStatement;
+import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair;
+import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint;
+import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
+import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.DeclaredCaseEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyChoiceEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyLeafEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyLeafListEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularChoiceEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularLeafEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularLeafListEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.SlimLeafListEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.UndeclaredCaseEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredEffectiveStatement.Default;
+import org.opendaylight.yangtools.yang.model.spi.source.FileYangTextSource;
+import org.opendaylight.yangtools.yang.parser.api.YangParserConfiguration;
+import org.opendaylight.yangtools.yang.parser.api.YangSyntaxErrorException;
+import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.RFC7950Reactors;
+import org.opendaylight.yangtools.yang.parser.rfc7950.repo.YangStatementStreamSource;
+import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase;
+import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
+import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor;
+import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor.BuildAction;
+import org.osgi.service.prefs.Preferences;
+
+public class Yang2TDLTranslator extends AbstractTranslator {
+
+    private static final String REFERENCE_DESCRIPTION = "ReferenceDescription";
+	private static final String LIST_KEY = "ListKey";
+	private static final String LEAF_REF_PATH = "LeafRefPath";
+
+	private boolean isXtext = false;
+
+	private Package theTdlPackage;
+	private StructuredDataType messageBody = null;
+
+	private String limit = null;
+	private AnnotationType mappingNameAnnotation;
+
+	public void setLimit(String limit) {
+		this.limit = limit;
+	}
+
+	@Override
+	public void setTargetResource(Resource targetResource) {
+		super.setTargetResource(targetResource);
+
+		Class resourceClass = targetResource.getClass();
+		do {
+			// Flaky
+			if (resourceClass.getSimpleName().equals("XtextResource")) {
+				isXtext = true;
+				break;
+			}
+			resourceClass = resourceClass.getSuperclass();
+		} while (resourceClass != null);
+	}
+
+	public String getCleanName(String name) {
+
+		String replacement = name;
+		if (isXtext) {
+			if (replacement.matches(idStartDigitRegex))
+				replacement = "_" + replacement;
+			replacement = replacement.replaceAll(idInvalidCharRegex, "_");
+			// This isn't needed because keywords are escaped by IDValueConverter
+			/*
+			 * if (xtextKyewords.contains(replacement)) { replacement = "^" + replacement; }
+			 */
+		}
+
+		return replacement;
+	}
+
+	//inherited entry point
+	@Override
+	public void translate(String targetFilename) throws Exception {
+//		this.sourceMappingTag = "YangSpecification";
+		this.targetMappingTag = "YangSpecification";
+		
+		drm = getTypeFor(sourceMappingTag, tdlPackage.Literals.DATA_RESOURCE_MAPPING);
+		drm.setResourceURI(new File(targetFilename).getName());
+		
+
+		IProject project = TDLHelper.getProjectForResource(getTargetResource());
+		Preferences preferences = null;
+		if (project != null) {
+			ProjectScope ps = new ProjectScope(project);
+			preferences = ps.getNode(PropertyPage.PREFERENCE_SCOPE);
+		}
+		
+		theTdlPackage = TDLHelper.getTdlPackage(getTargetResource());
+		mappingNameAnnotation = null;
+		if (theTdlPackage != null) {
+			ElementImport importTdl = tdlFactory.eINSTANCE.createElementImport();
+			importTdl.setImportedPackage(theTdlPackage);
+			getGeneratedPackage().getImport().add(importTdl);
+			// TODO Remove default string type
+			getGeneratedPackage().getPackagedElement().remove(stringType);
+			
+
+			for (PackageableElement e : theTdlPackage.getPackagedElement()) {
+				if (e.eClass().equals(tdlPackage.eINSTANCE.getAnnotationType())
+						&& e.getName().equals("MappingName")) {
+					mappingNameAnnotation = (AnnotationType) e;
+					break;
+				}
+			}
+		}
+
+		Package httpPackage = TDLHelper.getHttpPackage(getTargetResource());
+		Package httpMessageBasedPackage = null;
+//		boolean useMessageBasedApi = true;
+//		if (preferences != null)
+//			useMessageBasedApi = !preferences.getBoolean(PropertyPage.PROCEDURE_BASED, false);
+//		if (useMessageBasedApi) {
+//		}
+		if (httpPackage != null) {
+			packages: for (Package p : httpPackage.getNestedPackage()) {
+				for (PackageableElement e : p.getPackagedElement()) {
+					if (e.eClass().equals(tdlPackage.eINSTANCE.getStructuredDataType())
+							&& e.getName().equals("Body")) {
+						this.messageBody = (StructuredDataType) e;
+						httpMessageBasedPackage = p;
+						break packages;
+					}
+				}
+			}
+			if (httpMessageBasedPackage != null) {
+				ElementImport importHttp = tdlFactory.eINSTANCE.createElementImport();
+				importHttp.setImportedPackage(httpMessageBasedPackage);
+				getGeneratedPackage().getImport().add(importHttp);
+			}
+		}
+
+        CrossSourceStatementReactor reactor = createReactor();
+		BuildAction build = reactor.newBuild();
+
+		//TODO: extract
+		//DONE: resolve files -> load everything from the root folder (naive approach)
+		//TODO: handle folders as well?
+		//TODO: handle duplicates modules?
+		System.out.println("Load YANG libraries from parent:");
+		Path target = Path.of(targetFilename);
+		Path parent = target;
+		while (parent.getParent() != null && !parent.toAbsolutePath().toString().equals(limit)) {
+			parent = parent.getParent();
+		}
+		if (parent != target) {
+			Files.walk(parent).filter(f->
+					f.toFile().isFile() &&
+					f.toString().endsWith(".yang") &&
+					!f.toString().equals(targetFilename)
+				).forEach(f -> {
+					System.out.println(f);
+					build.addLibSource(moduleFromPath(f.toString()));
+				}
+			);
+//		Files.find(parent, 20, (f, p) -> 
+//			p.isRegularFile() && 
+//			f.toString().endsWith(".yang") &&
+//			!f.toString().equals(targetFilename)
+//		).forEach(f -> {
+//				System.out.println(f);
+//				build.addLibSource(moduleFromPath(f.toString()));
+//			}
+//		);
+		}
+
+		//TODO: provide some base libraries by default?
+//		Files.list(Path.of("samples", "ietf"))
+//			.filter(p->p.toString().endsWith("yang"))
+//			.forEach(p -> 
+//			build.addLibSource(moduleFromPath(p.toString()))
+//		);
+		System.out.println("Processing: "+target);
+		if (target.toFile().isDirectory()) {
+			Files.walk(target).filter(f->
+					f.toFile().isFile() &&
+					f.toString().endsWith(".yang") &&
+					!f.toString().equals(targetFilename)
+					).forEach(f -> {
+						System.out.println(f);
+						build.addSource(moduleFromPath(f.toString()));
+					}
+				);
+			//non-recursive version
+//			Files.list(target)
+//				.filter(p->p.toString().endsWith("yang"))
+//				.forEach(p -> 
+//				build.addSource(moduleFromPath(p.toString()))
+//			);
+		} else {
+			build.addSource(moduleFromPath(targetFilename));
+		}
+		SchemaContext schemaContext = build.buildEffective();
+		//TODO: handle multimodule paths? -> can handle folders recursively
+		//TODO: include meta-data -> need to sort out multipe annotations
+		//TODO: library of built-in types
+		//TODO: add extensions
+		drmTarget = getTypeFor(targetMappingTag, tdlPackage.Literals.DATA_RESOURCE_MAPPING);
+
+		if (this.mappingNameAnnotation != null) {
+			Annotation annot = tdlFactory.eINSTANCE.createAnnotation();
+			annot.setKey(this.mappingNameAnnotation);
+			annot.setValue("Yang");
+			drmTarget.getAnnotation().add(annot);
+		}
+//		mappingsPackage.getPackagedElement().add(drmTarget);
+		drmTarget.setResourceURI("TODO");
+		translate(schemaContext);
+
+		ensureUniqueNames(getGeneratedPackage());
+	}
+
+	private void translate(SchemaContext schemaContext) {
+		for (DataSchemaNode c : schemaContext.getChildNodes()) {
+			translate(c);
+			//TODO: process types as well?
+		}
+	}
+
+	private DataType translate(DataSchemaNode c) {
+		return translate(c, null);
+	}
+	
+	private DataType translate(DataSchemaNode c, String parent) {
+		//wrapper for meta-data
+		//TODO: make optional
+		//TODO: resolve issues with annotations
+		//TODO: use notes?
+		DataType dataType = translateOnly(c, parent);
+//		c.getDescription().ifPresent(e-> {
+//			annotateWith(dataType, REFERENCE_DESCRIPTION, e);
+//		});
+		return dataType;
+	}
+	
+	private DataType translateOnly(DataSchemaNode c, String parent) {
+		String baseName = getCleanName(c.getQName().getLocalName());
+		String name = baseName;
+		if (parent != null) {
+			name = parent+"___"+name;
+		}
+		System.out.println(name);
+		if (c instanceof ContainerSchemaNode) {
+			//DONE: remove wrapper container structured data type of only a collection is contained
+			Collection<? extends DataSchemaNode> childNodes = ((ContainerSchemaNode) c).getChildNodes();
+			if (childNodes.isEmpty()) {
+				//create structured data type
+				StructuredDataType dataType = translateStructuredDataType((ContainerSchemaNode) c, baseName, name);
+				return dataType;
+			}
+			DataSchemaNode first = childNodes.iterator().next();
+			if (childNodes.size() == 1 && first instanceof ListSchemaNode) {
+				//create collection
+				return translate(first, parent); //parent?
+			} else {
+				//create structured data type
+				StructuredDataType dataType = translateStructuredDataType((ContainerSchemaNode) c, baseName, name);
+				return dataType;
+			}
+		} else if (c instanceof ListSchemaNode) {
+			StructuredDataType itemType = translateStructuredDataType((ListSchemaNode) c, baseName, name);
+			CollectionDataType collectionType = getCollectionDataTypeFor(itemType);
+			addMapping(c, collectionType, sourceMappingTag, targetMappingTag);
+
+			//TODO: add key annotation?
+			List<QName> keyDefinition = ((ListSchemaNode) c).getKeyDefinition();
+			String key = keyDefinition.stream()
+					.map(QName::getLocalName)
+					.collect(Collectors.joining(", "));
+			// TODO: make optional
+//			annotateWith(collectionType, LIST_KEY, key);
+			
+			//TODO: add max count constraint
+			((ListSchemaNode) c).getElementCountConstraint().ifPresent(cs -> {
+				//TODO: extract
+				Integer value = cs.getMaxElements();
+				String constraintName = "maxLength";
+				if (value == null) {
+					value = cs.getMinElements();
+					constraintName = "minLength";
+				}
+				Constraint constraint = constrainWith(collectionType, constraintName);
+				LiteralValueUse ut = tdlFactory.eINSTANCE.createLiteralValueUse();
+				ut.setIntValue(BigInteger.valueOf(value.longValue()));
+				constraint.getQuantifier().add(ut);
+			});
+			
+			return collectionType;
+		} else if (c instanceof RegularLeafListEffectiveStatement) {
+			//TODO: what is the difference?
+			TypeDefinition<?> type = ((RegularLeafListEffectiveStatement) c).getType();
+			CollectionDataType collectionType = translateSimpleDataCollection(name, type);
+			return collectionType;
+		} else if (c instanceof EmptyLeafListEffectiveStatement) {
+			//DONE: unify and reuse
+			TypeDefinition<?> type = ((EmptyLeafListEffectiveStatement) c).getType();
+			CollectionDataType collectionType = translateSimpleDataCollection(name, type);
+			return collectionType;
+		} else if (c instanceof SlimLeafListEffectiveStatement) {
+			//TODO: check and remove?
+			TypeDefinition<?> type = ((SlimLeafListEffectiveStatement) c).getType();
+			CollectionDataType collectionType = translateSimpleDataCollection(name, type);
+			return collectionType;
+		} else if (c instanceof EmptyLeafEffectiveStatement) {
+			TypeDefinition<?> type = ((EmptyLeafEffectiveStatement) c).getType();
+			SimpleDataType dataType = translateSimpleDataType(name, type);
+			return dataType;
+		} else if (c instanceof RegularLeafEffectiveStatement) {
+			//TODO: what is the difference? is it used
+			String typeName = ((RegularLeafEffectiveStatement) c).getType().getQName().getLocalName();
+			SimpleDataType dataType = getSimpleDataTypeFor(typeName);
+			addMapping(c, dataType, sourceMappingTag, targetMappingTag);
+			return dataType;
+		} else if (c instanceof RegularChoiceEffectiveStatement) {
+			//TODO: difference?
+			StructuredDataType dataType = getStructuredDataTypeFor(name);
+			for (CaseSchemaNode child : ((RegularChoiceEffectiveStatement) c).getCases()) {
+				translateMember(baseName, dataType, child);
+			}
+			addMapping(c, dataType, sourceMappingTag, targetMappingTag);
+			return dataType;
+		} else if (c instanceof EmptyChoiceEffectiveStatement) {
+			//TODO: add annotation choice
+			//TODO: need to skip cases?
+			//TODO: structured or simple?!
+			StructuredDataType dataType = getStructuredDataTypeFor(name);
+			for (CaseSchemaNode child : ((EmptyChoiceEffectiveStatement) c).getCases()) {
+				translateMember(baseName, dataType, child);
+			}
+			addMapping(c, dataType, sourceMappingTag, targetMappingTag);
+			return dataType;
+		} else if (c instanceof UndeclaredCaseEffectiveStatement) {
+			//choice -> container? (no case)
+			return translateStructuredDataType((DataNodeContainer) c, baseName, name);
+		} else if (c instanceof DeclaredCaseEffectiveStatement) {
+			//choice -> case
+			//TODO: compare and check
+			return translateStructuredDataType((DataNodeContainer) c, baseName, name);
+		} else {
+			System.out.println("TODO:: "+c);
+			SimpleDataType todoType = getSimpleDataTypeFor("TODO");
+			return todoType;
+		}
+	}
+
+	private CollectionDataType translateSimpleDataCollection(String name, TypeDefinition<?> type) {
+		SimpleDataType itemType = translateSimpleDataType(name, type);
+		CollectionDataType collectionType = getCollectionDataTypeFor(itemType);
+		addMapping(type, collectionType, sourceMappingTag, targetMappingTag);
+		return collectionType;
+	}
+
+	private SimpleDataType translateSimpleDataType(String name, TypeDefinition<?> type) {
+		if (type instanceof IdentityrefTypeDefinition) {
+			//TODO: handle further?
+//			System.out.println("identityref:"+name+" -> "+((IdentityrefTypeDefinition)type).getIdentities());
+		}
+		if (type instanceof LeafrefTypeDefinition) {
+			//TODO: handle further?
+//			System.out.println("leafref:"+name+" -> "+((LeafrefTypeDefinition)type).getPathStatement().getOriginalString());
+		}
+
+		TypeDefinition<?> baseType = type.getBaseType();
+		String typeName = type.getQName().getLocalName();
+//		typeName = name; //DONE: fine? -> seems to be -> causes lots of redundant types
+		if (baseType instanceof EnumTypeDefinition) { 
+			//DONE: handle enumeration -> add instances rather than extension
+			EnumDataType dataType = getEnumDataTypeFor(typeName);
+			for (EnumPair e : ((EnumTypeDefinition)baseType).getValues()) {
+				SimpleDataInstance eInstance = getEnumDataInstanceFor(e.getName(), dataType);
+				eInstance.setDataType(dataType);
+				dataType.getValue().add(eInstance);
+			}
+			addMapping(baseType, dataType, sourceMappingTag, targetMappingTag);
+
+			//TODO: add default?
+			return dataType;
+			//TODO: union of simple data types? also enums?
+			//TODO: adapt further?
+		} else if (type instanceof EnumTypeDefinition) {
+			EnumDataType dataType = getEnumDataTypeFor(name);
+			for (EnumPair e : ((EnumTypeDefinition)type).getValues()) {
+				SimpleDataInstance eInstance = getEnumDataInstanceFor(e.getName(), dataType);
+				eInstance.setDataType(dataType);
+				dataType.getValue().add(eInstance);
+			}
+			addMapping(type, dataType, sourceMappingTag, targetMappingTag);
+
+			return dataType;
+		} else if (type instanceof UnionTypeDefinition) {
+			SimpleDataType dataType = getSimpleDataTypeFor(name);
+			//dataType.setName(type.getQName().getLocalName());
+			List<TypeDefinition<?>> types = ((UnionTypeDefinition) type).getTypes();
+			Constraint constraint = constrainWith(dataType, "union");
+			if (constraint != null) {
+				for (TypeDefinition<?>t : types) {
+					SimpleDataType unionType = translateSimpleDataType(name+"___"+t.getQName().getLocalName(), t);
+					LiteralValueUse ut = tdlFactory.eINSTANCE.createLiteralValueUse();
+//					ut.setValue(t.getQName().getLocalName());
+					ut.setValue(unionType.getName());
+					constraint.getQuantifier().add(ut);
+				}
+			}
+			addMapping(type, dataType, sourceMappingTag, targetMappingTag);
+
+			return dataType;
+		} else {
+			//TODO: add constraints?
+			SimpleDataType dataType = getSimpleDataTypeFor(typeName);
+			//TODO: what if extension is already present?
+			if (baseType != null) {
+				//add extension
+				SimpleDataType superType = getSimpleDataTypeFor(baseType.getQName().getLocalName());
+				Extension e = tdlFactory.eINSTANCE.createExtension();
+				e.setExtending(superType);
+				dataType.setExtension(e);
+			}
+			addMapping(type, dataType, sourceMappingTag, targetMappingTag);
+
+			if (type instanceof StringTypeDefinition) {
+				List<PatternConstraint> patternConstraints = ((StringTypeDefinition) type).getPatternConstraints();
+				Constraint constraint = constrainWith(dataType, "pattern");
+				if (constraint != null) {
+					for (PatternConstraint c : patternConstraints) {
+						LiteralValueUse ut = tdlFactory.eINSTANCE.createLiteralValueUse();
+						//TODO: or getJavaPatternString?
+						ut.setValue(c.getRegularExpressionString());
+						constraint.getQuantifier().add(ut);
+					}
+				} else {
+					//TODO: what if constraint is already there?
+				}
+			}
+			
+			return dataType;
+		}
+	}
+
+	private void translateMember(String baseName, StructuredDataType dataType, DataSchemaNode child) {
+		DataType memberType = translate(child, baseName);
+		String propertyName = child.getQName().getLocalName();
+		Member m = getContentWithName((String) propertyName, dataType, tdlPackage.Literals.MEMBER);
+		m.setDataType(memberType);
+		if (m.container() == null) {
+			dataType.getMember().add(m);
+		}
+		
+		if (child instanceof TypedDataSchemaNode) {
+			TypeDefinition<?> type = ((TypedDataSchemaNode) child).getType();
+			if (type instanceof LeafrefTypeDefinition) {
+				String value = ((LeafrefTypeDefinition)type).getPathStatement().getOriginalString();
+				annotateWith(m, LEAF_REF_PATH, value);
+			}
+		}
+	}
+
+	private StructuredDataType translateStructuredDataType(DataNodeContainer c, String baseName, String name) {
+		StructuredDataType dataType = getStructuredDataTypeFor(name);
+		addSuperType(dataType, this.messageBody);
+		for (DataSchemaNode child : c.getChildNodes()) {
+			translateMember(baseName, dataType, child);
+		}
+		addMapping((SchemaNode) c, dataType, sourceMappingTag, targetMappingTag);
+		return dataType;
+	}
+	
+	//----------------------------------------------------------
+	//Mappings
+	
+	private void addMapping(SchemaNode c, DataType dataType, String sourceMappingTag, String targetMappingTag) {
+//		String uri = c.toString().replaceAll(".+?argument=", "").replaceAll("}", "")
+		
+		QNameModule module = c.getQName().getModule();
+		String resourceName = getCleanName(module.getNamespace().toString() + "_resource");
+		DataResourceMapping resourceMapping = findElementOfType(resourceName, tdlPackage.Literals.DATA_RESOURCE_MAPPING);
+		if (resourceMapping == null) {
+			resourceMapping = tdlFactory.eINSTANCE.createDataResourceMapping();
+			resourceMapping.setName(resourceName);
+			String uri = module.getNamespace().toString();
+			Optional<Revision> rev = module.getRevision();
+			if (rev.isPresent())
+				uri += "?" + rev.get().toString();
+			resourceMapping.setResourceURI(uri);
+			getGeneratedPackage().getPackagedElement().add(resourceMapping);
+
+			if (this.mappingNameAnnotation != null) {
+				Annotation annot = tdlFactory.eINSTANCE.createAnnotation();
+				annot.setKey(this.mappingNameAnnotation);
+				annot.setValue("Yang");
+				resourceMapping.getAnnotation().add(annot);
+			}
+		}
+		
+		String uri = // c.toString().replaceAll(".+?argument=", "").replaceAll("}", "");
+				c.getQName().getLocalName();
+		
+		//TODO: move mappings to a separate package
+		
+		// TODO: make configurable?
+		boolean addSourceMapping = false;
+		DataElementMapping sourceMapping = null;
+		if (addSourceMapping)
+			sourceMapping = addDataElementMapping(uri, dataType, sourceMappingTag, drm);
+
+		DataElementMapping targetMapping = addDataElementMapping(uri, dataType, targetMappingTag, resourceMapping);
+
+		if (dataType instanceof StructuredDataType) {
+			//TODO: reflect source names before transformation
+			for (Member m : ((StructuredDataType) dataType).getMember()) {
+				String mUri = m.getName();
+				if (c instanceof DataNodeContainer) {
+					Collection<? extends DataSchemaNode> children = ((DataNodeContainer)c).getChildNodes();
+					Optional<? extends DataSchemaNode> childNode = children.stream()
+							.filter(cn -> getCleanName(cn.getQName().getLocalName()).equals(m.getName())).findAny();
+					if (childNode.isPresent())
+						mUri = childNode.get().getQName().getLocalName();
+				}
+				if (addSourceMapping)
+					addParameterMapping(sourceMapping, m, mUri);
+				addParameterMapping(targetMapping, m, mUri);
+			}
+		}
+	}
+
+	//----------------------------------------------------------
+	//TODO: clean up below
+	
+	public static void main(String[] args) throws Exception {
+        CrossSourceStatementReactor reactor = createReactor();
+
+//        processStatic(reactor);
+
+		BuildAction build = reactor.newBuild();
+		Files.list(Path.of("samples", "ietf")).forEach(p -> 
+			build.addSource(moduleFromPath(p.toString()))
+		);
+//		Files.list(Path.of("samples", "nfv")).forEach(p -> 
+//			build.addSource(moduleFromPath(p.toString()))
+//		);
+		Files.list(Path.of("samples", "simple")).forEach(p -> 
+			build.addSource(moduleFromPath(p.toString()))
+		);
+		
+//		build.addSource(moduleFromPath("samples/nfv/etsi-nfv-descriptors.yang"));
+		
+		SchemaContext schemaContext = build.buildEffective();
+//		
+//		Set<Module> modules = schemaContext.getModules();
+//		Set<DataSchemaNode> dataSchemaNodes = schemaContext.getDataDefinitions();
+//		
+//		dataSchemaNodes.forEach(System.out::println);
+//		schemaContext.getChildNodes().forEach(System.out::println);
+////		schemaContext.getTypeDefinitions().forEach(System.out::println);
+		expand("  ", schemaContext);
+	}
+
+	private static CrossSourceStatementReactor createReactor() {
+		CrossSourceStatementReactor reactor = RFC7950Reactors.vanillaReactorBuilder()
+        .addStatementSupport(ModelProcessingPhase.FULL_DECLARATION,
+            new MountStatementSupport(YangParserConfiguration.DEFAULT))
+        .build();
+		return reactor;
+	}
+
+	private static void processStatic(CrossSourceStatementReactor reactor) throws ReactorException {
+		reactor.newBuild().addSources(
+//                moduleFromResources("/ietf/ietf-yang-types@2013-07-15.yang"),
+//                moduleFromResources("/ietf/ietf-restconf@2017-01-26.yang"),
+//                moduleFromResources("/ietf/ietf-inet-types@2013-07-15.yang"),
+//                moduleFromResources("/nfv/etsi-nfv-common.yang"),
+//                moduleFromResources("/nfv/etsi-nfv-nsd.yang"),
+//                moduleFromResources("/nfv/etsi-nfv-pnfd.yang"),
+//                moduleFromResources("/nfv/etsi-nfv-vnfd.yang"),
+//                moduleFromResources("/nfv/etsi-nfv-descriptors.yang"),
+//                moduleFromResources("/nfv/etsi-nfv-ns.yang"),
+//                moduleFromResources("/nfv/etsi-nfv-pnf.yang"), 
+//                moduleFromResources("/nfv/etsi-nfv-vnf.yang")
+                moduleFromPath("samples/ietf/ietf-yang-types@2013-07-15.yang"),
+                moduleFromPath("samples/ietf/ietf-restconf@2017-01-26.yang"),
+                moduleFromPath("samples/ietf/ietf-inet-types@2013-07-15.yang"),
+                moduleFromPath("samples/nfv/etsi-nfv-common.yang"),
+                moduleFromPath("samples/nfv/etsi-nfv-nsd.yang"),
+                moduleFromPath("samples/nfv/etsi-nfv-pnfd.yang"),
+                moduleFromPath("samples/nfv/etsi-nfv-vnfd.yang"),
+                moduleFromPath("samples/nfv/etsi-nfv-descriptors.yang"),
+                moduleFromPath("samples/nfv/etsi-nfv-ns.yang"),
+                moduleFromPath("samples/nfv/etsi-nfv-pnf.yang"), 
+                moduleFromPath("samples/nfv/etsi-nfv-vnf.yang")
+            )
+                // moduleFromResources("/simple/sports.yang"))
+            .buildEffective()
+            .getChildNodes().forEach(e->System.out.println(e.getQName()));
+            ;
+	}
+	
+    private static YangStatementStreamSource moduleFromPath(String path) {
+    	return moduleFromPath(Path.of(path));
+    }
+
+    private static YangStatementStreamSource moduleFromPath(Path path) {
+        try {
+            // return new YangStatementSourceImpl("/example.yang", false);
+            return YangStatementStreamSource.create(new FileYangTextSource(path));
+            // return YangStatementStreamSource.create(YangTextSource.forResource(path));
+        } catch (final YangSyntaxErrorException | IOException e) {
+            throw new IllegalStateException("Failed to find resource " + path.toString(), e);
+        }
+    }
+	
+	public static void expand(String prefix, ContainerLike node) {
+		for (DataSchemaNode c : node.getChildNodes()) {
+			expand(prefix, c);
+		}
+	}
+
+	public static void expand(String prefix, ListSchemaNode node) {
+		for (DataSchemaNode c : node.getChildNodes()) {
+			expand(prefix, c);
+		}
+	}
+
+	private static void expand(String prefix, DataSchemaNode c) {
+		//TODO: this is not accurately reflecting the structures..
+		if (c instanceof LeafListSchemaNode) {
+			System.out.println(prefix+c.getQName().getLocalName() + " : " + ((LeafListSchemaNode) c).getType().getQName());
+		} else if (c instanceof ContainerSchemaNode) {
+			System.out.println("!c"+prefix+c.getQName().getLocalName() + " : " );
+			//create structured data type
+			expand(prefix+"  ", (ContainerSchemaNode) c);
+		} else if (c instanceof ListSchemaNode) {
+			System.out.println("!l"+prefix+c.getQName().getLocalName() + " : " );
+			//create collection of structured data type
+			expand(prefix+"  ", (ListSchemaNode) c);
+		} else if (c instanceof RegularLeafEffectiveStatement) {
+			System.out.println("!r"+prefix+c.getQName().getLocalName() + " : " + ((RegularLeafEffectiveStatement) c).getDeclared().getType().argument());
+			//create member of reference data type?
+		} else if (c instanceof EmptyLeafEffectiveStatement) {
+			System.out.println("!e"+prefix+c.getQName().getLocalName() + " : " + ((EmptyLeafEffectiveStatement) c).getType().getQName());
+			//create member of data type?
+		} else if (c instanceof LeafrefTypeDefinition) {
+			//not working?
+			System.out.println(((LeafrefTypeDefinition) c).getPathStatement().getOriginalString());
+		} else if (c instanceof LeafSchemaNode) {
+			TypeDefinition<? extends TypeDefinition<?>> type = ((LeafSchemaNode)c).getType();
+			String t = type.getQName().getLocalName();
+			if (!type.getQName().getLocalName().equals("string")) {
+				t = type.getQName().toString();
+				System.out.println("!x"+((Default<QName,LeafStatement>) c).getDeclared().getType());
+			} 
+			System.out.println("!"+prefix+c.getQName().getLocalName() + " : " + t);
+		} else {
+			System.out.println(prefix+c.getQName().getLocalName() + " : " + c.getClass().getSimpleName());
+		}
+	}
+
+}
diff --git a/updatesite/org.etsi.mts.tdl.updatesite/.project b/updatesite/org.etsi.mts.tdl.updatesite/.project
index 202d794cab5b07d969de8152ea3409495b89f4b6..0ad827db88e871e95ba29f965475efd4163a6765 100644
--- a/updatesite/org.etsi.mts.tdl.updatesite/.project
+++ b/updatesite/org.etsi.mts.tdl.updatesite/.project
@@ -14,4 +14,15 @@
 	<natures>
 		<nature>org.eclipse.m2e.core.maven2Nature</nature>
 	</natures>
+	<filteredResources>
+		<filter>
+			<id>1705077780127</id>
+			<name></name>
+			<type>30</type>
+			<matcher>
+				<id>org.eclipse.core.resources.regexFilterMatcher</id>
+				<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
 </projectDescription>