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 4e23324e4bf1fabde9f9dda3abb485d40904c28c..0efaf13dc0658ccc82a20b4d3524772af2fa54e4 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,5 +1,6 @@
 package org.etsi.mts.tdl.transform;
 
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Optional;
@@ -22,6 +23,7 @@ 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;
@@ -103,6 +105,31 @@ public abstract class AbstractTranslator {
 		return collectionType;
 	}
 
+	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";
@@ -253,11 +280,11 @@ public abstract class AbstractTranslator {
 		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;
 	}
 	
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 707d6d6bf0203b82d508e59040e220fb633b6040..d4cccf9e0c07d0cc3580e8cf8e44391bb165b4fb 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
@@ -1,7 +1,6 @@
 package org.etsi.mts.tdl.openapi2tdl.next;
 
 import java.io.File;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.List;
@@ -22,7 +21,6 @@ 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;
@@ -403,12 +401,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()) {
@@ -478,31 +475,6 @@ 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) {
 		StructuredDataType dataType = getStructuredDataTypeFor(name);
 		if (schema.getProperties() == null || !dataType.getMember().isEmpty()) {
diff --git a/plugins/org.etsi.mts.tdl.yang2tdl/META-INF/MANIFEST.MF b/plugins/org.etsi.mts.tdl.yang2tdl/META-INF/MANIFEST.MF
index 743af89cbfe36e86c6de726e3809d12e5c842779..cbab1cef08c4b34b2345fe0cec3cda13163e5411 100644
--- a/plugins/org.etsi.mts.tdl.yang2tdl/META-INF/MANIFEST.MF
+++ b/plugins/org.etsi.mts.tdl.yang2tdl/META-INF/MANIFEST.MF
@@ -13,6 +13,7 @@ Require-Bundle: org.etsi.mts.tdl.common,
  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.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/src/org/etsi/mts/tdl/yang2tdl/PropertyPage.java b/plugins/org.etsi.mts.tdl.yang2tdl/src/org/etsi/mts/tdl/yang2tdl/PropertyPage.java
index f43317d251425056246d5758523f749087bd7662..f1b14baaaacb119b57593de932ac6fb942b8ab1e 100644
--- 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
@@ -5,25 +5,27 @@ 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.jface.preference.BooleanFieldEditor;
+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.StringFieldEditor;
+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 PROCEDURE_BASED = "ProcedureBased",
-			GENERATE_JAVA_MAPPING = "GenerateJavaMapping",
-			JAVA_GENERATOR = "JavaMappingGenerator",
-			JAVA_API_PACKAGE = "JavaApiPackage";
+	public static final String YANG_SPEC_LOCATION = "YangFilesLocation";
 
 	public static final String PREFERENCE_SCOPE = "org.etsi.mts.tdl.yang2tdl";
 
@@ -33,7 +35,7 @@ public class PropertyPage extends FieldEditorPreferencePage implements IWorkbenc
 
 	protected Map<FieldEditor, String> fields = new Hashtable<FieldEditor, String>();
 
-	private StringFieldEditor javaApiPackage;
+//	private StringFieldEditor javaApiPackage;
 
 	public PropertyPage() {
 		super(GRID);
@@ -53,7 +55,7 @@ public class PropertyPage extends FieldEditorPreferencePage implements IWorkbenc
 	protected IPreferenceStore doGetPreferenceStore() {
 		ProjectScope ps = new ProjectScope((IProject) this.element);
 		ScopedPreferenceStore scopedStore = new ScopedPreferenceStore(ps, PREFERENCE_SCOPE);
-		scopedStore.setDefault(JAVA_GENERATOR, "java");
+//		scopedStore.setDefault(JAVA_GENERATOR, "java");
 		return scopedStore;
 	}
 
@@ -68,11 +70,11 @@ public class PropertyPage extends FieldEditorPreferencePage implements IWorkbenc
 	}
 
 	protected void initialize(String name, String value, FieldEditor e) {
-		if (name.equals(GENERATE_JAVA_MAPPING)) {
-			javaApiPackage.setEnabled(
-					Boolean.valueOf(value),
-					getFieldEditorParent());
-		}
+//		if (name.equals(GENERATE_JAVA_MAPPING)) {
+//			javaApiPackage.setEnabled(
+//					Boolean.valueOf(value),
+//					getFieldEditorParent());
+//		}
 	}
 
 	@Override
@@ -109,21 +111,13 @@ public class PropertyPage extends FieldEditorPreferencePage implements IWorkbenc
 	protected void createFieldEditors() {
 
 		Composite parent = getFieldEditorParent();
-		BooleanFieldEditor procBased = new BooleanFieldEditor(PROCEDURE_BASED, "Procedure-based API", parent);
-		addField(procBased);
-		
-		parent = getFieldEditorParent();
-		BooleanFieldEditor genJavaMappings = new BooleanFieldEditor(GENERATE_JAVA_MAPPING, "Generate type mappings for Java", parent);
-		addField(genJavaMappings);
-
-		parent = getFieldEditorParent();
-		StringFieldEditor javaGenerator = new StringFieldEditor(JAVA_GENERATOR, "Code generator for mappings", parent);
-		javaGenerator.setEnabled(false, parent);
-		addField(javaGenerator);
-
-		parent = getFieldEditorParent();
-		javaApiPackage = new StringFieldEditor(JAVA_API_PACKAGE, "Java API package", parent);
-		addField(javaApiPackage);
+		FieldEditor yangSpecLocation = new ContainerFieldEditor(YANG_SPEC_LOCATION, "Yang files location", parent) {
+			@Override
+			public boolean isValid() {
+				return PropertyPage.this.isValid(this) && doCheckState();
+			}
+		};
+		addField(yangSpecLocation);
 		
 		// TODO
 	}
@@ -142,4 +136,43 @@ public class PropertyPage extends FieldEditorPreferencePage implements IWorkbenc
 		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/Yang2TDLTranslator.java b/plugins/org.etsi.mts.tdl.yang2tdl/src/org/etsi/mts/tdl/yang2tdl/Yang2TDLTranslator.java
index dfecea5f35409db121ae94da124c73c9b09e031a..f41e75eef433dc700affcf188320d112e94618d3 100644
--- 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
@@ -7,14 +7,18 @@ 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;
@@ -32,6 +36,8 @@ 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;
@@ -41,6 +47,7 @@ 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;
@@ -84,6 +91,7 @@ public class Yang2TDLTranslator extends AbstractTranslator {
 	private StructuredDataType messageBody = null;
 
 	private String limit = null;
+	private AnnotationType mappingNameAnnotation;
 
 	public void setLimit(String limit) {
 		this.limit = limit;
@@ -138,36 +146,46 @@ public class Yang2TDLTranslator extends AbstractTranslator {
 		}
 		
 		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;
-						}
+//		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);
-				}
+			}
+			if (httpMessageBasedPackage != null) {
+				ElementImport importHttp = tdlFactory.eINSTANCE.createElementImport();
+				importHttp.setImportedPackage(httpMessageBasedPackage);
+				getGeneratedPackage().getImport().add(importHttp);
 			}
 		}
 
@@ -185,12 +203,15 @@ public class Yang2TDLTranslator extends AbstractTranslator {
 			parent = parent.getParent();
 		}
 		if (parent != target) {
-			Files.walk(parent).filter(
-					f -> f.toFile().isFile() && f.toString().endsWith(".yang") && !f.toString().equals(targetFilename))
-					.forEach(f -> {
+			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") &&
@@ -210,12 +231,15 @@ public class Yang2TDLTranslator extends AbstractTranslator {
 //		);
 		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 -> {
+			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"))
@@ -231,6 +255,13 @@ public class Yang2TDLTranslator extends AbstractTranslator {
 		//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);
@@ -269,8 +300,7 @@ public class Yang2TDLTranslator extends AbstractTranslator {
 		}
 		System.out.println(name);
 		if (c instanceof ContainerSchemaNode) {
-			// DONE: remove wrapper container structured data type of only a collection is
-			// contained
+			//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
@@ -289,12 +319,13 @@ public class Yang2TDLTranslator extends AbstractTranslator {
 		} else if (c instanceof ListSchemaNode) {
 			StructuredDataType itemType = translateStructuredDataType((ListSchemaNode) c, baseName, name);
 			CollectionDataType collectionType = getCollectionDataTypeFor(itemType);
-			addMapping(c.toString().replaceAll(".+?argument=", "").replaceAll("}", ""), collectionType,
-					sourceMappingTag, targetMappingTag);
+			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(", "));
+			String key = keyDefinition.stream()
+					.map(QName::getLocalName)
+					.collect(Collectors.joining(", "));
 			// TODO: make optional
 //			annotateWith(collectionType, LIST_KEY, key);
 			
@@ -337,8 +368,7 @@ public class Yang2TDLTranslator extends AbstractTranslator {
 			//TODO: what is the difference? is it used
 			String typeName = ((RegularLeafEffectiveStatement) c).getType().getQName().getLocalName();
 			SimpleDataType dataType = getSimpleDataTypeFor(typeName);
-			addMapping(c.toString().replaceAll(".+?argument=", "").replaceAll("}", ""), dataType, sourceMappingTag,
-					targetMappingTag);
+			addMapping(c, dataType, sourceMappingTag, targetMappingTag);
 			return dataType;
 		} else if (c instanceof RegularChoiceEffectiveStatement) {
 			//TODO: difference?
@@ -346,8 +376,7 @@ public class Yang2TDLTranslator extends AbstractTranslator {
 			for (CaseSchemaNode child : ((RegularChoiceEffectiveStatement) c).getCases()) {
 				translateMember(baseName, dataType, child);
 			}
-			addMapping(c.toString().replaceAll(".+?argument=", "").replaceAll("}", ""), dataType, sourceMappingTag,
-					targetMappingTag);
+			addMapping(c, dataType, sourceMappingTag, targetMappingTag);
 			return dataType;
 		} else if (c instanceof EmptyChoiceEffectiveStatement) {
 			//TODO: add annotation choice
@@ -357,8 +386,7 @@ public class Yang2TDLTranslator extends AbstractTranslator {
 			for (CaseSchemaNode child : ((EmptyChoiceEffectiveStatement) c).getCases()) {
 				translateMember(baseName, dataType, child);
 			}
-			addMapping(c.toString().replaceAll(".+?argument=", "").replaceAll("}", ""), dataType, sourceMappingTag,
-					targetMappingTag);
+			addMapping(c, dataType, sourceMappingTag, targetMappingTag);
 			return dataType;
 		} else if (c instanceof UndeclaredCaseEffectiveStatement) {
 			//choice -> container? (no case)
@@ -377,8 +405,7 @@ public class Yang2TDLTranslator extends AbstractTranslator {
 	private CollectionDataType translateSimpleDataCollection(String name, TypeDefinition<?> type) {
 		SimpleDataType itemType = translateSimpleDataType(name, type);
 		CollectionDataType collectionType = getCollectionDataTypeFor(itemType);
-		addMapping(type.toString().replaceAll(".+?argument=", "").replaceAll("}", ""), collectionType, sourceMappingTag,
-				targetMappingTag);
+		addMapping(type, collectionType, sourceMappingTag, targetMappingTag);
 		return collectionType;
 	}
 
@@ -403,8 +430,7 @@ public class Yang2TDLTranslator extends AbstractTranslator {
 				eInstance.setDataType(dataType);
 				dataType.getValue().add(eInstance);
 			}
-			addMapping(type.toString().replaceAll(".+?argument=", "").replaceAll("}", ""), dataType, sourceMappingTag,
-					targetMappingTag);
+			addMapping(baseType, dataType, sourceMappingTag, targetMappingTag);
 
 			//TODO: add default?
 			return dataType;
@@ -417,8 +443,7 @@ public class Yang2TDLTranslator extends AbstractTranslator {
 				eInstance.setDataType(dataType);
 				dataType.getValue().add(eInstance);
 			}
-			addMapping(type.toString().replaceAll(".+?argument=", "").replaceAll("}", ""), dataType, sourceMappingTag,
-					targetMappingTag);
+			addMapping(type, dataType, sourceMappingTag, targetMappingTag);
 
 			return dataType;
 		} else if (type instanceof UnionTypeDefinition) {
@@ -435,8 +460,7 @@ public class Yang2TDLTranslator extends AbstractTranslator {
 					constraint.getQuantifier().add(ut);
 				}
 			}
-			addMapping(type.toString().replaceAll(".+?argument=", "").replaceAll("}", ""), dataType, sourceMappingTag,
-					targetMappingTag);
+			addMapping(type, dataType, sourceMappingTag, targetMappingTag);
 
 			return dataType;
 		} else {
@@ -450,8 +474,7 @@ public class Yang2TDLTranslator extends AbstractTranslator {
 				e.setExtending(superType);
 				dataType.setExtension(e);
 			}
-			addMapping(type.toString().replaceAll(".+?argument=", "").replaceAll("}", ""), dataType, sourceMappingTag,
-					targetMappingTag);
+			addMapping(type, dataType, sourceMappingTag, targetMappingTag);
 
 			if (type instanceof StringTypeDefinition) {
 				List<PatternConstraint> patternConstraints = ((StringTypeDefinition) type).getPatternConstraints();
@@ -492,30 +515,68 @@ public class Yang2TDLTranslator extends AbstractTranslator {
 
 	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(c.toString().replaceAll(".+?argument=", "").replaceAll("}", ""), dataType, sourceMappingTag,
-				targetMappingTag);
+		addMapping((SchemaNode) c, dataType, sourceMappingTag, targetMappingTag);
 		return dataType;
 	}
 	
 	//----------------------------------------------------------
 	//Mappings
 	
-	private void addMapping(String uri, DataType dataType, String sourceMappingTag, String targetMappingTag) {
+	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
-		DataElementMapping sourceMapping = addDataElementMapping(uri, dataType, sourceMappingTag);
-
+		
 		// TODO: make configurable?
-		DataElementMapping targetMapping = addDataElementMapping("target://" + uri, dataType, targetMappingTag);
-		targetMapping.setDataResourceMapping(drmTarget);
+		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()) {
-				addParameterMapping(sourceMapping, m, m.getName());
-				addParameterMapping(targetMapping, m, m.getName());
+				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);
 			}
 		}
 	}
@@ -529,11 +590,15 @@ public class Yang2TDLTranslator extends AbstractTranslator {
 //        processStatic(reactor);
 
 		BuildAction build = reactor.newBuild();
-		Files.list(Path.of("samples", "ietf")).forEach(p -> build.addSource(moduleFromPath(p.toString())));
+		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())));
+		Files.list(Path.of("samples", "simple")).forEach(p -> 
+			build.addSource(moduleFromPath(p.toString()))
+		);
 		
 //		build.addSource(moduleFromPath("samples/nfv/etsi-nfv-descriptors.yang"));
 		
@@ -572,12 +637,18 @@ public class Yang2TDLTranslator extends AbstractTranslator {
                 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"))
+                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()));
+            .buildEffective()
+            .getChildNodes().forEach(e->System.out.println(e.getQName()));
             ;
 	}
 	
@@ -610,8 +681,7 @@ public class Yang2TDLTranslator extends AbstractTranslator {
 	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());
+			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
@@ -621,12 +691,10 @@ public class Yang2TDLTranslator extends AbstractTranslator {
 			//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());
+			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());
+			System.out.println("!e"+prefix+c.getQName().getLocalName() + " : " + ((EmptyLeafEffectiveStatement) c).getType().getQName());
 			//create member of data type?
 		} else if (c instanceof LeafrefTypeDefinition) {
 			//not working?