diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/LabelAccessTranslationUnit.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/LabelAccessTranslationUnit.java
deleted file mode 100644
index b437210..0000000
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/LabelAccessTranslationUnit.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/**
- * Copyright (c) 2020 Robert Bosch GmbH.
- * 
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- * 
- * SPDX-License-Identifier: EPL-2.0
- * 
- * Contributors:
- *     Robert Bosch GmbH - initial API and implementation
- */
-package org.eclipse.app4mc.slg.commons.m2t.generators;
-
-import java.util.Arrays;
-
-import org.eclipse.app4mc.amalthea.model.LabelAccess;
-import org.eclipse.app4mc.amalthea.model.LabelAccessEnum;
-import org.eclipse.app4mc.amalthea.model.LabelAccessStatistic;
-import org.eclipse.app4mc.amalthea.model.MinAvgMaxStatistic;
-import org.eclipse.app4mc.amalthea.model.NumericStatistic;
-import org.eclipse.app4mc.amalthea.model.SingleValueStatistic;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-
-public class LabelAccessTranslationUnit extends TranslationUnit {
-	public String getBasePath() {
-		return this.tuLabel.getBasePath();
-	}
-
-	public String getModuleName() {
-		return this.tuLabel.getModuleName();
-	}
-
-	public String getIncFile() {
-		return this.tuLabel.getIncFile();
-	}
-
-	@Override
-	public String getCall() {
-		String _xblockexpression = null;
-		{
-			String statString = "1";
-			LabelAccessStatistic _statistic = null;
-			if (this.labelAccess != null) {
-				_statistic = this.labelAccess.getStatistic();
-			}
-			NumericStatistic _value = null;
-			if (_statistic != null) {
-				_value = _statistic.getValue();
-			}
-			final NumericStatistic stat = _value;
-			if ((stat != null)) {
-				LabelAccessStatistic _statistic_1 = null;
-				if (this.labelAccess != null) {
-					_statistic_1 = this.labelAccess.getStatistic();
-				}
-				NumericStatistic _value_1 = null;
-				if (_statistic_1 != null) {
-					_value_1 = _statistic_1.getValue();
-				}
-				statString = LabelAccessTranslationUnit.getNumericStatistic(_value_1);
-			}
-			String _switchResult = null;
-			LabelAccessEnum _access = this.labelAccess.getAccess();
-			if (_access != null) {
-				switch (_access) {
-				case READ:
-					_switchResult = this.tuLabel.readCall(statString);
-					break;
-				case WRITE:
-					_switchResult = this.tuLabel.writeCall(statString);
-					break;
-				default:
-					_switchResult = (("/*underspecified access to label" + this.labelAccess.getData().getName()) + "*/");
-					break;
-				}
-			} else {
-				_switchResult = (("/*underspecified access to label" + this.labelAccess.getData().getName()) + "*/");
-			}
-			_xblockexpression = _switchResult;
-		}
-		return _xblockexpression;
-	}
-
-	public String getModulePath() {
-		return getBasePath() + "/" + getModuleName();
-	}
-
-	private OutputBuffer outputBuffer;
-
-	@Override
-	public String getSrcFile() {
-		return getModuleName() + ".cpp";
-	}
-
-	public String getIncPath() {
-		return getModulePath() + "/_inc/" + getIncFile();
-	}
-
-	public String getSrcPath() {
-		return getModulePath() + "/_src/" + getSrcFile();
-	}
-
-	public boolean isIncFileEmpty() {
-		return !outputBuffer.bufferExists("INC", getModulePath() + "/_inc/" + getModuleName());
-	}
-
-	public boolean isSrcFileEmpty() {
-		return !outputBuffer.bufferExists("SRC", getModulePath() + "/_src/" + getModuleName());
-	}
-
-	public boolean incAppend(final String str) {
-		return outputBuffer.appendTo("INC", getModulePath() + "/_inc/" + getModuleName(), str);
-	}
-
-	public boolean srcAppend(final String str) {
-		return outputBuffer.appendTo("SRC", getModulePath() + "/_src/" + getModuleName(), str);
-	}
-
-	private final LabelTranslationUnit tuLabel;
-
-	private final LabelAccess labelAccess;
-
-	public LabelAccessTranslationUnit(final OutputBuffer outputBuffer, final LabelTranslationUnit tuLabel,
-			final LabelAccess labelAccess) {
-		super();
-		this.tuLabel = tuLabel;
-		this.labelAccess = labelAccess;
-		this.outputBuffer = outputBuffer;
-	}
-
-	protected static String _getNumericStatistic(final MinAvgMaxStatistic stat) {
-		String _string = Integer.valueOf(Double.valueOf(Math.ceil(stat.getAvg())).intValue()).toString();
-		return (_string + "/*MinAvgMaxStatistic not supported yet*/");
-	}
-
-	protected static String _getNumericStatistic(final SingleValueStatistic stat) {
-		return Integer.valueOf(Double.valueOf(Math.ceil(stat.getValue())).intValue()).toString();
-	}
-
-	public static String getNumericStatistic(final NumericStatistic stat) {
-		if (stat instanceof MinAvgMaxStatistic) {
-			return _getNumericStatistic((MinAvgMaxStatistic) stat);
-		} else if (stat instanceof SingleValueStatistic) {
-			return _getNumericStatistic((SingleValueStatistic) stat);
-		} else {
-			throw new IllegalArgumentException("Unhandled parameter types: " + Arrays.<Object>asList(stat).toString());
-		}
-	}
-}
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/LabelGenerator.xtend b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/LabelGenerator.xtend
index b62ecf3..0198f5a 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/LabelGenerator.xtend
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/LabelGenerator.xtend
@@ -26,26 +26,34 @@
 		throw new IllegalStateException("Utility class");
 	}
 
-	static def String toCMake(List<String> srcFiles)
+	// ---------- names of generated 'C' functions ----------
+
+	static def String initCall(Label label) 				'''initialize_«label.name»()'''	
+	static def String readCall(Label label, String param) 	'''read_«label.name»(«param»)'''	
+	static def String writeCall(Label label, String param)	'''write_«label.name»(«param»)'''	
+
+	// ---------- generate file contents ----------
+
+	static def String toCMake(String libName, List<String> srcFiles)
 	'''
-			# «LabelTranslationUnit.libName» ################################################################
+			# «libName» ################################################################
 			####
-			add_library(«LabelTranslationUnit.libName»  STATIC
+			add_library(«libName»  STATIC
 		«FOR srcFile : srcFiles»
 			${CMAKE_CURRENT_LIST_DIR}/_src/«srcFile»
 			«ENDFOR»
 			)
 		
-				target_include_directories(«LabelTranslationUnit.getLibName()»
+				target_include_directories(«libName»
 				    PUBLIC ${CMAKE_CURRENT_LIST_DIR}/_inc
 				)	
 	'''
 
 	static def String toH(Label label)
 	'''
-		void «initCall(label.name)»;
-		void «readCall(label.name, "int labelAccessStatistics")»;
-		void «writeCall(label.name, "int labelAccessStatistics")»;
+		void «initCall(label)»;
+		void «readCall(label, "int labelAccessStatistics")»;
+		void «writeCall(label, "int labelAccessStatistics")»;
 		
 	'''
 
@@ -54,7 +62,7 @@
 		int «label.name»[«AmaltheaModelUtils.getLabelArraySize(label)»];	
 		
 		static bool isIinitialized_«label.name» = false;
-		void «initCall(label.name)» {
+		void «initCall(label)» {
 			if (!isIinitialized_«label.name»){
 				for (int i=0; i < «AmaltheaModelUtils.getLabelArraySize(label)»; i++){
 					«label.name»[i] = i+1;
@@ -64,7 +72,7 @@
 		}
 		
 		
-		void «readCall(label.name, "int labelAccessStatistics")» {
+		void «readCall(label, "int labelAccessStatistics")» {
 			int numberOfBytes = «label?.size?.numberBytes»;
 			
 			for (int repeat = 0 ; repeat < labelAccessStatistics; repeat++){
@@ -97,7 +105,7 @@
 			}
 		}
 		
-		void «writeCall(label.name, "int labelAccessStatistics")» {
+		void «writeCall(label, "int labelAccessStatistics")» {
 			int numberOfBytes = «label?.size?.numberBytes»;
 			for (int repeat = 0 ; repeat < labelAccessStatistics; repeat++){
 				if(numberOfBytes < 4){
@@ -128,10 +136,4 @@
 		
 	'''
 
-	static def String initCall(String name) '''initialize_«name»()'''
-
-	static def String readCall(String name, String param) '''read_«name»(«param»)'''
-
-	static def String writeCall(String name, String param) '''write_«name»(«param»)'''
-
 }
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/LabelTranslationUnit.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/LabelTranslationUnit.java
deleted file mode 100644
index ed2b664..0000000
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/LabelTranslationUnit.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/**
- * Copyright (c) 2020 Robert Bosch GmbH.
- * 
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- * 
- * SPDX-License-Identifier: EPL-2.0
- * 
- * Contributors:
- *     Robert Bosch GmbH - initial API and implementation
- */
-package org.eclipse.app4mc.slg.commons.m2t.generators;
-
-import org.eclipse.app4mc.amalthea.model.Label;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-
-public class LabelTranslationUnit extends TranslationUnit {
-	public static String getModulePathStatic() {
-		return "synthetic_gen" + "/" + getModuleNameStatic();
-	}
-
-	public static String getMakeFilePathStatic() {
-		return getModulePathStatic() + "/" + "CMakeLists.txt";
-	}
-
-	public static String getModuleNameStatic() {
-		return "labels";
-	}
-
-	public static String getLibName() {
-		return "LABELS_LIB";
-	}
-
-	public String getModuleName() {
-		return LabelTranslationUnit.getModuleNameStatic();
-	}
-
-	protected String getName() {
-		return this.label.getName();
-	}
-
-	public String getInitCall() { return "initialize_" + getName() + "()"; }
-
-	public String readCall(final String param) { return "read_" + getName() + "(" + param + ")"; }
-
-	public String writeCall(final String param) { return "write_" + getName() + "(" + param + ")"; }
-
-	public String getIncFile() { return getModuleName() + ".h"; }
-
-	private final Label label;
-	private OutputBuffer outputBuffer;
-
-	public LabelTranslationUnit(final OutputBuffer outputBuffer, final Label label) {
-		super();
-		this.label = label;
-		this.outputBuffer = outputBuffer;
-		this.genFiles();
-	}
-
-	public void genFiles() {
-		if (isSrcFileEmpty()) {
-			srcAppend("#include \"" + getIncFile() + "\"\n\n");
-		}
-		if (isIncFileEmpty()) {
-			incAppend("#include <stdbool.h>\n\n");
-		}
-
-		incAppend(LabelGenerator.toH(label));
-		srcAppend(LabelGenerator.toCpp(label));
-	}
-
-	protected long getSize() {
-		return this.label.getSize().getNumberBytes();
-	}
-
-	public String getBasePath() {
-		return "synthetic_gen";
-	}
-
-	public String getModulePath() { return this.getBasePath() + "/" + this.getModuleName(); }
-
-	@Override
-	public String getSrcFile() { return this.getModuleName() + ".cpp"; }
-
-	public String getIncPath() { return this.getModulePath() + "/_inc/" + this.getIncFile(); }
-
-	public String getSrcPath() { return this.getModulePath() + "/_src/" + this.getSrcFile(); }
-
-	public boolean isIncFileEmpty() {
-		return (!this.outputBuffer.bufferExists("INC", ((this.getModulePath() + "/_inc/") + this.getModuleName())));
-	}
-
-	public boolean isSrcFileEmpty() {
-		return (!this.outputBuffer.bufferExists("SRC", ((this.getModulePath() + "/_src/") + this.getModuleName())));
-	}
-
-	public boolean incAppend(final String str) {
-		return this.outputBuffer.appendTo("INC", ((this.getModulePath() + "/_inc/") + this.getModuleName()), str);
-	}
-
-	public boolean srcAppend(final String str) {
-		return this.outputBuffer.appendTo("SRC", ((this.getModulePath() + "/_src/") + this.getModuleName()), str);
-	}
-
-}
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/RunnableGenerator.xtend b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/RunnableGenerator.xtend
index 8099bcf..f29dc3d 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/RunnableGenerator.xtend
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/RunnableGenerator.xtend
@@ -19,30 +19,32 @@
 
 class RunnableGenerator {
 
+	public static val String LIB_NAME = "RUNNABLES_LIB";
+
 	// Suppress default constructor
 	private new() {
 		throw new IllegalStateException("Utility class");
 	}
 
 	static def String toCMake(List<String> srcFiles) '''
-			# «RunnableTranslationUnit.libName» ################################################################
+			# «LIB_NAME» ################################################################
 			####
-			add_library(«RunnableTranslationUnit.libName» STATIC
+			add_library(«LIB_NAME» STATIC
 			«FOR srcFile : srcFiles»
 			${CMAKE_CURRENT_LIST_DIR}/_src/«srcFile»
 		«ENDFOR»
 		)
 		
-				target_include_directories(«RunnableTranslationUnit.libName»
+				target_include_directories(«LIB_NAME»
 				    PUBLIC  ${CMAKE_CURRENT_LIST_DIR}/_inc
 				)	
 				
-				target_include_directories(«RunnableTranslationUnit.libName»
+				target_include_directories(«LIB_NAME»
 				    PUBLIC ${CMAKE_CURRENT_LIST_DIR}/../ticksUtils/_inc
 				    	        ${CMAKE_CURRENT_LIST_DIR}/../labels/_inc
 				)	
 				
-				target_link_libraries(RUNNABLES_LIB 
+				target_link_libraries(«LIB_NAME» 
 				    PRIVATE LABELS_LIB TICKS_UTILS
 				)
 	'''
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/RunnableTranslationUnit.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/RunnableTranslationUnit.java
deleted file mode 100644
index 296d9c8..0000000
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/RunnableTranslationUnit.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/**
- * Copyright (c) 2020 Robert Bosch GmbH.
- * 
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- * 
- * SPDX-License-Identifier: EPL-2.0
- * 
- * Contributors:
- *     Robert Bosch GmbH - initial API and implementation
- */
-package org.eclipse.app4mc.slg.commons.m2t.generators;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.function.Consumer;
-
-import org.eclipse.app4mc.amalthea.model.ActivityGraph;
-import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
-import org.eclipse.app4mc.slg.commons.m2t.transformers.sw.ActivityGraphItemTransformer;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.xtend2.lib.StringConcatenation;
-import org.eclipse.xtext.xbase.lib.StringExtensions;
-
-public class RunnableTranslationUnit extends TranslationUnit {
-	public static String getModulePathStatic() {
-		return "synthetic_gen" + "/" + getModuleNameStatic();
-	}
-
-	public static String getMakeFilePathStatic() {
-		return getModulePathStatic() + "/" + "CMakeLists.txt";
-	}
-
-	public static String getModuleNameStatic() {
-		return "runnables";
-	}
-
-	public static String getLibName() {
-		return "RUNNABLES_LIB";
-	}
-
-	public String getModuleName() {
-		return RunnableTranslationUnit.getModuleNameStatic();
-	}
-
-	@Override
-	public String getCall() {
-		StringConcatenation builder = new StringConcatenation();
-		builder.append("run_");
-		builder.append(this.runnable.getName());
-		builder.append("()");
-		return builder.toString();
-	}
-
-	@Override
-	public String getIncFile() {
-		return getModuleName() + ".h";
-	}
-
-	public ActivityGraphItemTransformer callGraphItemTransformer;
-
-	public org.eclipse.app4mc.amalthea.model.Runnable runnable;
-
-	private OutputBuffer outputBuffer;
-
-	public RunnableTranslationUnit(final OutputBuffer outputBuffer,
-			final ActivityGraphItemTransformer callGraphItemTransformer,
-			final org.eclipse.app4mc.amalthea.model.Runnable runnable) {
-		super();
-		this.callGraphItemTransformer = callGraphItemTransformer;
-		this.runnable = runnable;
-		this.outputBuffer = outputBuffer;
-
-		this.genFiles();
-	}
-
-	public void genFiles() {
-		if (isSrcFileEmpty()) {
-			srcAppend("#include \"" + getIncFile() + "\"\n");
-		}
-		final LinkedHashSet<String> includes = new LinkedHashSet<>();
-		final ArrayList<String> calls = new ArrayList<>();
-		ActivityGraph _activityGraph = null;
-		if (this.runnable != null) {
-			_activityGraph = this.runnable.getActivityGraph();
-		}
-		EList<ActivityGraphItem> _items = null;
-		if (_activityGraph != null) {
-			_items = _activityGraph.getItems();
-		}
-		final Consumer<ActivityGraphItem> _function = new Consumer<ActivityGraphItem>() {
-			@Override
-			public void accept(final ActivityGraphItem item) {
-				final TranslationUnit tmp = RunnableTranslationUnit.this.callGraphItemTransformer.transform(item);
-				if (((!StringExtensions.isNullOrEmpty(tmp.getIncFile()))
-						&& (!RunnableTranslationUnit.this.getIncFile().equals(tmp.getIncFile())))) {
-					includes.add(tmp.getIncFile());
-				}
-				final String call = tmp.getCall();
-				if (!StringExtensions.isNullOrEmpty(call)) {
-					calls.add(call);
-				}
-			}
-		};
-		_items.forEach(_function);
-
-		incAppend("\n//Runnable " + runnable.getName() + "----\n");
-		toH(includes);
-
-		srcAppend("\n//Runnable " + runnable.getName() + "----\n");
-		toCpp(includes, calls);
-	}
-
-	public void toH(final HashSet<String> includes) {
-		final Consumer<String> _function = new Consumer<String>() {
-			@Override
-			public void accept(final String include) {
-				RunnableTranslationUnit.this.incAppend((("#include \"" + include) + "\"\n"));
-			}
-		};
-		includes.forEach(_function);
-		StringConcatenation builder = new StringConcatenation();
-		builder.append("void ");
-		builder.append(this.getCall());
-		builder.append(";");
-		builder.newLineIfNotEmpty();
-		this.incAppend(builder.toString());
-	}
-
-	public void toCpp(final HashSet<String> includes, final List<String> calls) {
-		srcAppend("void " + getCall() + "{\n");
-
-		final Consumer<String> _function = new Consumer<String>() {
-			@Override
-			public void accept(final String call) {
-				RunnableTranslationUnit.this.srcAppend((("\t" + call) + ";\n"));
-			}
-		};
-		calls.forEach(_function);
-
-		srcAppend("}\n\n");
-	}
-
-	public String getBasePath() {
-		return "synthetic_gen";
-	}
-
-	public String getModulePath() {
-		return getBasePath() + "/" + getModuleName();
-	}
-
-	@Override
-	public String getSrcFile() {
-		return getModuleName() + ".cpp";
-	}
-
-	public String getIncPath() {
-		return getModulePath() + "/_inc/" + getIncFile();
-	}
-
-	public String getSrcPath() {
-		return getModulePath() + "/_src/" + getSrcFile();
-	}
-
-	public boolean isIncFileEmpty() {
-		return !outputBuffer.bufferExists("INC", getModulePath() + "/_inc/" + getModuleName());
-	}
-
-	public boolean isSrcFileEmpty() {
-		return !outputBuffer.bufferExists("SRC", getModulePath() + "/_src/" + getModuleName());
-	}
-
-	public void incAppend(final String str) {
-		outputBuffer.appendTo("INC", getModulePath() + "/_inc/" + getModuleName(), str);
-	}
-
-	public void srcAppend(final String str) {
-		outputBuffer.appendTo("SRC", getModulePath() + "/_src/" + getModuleName(), str);
-	}
-}
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TaskGenerator.xtend b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TaskGenerator.xtend
index 2bc39d7..a5ee31e 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TaskGenerator.xtend
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TaskGenerator.xtend
@@ -17,57 +17,60 @@
 
 import java.util.List
 import java.util.Set
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit
 
 class TaskGenerator {
 
+	public static val String LIB_NAME = "TASKS_LIB";
+
 	// Suppress default constructor
 	private new() {
 		throw new IllegalStateException("Utility class");
 	}
 
-	static def String toH(String moduleName)
+	static def String toH(SLGTranslationUnit tu)
 	'''
 		
-		//Header of Task «moduleName»
+		//Header of Task «tu.moduleName»
 		#include <stdint.h>
 		
-		class «moduleName» {
+		class «tu.moduleName» {
 		
 		public:
 		
 		    //constructor
-			«moduleName»(void);
+			«tu.moduleName»(void);
 			
 			// destructor
-			virtual ~«moduleName»() =default;
+			virtual ~«tu.moduleName»() =default;
 			
 			
-			void «initCall(moduleName)»;
+			void «initCall(tu.moduleName)»;
 		
-			void «stepCall(moduleName)»;
+			void «stepCall(tu.moduleName)»;
 		
 		 };
 	'''
 
-	static def String toCpp(String moduleName, String incFile, Set<String> includes, List<String> initCalls, List<String> stepCalls)
+	static def String toCpp(SLGTranslationUnit tu, String incFile, Set<String> includes, List<String> initCalls, List<String> stepCalls)
 	'''
 		#include "«incFile»"
 		«FOR include : includes»
 			#include "«include»"
 		«ENDFOR»
 		
-		«moduleName»::«moduleName»(){
+		«tu.moduleName»::«tu.moduleName»(){
 			//default constructor
 		}
 		
 		
-		void «moduleName»::«initCall(moduleName)» {
+		void «tu.moduleName»::«initCall(tu.moduleName)» {
 		       «FOR call : initCalls»
 		       	«call»;
 		       «ENDFOR»
 		} 
 		
-		void «moduleName»::«stepCall(moduleName)» {
+		void «tu.moduleName»::«stepCall(tu.moduleName)» {
 		       «FOR call : stepCalls»
 		       	«call»;
 		       «ENDFOR»
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TaskTranslationUnit.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TaskTranslationUnit.java
deleted file mode 100644
index c0c750b..0000000
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TaskTranslationUnit.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/**
- * Copyright (c) 2020 Robert Bosch GmbH.
- * 
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- * 
- * SPDX-License-Identifier: EPL-2.0
- * 
- * Contributors:
- *     Robert Bosch GmbH - initial API and implementation
- */
-package org.eclipse.app4mc.slg.commons.m2t.generators;
-
-import java.util.ArrayList;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
-import java.util.function.BiConsumer;
-import java.util.function.Consumer;
-
-import org.eclipse.app4mc.amalthea.model.ActivityGraph;
-import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
-import org.eclipse.app4mc.amalthea.model.Component;
-import org.eclipse.app4mc.amalthea.model.RunnableCall;
-import org.eclipse.app4mc.amalthea.model.Tag;
-import org.eclipse.app4mc.amalthea.model.Task;
-import org.eclipse.app4mc.slg.commons.m2t.transformers.sw.LabelTransformer;
-import org.eclipse.app4mc.slg.commons.m2t.transformers.sw.RunnableTransformer;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.xtext.xbase.lib.Functions.Function1;
-import org.eclipse.xtext.xbase.lib.IterableExtensions;
-
-public class TaskTranslationUnit extends TranslationUnit {
-	public RunnableTransformer runnableTransformer;
-
-	public LabelTransformer labelTransformer;
-
-	public String getBasePath() {
-		return "";
-	}
-
-	public String getModuleName() {
-		return this.task.getName();
-	}
-
-	private final Task task;
-
-	private OutputBuffer outputBuffer;
-
-	public TaskTranslationUnit(final OutputBuffer outputBuffer, final RunnableTransformer runnableTransformer,
-			final LabelTransformer labelTransformer, final Task task, final Component component) {
-		super();
-		this.runnableTransformer = runnableTransformer;
-		this.labelTransformer = labelTransformer;
-		this.task = task;
-		this.outputBuffer = outputBuffer;
-		this.genFiles();
-	}
-
-	public TaskTranslationUnit(final OutputBuffer outputBuffer, final RunnableTransformer runnableTransformer,
-			final LabelTransformer labelTransformer, final Task task) {
-		super();
-		this.task = task;
-		this.runnableTransformer = runnableTransformer;
-		this.labelTransformer = labelTransformer;
-		this.outputBuffer = outputBuffer;
-	}
-
-	public void genFiles() {
-		
-			final LinkedHashSet<String> includes = new LinkedHashSet<>();
-			final LinkedList<String> initCalls = new LinkedList<>();
-			final LinkedList<String> stepCalls = new LinkedList<>();
-			ActivityGraph _activityGraph = null;
-			if (this.task != null) {
-				_activityGraph = this.task.getActivityGraph();
-			}
-			EList<ActivityGraphItem> _items = null;
-			if (_activityGraph != null) {
-				_items = _activityGraph.getItems();
-			}
-			final Consumer<ActivityGraphItem> _function = item -> {
-				if ((item instanceof RunnableCall)) {
-					final org.eclipse.app4mc.amalthea.model.Runnable runnable = ((RunnableCall) item).getRunnable();
-					final RunnableTranslationUnit tu = TaskTranslationUnit.this.runnableTransformer
-							.transform(((org.eclipse.app4mc.amalthea.model.Runnable) runnable));
-					includes.add(tu.getIncFile());
-					final Function1<Tag, Boolean> _function1 = tag -> Boolean.valueOf("initialize".equals(tag.getName()));
-					boolean _isEmpty = IterableExtensions
-							.isEmpty(IterableExtensions.<Tag>filter(((RunnableCall) item).getTags(), _function1));
-					boolean _not = (!_isEmpty);
-					if (_not) {
-						initCalls.add(tu.getCall());
-					} else {
-						stepCalls.add(tu.getCall());
-					}
-				}
-			};
-			_items.forEach(_function);
-			labelTransformer.getCache().forEach((BiConsumer<ArrayList<?>, LabelTranslationUnit>) (label, tu) -> {
-				includes.add(tu.getIncFile());
-				initCalls.add(tu.getInitCall());
-			});
-			this.incAppend(TaskGenerator.toH(getModuleName()));
-			this.srcAppend(TaskGenerator.toCpp(getModuleName(), getIncFile(), includes, initCalls, stepCalls));
-		
-	}
-
-	public String getModulePath() { return getBasePath() + "/" + getModuleName(); }
-
-	@Override
-	public String getIncFile() { return getModuleName() + ".hpp"; }
-
-	@Override
-	public String getSrcFile() { return getModuleName() + ".cpp"; }
-
-	public String getIncPath() { return getModulePath() + "/_inc/" + getIncFile(); }
-
-	public String getSrcPath() { return getModulePath() + "/_src/" + getSrcFile(); }
-
-	public boolean isIncFileEmpty() {
-		return !outputBuffer.bufferExists("INC", getModulePath() + "/_inc/" + getModuleName());
-	}
-
-	public boolean isSrcFileEmpty() {
-		return !outputBuffer.bufferExists("SRC", getModulePath() + "/_src/" + getModuleName());
-	}
-
-	public boolean incAppend(final String str) {
-		return outputBuffer.appendTo("INC", getModulePath() + "/_inc/" + getModuleName(), str);
-	}
-
-	public boolean srcAppend(final String str) {
-		return outputBuffer.appendTo("SRC", getModulePath() + "/_src/" + getModuleName(), str);
-	}
-}
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TicksGenerator.xtend b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TicksGenerator.xtend
new file mode 100644
index 0000000..b813385
--- /dev/null
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TicksGenerator.xtend
@@ -0,0 +1,69 @@
+/**
+ * *******************************************************************************
+ * Copyright (c) 2020-2021 Robert Bosch GmbH.
+ * 
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ * 
+ * Contributors:
+ *     Robert Bosch GmbH - initial API and implementation
+ * *******************************************************************************
+ */
+
+package org.eclipse.app4mc.slg.commons.m2t.generators
+
+import org.eclipse.app4mc.amalthea.model.DiscreteValueBetaDistribution
+import org.eclipse.app4mc.amalthea.model.DiscreteValueBoundaries
+import org.eclipse.app4mc.amalthea.model.DiscreteValueConstant
+import org.eclipse.app4mc.amalthea.model.DiscreteValueGaussDistribution
+import org.eclipse.app4mc.amalthea.model.DiscreteValueHistogram
+import org.eclipse.app4mc.amalthea.model.DiscreteValueStatistics
+import org.eclipse.app4mc.amalthea.model.DiscreteValueUniformDistribution
+import org.eclipse.app4mc.amalthea.model.DiscreteValueWeibullEstimatorsDistribution
+import org.eclipse.app4mc.amalthea.model.IDiscreteValueDeviation
+
+class TicksGenerator {
+
+	// Suppress default constructor
+	private new() {
+		throw new IllegalStateException("Utility class");
+	}
+
+	static def dispatch String getParameters(DiscreteValueConstant value)
+		'''«value.value»'''
+
+	static def dispatch String getParameters(DiscreteValueStatistics value)
+		'''«value.average», «value.lowerBound», «value.upperBound»'''
+		
+	static def dispatch String getParameters(IDiscreteValueDeviation value) '''
+		WARNING:VALUE_FORMAT_NOT_SUPPORTED
+	'''
+
+	static def dispatch String getParameters(DiscreteValueBetaDistribution value) '''
+		WARNING:VALUE_FORMAT_NOT_SUPPORTED
+	'''
+
+	static def dispatch String getParameters(DiscreteValueBoundaries value) '''
+		WARNING:VALUE_FORMAT_NOT_SUPPORTED
+	'''
+
+	static def dispatch String getParameters(DiscreteValueGaussDistribution value) '''
+		WARNING:VALUE_FORMAT_NOT_SUPPORTED
+	'''
+
+	static def dispatch String getParameters(DiscreteValueHistogram value) '''
+		WARNING:VALUE_FORMAT_NOT_SUPPORTED
+	'''
+
+	static def dispatch String getParameters(DiscreteValueUniformDistribution value) '''
+		WARNING:VALUE_FORMAT_NOT_SUPPORTED
+	'''
+
+	static def dispatch String getParameters(DiscreteValueWeibullEstimatorsDistribution value) '''
+		WARNING:VALUE_FORMAT_NOT_SUPPORTED
+	'''
+
+}
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TicksTranslationUnit.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TicksTranslationUnit.java
deleted file mode 100644
index 0e7beaf..0000000
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TicksTranslationUnit.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/**
- * Copyright (c) 2020 Robert Bosch GmbH.
- * 
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- * 
- * SPDX-License-Identifier: EPL-2.0
- * 
- * Contributors:
- *     Robert Bosch GmbH - initial API and implementation
- */
-package org.eclipse.app4mc.slg.commons.m2t.generators;
-
-import java.util.Arrays;
-
-import org.eclipse.app4mc.amalthea.model.DiscreteValueBetaDistribution;
-import org.eclipse.app4mc.amalthea.model.DiscreteValueBoundaries;
-import org.eclipse.app4mc.amalthea.model.DiscreteValueConstant;
-import org.eclipse.app4mc.amalthea.model.DiscreteValueGaussDistribution;
-import org.eclipse.app4mc.amalthea.model.DiscreteValueHistogram;
-import org.eclipse.app4mc.amalthea.model.DiscreteValueStatistics;
-import org.eclipse.app4mc.amalthea.model.DiscreteValueUniformDistribution;
-import org.eclipse.app4mc.amalthea.model.DiscreteValueWeibullEstimatorsDistribution;
-import org.eclipse.app4mc.amalthea.model.IDiscreteValueDeviation;
-import org.eclipse.app4mc.amalthea.model.Ticks;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.xtend2.lib.StringConcatenation;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class TicksTranslationUnit extends TranslationUnit {
-	private static final Logger LOG = LoggerFactory.getLogger(TicksTranslationUnit.class);
-
-	public String getBasePath() {
-		return this.tuTicksUtils.getBasePath();
-	}
-
-	public String getModuleName() {
-		return this.tuTicksUtils.getModuleName();
-	}
-
-	@Override
-	public String getCall() {
-		if (((this.ticksValue != null) && ((this.ticksValue instanceof DiscreteValueStatistics)
-				|| (this.ticksValue instanceof DiscreteValueConstant)))) {
-			return this.tuTicksUtils.getExecCall(this.getParameters(this.ticksValue)).toString();
-		}
-		TicksTranslationUnit.LOG.error("Unsupported element for Ticks : " + this.ticksValue.eClass().getName());
-		return "";
-	}
-
-	private final TicksUtilsTranslationUnit tuTicksUtils;
-	private final Ticks ticks;
-	private String puName;
-	private IDiscreteValueDeviation ticksValue;
-
-	private OutputBuffer outputBuffer;
-
-	public TicksTranslationUnit(final OutputBuffer outputBuffer, final TicksUtilsTranslationUnit tuTicksUtils,
-			final Ticks ticks, final String puName, final IDiscreteValueDeviation ticksValue) {
-		super();
-		this.tuTicksUtils = tuTicksUtils;
-		this.ticks = ticks;
-		this.puName = puName;
-		this.ticksValue = ticksValue;
-		this.outputBuffer = outputBuffer;
-	}
-
-	public String getPuName() {
-		return this.puName;
-	}
-
-	public String getIncFile() {
-		return this.getModuleName() + ".h";
-	}
-
-	private String _getParameters(final IDiscreteValueDeviation value) {
-		StringConcatenation _builder = new StringConcatenation();
-		_builder.append("WARNING:VALUE_FORMAT_NOT_SUPPORTED\t\t");
-		_builder.newLine();
-		return _builder.toString();
-	}
-
-	private String _getParameters(final DiscreteValueBetaDistribution value) {
-		StringConcatenation _builder = new StringConcatenation();
-		_builder.append("WARNING:VALUE_FORMAT_NOT_SUPPORTED");
-		_builder.newLine();
-		return _builder.toString();
-	}
-
-	private String _getParameters(final DiscreteValueBoundaries value) {
-		StringConcatenation _builder = new StringConcatenation();
-		_builder.append("WARNING:VALUE_FORMAT_NOT_SUPPORTED");
-		_builder.newLine();
-		return _builder.toString();
-	}
-
-	private String _getParameters(final DiscreteValueConstant value) {
-		StringConcatenation _builder = new StringConcatenation();
-		long _value = value.getValue();
-		_builder.append(_value);
-		return _builder.toString();
-	}
-
-	private String _getParameters(final DiscreteValueGaussDistribution value) {
-		StringConcatenation _builder = new StringConcatenation();
-		_builder.append("WARNING:VALUE_FORMAT_NOT_SUPPORTED");
-		_builder.newLine();
-		return _builder.toString();
-	}
-
-	private String _getParameters(final DiscreteValueHistogram value) {
-		StringConcatenation _builder = new StringConcatenation();
-		_builder.append("WARNING:VALUE_FORMAT_NOT_SUPPORTED");
-		_builder.newLine();
-		return _builder.toString();
-	}
-
-	private String _getParameters(final DiscreteValueStatistics value) {
-		StringConcatenation _builder = new StringConcatenation();
-		_builder.append(value.getAverage());
-		_builder.append(", ");
-		_builder.append(value.getLowerBound());
-		_builder.append(", ");
-		_builder.append(value.getUpperBound());
-		return _builder.toString();
-	}
-
-	private String _getParameters(final DiscreteValueUniformDistribution value) {
-		StringConcatenation _builder = new StringConcatenation();
-		_builder.append("WARNING:VALUE_FORMAT_NOT_SUPPORTED");
-		_builder.newLine();
-		return _builder.toString();
-	}
-
-	private String _getParameters(final DiscreteValueWeibullEstimatorsDistribution value) {
-		StringConcatenation _builder = new StringConcatenation();
-		_builder.append("WARNING:VALUE_FORMAT_NOT_SUPPORTED");
-		return _builder.toString();
-	}
-
-	private String getParameters(final IDiscreteValueDeviation value) {
-		if (value instanceof DiscreteValueBetaDistribution) {
-			return _getParameters((DiscreteValueBetaDistribution) value);
-		} else if (value instanceof DiscreteValueBoundaries) {
-			return _getParameters((DiscreteValueBoundaries) value);
-		} else if (value instanceof DiscreteValueGaussDistribution) {
-			return _getParameters((DiscreteValueGaussDistribution) value);
-		} else if (value instanceof DiscreteValueStatistics) {
-			return _getParameters((DiscreteValueStatistics) value);
-		} else if (value instanceof DiscreteValueUniformDistribution) {
-			return _getParameters((DiscreteValueUniformDistribution) value);
-		} else if (value instanceof DiscreteValueWeibullEstimatorsDistribution) {
-			return _getParameters((DiscreteValueWeibullEstimatorsDistribution) value);
-		} else if (value instanceof DiscreteValueConstant) {
-			return _getParameters((DiscreteValueConstant) value);
-		} else if (value instanceof DiscreteValueHistogram) {
-			return _getParameters((DiscreteValueHistogram) value);
-		} else if (value != null) {
-			return _getParameters(value);
-		} else {
-			throw new IllegalArgumentException("Unhandled parameter types: " + Arrays.<Object>asList(value).toString());
-		}
-	}
-
-	public String getModulePath() {
-		return getBasePath() + "/" + getModuleName();
-	}
-
-	@Override
-	public String getSrcFile() {
-		return getModuleName() + ".cpp";
-	}
-
-	public String getIncPath() {
-		return getModulePath() + "/_inc/" + getIncFile();
-	}
-
-	public String getSrcPath() {
-		return getModulePath() + "/_src/" + getSrcFile();
-	}
-
-	public boolean isIncFileEmpty() {
-		return !outputBuffer.bufferExists("INC", getModulePath() + "/_inc/" + getModuleName());
-	}
-
-	public boolean isSrcFileEmpty() {
-		return !outputBuffer.bufferExists("SRC", getModulePath() + "/_src/" + getModuleName());
-	}
-
-	public boolean incAppend(final String str) {
-		return outputBuffer.appendTo("INC", getModulePath() + "/_inc/" + getModuleName(), str);
-	}
-
-	public boolean srcAppend(final String str) {
-		return outputBuffer.appendTo("SRC", getModulePath() + "/_src/" + getModuleName(), str);
-	}
-
-}
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TicksUtilsGenerator.xtend b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TicksUtilsGenerator.xtend
index 7b139dc..8fccef6 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TicksUtilsGenerator.xtend
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TicksUtilsGenerator.xtend
@@ -16,13 +16,15 @@
 package org.eclipse.app4mc.slg.commons.m2t.generators
 
 import java.util.List
-import org.eclipse.app4mc.amalthea.model.impl.DiscreteValueStatisticsImpl
-import org.eclipse.app4mc.amalthea.model.impl.DiscreteValueConstantImpl
+import org.eclipse.app4mc.amalthea.model.AmaltheaPackage
 import org.eclipse.app4mc.slg.config.ConfigModel
 import org.eclipse.app4mc.slg.config.TickType
+import org.eclipse.emf.ecore.EClass
 
 class TicksUtilsGenerator {
 
+	public static val String LIB_NAME = "TICKS_UTILS";
+
 	// Suppress default constructor
 	private new() {
 		throw new IllegalStateException("Utility class");
@@ -30,29 +32,29 @@
 
 	static def String toCMake(List<String> srcFiles)
 	'''
-			# «TicksUtilsTranslationUnit.getLibName» ################################################################
+			# «LIB_NAME» ################################################################
 			####
-			add_library(«TicksUtilsTranslationUnit.getLibName()»  STATIC
+			add_library(«LIB_NAME»  STATIC
 		«FOR srcFile : srcFiles»
 			${CMAKE_CURRENT_LIST_DIR}/_src/«srcFile»
 			«ENDFOR»
 		)
 		
-				target_include_directories(«TicksUtilsTranslationUnit.getLibName()»
+				target_include_directories(«LIB_NAME»
 				    PUBLIC ${CMAKE_CURRENT_LIST_DIR}/_inc/
 				)	
 	'''
 
 	// ----- generate ticks -----
 
-	static def String generateTicksDeclaration(Object valueClass) {
-		switch valueClass {
-			case DiscreteValueConstantImpl: '''
-				void «execCall(valueClass, "int ticks")»;
+	static def String generateTicksDeclaration(EClass eClass) {
+		switch eClass {
+			case AmaltheaPackage.eINSTANCE.discreteValueConstant: '''
+				void «execCall(eClass, "int ticks")»;
 				
 			'''
-			case DiscreteValueStatisticsImpl: '''
-				void «execCall(valueClass, "double average, int lowerBound, int upperBound")»;
+			case AmaltheaPackage.eINSTANCE.discreteValueStatistics: '''
+				void «execCall(eClass, "double average, int lowerBound, int upperBound")»;
 				
 			'''
 			default: {
@@ -61,16 +63,16 @@
 		}
 	}
 
-	static def String generateTicks(Object valueClass) {
-		switch valueClass {
-			case DiscreteValueConstantImpl: '''
-				void «execCall(valueClass, "int ticks")» {
+	static def String generateTicks(EClass eClass) {
+		switch eClass {
+			case AmaltheaPackage.eINSTANCE.discreteValueConstant: '''
+				void «execCall(eClass, "int ticks")» {
 					burnTicks(ticks);
 				}
 				
 			'''
-			case DiscreteValueStatisticsImpl: '''
-				void «execCall(valueClass, "double average, int lowerBound, int upperBound")» {
+			case AmaltheaPackage.eINSTANCE.discreteValueStatistics: '''
+				void «execCall(eClass, "double average, int lowerBound, int upperBound")» {
 					burnTicksStatistics(average, lowerBound, upperBound);
 				}
 				
@@ -81,7 +83,7 @@
 		}
 	}
 
-	private static def String execCall(Object valueClass, String params) '''executeTicks_«valueClass.toString.split("\\.").last»(«params»)'''
+	static def String execCall(EClass eClass, String params) '''executeTicks_«eClass.name»(«params»)'''
 
 
 	// ----- burn ticks -----
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TicksUtilsTranslationUnit.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TicksUtilsTranslationUnit.java
deleted file mode 100644
index 7a311f3..0000000
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TicksUtilsTranslationUnit.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/**
- * Copyright (c) 2020 Robert Bosch GmbH.
- * 
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- * 
- * SPDX-License-Identifier: EPL-2.0
- * 
- * Contributors:
- *     Robert Bosch GmbH - initial API and implementation
- */
-
-package org.eclipse.app4mc.slg.commons.m2t.generators;
-
-import org.eclipse.app4mc.slg.config.ConfigModel;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.xtend2.lib.StringConcatenation;
-import org.eclipse.xtext.xbase.lib.Conversions;
-import org.eclipse.xtext.xbase.lib.IterableExtensions;
-
-public class TicksUtilsTranslationUnit extends TranslationUnit {
-	public static String getModulePathStatic() {
-		return "synthetic_gen" + "/" + getModuleNameStatic();
-	}
-
-	public static String getMakeFilePathStatic() {
-		return getModulePathStatic() + "/" + "CMakeLists.txt";
-	}
-
-	public static String getModuleNameStatic() {
-		return "ticksUtils";
-	}
-
-	public static String getLibName() {
-		return "TICKS_UTILS";
-	}
-
-	public String getModuleName() {
-		return TicksUtilsTranslationUnit.getModuleNameStatic();
-	}
-
-	public CharSequence getExecCall(final String params) {
-		StringConcatenation _builder = new StringConcatenation();
-		_builder.append("executeTicks_");
-		String _last = IterableExtensions
-				.<String>last(((Iterable<String>) Conversions.doWrapArray(this.valueClass.toString().split("\\."))));
-		_builder.append(_last);
-		_builder.append("(");
-		_builder.append(params);
-		_builder.append(")");
-		return _builder;
-	}
-
-	public String getIncFile() {
-		return this.getModuleName() + ".h";
-	}
-
-	private final ConfigModel configModel;
-
-	private final Object valueClass;
-
-	private OutputBuffer outputBuffer;
-
-	public TicksUtilsTranslationUnit(final OutputBuffer outputBuffer, final ConfigModel configModel,
-			final Object valueClass) {
-		super();
-		this.configModel = configModel;
-		this.valueClass = valueClass;
-		this.outputBuffer = outputBuffer;
-		this.genFiles();
-	}
-
-	public void genFiles() {
-
-		if (this.isIncFileEmpty()) {
-			this.toH();
-		}
-		if (this.isSrcFileEmpty()) {
-			this.toCPP();
-		}
-		srcAppend(TicksUtilsGenerator.generateTicks(valueClass));
-		incAppend(TicksUtilsGenerator.generateTicksDeclaration(valueClass));
-	}
-
-	private void toCPP() {
-		srcAppend("#include \"" + getIncFile() + "\"\n");
-
-		final String ticksCodeSnippet = configModel.getCustomTickImpl().getValue();
-		final boolean ticksCodeEnabled = configModel.getCustomTickImpl().isEnable();
-		
-		final String burnTicksBody = ticksCodeEnabled ? ticksCodeSnippet : TicksUtilsGenerator.burnTicksDefault();
-
-		srcAppend(TicksUtilsGenerator.burnTicks(burnTicksBody));
-		srcAppend(TicksUtilsGenerator.burnTicksStatistics(configModel));
-	}
-
-	private void toH() {
-
-		incAppend(TicksUtilsGenerator.burnTicksDeclaration());
-		incAppend(TicksUtilsGenerator.burnTicksStatisticsDeclaration());
-
-	}
-
-	public String getBasePath() {
-		return "synthetic_gen";
-	}
-
-	public String getModulePath() {
-		return this.getBasePath() + "/" + this.getModuleName();
-	}
-
-	@Override
-	public String getSrcFile() {
-		return this.getModuleName() + ".cpp";
-	}
-
-	public String getIncPath() {
-		return this.getModulePath() + "/_inc/" + this.getIncFile();
-	}
-
-	public String getSrcPath() {
-		return this.getModulePath() + "/_src/" + this.getSrcFile();
-	}
-
-	public boolean isIncFileEmpty() {
-		return !this.outputBuffer.bufferExists("INC", this.getModulePath() + "/_inc/" + this.getModuleName());
-	}
-
-	public boolean isSrcFileEmpty() {
-		return !this.outputBuffer.bufferExists("SRC", this.getModulePath() + "/_src/" + this.getModuleName());
-	}
-
-	public boolean incAppend(final String str) {
-		return this.outputBuffer.appendTo("INC", ((this.getModulePath() + "/_inc/") + this.getModuleName()), str);
-	}
-
-	public boolean srcAppend(final String str) {
-		return this.outputBuffer.appendTo("SRC", ((this.getModulePath() + "/_src/") + this.getModuleName()), str);
-	}
-}
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TranslationUnit.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TranslationUnit.java
deleted file mode 100644
index 6251446..0000000
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TranslationUnit.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/**
- * Copyright (c) 2020 Robert Bosch GmbH.
- * 
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- * 
- * SPDX-License-Identifier: EPL-2.0
- * 
- * Contributors:
- *     Robert Bosch GmbH - initial API and implementation
- */
-
-package org.eclipse.app4mc.slg.commons.m2t.generators;
-
-public class TranslationUnit {
-	private String path;
-	private String call;
-	private String incFile;
-	private String srcFile;
-
-	public TranslationUnit(final String path, final String call, final String incFile, final String srcFile) {
-		this.path = path;
-		this.call = call;
-		this.incFile = incFile;
-		this.srcFile = srcFile;
-	}
-
-	public TranslationUnit() {
-		this("MODULE_PATH", "CALL", "MODULE.H", "MODULE.CPP"); // dummy values for unused data
-	}
-
-	public String getCall() {
-		return this.call;
-	}
-
-	public void setCall(final String _call) {
-		this.call = _call;
-	}
-
-	public String getPath() {
-		return this.path;
-	}
-
-	public void setPath(final String _path) {
-		this.path = _path;
-	}
-
-	public String getSrcFile() {
-		return this.srcFile;
-	}
-
-	public String getIncFile() {
-		return this.incFile;
-	}
-
-	public String getExtendedIncPath() {
-		return ((this.path + "/_inc/") + this.incFile);
-	}
-
-	public String getExtendedSrcPath() {
-		return ((this.path + "/_src/") + this.srcFile);
-	}
-
-}
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/SLGBaseSettings.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/SLGBaseSettings.java
index 0715c88..aa8fd76 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/SLGBaseSettings.java
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/SLGBaseSettings.java
@@ -25,11 +25,11 @@
 	}
 
 	public static final String SRC_TYPE = "SRC";
-	public static final String SRC_EXT = ".cpp";
+	public static final String SRC_EXT = ".c";
 	public static final String SRC_FOLDER = "/_src/";
 
 	public static final String INC_TYPE = "INC";
-	public static final String INC_EXT = ".hpp";
+	public static final String INC_EXT = ".h";
 	public static final String INC_FOLDER = "/_inc/";
 
 	public static final String OTHER_TYPE = "OTHER";
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/SLGBaseTransformer.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/SLGBaseTransformer.java
index d9fb202..d5334a4 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/SLGBaseTransformer.java
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/SLGBaseTransformer.java
@@ -22,14 +22,12 @@
 import static org.eclipse.app4mc.slg.commons.m2t.transformers.SLGBaseSettings.SRC_FOLDER;
 import static org.eclipse.app4mc.slg.commons.m2t.transformers.SLGBaseSettings.SRC_TYPE;
 
-import java.util.ArrayList;
-import java.util.HashMap;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.stream.Collectors;
 
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
 import org.eclipse.app4mc.transformation.util.OutputBuffer;
 
 import com.google.inject.Inject;
@@ -67,6 +65,22 @@
 	public String getSrcPath(SLGTranslationUnit tu) { return tu.getModulePath() + SRC_FOLDER + getSrcFile(tu); }
 	public String getIncPath(SLGTranslationUnit tu) { return tu.getModulePath() + INC_FOLDER + getIncFile(tu); }
 
+	// Generic cache handling
+
+	public List<String> getSrcFiles() {
+
+		return getCache().values().stream()
+				.map(this::getSrcFile)
+				.sorted()
+				.distinct()
+				.collect(Collectors.toList());
+	}
+
+	public Map<List<Object>, SLGTranslationUnit> getCache() {
+		return Collections.emptyMap();
+	}
+
+
 	// still necessary ???
 
 	@Inject Properties properties;
@@ -80,17 +94,4 @@
 		return value.toString();
 	}
 
-	public Map<ArrayList<?>, ? extends TranslationUnit> getCache() {
-		return new HashMap<>();
-	}
-
-	public List<String> getSrcFiles() {
-
-		return getCache().values().stream()
-				.map(TranslationUnit::getSrcFile)
-				.sorted()
-				.distinct()
-				.collect(Collectors.toList());
-	}
-
 }
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/ActivityGraphItemTransformer.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/ActivityGraphItemTransformer.java
index ee07a46..cd0fd5b 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/ActivityGraphItemTransformer.java
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/ActivityGraphItemTransformer.java
@@ -15,8 +15,7 @@
 
 package org.eclipse.app4mc.slg.commons.m2t.transformers.sw;
 
-import java.util.Arrays;
-import java.util.List;
+import java.util.Map;
 
 import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
 import org.eclipse.app4mc.amalthea.model.ChannelReceive;
@@ -24,9 +23,8 @@
 import org.eclipse.app4mc.amalthea.model.LabelAccess;
 import org.eclipse.app4mc.amalthea.model.RunnableCall;
 import org.eclipse.app4mc.amalthea.model.Ticks;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TicksTranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
 import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGBaseTransformer;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -43,54 +41,35 @@
 	@Inject private LabelAccessTransformer labelAccessTransformer;
 	@Inject private TicksTransformer ticksTransformer;
 
-	protected TranslationUnit _transform(final ActivityGraphItem activityGraphItem) {
-		ActivityGraphItemTransformer.LOG.error(UNSUPPORTED_ELEMENT, activityGraphItem.getClass().getName());
-		return new TranslationUnit("undefined", "", "", "");
-	}
-
-	protected TranslationUnit _transform(final RunnableCall runnableCall) {
-		return this.runnableTransformer.transform(runnableCall.getRunnable());
-	}
-
-	protected TranslationUnit _transform(final Ticks ticks) {
-		return this.ticksTransformer.transform(ticks);
-	}
-
-	public List<TicksTranslationUnit> transformAllItems(final Ticks ticks) {
-		return this.ticksTransformer.transformAllItems(ticks);
-	}
-
-	protected TranslationUnit _transform(final LabelAccess labelAccess) {
-		return this.labelAccessTransformer.transform(labelAccess);
-	}
-
-	protected TranslationUnit _transform(final ChannelReceive channelReceive) {
-		ActivityGraphItemTransformer.LOG.error(UNSUPPORTED_ELEMENT, channelReceive.getClass().getName());
-		return new TranslationUnit("undefined", "", "", "");
-	}
-
-	protected TranslationUnit _transform(final ChannelSend channelSend) {
-		ActivityGraphItemTransformer.LOG.error(UNSUPPORTED_ELEMENT, channelSend.getClass().getName());
-		return new TranslationUnit("undefined", "", "", "");
-	}
-
-	public TranslationUnit transform(final ActivityGraphItem channelReceive) {
-		if (channelReceive instanceof ChannelReceive) {
-			return _transform((ChannelReceive) channelReceive);
-		} else if (channelReceive instanceof ChannelSend) {
-			return _transform((ChannelSend) channelReceive);
-		} else if (channelReceive instanceof LabelAccess) {
-			return _transform((LabelAccess) channelReceive);
-		} else if (channelReceive instanceof Ticks) {
-			return _transform((Ticks) channelReceive);
-		} else if (channelReceive instanceof RunnableCall) {
-			return _transform((RunnableCall) channelReceive);
-		} else if (channelReceive != null) {
-			return _transform(channelReceive);
-		} else {
-			throw new IllegalArgumentException(
-					"Unhandled parameter types: " + Arrays.<Object>asList(channelReceive).toString());
+	public SLGTranslationUnit transform(final ActivityGraphItem graphItem) {
+		if (graphItem == null) {
+			throw new IllegalArgumentException("Unhandled parameter type: null");
 		}
+
+		if (graphItem instanceof LabelAccess) {
+			return labelAccessTransformer.transform((LabelAccess) graphItem);
+
+		} else if (graphItem instanceof Ticks) {
+			return ticksTransformer.transform((Ticks) graphItem);
+
+		} else if (graphItem instanceof RunnableCall) {
+			return runnableTransformer.transform(((RunnableCall) graphItem).getRunnable());
+
+		} else if (graphItem instanceof ChannelReceive) {
+			LOG.error(UNSUPPORTED_ELEMENT, "ChannelReceive");
+			return new SLGTranslationUnit("ChannelReceive is not yet implemented");
+
+		} else if (graphItem instanceof ChannelSend) {
+			LOG.error(UNSUPPORTED_ELEMENT, "ChannelSend");
+			return new SLGTranslationUnit("ChannelSend is not yet implemented");
+		}
+
+		LOG.error(UNSUPPORTED_ELEMENT, graphItem.getClass().getName());
+		return new SLGTranslationUnit(graphItem.eClass().getName() + " in not supported");
+	}
+
+	public Map<String, SLGTranslationUnit> transformAllItems(final Ticks ticks) {
+		return ticksTransformer.transformAllItems(ticks);
 	}
 
 }
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/GroupHeaderTransformer.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/GroupHeaderTransformer.java
index 7219c1a..1547a86 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/GroupHeaderTransformer.java
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/GroupHeaderTransformer.java
@@ -16,18 +16,16 @@
 package org.eclipse.app4mc.slg.commons.m2t.transformers.sw;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.LinkedHashSet;
-import java.util.function.Consumer;
+import java.util.List;
+import java.util.Map;
 
 import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
-import org.eclipse.app4mc.amalthea.model.Component;
 import org.eclipse.app4mc.amalthea.model.Group;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.xtext.xbase.lib.CollectionLiterals;
-import org.eclipse.xtext.xbase.lib.StringExtensions;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
 
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
@@ -35,66 +33,78 @@
 @Singleton
 public class GroupHeaderTransformer extends ActivityGraphItemTransformer {
 
-	@Inject private OutputBuffer outputBuffer;
-	@Inject private ActivityGraphItemTransformer psCallGraphItemTransformer;
+	@Inject private ActivityGraphItemTransformer activityGraphItemTransformer;
 
-	public static String getModuleName(final Group group) {
-		return "groups";
+	// ---------- generic part "def create new transform(...)" ----------
+
+	private final Map<List<Object>, SLGTranslationUnit> transformCache = new HashMap<>();
+
+	public Map<List<Object>, SLGTranslationUnit> getCache() {
+		return this.transformCache;
 	}
 
-	public static String getFunctionDef(final Group group) {
-		return "group_" + group.getName() + "()";
-	}
+	public SLGTranslationUnit transform(final Group group) {
+		final List<Object> key = new ArrayList<>(Arrays.asList(group));
+		final SLGTranslationUnit tu;
 
-	public TranslationUnit transform(final Group group, final Component component) {
-		final ArrayList<?> key = CollectionLiterals.newArrayList(group, component);
-		final TranslationUnit _result;
-		synchronized (cache) {
-			if (cache.containsKey(key)) {
-				return cache.get(key);
+		synchronized (transformCache) {
+			if (transformCache.containsKey(key)) {
+				return transformCache.get(key);
 			}
-			TranslationUnit _translationUnit = new TranslationUnit();
-			_result = _translationUnit;
-			cache.put(key, _result);
+			tu = createTranslationUnit(group);
+			transformCache.put(key, tu);
 		}
-		_init_transform(_result, group, component);
-		return _result;
+
+		// if translation unit is newly created and valid -> create files
+		if (tu.isValid()) {
+			doTransform(tu, group);
+		}
+
+		return tu;
 	}
 
-	private final HashMap<ArrayList<?>, TranslationUnit> cache = CollectionLiterals.newHashMap();
+	// ---------------------------------------------------
 
-	private void _init_transform(final TranslationUnit it, final Group group, final Component component) {
-		it.setPath(GroupHeaderTransformer.getModuleName(group));
-		it.setCall(GroupHeaderTransformer.getFunctionDef(group));
-
-		final LinkedHashSet<String> groupItemIncludes = new LinkedHashSet<>();
-		final LinkedHashSet<String> groupItemCalls = new LinkedHashSet<>();
-
-		EList<ActivityGraphItem> _items = null;
-		if (group != null) {
-			_items = group.getItems();
+	private SLGTranslationUnit createTranslationUnit(final Group group) {
+		if ((group == null)) {
+			return new SLGTranslationUnit("UNSPECIFIED GROUP");
+		} else {
+			String basePath = "groups";
+			String moduleName = "groups";
+			String call = "group_" + group.getName() + "()";
+			return new SLGTranslationUnit(basePath, moduleName, call);
 		}
-		final Consumer<ActivityGraphItem> _function = (ActivityGraphItem item) -> {
-			final TranslationUnit tmp = this.psCallGraphItemTransformer.transform(item);
-			if (((!StringExtensions.isNullOrEmpty(tmp.getExtendedIncPath()))
-					&& (!it.getExtendedIncPath().equals(tmp.getExtendedIncPath())))) {
-				groupItemIncludes.add(tmp.getExtendedIncPath());
+	}
+
+	private void doTransform(final SLGTranslationUnit tu, final Group group) {
+		genFiles(tu, group);
+	}
+
+	private void genFiles(SLGTranslationUnit tu, final Group group) {
+		if (group == null)
+			return; // do nothing
+
+		final HashSet<String> groupItemIncludes = new LinkedHashSet<>();
+		final HashSet<String> groupItemCalls = new LinkedHashSet<>();
+
+		for (ActivityGraphItem item : group.getItems()) {
+
+			final SLGTranslationUnit tmpTU = activityGraphItemTransformer.transform(item);
+			if (tmpTU.isValid()) {
+				if (!getIncPath(tu).equals(getIncPath(tmpTU))) {
+					groupItemIncludes.add(getIncPath(tmpTU));
+				}
+				groupItemCalls.add(tmpTU.getCall());
 			}
-			if (!StringExtensions.isNullOrEmpty(tmp.getCall())) {
-				groupItemCalls.add(tmp.getCall());
-			}
-		};
-		_items.forEach(_function);
+		}
 
-		final int index = it.getExtendedIncPath().lastIndexOf(".");
-		final String trimmedIncPath = it.getExtendedIncPath().substring(0, index);
+		incAppend(tu, "\n//Group " + group.getName() + "----\n");
 
-		outputBuffer.appendTo("INC", trimmedIncPath, "\n//Group " + group.getName() + "----\n");
+		for (String include : groupItemIncludes) {
+			incAppend(tu, "#include \"" + include + "\"\n");
+		}
 
-		groupItemIncludes.forEach(include -> 
-			outputBuffer.appendTo("INC", trimmedIncPath, "#include \"" + include + ".h\"\n"));
-
-		outputBuffer.appendTo("INC", trimmedIncPath, "void " + it.getCall() + ";\n");
+		incAppend(tu, "void " + tu.getCall() + ";\n");
 	}
 
 }
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/GroupSourceTransformer.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/GroupSourceTransformer.java
index 2fc792b..138ace5 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/GroupSourceTransformer.java
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/GroupSourceTransformer.java
@@ -16,16 +16,15 @@
 package org.eclipse.app4mc.slg.commons.m2t.transformers.sw;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
 
 import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
-import org.eclipse.app4mc.amalthea.model.Component;
 import org.eclipse.app4mc.amalthea.model.Group;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.xtext.xbase.lib.CollectionLiterals;
-import org.eclipse.xtext.xbase.lib.StringExtensions;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
 
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
@@ -33,60 +32,82 @@
 @Singleton
 public class GroupSourceTransformer extends ActivityGraphItemTransformer {
 
-	@Inject private OutputBuffer outputBuffer;
-	@Inject private ActivityGraphItemTransformer psCallGraphItemTransformer;
+	@Inject private ActivityGraphItemTransformer activityGraphItemTransformer;
 
-	public TranslationUnit transform(final Group group, final Component component) {
-		final ArrayList<?> key = CollectionLiterals.newArrayList(group, component);
-		final TranslationUnit _result;
-		synchronized (cache) {
-			if (cache.containsKey(key)) {
-				return cache.get(key);
-			}
-			TranslationUnit tu = new TranslationUnit();
-			_result = tu;
-			cache.put(key, _result);
-		}
-		_init_transform(_result, group, component);
-		return _result;
+	// ---------- generic part "def create new transform(...)" ----------
+
+	private final Map<List<Object>, SLGTranslationUnit> transformCache = new HashMap<>();
+
+	public Map<List<Object>, SLGTranslationUnit> getCache() {
+		return this.transformCache;
 	}
 
-	private final HashMap<ArrayList<?>, TranslationUnit> cache = CollectionLiterals.newHashMap();
+	public SLGTranslationUnit transform(final Group group) {
+		final List<Object> key = new ArrayList<>(Arrays.asList(group));
+		final SLGTranslationUnit tu;
 
-	private void _init_transform(final TranslationUnit it, final Group group, final Component component) {
-		it.setPath(GroupHeaderTransformer.getModuleName(group));
-		it.setCall(GroupHeaderTransformer.getFunctionDef(group));
+		synchronized (transformCache) {
+			if (transformCache.containsKey(key)) {
+				return transformCache.get(key);
+			}
+			tu = createTranslationUnit(group);
+			transformCache.put(key, tu);
+		}
 
-		final LinkedList<String> groupItemIncludes = new LinkedList<>();
-		final LinkedList<String> groupItemCalls = new LinkedList<>();
+		// if translation unit is newly created and valid -> create files
+		if (tu.isValid()) {
+			doTransform(tu, group);
+		}
 
+		return tu;
+	}
 
-		if (group != null) {
-			for (ActivityGraphItem item : group.getItems()) {
-				final TranslationUnit tmp = psCallGraphItemTransformer.transform(item);
-				if (!StringExtensions.isNullOrEmpty(tmp.getPath())) {
-					groupItemIncludes.add(tmp.getPath());
-				}
-				if (!StringExtensions.isNullOrEmpty(tmp.getCall())) {
-					groupItemCalls.add(tmp.getCall());
-				}
+	// ---------------------------------------------------
+
+	private SLGTranslationUnit createTranslationUnit(final Group group) {
+		if ((group == null)) {
+			return new SLGTranslationUnit("UNSPECIFIED GROUP");
+		} else {
+			String basePath = "groups";
+			String moduleName = "groups";
+			String call = "group_" + group.getName() + "()";
+			return new SLGTranslationUnit(basePath, moduleName, call);
+		}
+	}
+
+	private void doTransform(final SLGTranslationUnit tu, final Group group) {
+		genFiles(tu, group);
+	}
+
+	private void genFiles(SLGTranslationUnit tu, final Group group) {
+		if (group == null)
+			return; // do nothing
+		
+		final List<String> groupItemIncludes = new LinkedList<>();	// Mc: why list here ? (See GroupHeaderTransformer)
+		final List<String> groupItemCalls = new LinkedList<>();
+
+		for (ActivityGraphItem item : group.getItems()) {
+
+			final SLGTranslationUnit tmpTU = activityGraphItemTransformer.transform(item);
+			if (tmpTU.isValid()) {
+				groupItemIncludes.add(getIncPath(tmpTU));
+				groupItemCalls.add(tmpTU.getCall());
 			}
 		}
 
-		final int index = it.getExtendedSrcPath().lastIndexOf(".");
-		final String trimmedSrcPath = it.getExtendedSrcPath().substring(0, index);
+		srcAppend(tu, "\n//Group " + group.getName() + "----\n");
 
-		outputBuffer.appendTo("SRC", trimmedSrcPath, (("\n//Group " + group.getName()) + "----\n"));
+		for (String include : groupItemIncludes) {
+			srcAppend(tu, "#include \"" + include + ".h\"\n");
+		}
 
-		groupItemIncludes.forEach(include -> 
-			outputBuffer.appendTo("SRC", trimmedSrcPath, "#include \"" + include + ".h\"\n"));
-		
-		outputBuffer.appendTo("SRC", trimmedSrcPath, "void " + it.getCall() + "{\n");
+		srcAppend(tu, "void " + tu.getCall() + "{\n");
 
-		groupItemCalls.forEach(call -> 
-			outputBuffer.appendTo("SRC", trimmedSrcPath, call + ";\n"));
+		for (String call : groupItemCalls) {
+			srcAppend(tu, call + ";\n");
+		}
 
-		outputBuffer.appendTo("SRC", trimmedSrcPath, "}");
+		srcAppend(tu, "}");
 	}
 
 }
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/InstrumentationTransformer.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/InstrumentationTransformer.java
index 3d4b628..f4247d0 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/InstrumentationTransformer.java
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/InstrumentationTransformer.java
@@ -23,6 +23,7 @@
 import org.eclipse.app4mc.transformation.util.OutputBuffer;
 
 import com.google.inject.Inject;
+
 public class InstrumentationTransformer extends SLGBaseTransformer {
 
 	@Inject private OutputBuffer outputBuffer;
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/LabelAccessTransformer.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/LabelAccessTransformer.java
index 293c2e5..d5969a1 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/LabelAccessTransformer.java
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/LabelAccessTransformer.java
@@ -1,6 +1,6 @@
 /**
  ********************************************************************************
- * Copyright (c) 2021 Robert Bosch GmbH.
+ * Copyright (c) 2020-2021 Robert Bosch GmbH.
  * 
  * This program and the accompanying materials are made
  * available under the terms of the Eclipse Public License 2.0
@@ -15,10 +15,13 @@
 
 package org.eclipse.app4mc.slg.commons.m2t.transformers.sw;
 
+import static org.eclipse.app4mc.amalthea.model.LabelAccessEnum._UNDEFINED_;
+
 import org.eclipse.app4mc.amalthea.model.LabelAccess;
-import org.eclipse.app4mc.slg.commons.m2t.generators.LabelAccessTranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.generators.LabelTranslationUnit;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
+import org.eclipse.app4mc.amalthea.model.MinAvgMaxStatistic;
+import org.eclipse.app4mc.amalthea.model.NumericStatistic;
+import org.eclipse.app4mc.amalthea.model.SingleValueStatistic;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
 
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
@@ -26,12 +29,64 @@
 @Singleton
 public class LabelAccessTransformer {
 
-	@Inject private OutputBuffer outputBuffer;
 	@Inject private LabelTransformer labelTransformer;
 
-	public LabelAccessTranslationUnit transform(final LabelAccess labelAccess) {
-		final LabelTranslationUnit tuLabel = this.labelTransformer.transform(labelAccess.getData());
-		return new LabelAccessTranslationUnit(this.outputBuffer, tuLabel, labelAccess);
+	public SLGTranslationUnit transform(final LabelAccess labelAccess) {
+		final SLGTranslationUnit labelTU = labelTransformer.transform(labelAccess.getData());
+
+		return createTranslationUnit(labelAccess, labelTU);
+	}
+
+	private SLGTranslationUnit createTranslationUnit(LabelAccess labelAccess, SLGTranslationUnit labelTU) {
+		if ((labelTU == null)) {
+			return new SLGTranslationUnit("UNSPECIFIED LABEL ACCESS");
+		}
+
+		String basePath = labelTU.getBasePath();
+		String moduleName = labelTU.getModuleName();
+		String call = computeCall(labelAccess);
+		return new SLGTranslationUnit(basePath, moduleName, call);
+	}
+
+	private String computeCall(final LabelAccess labelAccess) {
+
+		if (labelAccess == null
+				|| labelAccess.getData() == null
+				|| labelAccess.getData().getName() == null
+				|| labelAccess.getData().getName().isEmpty())
+			return "/* unspecified label access */";	
+		
+		if (labelAccess.getAccess() == _UNDEFINED_) {
+			return ("/*underspecified access to label" + labelAccess.getData().getName()) + "*/";				
+		}
+
+		final NumericStatistic stat = statisticValueOrNull(labelAccess);
+		final String statString = (stat == null) ? "1" : getNumericStatistic(stat);
+
+		switch (labelAccess.getAccess()) {
+		case READ:
+			return "read_" + labelAccess.getData().getName() + "(" + statString + ")"; 
+		case WRITE:
+			return "write_" + labelAccess.getData().getName() + "(" + statString + ")"; 
+		default:
+			return null;
+		}
+	}
+
+	private NumericStatistic statisticValueOrNull(final LabelAccess access) {
+		if (access == null || access.getStatistic() == null) return null;
+		
+		return access.getStatistic().getValue();
+	}
+
+	private String getNumericStatistic(final NumericStatistic statistic) {
+		if (statistic instanceof MinAvgMaxStatistic) {
+			String valueString = String.format("%d", Math.ceil(((MinAvgMaxStatistic) statistic).getAvg()));
+			return (valueString + " /*MinAvgMaxStatistic not supported yet*/");
+		} else if (statistic instanceof SingleValueStatistic) {
+			return String.format("%d", Math.ceil(((SingleValueStatistic) statistic).getValue()));
+		}
+		return null;
 	}
 
 }
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/LabelTransformer.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/LabelTransformer.java
index 995fef5..c2c2ed3 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/LabelTransformer.java
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/LabelTransformer.java
@@ -16,14 +16,16 @@
 package org.eclipse.app4mc.slg.commons.m2t.transformers.sw;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 import org.eclipse.app4mc.amalthea.model.Label;
 import org.eclipse.app4mc.slg.commons.m2t.generators.LabelGenerator;
-import org.eclipse.app4mc.slg.commons.m2t.generators.LabelTranslationUnit;
 import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGBaseTransformer;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
 import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.xtext.xbase.lib.CollectionLiterals;
 
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
@@ -31,36 +33,74 @@
 @Singleton
 public class LabelTransformer extends SLGBaseTransformer {
 
+	public static final String LIB_NAME = "LABELS_LIB";
+	public static final String BASE_PATH = "synthetic_gen";
+	public static final String MODULE_NAME = "labels";
+	public static final String MODULE_PATH = BASE_PATH + "/" + MODULE_NAME;
+	public static final String MAKEFILE_PATH = MODULE_PATH + "/CMakeLists.txt";
+
 	@Inject private OutputBuffer outputBuffer;
 
-	public LabelTranslationUnit transform(final Label label) {
-		final ArrayList<?> key = CollectionLiterals.newArrayList(label);
-		final LabelTranslationUnit _result;
-		synchronized (cache) {
-			if (cache.containsKey(key)) {
-				return cache.get(key);
+	// ---------- generic part "def create new transform(...)" ----------
+
+	private final Map<List<Object>, SLGTranslationUnit> transformCache = new HashMap<>();
+
+	public Map<List<Object>, SLGTranslationUnit> getCache() {
+		return this.transformCache;
+	}
+
+	public SLGTranslationUnit transform(final Label label) {
+		final List<Object> key = new ArrayList<>(Arrays.asList(label));
+		final SLGTranslationUnit tu;
+
+		synchronized (transformCache) {
+			if (transformCache.containsKey(key)) {
+				return transformCache.get(key);
 			}
-			LabelTranslationUnit tu = new LabelTranslationUnit(this.outputBuffer, label);
-			_result = tu;
-			cache.put(key, _result);
+			tu = createTranslationUnit(label);
+			transformCache.put(key, tu);
 		}
-		_init_transform(_result, label);
-		return _result;
+
+		// if translation unit is newly created and valid -> create files
+		if (tu.isValid()) {
+			doTransform(tu, label);
+		}
+
+		return tu;
 	}
 
-	private final HashMap<ArrayList<?>, LabelTranslationUnit> cache = CollectionLiterals.newHashMap();
+	// ---------------------------------------------------
 
-	private void _init_transform(final LabelTranslationUnit it, final Label label) {
+	public SLGTranslationUnit createTranslationUnit(final Label label) {
+		if ((label == null)) {
+			return new SLGTranslationUnit("UNSPECIFIED LABEL");
+		} else {
+			String basePath = BASE_PATH;
+			String moduleName = MODULE_NAME;
+			String call = label.getName();
+			return new SLGTranslationUnit(basePath, moduleName, call);
+		}
 	}
 
-	@Override
-	public HashMap<ArrayList<?>, LabelTranslationUnit> getCache() {
-		return this.cache;
+	private void doTransform(final SLGTranslationUnit tu, final Label label) {
+		genFiles(tu, label);
+	}
+
+	public void genFiles(SLGTranslationUnit tu, Label label) {
+		if (isSrcFileEmpty(tu)) {
+			srcAppend(tu, "#include \"" + getIncFile(tu) + "\"\n\n");
+		}
+		if (isIncFileEmpty(tu)) {	// Mc: ???
+			incAppend(tu, "#include <stdbool.h>\n\n");
+		}
+
+		incAppend(tu, LabelGenerator.toH(label));
+		srcAppend(tu, LabelGenerator.toCpp(label));
 	}
 
 	public boolean createCMake() {
-		return this.outputBuffer.appendTo("OTHER", LabelTranslationUnit.getMakeFilePathStatic(),
-				LabelGenerator.toCMake(this.getSrcFiles()));
+		return outputBuffer.appendTo(
+				"OTHER", MAKEFILE_PATH, LabelGenerator.toCMake(LIB_NAME, getSrcFiles()));
 	}
 
 }
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/RunnableTransformer.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/RunnableTransformer.java
index 1633866..a690a58 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/RunnableTransformer.java
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/RunnableTransformer.java
@@ -1,6 +1,6 @@
 /**
  ********************************************************************************
- * Copyright (c) 2021 Robert Bosch GmbH.
+ * Copyright (c) 2020-2021 Robert Bosch GmbH.
  * 
  * This program and the accompanying materials are made
  * available under the terms of the Eclipse Public License 2.0
@@ -16,15 +16,19 @@
 package org.eclipse.app4mc.slg.commons.m2t.transformers.sw;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
 import java.util.Map;
 
+import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
+import org.eclipse.app4mc.amalthea.model.Runnable;
 import org.eclipse.app4mc.slg.commons.m2t.generators.RunnableGenerator;
-import org.eclipse.app4mc.slg.commons.m2t.generators.RunnableTranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
 import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGBaseTransformer;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
 import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.xtext.xbase.lib.CollectionLiterals;
 
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
@@ -33,39 +37,107 @@
 public class RunnableTransformer extends SLGBaseTransformer {
 
 	@Inject private OutputBuffer outputBuffer;
-	@Inject private ActivityGraphItemTransformer psCallGraphItemTransformer;
+	@Inject private ActivityGraphItemTransformer activityGraphItemTransformer;
 
-	public RunnableTranslationUnit transform(final org.eclipse.app4mc.amalthea.model.Runnable runnable) {
-		final ArrayList<?> key = CollectionLiterals.newArrayList(runnable);
-		final RunnableTranslationUnit _result;
-		synchronized (cache) {
-			if (cache.containsKey(key)) {
-				return cache.get(key);
-			}
-			RunnableTranslationUnit tu = new RunnableTranslationUnit(this.outputBuffer,
-					this.psCallGraphItemTransformer, runnable);
-			_result = tu;
-			cache.put(key, _result);
-		}
-		_init_transform(_result, runnable);
-		return _result;
-	}
+	// ---------- generic part "def create new transform(...)" ----------
 
-	private final HashMap<ArrayList<?>, RunnableTranslationUnit> cache = CollectionLiterals
-			.newHashMap();
-
-	private void _init_transform(final RunnableTranslationUnit it,
-			final org.eclipse.app4mc.amalthea.model.Runnable runnable) {
-	}
+	private final Map<List<Object>, SLGTranslationUnit> transformCache = new HashMap<>();
 
 	@Override
-	public Map<ArrayList<?>, ? extends TranslationUnit> getCache() {
-		return this.cache;
+	public Map<List<Object>, SLGTranslationUnit> getCache() {
+		return this.transformCache;
+	}
+
+	public SLGTranslationUnit transform(final Runnable runnable) {
+		final List<Object> key = new ArrayList<>(Arrays.asList(runnable));
+		final SLGTranslationUnit tu;
+
+		synchronized (transformCache) {
+			if (transformCache.containsKey(key)) {
+				return transformCache.get(key);
+			}
+			tu = createTranslationUnit(runnable);
+			transformCache.put(key, tu);
+		}
+
+		// if translation unit is newly created and valid -> create files
+		if (tu.isValid()) {
+			doTransform(tu, runnable);
+		}
+
+		return tu;
+	}
+
+	// ---------------------------------------------------
+
+	public SLGTranslationUnit createTranslationUnit(final Runnable runnable) {
+		if ((runnable == null)) {
+			return new SLGTranslationUnit("UNSPECIFIED RUNNABLE");
+		} else {
+			String basePath = "synthetic_gen";
+			String moduleName = "runnables";
+			String call = "run_" + runnable.getName() + "()";
+			return new SLGTranslationUnit(basePath, moduleName, call);
+		}
+	}
+
+	private void doTransform(final SLGTranslationUnit tu, final Runnable runnable) {
+		genFiles(tu, runnable);
+	}
+
+	public void genFiles(final SLGTranslationUnit tu, final Runnable runnable) {
+		if (isSrcFileEmpty(tu)) {
+			srcAppend(tu, "#include \"" + getIncFile(tu) + "\"\n");
+		}
+
+		final HashSet<String> includes = new LinkedHashSet<>();
+		final List<String> calls = new ArrayList<>();
+		
+		if (runnable != null && runnable.getActivityGraph() != null) {
+			for (ActivityGraphItem item : runnable.getActivityGraph().getItems()) {
+
+				final SLGTranslationUnit tmpTU = activityGraphItemTransformer.transform(item);
+				
+				String tmpIncFile = getIncFile(tmpTU);
+				if (tmpIncFile != null && !tmpIncFile.isEmpty() && !tmpIncFile.equals(getIncFile(tu))) {
+					includes.add(tmpIncFile);
+				}
+				final String tmpCall = tmpTU.getCall();
+				if (tmpCall != null && !tmpCall.isEmpty()) {
+					calls.add(tmpCall);
+				}
+			}
+		}
+
+		incAppend(tu, "\n//Runnable " + runnable.getName() + "----\n");
+		toH(tu, includes);
+
+		srcAppend(tu, "\n//Runnable " + runnable.getName() + "----\n");
+		toCpp(tu, calls);
+	}
+
+	private void toH(final SLGTranslationUnit tu, final HashSet<String> includes) {
+		for (String include : includes) {
+			incAppend(tu, "#include \"" + include + "\"\n");
+		}
+
+		incAppend(tu, "void " + tu.getCall() + ";\n");
+	}
+
+	private void toCpp(final SLGTranslationUnit tu, final List<String> calls) {
+		srcAppend(tu, "void " + tu.getCall() + "{\n");
+
+		for (String call : calls) {
+			srcAppend(tu, "\t" + call + ";\n");
+		}
+
+		srcAppend(tu, "}\n\n");
 	}
 
 	public boolean createCMake() {
-		return this.outputBuffer.appendTo("OTHER", RunnableTranslationUnit.getMakeFilePathStatic(),
-				RunnableGenerator.toCMake(this.getSrcFiles()));
+		// Building rule: basePath + moduleName + "CMakeLists.txt"
+		String makeFilePath = "synthetic_gen/runnables/CMakeLists.txt";
+		return outputBuffer.appendTo("OTHER", makeFilePath, RunnableGenerator.toCMake(getSrcFiles()));
 	}
 
 }
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/TaskTransformer.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/TaskTransformer.java
index 17b31fe..8b6667c 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/TaskTransformer.java
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/TaskTransformer.java
@@ -16,16 +16,24 @@
 package org.eclipse.app4mc.slg.commons.m2t.transformers.sw;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 
-import org.eclipse.app4mc.amalthea.model.Component;
+import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
+import org.eclipse.app4mc.amalthea.model.Label;
+import org.eclipse.app4mc.amalthea.model.Runnable;
+import org.eclipse.app4mc.amalthea.model.RunnableCall;
+import org.eclipse.app4mc.amalthea.model.Tag;
 import org.eclipse.app4mc.amalthea.model.Task;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TaskTranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
+import org.eclipse.app4mc.slg.commons.m2t.generators.LabelGenerator;
+import org.eclipse.app4mc.slg.commons.m2t.generators.TaskGenerator;
 import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGBaseTransformer;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.xtext.xbase.lib.CollectionLiterals;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
 
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
@@ -33,34 +41,92 @@
 @Singleton
 public class TaskTransformer extends SLGBaseTransformer {
 
-	@Inject private OutputBuffer outputBuffer;
 	@Inject private RunnableTransformer runnableTransformer;
 	@Inject private LabelTransformer labelTransformer;
 
-	public TaskTranslationUnit transform(final Task task, final Component component) {
-		final ArrayList<?> key = CollectionLiterals.newArrayList(task, component);
-		final TaskTranslationUnit _result;
-		synchronized (cache) {
-			if (cache.containsKey(key)) {
-				return cache.get(key);
-			}
-			TaskTranslationUnit _taskTranslationUnit = new TaskTranslationUnit(this.outputBuffer,
-					this.runnableTransformer, this.labelTransformer, task, component);
-			_result = _taskTranslationUnit;
-			cache.put(key, _result);
-		}
-		_init_transform(_result, task, component);
-		return _result;
-	}
+	// ---------- generic part "def create new transform(...)" ----------
 
-	private final HashMap<ArrayList<?>, TaskTranslationUnit> cache = CollectionLiterals.newHashMap();
-
-	private void _init_transform(final TaskTranslationUnit it, final Task task, final Component component) {
-	}
+	private final Map<List<Object>, SLGTranslationUnit> transformCache = new HashMap<>();
 
 	@Override
-	public Map<ArrayList<?>, ? extends TranslationUnit> getCache() {
-		return this.cache;
+	public Map<List<Object>, SLGTranslationUnit> getCache() {
+		return this.transformCache;
+	}
+
+	public SLGTranslationUnit transform(final Task task) {
+		final List<Object> key = new ArrayList<>(Arrays.asList(task));
+		final SLGTranslationUnit tu;
+
+		synchronized (transformCache) {
+			if (transformCache.containsKey(key)) {
+				return transformCache.get(key);
+			}
+			tu = createTranslationUnit(task);
+			transformCache.put(key, tu);
+		}
+
+		// if translation unit is newly created and valid -> create files
+		if (tu.isValid()) {
+			doTransform(tu, task);
+		}
+
+		return tu;
+	}
+
+	// ---------------------------------------------------
+
+	public SLGTranslationUnit createTranslationUnit(final Task task) {
+		if ((task == null)) {
+			return new SLGTranslationUnit("UNSPECIFIED TASK");
+		} else {
+			String basePath = "";
+			String moduleName = task.getName();
+			String call = "" + task.getName() + "()"; // unused
+			return new SLGTranslationUnit(basePath, moduleName, call);
+		}
+	}
+
+	private void doTransform(final SLGTranslationUnit tu, final Task task) {
+		genFiles(tu, task);
+	}
+
+	public void genFiles(SLGTranslationUnit tu, final Task task) {
+
+		final LinkedHashSet<String> includes = new LinkedHashSet<>();
+		final LinkedList<String> initCalls = new LinkedList<>();
+		final LinkedList<String> stepCalls = new LinkedList<>();
+
+		if (task != null && task.getActivityGraph() != null) {
+			for (ActivityGraphItem item : task.getActivityGraph().getItems()) {
+
+				if (item instanceof RunnableCall) {
+					final Runnable runnable = ((RunnableCall) item).getRunnable();
+					final SLGTranslationUnit runnableTU = runnableTransformer.transform(runnable);
+
+					includes.add(getIncFile(runnableTU));
+
+					List<Tag> tags = ((RunnableCall) item).getTags();
+					if (tags.stream().anyMatch(tag -> "initialize".equals(tag.getName()))) {
+						initCalls.add(runnableTU.getCall());
+					} else {
+						stepCalls.add(runnableTU.getCall());
+					}
+				}
+			}
+		}
+
+		for (Entry<List<Object>, SLGTranslationUnit> entry : labelTransformer.getCache().entrySet()) {
+			if (entry.getKey().get(0) instanceof Label) {	// Mc: use better way to get the object of interest
+				Label label = (Label) entry.getKey();
+				SLGTranslationUnit labelTU = entry.getValue();
+
+				includes.add(getIncFile(labelTU));
+				initCalls.add(LabelGenerator.initCall(label));
+			}
+		}
+
+		incAppend(tu, TaskGenerator.toH(tu));
+		srcAppend(tu, TaskGenerator.toCpp(tu, getIncFile(tu), includes, initCalls, stepCalls));
 	}
 
 }
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/TicksTransformer.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/TicksTransformer.java
index fee1ec6..839f1be 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/TicksTransformer.java
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/TicksTransformer.java
@@ -1,6 +1,6 @@
 /**
  ********************************************************************************
- * Copyright (c) 2021 Robert Bosch GmbH.
+ * Copyright (c) 2020-2021 Robert Bosch GmbH.
  * 
  * This program and the accompanying materials are made
  * available under the terms of the Eclipse Public License 2.0
@@ -15,17 +15,16 @@
 
 package org.eclipse.app4mc.slg.commons.m2t.transformers.sw;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
 
 import org.eclipse.app4mc.amalthea.model.IDiscreteValueDeviation;
 import org.eclipse.app4mc.amalthea.model.ProcessingUnitDefinition;
 import org.eclipse.app4mc.amalthea.model.Ticks;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TicksTranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TicksUtilsTranslationUnit;
+import org.eclipse.app4mc.slg.commons.m2t.generators.TicksGenerator;
 import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGBaseTransformer;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
 import org.eclipse.emf.common.util.EMap;
 
 import com.google.inject.Inject;
@@ -34,42 +33,54 @@
 @Singleton
 public class TicksTransformer extends SLGBaseTransformer {
 
-	@Inject private OutputBuffer outputBuffer;
 	@Inject private TicksUtilsTransformer ticksUtilsTransformer;
 
-	public TicksTranslationUnit transform(final Ticks ticks) {
+	public SLGTranslationUnit transform(final Ticks ticks) {
 		if (ticks.getDefault() != null) {
-			final TicksUtilsTranslationUnit tuTicks = ticksUtilsTransformer.generate(ticks.getDefault());
-			return new TicksTranslationUnit(outputBuffer, tuTicks, ticks, "default", ticks.getDefault());
+			final SLGTranslationUnit ticksUtilsTU = ticksUtilsTransformer.transform(ticks.getDefault());
+
+			return createTranslationUnit(ticks, ticksUtilsTU);
 		}
+
 		return null;
 	}
 
-	public List<TicksTranslationUnit> transformAllItems(final Ticks ticks) {
-		final List<TicksTranslationUnit> result = new ArrayList<TicksTranslationUnit>();
+	private SLGTranslationUnit createTranslationUnit(Ticks ticks, SLGTranslationUnit ticksUtilsTU) {
+		if ((ticksUtilsTU == null)) {
+			return new SLGTranslationUnit("UNSPECIFIED TICKS");			
+		}
+
+		String basePath = ticksUtilsTU.getBasePath();
+		String moduleName = ticksUtilsTU.getModuleName();
+		String call = computeCall(ticks);
+		return new SLGTranslationUnit(basePath, moduleName, call);
+	}
+
+	private String computeCall(Ticks ticks) {
+		String parameters = TicksGenerator.getParameters(ticks.getDefault());
+		String className = ticks.getDefault().eClass().getName();
+		return "executeTicks_" + className +"(" + parameters + ")";
+	}
+
+	public Map<String, SLGTranslationUnit> transformAllItems(final Ticks ticks) {
+		final Map<String, SLGTranslationUnit> result = new HashMap<>();
+		
 		final IDiscreteValueDeviation defaultTicks = ticks.getDefault();
 		if ((defaultTicks != null)) {
-			final TicksUtilsTranslationUnit tuTicks = this.ticksUtilsTransformer.generate(ticks.getDefault());
-			result.add(new TicksTranslationUnit(this.outputBuffer, tuTicks, ticks,
-					"default", ticks.getDefault()));
+			final SLGTranslationUnit ticksUtilsTU = ticksUtilsTransformer.transform(defaultTicks);
+			result.put("default", createTranslationUnit(ticks, ticksUtilsTU));
 		}
-		EMap<ProcessingUnitDefinition, IDiscreteValueDeviation> _extended = null;
-		if (ticks != null) {
-			_extended = ticks.getExtended();
-		}
-		final EMap<ProcessingUnitDefinition, IDiscreteValueDeviation> puExtendedMap = _extended;
-		Set<ProcessingUnitDefinition> _keySet = puExtendedMap.keySet();
-		for (final ProcessingUnitDefinition puDefinition : _keySet) {
-			{
-				final IDiscreteValueDeviation ticksValue = puExtendedMap.get(puDefinition);
-				if (((puDefinition != null) && (ticksValue != null))) {
-					final TicksUtilsTranslationUnit tuTicks_1 = this.ticksUtilsTransformer.generate(ticksValue);
-					String _name = puDefinition.getName();
-					TicksTranslationUnit _ticksTranslationUnit_1 = new TicksTranslationUnit(this.outputBuffer,
-							tuTicks_1, ticks, _name, ticksValue);
-					result.add(_ticksTranslationUnit_1);
-				}
+
+		final EMap<ProcessingUnitDefinition, IDiscreteValueDeviation> extendedTicksMap = ticks.getExtended();
+		for (final Entry<ProcessingUnitDefinition, IDiscreteValueDeviation> entry : extendedTicksMap.entrySet()) {
+			final ProcessingUnitDefinition puDefinition = entry.getKey();
+			final IDiscreteValueDeviation ticksDeviation = entry.getValue();
+
+			if (puDefinition != null && ticksDeviation != null) {
+				final SLGTranslationUnit ticksUtilsTU = this.ticksUtilsTransformer.transform(ticksDeviation);
+				result.put(puDefinition.getName(), createTranslationUnit(ticks, ticksUtilsTU));
 			}
+
 		}
 		return result;
 	}
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/TicksUtilsTransformer.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/TicksUtilsTransformer.java
index 6e81f1f..a7af03f 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/TicksUtilsTransformer.java
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/TicksUtilsTransformer.java
@@ -15,19 +15,22 @@
 
 package org.eclipse.app4mc.slg.commons.m2t.transformers.sw;
 
+import static org.eclipse.app4mc.slg.commons.m2t.transformers.SLGBaseSettings.OTHER_TYPE;
+
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.eclipse.app4mc.amalthea.model.IDiscreteValueDeviation;
 import org.eclipse.app4mc.slg.commons.m2t.CustomObjectsStore;
 import org.eclipse.app4mc.slg.commons.m2t.generators.TicksUtilsGenerator;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TicksUtilsTranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
 import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGBaseTransformer;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
 import org.eclipse.app4mc.slg.config.ConfigModel;
 import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.xtext.xbase.lib.CollectionLiterals;
+import org.eclipse.emf.ecore.EClass;
 
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
@@ -38,45 +41,94 @@
 	@Inject private OutputBuffer outputBuffer;
 	@Inject private CustomObjectsStore customObjsStore;
 
-	public TicksUtilsTranslationUnit generate(final IDiscreteValueDeviation value) {
-		return this.generateIntern(value.getClass());
+	public SLGTranslationUnit transform(final IDiscreteValueDeviation value) {
+		if (value == null)
+			return new SLGTranslationUnit("UNSPECIFIED TICKS");
+
+		return transformClass(value.eClass()); // hash according to class not instance
 	}
 
-	public TicksUtilsTranslationUnit generateIntern(final Object valueClass) {
-		final ArrayList<?> key = CollectionLiterals.newArrayList(valueClass);
-		final TicksUtilsTranslationUnit _result;
-		synchronized (cache) {
-			if (cache.containsKey(key)) {
-				return cache.get(key);
+	// ---------- generic part "def create new transform(...)" ----------
+
+	private final Map<List<Object>, SLGTranslationUnit> transformCache = new HashMap<>();
+
+	public Map<List<Object>, SLGTranslationUnit> getCache() {
+		return this.transformCache;
+	}
+
+	public SLGTranslationUnit transformClass(final EClass eClass) {
+		final List<Object> key = new ArrayList<>(Arrays.asList(eClass));
+		final SLGTranslationUnit tu;
+
+		synchronized (transformCache) {
+			if (transformCache.containsKey(key)) {
+				return transformCache.get(key);
 			}
-			ConfigModel _instance = this.customObjsStore.<ConfigModel>getInstance(ConfigModel.class);
-			TicksUtilsTranslationUnit tu = new TicksUtilsTranslationUnit(this.outputBuffer,
-					_instance, valueClass);
-			_result = tu;
-			cache.put(key, _result);
+			tu = createTranslationUnit(eClass);
+			transformCache.put(key, tu);
 		}
-		_init_generateIntern(_result, valueClass);
-		return _result;
+
+		// if translation unit is newly created and valid -> create files
+		if (tu.isValid()) {
+			doTransform(tu, eClass);
+		}
+
+		return tu;
 	}
 
-	private final HashMap<ArrayList<?>, TicksUtilsTranslationUnit> cache = CollectionLiterals
-			.newHashMap();
+	// ---------------------------------------------------
 
-	private void _init_generateIntern(final TicksUtilsTranslationUnit it, final Object valueClass) {
+	private SLGTranslationUnit createTranslationUnit(final EClass eClass) {
+		if (eClass == null) {
+			return new SLGTranslationUnit("UNSPECIFIED TICKS");
+		} else {
+			String basePath = "synthetic_gen";
+			String moduleName = "ticksUtils";
+			String call = "burnTicks(<params>)"; // unused
+			return new SLGTranslationUnit(basePath, moduleName, call);
+		}
 	}
 
-	@Override
-	public Map<ArrayList<?>, ? extends TranslationUnit> getCache() {
-		return this.cache;
+	private void doTransform(final SLGTranslationUnit tu, final EClass eClass) {
+		genFiles(tu, eClass);
 	}
 
-	public boolean write() {
-		return this.createCMake();
+	public void genFiles(SLGTranslationUnit tu, final EClass eClass) {
+		if (isIncFileEmpty(tu)) {
+			toH(tu);
+		}
+		if (isSrcFileEmpty(tu)) {
+			toCPP(tu);
+		}
+		srcAppend(tu, TicksUtilsGenerator.generateTicks(eClass));
+		incAppend(tu, TicksUtilsGenerator.generateTicksDeclaration(eClass));
 	}
 
-	public boolean createCMake() {
-		return this.outputBuffer.appendTo("OTHER", TicksUtilsTranslationUnit.getMakeFilePathStatic(),
-				TicksUtilsGenerator.toCMake(this.getSrcFiles()));
+	private void toCPP(SLGTranslationUnit tu) {
+		srcAppend(tu, "#include \"" + getIncFile(tu) + "\"\n");
+
+		final ConfigModel configModel = customObjsStore.<ConfigModel>getInstance(ConfigModel.class);
+
+		final String ticksCodeSnippet = configModel.getCustomTickImpl().getValue();
+		final boolean ticksCodeEnabled = configModel.getCustomTickImpl().isEnable();
+		
+		final String burnTicksBody = ticksCodeEnabled ? ticksCodeSnippet : TicksUtilsGenerator.burnTicksDefault();
+
+		srcAppend(tu, TicksUtilsGenerator.burnTicks(burnTicksBody));
+		srcAppend(tu, TicksUtilsGenerator.burnTicksStatistics(configModel));
+	}
+
+	private void toH(SLGTranslationUnit tu) {
+
+		incAppend(tu, TicksUtilsGenerator.burnTicksDeclaration());
+		incAppend(tu, TicksUtilsGenerator.burnTicksStatisticsDeclaration());
+
+	}
+
+	public void createCMake() {
+		// Building rule: basePath + moduleName + "CMakeLists.txt"
+		String makeFilePath = "synthetic_gen/ticksUtils/CMakeLists.txt";
+		outputBuffer.appendTo(OTHER_TYPE, makeFilePath, TicksUtilsGenerator.toCMake(getSrcFiles()));
 	}
 
 }
diff --git a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/customization/CustomRunnableTransformer.java b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/customization/CustomRunnableTransformer.java
index d1feece..c89da4c 100644
--- a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/customization/CustomRunnableTransformer.java
+++ b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/customization/CustomRunnableTransformer.java
@@ -1,4 +1,5 @@
 /**
+ ********************************************************************************
  * Copyright (c) 2020-2021 Robert Bosch GmbH.
  * 
  * This program and the accompanying materials are made
@@ -9,47 +10,201 @@
  * 
  * Contributors:
  *     Robert Bosch GmbH - initial API and implementation
+ ********************************************************************************
  */
 
 package org.eclipse.app4mc.slg.customization;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
 
+import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
+import org.eclipse.app4mc.amalthea.model.InterProcessTrigger;
+import org.eclipse.app4mc.amalthea.model.Process;
 import org.eclipse.app4mc.amalthea.model.Runnable;
-import org.eclipse.app4mc.slg.commons.m2t.generators.RunnableTranslationUnit;
+import org.eclipse.app4mc.amalthea.model.Ticks;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
 import org.eclipse.app4mc.slg.commons.m2t.transformers.sw.ActivityGraphItemTransformer;
 import org.eclipse.app4mc.slg.commons.m2t.transformers.sw.RunnableTransformer;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.xtext.xbase.lib.CollectionLiterals;
+import org.eclipse.app4mc.slg.linux.transformers.LinuxBaseSettings;
 
 import com.google.inject.Inject;
+import com.google.inject.Singleton;
 
+@Singleton
 public class CustomRunnableTransformer extends RunnableTransformer {
 
-	@Inject private OutputBuffer outputBuffer;
-	@Inject private ActivityGraphItemTransformer psCallGraphItemTransformer;
+	@Inject private ActivityGraphItemTransformer activityGraphItemTransformer;
+
+	// ---------- generic part "def create new transform(...)" ----------
+
+	private final Map<List<Object>, SLGTranslationUnit> transformCache = new HashMap<>();
 
 	@Override
-	public RunnableTranslationUnit transform(final Runnable runnable) {
-		final ArrayList<?> key = CollectionLiterals.newArrayList(runnable);
-		final CustomRunnableTranslationUnit result;
-		synchronized (_createCache_transform) {
-			if (_createCache_transform.containsKey(key)) {
-				return _createCache_transform.get(key);
+	public Map<List<Object>, SLGTranslationUnit> getCache() {
+		return this.transformCache;
+	}
+
+	@Override
+	public SLGTranslationUnit transform(final Runnable runnable) {
+		final List<Object> key = new ArrayList<>(Arrays.asList(runnable));
+		final SLGTranslationUnit tu;
+
+		synchronized (transformCache) {
+			if (transformCache.containsKey(key)) {
+				return transformCache.get(key);
 			}
-			CustomRunnableTranslationUnit tu = new CustomRunnableTranslationUnit(
-					this.outputBuffer, this.psCallGraphItemTransformer, runnable);
-			result = tu;
-			_createCache_transform.put(key, result);
+			tu = createTranslationUnit(runnable);
+			transformCache.put(key, tu);
 		}
-		doTransform(result, runnable);
-		return result;
+
+		// if translation unit is newly created and valid -> create files
+		if (tu.isValid()) {
+			doTransform(tu, runnable);
+		}
+
+		return tu;
 	}
 
-	private final HashMap<ArrayList<?>, RunnableTranslationUnit> _createCache_transform = CollectionLiterals
-			.newHashMap();
+	// ---------------------------------------------------
 
-	private void doTransform(final CustomRunnableTranslationUnit tu, final Runnable runnable) {
+	@Override
+	public String getSrcFile(SLGTranslationUnit tu) { return tu.getModuleName() + LinuxBaseSettings.SRC_EXT; }
+
+	@Override
+	public String getIncFile(SLGTranslationUnit tu) { return tu.getModuleName() + LinuxBaseSettings.INC_EXT; }
+
+	// ---------------------------------------------------
+
+	@Override
+	public SLGTranslationUnit createTranslationUnit(final Runnable runnable) {
+		if ((runnable == null)) {
+			return new SLGTranslationUnit("UNSPECIFIED RUNNABLE");
+		} else {
+			String basePath = "synthetic_gen";
+			String moduleName = "runnables";
+			String call = "run_" + runnable.getName();
+			return new SLGTranslationUnit(basePath, moduleName, call);
+		}
 	}
+
+	private void doTransform(final SLGTranslationUnit tu, final Runnable runnable) {
+		genFiles(tu, runnable);
+	}
+
+	@Override
+	public void genFiles(final SLGTranslationUnit tu, final Runnable runnable) {
+		if (isSrcFileEmpty(tu)) {
+			srcAppend(tu, "#include \"" + getIncFile(tu) + "\"\n");
+		}
+
+		final HashSet<String> includes = new LinkedHashSet<>();
+		final List<String> calls = new ArrayList<>();
+		final List<Process> processedTasks = new ArrayList<>();
+
+		if (runnable != null && runnable.getActivityGraph() != null) {
+			for (final ActivityGraphItem item : runnable.getActivityGraph().getItems()) {
+				if (item instanceof Ticks) {
+					Ticks ticks = (Ticks) item;
+					final Map<String, SLGTranslationUnit> translationUnits = activityGraphItemTransformer.transformAllItems(ticks); // Mc: move method to TicksTransformer ?
+	
+					SLGTranslationUnit defaultTicksTU = null;
+					boolean ticksAssociatedToPUs = false;
+					
+					for (final Entry<String, SLGTranslationUnit> entry : translationUnits.entrySet()) {
+						String puName = entry.getKey();
+						SLGTranslationUnit tmpTU = entry.getValue();
+						
+						if (puName.equals("default")) {
+							defaultTicksTU = tmpTU;
+						} else {
+							final String tmpIncFile = getIncFile(tmpTU);
+							if (tmpIncFile != null && !tmpIncFile.isEmpty() && !getIncFile(tu).equals(tmpIncFile)) {
+								includes.add(tmpIncFile);
+							}
+							final String call = tmpTU.getCall();
+							if (call != null && !call.isEmpty()) {
+								calls.add(ticksAssociatedToPUs ? "else" : " if(strcmp(coreName,\"" + puName + "\")==0){");
+								calls.add(call);
+								calls.add("}");
+								ticksAssociatedToPUs = true;
+							}
+						}
+					}
+
+					if ((defaultTicksTU != null)) {
+						if (ticksAssociatedToPUs) {
+							calls.add("else ");
+						}
+						
+						if (defaultTicksTU.getCall() != null && !defaultTicksTU.getCall().isEmpty()) {
+							calls.add("{");
+							calls.add(defaultTicksTU.getCall());
+							calls.add("}");
+						}
+					}
+				} else {
+					if ((item instanceof InterProcessTrigger)) {
+						InterProcessTrigger trigger = (InterProcessTrigger) item;
+						final String value = CustomRunnableGenerator.handleInterProcessTrigger(trigger.getStimulus(), processedTasks);
+						if (value != null && !value.trim().isEmpty()) {
+							calls.add(value);
+						}
+					} else {
+						final SLGTranslationUnit tmpTU = activityGraphItemTransformer.transform(item);
+						
+						final String tmpIncFile = getIncFile(tmpTU);
+						if (tmpIncFile != null && !tmpIncFile.isEmpty() && !getIncFile(tu).equals(tmpIncFile)) {
+							includes.add(tmpIncFile);
+						}
+						final String call = tmpTU.getCall();
+						if (call != null && !call.isEmpty()) {
+							calls.add(call);
+						}
+					}
+				}
+			}
+		
+		}
+
+		String runnableName = runnable.getName();
+		
+		// write header
+		this.toH(tu, runnableName, includes);
+		
+		// write body
+		srcAppend(tu, "\n//Runnable " + runnableName + "----\n");
+		toCpp(tu, calls);
+	}
+
+	private void toH(final SLGTranslationUnit tu, final String runnableName, final HashSet<String> includes) {
+		if (isIncFileEmpty(tu)) {
+			incAppend(tu, "#include <string.h>\n");
+		}
+		
+		for(String include : includes) {
+			incAppend(tu, "#include \"" + include + "\"\n");
+		}
+
+		incAppend(tu, "\n//Runnable " + runnableName + "----\n");
+
+		incAppend(tu, "void " + tu.getCall() + "(char* coreName);\n");
+	}
+
+	private void toCpp(final SLGTranslationUnit tu, final List<String> calls) {
+		srcAppend(tu, "void " + tu.getCall() + "(char* coreName){\n");
+		
+		for (String call : calls) {
+			srcAppend(tu, "\t" + call + (call.endsWith(")") ? ";" : "") + "\n");			
+		}
+
+		srcAppend(tu, "}\n\n");
+	}
+
 }
diff --git a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/customization/CustomRunnableTranslationUnit.java b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/customization/CustomRunnableTranslationUnit.java
deleted file mode 100644
index 0227a1e..0000000
--- a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/customization/CustomRunnableTranslationUnit.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/**
- * Copyright (c) 2020-2021 Robert Bosch GmbH.
- * 
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- * 
- * SPDX-License-Identifier: EPL-2.0
- * 
- * Contributors:
- *     Robert Bosch GmbH - initial API and implementation
- */
-package org.eclipse.app4mc.slg.customization;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.List;
-
-import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
-import org.eclipse.app4mc.amalthea.model.InterProcessTrigger;
-import org.eclipse.app4mc.amalthea.model.Process;
-import org.eclipse.app4mc.amalthea.model.Runnable;
-import org.eclipse.app4mc.amalthea.model.Ticks;
-import org.eclipse.app4mc.slg.commons.m2t.generators.RunnableTranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TicksTranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.transformers.sw.ActivityGraphItemTransformer;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-
-public class CustomRunnableTranslationUnit extends RunnableTranslationUnit {
-	private final List<Process> processedTasks = new ArrayList<>();
-
-	public CustomRunnableTranslationUnit(final OutputBuffer outputBuffer,
-			final ActivityGraphItemTransformer callGraphItemTransformer,
-			final Runnable runnable) {
-		super(outputBuffer, callGraphItemTransformer, runnable);
-	}
-
-	@Override
-	public String getCall() {
-		return "run_" + runnable.getName();
-	}
-
-	@Override
-	public void genFiles() {
-		if (isSrcFileEmpty()) {
-			srcAppend("#include \"" + this.getIncFile() + "\"\n");
-		}
-		final HashSet<String> includes = new LinkedHashSet<>();
-		final List<String> calls = new ArrayList<>();
-		
-		if (runnable != null && runnable.getActivityGraph() != null) {
-			for (final ActivityGraphItem item : runnable.getActivityGraph().getItems()) {
-				if ((item instanceof Ticks)) {
-					Ticks ticks = (Ticks) item;
-					final List<TicksTranslationUnit> translationUnits = callGraphItemTransformer.transformAllItems(ticks);
-	
-					TicksTranslationUnit defaultPUTicks = null;
-					boolean ticksAssociatedToPUs = false;
-					
-					for (final TicksTranslationUnit tmp : translationUnits) {
-						if (tmp.getPuName().equals("default")) {
-							defaultPUTicks = tmp;
-						} else {
-							if (tmp.getIncFile() != null && !tmp.getIncFile().isEmpty() && !getIncFile().equals(tmp.getIncFile())) {
-								includes.add(tmp.getIncFile());
-							}
-							final String call = tmp.getCall();
-							if (call != null && !call.isEmpty()) {
-								calls.add((ticksAssociatedToPUs ? "else" : "") + " if(strcmp(coreName,\"" + tmp.getPuName() + "\")==0){");
-								calls.add(call);
-								calls.add("}");
-								ticksAssociatedToPUs = true;
-							}
-						}
-					}
-
-					if ((defaultPUTicks != null)) {
-						if (ticksAssociatedToPUs) {
-							calls.add("else ");
-						}
-						
-						if (defaultPUTicks.getCall() != null && !defaultPUTicks.getCall().isEmpty()) {
-							calls.add("{");
-							calls.add(defaultPUTicks.getCall());
-							calls.add("}");
-						}
-					}
-				} else {
-					if ((item instanceof InterProcessTrigger)) {
-						InterProcessTrigger trigger = (InterProcessTrigger) item;
-						final String value = CustomRunnableGenerator.handleInterProcessTrigger(trigger.getStimulus(), processedTasks);
-						if (value != null && !value.trim().isEmpty()) {
-							calls.add(value);
-						}
-					} else {
-						final TranslationUnit tmp = callGraphItemTransformer.transform(item);
-						
-						if (tmp.getIncFile() != null && !tmp.getIncFile().isEmpty() && !getIncFile().equals(tmp.getIncFile())) {
-							includes.add(tmp.getIncFile());
-						}
-						final String call = tmp.getCall();
-						if (call != null && !call.isEmpty()) {
-							calls.add(call);
-						}
-					}
-				}
-			}
-		
-		}
-		// write header
-		this.toH(includes);
-		
-		// write body
-		this.srcAppend("\n//Runnable " + runnable.getName() + "----\n");
-		this.toCpp(includes, calls);
-	}
-
-	@Override
-	public void toH(final HashSet<String> includes) {
-		if (isIncFileEmpty()) {
-			incAppend("#include <string.h>\n");
-		}
-		
-		for(String include : includes) {
-			incAppend("#include \"" + include + "\"\n");
-		}
-
-		incAppend("\n//Runnable " + this.runnable.getName() + "----\n");
-
-		incAppend("void " + getCall() + "(char* coreName);\n");
-	}
-
-	@Override
-	public void toCpp(final HashSet<String> includes, final List<String> calls) {
-		srcAppend((("void " + this.getCall()) + "(char* coreName){\n"));
-		
-		for (String call : calls) {
-			srcAppend("\t" + call + (call.endsWith(")") ? ";" : "") + "\n");			
-		}
-
-		srcAppend("}\n\n");
-	}
-
-}
diff --git a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/generators/LinuxTicksGenerator.xtend b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/generators/LinuxTicksGenerator.xtend
index e7d223b..d7b55b0 100644
--- a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/generators/LinuxTicksGenerator.xtend
+++ b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/generators/LinuxTicksGenerator.xtend
@@ -32,6 +32,15 @@
 		throw new IllegalStateException("Utility class");
 	}
 
+	static def dispatch String getParameters(DiscreteValueConstant value)
+		'''«value.value»'''
+
+	static def dispatch String getParameters(DiscreteValueStatistics value)
+		'''«value.average», «value.lowerBound», «value.upperBound»'''
+
+	static def dispatch String getParameters(DiscreteValueWeibullEstimatorsDistribution value)
+		'''«value.average»'''
+
 	static def dispatch String getParameters(IDiscreteValueDeviation value) '''
 		WARNING:VALUE_FORMAT_NOT_SUPPORTED	
 	'''
@@ -44,8 +53,6 @@
 		WARNING:VALUE_FORMAT_NOT_SUPPORTED
 	'''
 
-	static def dispatch String getParameters(DiscreteValueConstant value) '''«value.value»'''
-
 	static def dispatch String getParameters(DiscreteValueGaussDistribution value) '''
 		WARNING:VALUE_FORMAT_NOT_SUPPORTED
 	'''
@@ -54,14 +61,8 @@
 		WARNING:VALUE_FORMAT_NOT_SUPPORTED
 	'''
 
-	static def dispatch String getParameters(
-		DiscreteValueStatistics value) '''«value.average», «value.lowerBound», «value.upperBound»'''
-
 	static def dispatch String getParameters(DiscreteValueUniformDistribution value) '''
 		WARNING:VALUE_FORMAT_NOT_SUPPORTED
 	'''
 
-	static def dispatch String getParameters(DiscreteValueWeibullEstimatorsDistribution value) '''
-	«value.average»'''
-
 }
diff --git a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/generators/LinuxTicksUtilsGenerator.xtend b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/generators/LinuxTicksUtilsGenerator.xtend
index 978246f..cc6846a 100644
--- a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/generators/LinuxTicksUtilsGenerator.xtend
+++ b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/generators/LinuxTicksUtilsGenerator.xtend
@@ -10,7 +10,7 @@
  * 
  * Contributors:
  *     Robert Bosch GmbH - initial API and implementation
- ********************************************************************************
+ * *******************************************************************************
  */
 
 package org.eclipse.app4mc.slg.linux.generators
@@ -28,96 +28,49 @@
 	}
 
 	// ---------- names of generated 'C' functions ----------
-	
 	static def String getExecCall(String params) '''burnTicks(«params»)'''
-	
-	/*'''executeTicks_«valueClass.toString.split("\\.").last»(«params»)'''*/
-	
-	//--------------------------------------------------------------------
 
+	/*'''executeTicks_«valueClass.toString.split("\\.").last»(«params»)'''*/
+	// --------------------------------------------------------------------
 	static def String generateTicks(Object valueClass) {
 		switch valueClass {
 			case DiscreteValueConstantImpl: '''
-			void «getExecCall("int ticks")» {
-				burnTicks(ticks);
-			}
-			
+				void «getExecCall("int ticks")» {
+					burnTicks(ticks);
+				}
+				
 			'''
-			
 			case DiscreteValueStatisticsImpl: '''
-			void «getExecCall("double average, int lowerBound, int upperBound")» {
-				burnTicksStatistics(average, lowerBound, upperBound);
-			}
-			
+				void «getExecCall("double average, int lowerBound, int upperBound")» {
+					burnTicksStatistics(average, lowerBound, upperBound);
+				}
+				
 			'''
-			
 			default: ''''''
-			/*
-			'''
-			WARNING:VALUE_FORMAT_NOT_SUPPORTED: «valueClass»
-			
-			''' */
+		/*
+		 * '''
+		 * WARNING:VALUE_FORMAT_NOT_SUPPORTED: «valueClass»
+		 * 
+		 ''' */
 		}
 	}
 
-//	static def dispatch String generateTicks(IDiscreteValueDeviation value) '''
-//		WARNING:VALUE_FORMAT_NOT_SUPPORTED: IDiscreteValueDeviation		
-//	'''
-//
-//	static def dispatch String generateTicks(DiscreteValueBetaDistribution value) '''
-//		WARNING:VALUE_FORMAT_NOT_SUPPORTED: DiscreteValueBetaDistribution
-//	'''
-//
-//	static def dispatch String generateTicks(DiscreteValueBoundaries value) '''
-//		WARNING:VALUE_FORMAT_NOT_SUPPORTED: DiscreteValueBoundaries
-//	'''
-//
-//	static def dispatch String generateTicks(DiscreteValueConstant value) '''
-//		void «call»(int ticks) {
-//		 	burnTicks(ticks);
-//		}
-//		
-//	'''
-//
-//	static def dispatch String generateTicks(DiscreteValueGaussDistribution value) '''
-//		WARNING:VALUE_FORMAT_NOT_SUPPORTED:DiscreteValueGaussDistribution
-//	'''
-//
-//	static def dispatch String generateTicks(DiscreteValueHistogram value) '''
-//		WARNING:VALUE_FORMAT_NOT_SUPPORTED:DiscreteValueHistogram
-//	'''
-//
-////	TODO:what to do with boundaries, maybe better toggle between upper/lower or random selection from range   
-//	static def dispatch String generateTicks(DiscreteValueStatistics value) '''
-//		void «call»(double average, int lowerBound, int upperBound) {
-//			burnTicksStatistics(average, lowerBound, upperBound);
-//		}		
-//	'''
-//
-//	static def dispatch String generateTicks(DiscreteValueUniformDistribution value) '''
-//		WARNING:VALUE_FORMAT_NOT_SUPPORTED:DiscreteValueUniformDistribution
-//	'''
-//
-//	static def dispatch String generateTicks(DiscreteValueWeibullEstimatorsDistribution value) '''
-//		WARNING:VALUE_FORMAT_NOT_SUPPORTED:DiscreteValueWeibullEstimatorsDistribution
-//	'''
-	
-	    // ----- public interfaces -----
-    static def String burnTicks(String burnTicksBody) '''
-        void burnTicks(int ticks) {
-        	«burnTicksBody»
-        }
-
+	// ----- public interfaces -----
+	static def String burnTicks(String burnTicksBody) '''
+		void burnTicks(int ticks) {
+			«burnTicksBody»
+		}
+		
 	'''
-	
+
 	// select statistics parameter according to configuration model
 	// TODO: choose final names of configuration parameters
 	static def String chooseTicks(ConfigModel configModel) {
 		switch configModel.defaultTickType {
-			case TickType.MINIMUM: 	"lowerBound"
-			case TickType.MAXIMUM: 	"upperBound"
-			case TickType.AVERAGE : "(int)average"
-			default: 				"(int)average"
+			case TickType.MINIMUM: "lowerBound"
+			case TickType.MAXIMUM: "upperBound"
+			case TickType.AVERAGE: "(int)average"
+			default: "(int)average"
 		}
 	}
 
@@ -126,20 +79,19 @@
 			burnTicks(«chooseTicks(configModel)»);
 		}
 		
-    '''
-	
-	// ----- default implementations -----
+	  '''
 
+	// ----- default implementations -----
 	static def String burnTicksDefault() '''
 			// default implementation of tick burning
 			int numLoops = ticks / 400; 
 		#	if defined (__x86_64__)
 			int i;
-		 	for (i = 0; i < numLoops; i++) {
-		 		«FOR i : 1..400»
-		 			__asm volatile("nop");
-		 		«ENDFOR»
-		 		}
+				for (i = 0; i < numLoops; i++) {
+					«FOR i : 1..400»
+						__asm volatile("nop");
+					«ENDFOR»
+					}
 		#	elif defined (__x86_32__) 		
 		 		for (i = 0; i < numLoops; i++) {
 		 			 	«FOR i : 1..400»
@@ -154,80 +106,35 @@
 			}
 		#	endif
 	'''
-	
-	
-	//********************** API's to generate decleration **************************
-	
-	static def String burnTicksDecleration() '''
-        void burnTicks(int ticks);
 
+	// ********************** API's to generate decleration **************************
+	static def String burnTicksDeclaration() '''
+		void burnTicks(int ticks);
+		
 	'''
+
 	static def String burnTicksStatisticsDecleration() '''
 		void burnTicksStatistics(double average, int lowerBound, int upperBound);
 		
-    '''
- 
- 
-	
-	static def String generateTicksDecleration(Object valueClass) {
+	  '''
+
+	static def String generateTicksDeclaration(Object valueClass) {
 		switch valueClass {
 			case DiscreteValueConstantImpl: '''
-			void «getExecCall("int ticks")»;
-			
+				void «getExecCall("int ticks")»;
+				
 			'''
-			
 			case DiscreteValueStatisticsImpl: '''
-			void «getExecCall("double average, int lowerBound, int upperBound")»;
-			
+				void «getExecCall("double average, int lowerBound, int upperBound")»;
+				
 			'''
-			
 			default: ''''''
-			
-			/*
-			'''
-			WARNING:VALUE_FORMAT_NOT_SUPPORTED: «valueClass»
-			
-			''' */
+		/*
+		 * '''
+		 * WARNING:VALUE_FORMAT_NOT_SUPPORTED: «valueClass»
+		 * 
+		 ''' */
 		}
 	}
- 
 
-// static def dispatch String generateTicksDecleration(IDiscreteValueDeviation value) '''
-//		WARNING:VALUE_FORMAT_NOT_SUPPORTED: IDiscreteValueDeviation		
-//	'''
-//
-//	static def dispatch String generateTicksDecleration(DiscreteValueBetaDistribution value) '''
-//		WARNING:VALUE_FORMAT_NOT_SUPPORTED: DiscreteValueBetaDistribution
-//	'''
-//
-//	static def dispatch String generateTicksDecleration(DiscreteValueBoundaries value) '''
-//		WARNING:VALUE_FORMAT_NOT_SUPPORTED: DiscreteValueBoundaries
-//	'''
-//
-//	static def dispatch String generateTicksDecleration(DiscreteValueConstant value) '''
-//		void «call»(int ticks);
-//		
-//	'''
-//
-//	static def dispatch String generateTicksDecleration(DiscreteValueGaussDistribution value) '''
-//		WARNING:VALUE_FORMAT_NOT_SUPPORTED:DiscreteValueGaussDistribution
-//	'''
-//
-//	static def dispatch String generateTicksDecleration(DiscreteValueHistogram value) '''
-//		WARNING:VALUE_FORMAT_NOT_SUPPORTED:DiscreteValueHistogram
-//	'''
-//
-////	TODO:what to do with boundaries, maybe better toggle between upper/lower or random selection from range   
-//	static def dispatch String generateTicksDecleration(DiscreteValueStatistics value) '''
-//		void «call»(double average, int lowerBound, int upperBound) ;
-//	'''
-//
-//	static def dispatch String generateTicksDecleration(DiscreteValueUniformDistribution value) '''
-//		WARNING:VALUE_FORMAT_NOT_SUPPORTED:DiscreteValueUniformDistribution
-//	'''
-//
-//	static def dispatch String generateTicksDecleration(DiscreteValueWeibullEstimatorsDistribution value) '''
-//		WARNING:VALUE_FORMAT_NOT_SUPPORTED:DiscreteValueWeibullEstimatorsDistribution
-//	'''
-		
 }
diff --git a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/LinuxBaseTransformer.java b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/LinuxBaseTransformer.java
index 899d6d5..7e689b6 100644
--- a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/LinuxBaseTransformer.java
+++ b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/LinuxBaseTransformer.java
@@ -22,6 +22,11 @@
 import static org.eclipse.app4mc.slg.linux.transformers.LinuxBaseSettings.SRC_FOLDER;
 import static org.eclipse.app4mc.slg.linux.transformers.LinuxBaseSettings.SRC_TYPE;
 
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
 import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
 import org.eclipse.app4mc.transformation.util.OutputBuffer;
 
@@ -60,4 +65,19 @@
 	public String getSrcPath(SLGTranslationUnit tu) { return tu.getModulePath() + SRC_FOLDER + getSrcFile(tu); }
 	public String getIncPath(SLGTranslationUnit tu) { return tu.getModulePath() + INC_FOLDER + getIncFile(tu); }
 
+	// Generic cache handling
+
+	public List<String> getSrcFiles() {
+
+		return getCache().values().stream()
+				.map(this::getSrcFile)
+				.sorted()
+				.distinct()
+				.collect(Collectors.toList());
+	}
+
+	public Map<List<Object>, SLGTranslationUnit> getCache() {
+		return Collections.emptyMap();
+	}
+
 }
diff --git a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxLabelTransformer.java b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxLabelTransformer.java
index 294eca4..3a7507b 100644
--- a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxLabelTransformer.java
+++ b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxLabelTransformer.java
@@ -74,7 +74,7 @@
 		genFiles(tu, label);
 	}
 
-	private void genFiles(SLGTranslationUnit tu, Label label) {
+	private void genFiles(final SLGTranslationUnit tu, final Label label) {
 		if (isSrcFileEmpty(tu)) {
 			srcAppend(tu, "#include \"" + getIncFile(tu) + "\"\n");
 			srcAppend(tu, "#include <stdbool.h>\n\n");
diff --git a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxTicksTransformer.java b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxTicksTransformer.java
index e92eff9..ac5a12c 100644
--- a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxTicksTransformer.java
+++ b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxTicksTransformer.java
@@ -49,7 +49,8 @@
 
 	private String computeCall(Ticks ticks) {
 		String parameters = LinuxTicksGenerator.getParameters(ticks.getDefault());
-		return "burnTicks(" + parameters + ")";
+		String className = ticks.getDefault().eClass().getName();
+		return "executeTicks_" + className +"(" + parameters + ")";
 	}
 
 }
diff --git a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxTicksUtilsTransformer.java b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxTicksUtilsTransformer.java
index 1a03dd1..d904134 100644
--- a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxTicksUtilsTransformer.java
+++ b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxTicksUtilsTransformer.java
@@ -91,16 +91,18 @@
 			toCPP(tu);
 		}
 		srcAppend(tu, LinuxTicksUtilsGenerator.generateTicks(devClass));
-		incAppend(tu, LinuxTicksUtilsGenerator.generateTicksDecleration(devClass));
+		incAppend(tu, LinuxTicksUtilsGenerator.generateTicksDeclaration(devClass));
 	}
 
 	private void toCPP(SLGTranslationUnit tu) {
 		srcAppend(tu, "#include \"" + getIncFile(tu) + "\"\n");
 
-		ConfigModel configModel = customObjsStore.<ConfigModel>getInstance(ConfigModel.class);
+		final ConfigModel configModel = customObjsStore.<ConfigModel>getInstance(ConfigModel.class);
 
 		final String ticksCodeSnippet = configModel.getCustomTickImpl().getValue();
-		final String burnTicksBody = configModel.getCustomTickImpl().isEnable() ? ticksCodeSnippet : LinuxTicksUtilsGenerator.burnTicksDefault();
+		final boolean ticksCodeEnabled = configModel.getCustomTickImpl().isEnable();
+		
+		final String burnTicksBody = ticksCodeEnabled ? ticksCodeSnippet : LinuxTicksUtilsGenerator.burnTicksDefault();
 
 		srcAppend(tu, LinuxTicksUtilsGenerator.burnTicks(burnTicksBody));
 		srcAppend(tu, LinuxTicksUtilsGenerator.burnTicksStatistics(configModel));
@@ -108,7 +110,7 @@
 	}
 
 	private void toH(SLGTranslationUnit tu) {
-		incAppend(tu, LinuxTicksUtilsGenerator.burnTicksDecleration());
+		incAppend(tu, LinuxTicksUtilsGenerator.burnTicksDeclaration());
 		incAppend(tu, LinuxTicksUtilsGenerator.burnTicksStatisticsDecleration());
 	}
 
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosAmlTranslationUnit.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosAmlTranslationUnit.java
deleted file mode 100644
index 395f2ee..0000000
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosAmlTranslationUnit.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/**
- * Copyright (c) 2020-2021 Robert Bosch GmbH.
- * 
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- * 
- * SPDX-License-Identifier: EPL-2.0
- * 
- * Contributors:
- *     Robert Bosch GmbH - initial API and implementation
- */
-
-package org.eclipse.app4mc.slg.ros2.generators;
-
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-
-public class RosAmlTranslationUnit extends TranslationUnit {
-
-	private OutputBuffer outputBuffer;
-
-	public RosAmlTranslationUnit(final OutputBuffer outputBuffer) {
-		super();
-		this.outputBuffer = outputBuffer;
-
-		genFiles();
-	}
-
-	public String getBasePath() {
-		return "utils";
-	}
-
-	public String getModuleName() {
-		return "aml";
-	}
-
-	public String getModulePath() {
-		return getBasePath() + "/" + getModuleName();
-	}
-
-	@Override
-	public String getIncFile() {
-		return getModuleName() + ".h";
-	}
-
-	@Override
-	public String getSrcFile() {
-		return getModuleName() + ".cpp";
-	}
-
-	public String getIncPath() {
-		return getModulePath() + "/inc/" + getIncFile();
-	}
-
-	public String getSrcPath() {
-		return getModulePath() + "/src/" + getSrcFile();
-	}
-
-	public void genFiles() {
-		incAppend(RosAmlGenerator.toH());
-		srcAppend(RosAmlGenerator.toCpp());
-	}
-
-	public void incAppend(final String str) {
-		outputBuffer.appendTo("INC", getModulePath() + "/_inc/" + getModuleName(), str);
-	}
-
-	public void srcAppend(final String str) {
-		outputBuffer.appendTo("SRC", getModulePath() + "/_src/" + getModuleName(), str);
-	}
-
-}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosChannelSendTranslationUnit.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosChannelSendTranslationUnit.java
deleted file mode 100644
index 2c9443a..0000000
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosChannelSendTranslationUnit.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/**
- * Copyright (c) 2020-2021 Robert Bosch GmbH.
- * 
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- * 
- * SPDX-License-Identifier: EPL-2.0
- * 
- * Contributors:
- *     Robert Bosch GmbH - initial API and implementation
- */
-
-package org.eclipse.app4mc.slg.ros2.generators;
-
-import org.eclipse.app4mc.amalthea.model.ChannelSend;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-
-public class RosChannelSendTranslationUnit extends TranslationUnit {
-	private RosChannelSendUtilsTranslationUnit tuIpUtils;
-
-	private ChannelSend cs;
-	private OutputBuffer outputBuffer;
-
-	public RosChannelSendTranslationUnit(final OutputBuffer outputBuffer,
-			final RosChannelSendUtilsTranslationUnit tuIpUtils, final ChannelSend cs) {
-		super();
-		this.cs = cs;
-		this.tuIpUtils = tuIpUtils;
-		this.outputBuffer = outputBuffer;
-	}
-
-	public String getBasePath() {
-		return tuIpUtils.getBasePath();
-	}
-
-	public String getModuleName() {
-		return tuIpUtils.getModuleName();
-	}
-
-	public String getIncFile() {
-		return getModuleName() + ".h";
-	}
-
-	@Override
-	public String getCall() {
-		return tuIpUtils.getExecCall(cs.getData().getName());
-	}
-
-	public String getModulePath() {
-		return getBasePath() + "/" + getModuleName();
-	}
-
-	@Override
-	public String getSrcFile() {
-		return getModuleName() + ".cpp";
-	}
-
-	public String getIncPath() {
-		return getModulePath() + "/_inc/" + this.getIncFile();
-	}
-
-	public String getSrcPath() {
-		return getModulePath() + "/_src/" + this.getSrcFile();
-	}
-
-	public boolean isIncFileEmpty() {
-		return !outputBuffer.bufferExists("INC", getModulePath() + "/_inc/" + getModuleName());
-	}
-
-	public boolean isSrcFileEmpty() {
-		return !outputBuffer.bufferExists("SRC", getModulePath() + "/_src/" + getModuleName());
-	}
-
-	public boolean incAppend(final String str) {
-		return outputBuffer.appendTo("INC", this.getModulePath() + "/_inc/" + getModuleName(), str);
-	}
-
-	public boolean srcAppend(final String str) {
-		return outputBuffer.appendTo("SRC", getModulePath() + "/_src/" + getModuleName(), str);
-	}
-
-}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosChannelSendUtilsTranslationUnit.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosChannelSendUtilsTranslationUnit.java
deleted file mode 100644
index 8fc76ac..0000000
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosChannelSendUtilsTranslationUnit.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/**
- * Copyright (c) 2020-2021 Robert Bosch GmbH.
- * 
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- * 
- * SPDX-License-Identifier: EPL-2.0
- * 
- * Contributors:
- *     Robert Bosch GmbH - initial API and implementation
- */
-
-package org.eclipse.app4mc.slg.ros2.generators;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.app4mc.amalthea.model.ChannelSend;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-
-public class RosChannelSendUtilsTranslationUnit extends TranslationUnit {
-	public static final String LIB_NAME = "CHANNELSEND_UTIL";
-	public static final String MODULE_NAME = "channelSendUtils";
-	public static final String MODULE_PATH = "synthetic_gen/" + MODULE_NAME;
-	public static final String MAKEFILE_PATH = MODULE_PATH + "/CMakeLists.txt";
-
-	private ChannelSend cs;
-	private OutputBuffer outputBuffer;
-
-	public RosChannelSendUtilsTranslationUnit(final OutputBuffer outputBuffer, final ChannelSend cs) {
-		super();
-		this.cs = cs;
-		this.outputBuffer = outputBuffer;
-
-		this.genFiles();
-	}
-
-	private static List<String> topic_list = new ArrayList<>();
-
-	public String getModuleName() {
-		return MODULE_NAME;
-	}
-
-	@Override
-	public String getIncFile() {
-		return (MODULE_NAME + ".h");
-	}
-
-	public String getExecCall(final String param) {
-		return "publish_to_" + param + "(" + param + "_publisher)";
-	}
-
-	public void genFiles() {
-
-		if (this.isSrcFileEmpty()) {
-			this.incAppend(RosChannelSendUtilsGenerator.toHeader());
-		}
-		if (this.isSrcFileEmpty()) {
-			this.srcAppend(RosChannelSendUtilsGenerator.toCPPHead());
-		}
-		boolean already_defined = false;
-		for (final String topic_name : RosChannelSendUtilsTranslationUnit.topic_list) {
-			if (topic_name.equals(this.cs.getData().getName())) {
-				already_defined = true;
-			}
-		}
-
-		if ((!already_defined)) {
-
-			this.incAppend(RosChannelSendUtilsGenerator.toH(cs));
-			this.srcAppend(RosChannelSendUtilsGenerator.toCPP(cs));
-
-			RosChannelSendUtilsTranslationUnit.topic_list.add(this.cs.getData().getName());
-		}
-	}
-
-	public String getBasePath() {
-		return "synthetic_gen";
-	}
-
-	public String getModulePath() {
-		return getBasePath() + "/" + getModuleName();
-	}
-
-	@Override
-	public String getSrcFile() {
-		return getModuleName() + ".cpp";
-	}
-
-	public String getIncPath() {
-		return getModulePath() + "/_inc/" + getIncFile();
-	}
-
-	public String getSrcPath() {
-		return getModulePath() + "/_src/" + getSrcFile();
-	}
-
-	public boolean isIncFileEmpty() {
-		return !outputBuffer.bufferExists("INC", getModulePath() + "/_inc/" + getModuleName());
-	}
-
-	public boolean isSrcFileEmpty() {
-		return !outputBuffer.bufferExists("SRC", getModulePath() + "/_src/" + getModuleName());
-	}
-
-	public boolean incAppend(final String str) {
-		return outputBuffer.appendTo("INC", getModulePath() + "/_inc/" + getModuleName(), str);
-	}
-
-	public boolean srcAppend(final String str) {
-		return outputBuffer.appendTo("SRC", getModulePath() + "/_src/" + getModuleName(), str);
-	}
-
-}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessTriggerTranslationUnit.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessTriggerTranslationUnit.java
deleted file mode 100644
index b63758a..0000000
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessTriggerTranslationUnit.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/**
- * Copyright (c) 2020-2021 Robert Bosch GmbH.
- * 
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- * 
- * SPDX-License-Identifier: EPL-2.0
- * 
- * Contributors:
- *     Robert Bosch GmbH - initial API and implementation
- */
-
-package org.eclipse.app4mc.slg.ros2.generators;
-
-import org.eclipse.app4mc.amalthea.model.InterProcessTrigger;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-
-public class RosInterProcessTriggerTranslationUnit extends TranslationUnit {
-	private RosInterProcessTriggerUtilsTranslationUnit tuIpUtils;
-
-	private InterProcessTrigger ip;
-
-	private OutputBuffer outputBuffer;
-
-	public RosInterProcessTriggerTranslationUnit(final OutputBuffer outputBuffer,
-			final RosInterProcessTriggerUtilsTranslationUnit tuIpUtils, final InterProcessTrigger ip) {
-		super();
-		this.tuIpUtils = tuIpUtils;
-		this.ip = ip;
-		this.outputBuffer = outputBuffer;
-	}
-
-	public String getBasePath() {
-		return this.tuIpUtils.getBasePath();
-	}
-
-	public String getModuleName() {
-		return this.tuIpUtils.getModuleName();
-	}
-
-	@Override
-	public String getIncFile() {
-		return getModuleName() + ".h";
-	}
-
-	@Override
-	public String getCall() {
-		return tuIpUtils.getExecCall(ip.getStimulus().getName());
-	}
-
-	public String getModulePath() {
-		return getBasePath() + "/" + getModuleName();
-	}
-
-	@Override
-	public String getSrcFile() {
-		return getModuleName() + ".cpp";
-	}
-
-	public String getIncPath() {
-		return getModulePath() + "/_inc/" + getIncFile();
-	}
-
-	public String getSrcPath() {
-		return getModulePath() + "/_src/" + getSrcFile();
-	}
-
-	public boolean isIncFileEmpty() {
-		return !outputBuffer.bufferExists("INC", getModulePath() + "/_inc/" + getModuleName());
-	}
-
-	public boolean isSrcFileEmpty() {
-		return !this.outputBuffer.bufferExists("SRC", getModulePath() + "/_src/" + getModuleName());
-	}
-
-	public boolean incAppend(final String str) {
-		return outputBuffer.appendTo("INC", getModulePath() + "/_inc/" + getModuleName(), str);
-	}
-
-	public boolean srcAppend(final String str) {
-		return outputBuffer.appendTo("SRC", getModulePath() + "/_src/" + getModuleName(), str);
-	}
-
-}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessTriggerUtilsGenerator.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessTriggerUtilsGenerator.xtend
index 8b2d0ed..92d0cad 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessTriggerUtilsGenerator.xtend
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessTriggerUtilsGenerator.xtend
@@ -37,11 +37,11 @@
 		
 	'''
 
-	static def String toCPP(InterProcessTrigger ip) '''
+	static def String toCPP(InterProcessTrigger ipt) '''
 		
-		void call_service_«ip.stimulus.name»(rclcpp::Client<«ip.stimulus.name»_service::srv::«Utils.toIdlCompliantName(ip.stimulus.name + '_service')»>::SharedPtr& client) {
+		void call_service_«ipt.stimulus.name»(rclcpp::Client<«ipt.stimulus.name»_service::srv::«Utils.toIdlCompliantName(ipt.stimulus.name + '_service')»>::SharedPtr& client) {
 			
-			auto request = std::make_shared<«ip.stimulus.name»_service::srv::«Utils.toIdlCompliantName(ip.stimulus.name + '_service')»::Request>();
+			auto request = std::make_shared<«ipt.stimulus.name»_service::srv::«Utils.toIdlCompliantName(ipt.stimulus.name + '_service')»::Request>();
 			
 			  while (!client->wait_for_service(50ms)) {
 			    if (!rclcpp::ok()) {
@@ -54,9 +54,9 @@
 		}
 	'''
 
-	static def String toH(InterProcessTrigger ip) '''
-		#include "«ip.stimulus.name»_service/srv/«ip.stimulus.name»_service.hpp"
-		void call_service_«ip.stimulus.name»(rclcpp::Client<«ip.stimulus.name»_service::srv::«Utils.toIdlCompliantName(ip.stimulus.name + '_service')»>::SharedPtr& client);
+	static def String toH(InterProcessTrigger ipt) '''
+		#include "«ipt.stimulus.name»_service/srv/«ipt.stimulus.name»_service.hpp"
+		void call_service_«ipt.stimulus.name»(rclcpp::Client<«ipt.stimulus.name»_service::srv::«Utils.toIdlCompliantName(ipt.stimulus.name + '_service')»>::SharedPtr& client);
 		
 	'''
 
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessTriggerUtilsTranslationUnit.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessTriggerUtilsTranslationUnit.java
deleted file mode 100644
index ad09865..0000000
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessTriggerUtilsTranslationUnit.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/**
- * Copyright (c) 2020-2021 Robert Bosch GmbH.
- * 
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- * 
- * SPDX-License-Identifier: EPL-2.0
- * 
- * Contributors:
- *     Robert Bosch GmbH - initial API and implementation
- */
-
-package org.eclipse.app4mc.slg.ros2.generators;
-
-import org.eclipse.app4mc.amalthea.model.InterProcessTrigger;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-
-public class RosInterProcessTriggerUtilsTranslationUnit extends TranslationUnit {
-	public static final String LIB_NAME = "INTERPROCESSTRIGGER_UTIL";
-	public static final String MODULE_NAME = "interProcessTriggerUtils";
-	public static final String MODULE_PATH = "synthetic_gen/" + MODULE_NAME;
-	public static final String MAKEFILE_PATH = MODULE_PATH + "/CMakeLists.txt";
-
-	private InterProcessTrigger ip;
-	private OutputBuffer outputBuffer;
-
-	public RosInterProcessTriggerUtilsTranslationUnit(final OutputBuffer outputBuffer, final InterProcessTrigger ip) {
-		super();
-		this.ip = ip;
-		this.outputBuffer = outputBuffer;
-		this.genFiles();
-	}
-
-	public String getModuleName() {
-		return MODULE_NAME;
-	}
-
-	@Override
-	public String getIncFile() {
-		return MODULE_NAME + ".h";
-	}
-
-	public String getExecCall(final String param) {
-		return "call_service_" + param + "(" + param + "_client)";
-	}
-
-	public void genFiles() {
-		if (isSrcFileEmpty()) {
-			incAppend(RosInterProcessTriggerUtilsGenerator.toHeader());
-		}
-		if (isSrcFileEmpty()) {
-			srcAppend(RosInterProcessTriggerUtilsGenerator.toCPPHead());
-		}
-
-		incAppend(RosInterProcessTriggerUtilsGenerator.toH(ip));
-		srcAppend(RosInterProcessTriggerUtilsGenerator.toCPP(ip));
-	}
-
-	public String getBasePath() {
-		return "synthetic_gen";
-	}
-
-	public String getModulePath() {
-		return getBasePath() + "/" + getModuleName();
-	}
-
-	@Override
-	public String getSrcFile() {
-		return getModuleName() + ".cpp";
-	}
-
-	public String getIncPath() {
-		return getModulePath() + "/_inc/" + getIncFile();
-	}
-
-	public String getSrcPath() {
-		return getModulePath() + "/_src/" + getSrcFile();
-	}
-
-	public boolean isIncFileEmpty() {
-		return !outputBuffer.bufferExists("INC", getModulePath() + "/_inc/" + getModuleName());
-	}
-
-	public boolean isSrcFileEmpty() {
-		return !outputBuffer.bufferExists("SRC", getModulePath() + "/_src/" + getModuleName());
-	}
-
-	public boolean incAppend(final String str) {
-		return outputBuffer.appendTo("INC", getModulePath() + "/_inc/" + getModuleName(), str);
-	}
-
-	public boolean srcAppend(final String str) {
-		return outputBuffer.appendTo("SRC", getModulePath() + "/_src/" + getModuleName(), str);
-	}
-}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosLabelAccessTranslationUnit.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosLabelAccessTranslationUnit.java
deleted file mode 100644
index b476be1..0000000
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosLabelAccessTranslationUnit.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/**
- * Copyright (c) 2020-2021 Robert Bosch GmbH.
- * 
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- * 
- * SPDX-License-Identifier: EPL-2.0
- * 
- * Contributors:
- *     Robert Bosch GmbH - initial API and implementation
- */
-
-package org.eclipse.app4mc.slg.ros2.generators;
-
-import java.util.Arrays;
-
-import org.eclipse.app4mc.amalthea.model.LabelAccess;
-import org.eclipse.app4mc.amalthea.model.MinAvgMaxStatistic;
-import org.eclipse.app4mc.amalthea.model.NumericStatistic;
-import org.eclipse.app4mc.amalthea.model.SingleValueStatistic;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-
-public class RosLabelAccessTranslationUnit extends TranslationUnit {
-	private RosLabelTranslationUnit tuLabel;
-
-	private LabelAccess labelAccess;
-
-	private OutputBuffer outputBuffer;
-
-	public RosLabelAccessTranslationUnit(final OutputBuffer outputBuffer, final RosLabelTranslationUnit tuLabel,
-			final LabelAccess labelAccess) {
-		super();
-		this.tuLabel = tuLabel;
-		this.labelAccess = labelAccess;
-		this.outputBuffer = outputBuffer;
-	}
-
-	public String getBasePath() {
-		return this.tuLabel.getBasePath();
-	}
-
-	public String getModuleName() {
-		return this.tuLabel.getModuleName();
-	}
-
-	@Override
-	public String getIncFile() {
-		return this.tuLabel.getIncFile();
-	}
-
-	// ---------- names of generated 'C' functions ----------
-
-	@Override
-	public String getCall() {
-		NumericStatistic stat = null;
-		if (labelAccess != null && labelAccess.getStatistic() != null) {
-			stat = labelAccess.getStatistic().getValue();
-		}
-
-		String statString = (stat == null) ? "1" : getNumericStatistic(stat);
-
-		if (labelAccess.getAccess() != null) {
-			switch (labelAccess.getAccess()) {
-			case READ:
-				return tuLabel.readCall(statString);
-			case WRITE:
-				return tuLabel.writeCall(statString);
-			default:
-				// underspecified
-			}
-		}
-
-		return "/*underspecified access to label" + labelAccess.getData().getName() + "*/";
-
-	}
-
-	public String getModulePath() {
-		return getBasePath() + "/" + getModuleName();
-	}
-
-	@Override
-	public String getSrcFile() {
-		return getModuleName() + ".cpp";
-	}
-
-	public String getIncPath() {
-		return getModulePath() + "/_inc/" + getIncFile();
-	}
-
-	public String getSrcPath() {
-		return getModulePath() + "/_src/" + getSrcFile();
-	}
-
-	public boolean isIncFileEmpty() {
-		return !outputBuffer.bufferExists("INC", getModulePath() + "/_inc/" + getModuleName());
-	}
-
-	public boolean isSrcFileEmpty() {
-		return !outputBuffer.bufferExists("SRC", getModulePath() + "/_src/" + getModuleName());
-	}
-
-	public boolean incAppend(final String str) {
-		return outputBuffer.appendTo("INC", getModulePath() + "/_inc/" + getModuleName(), str);
-	}
-
-	public boolean srcAppend(final String str) {
-		return outputBuffer.appendTo("SRC", getModulePath() + "/_src/" + getModuleName(), str);
-	}
-
-	protected static String _getNumericStatistic(final MinAvgMaxStatistic stat) {
-		String _string = Integer.valueOf(Double.valueOf(Math.ceil(stat.getAvg())).intValue()).toString();
-		return (_string + "/*MinAvgMaxStatistic not supported yet*/");
-	}
-
-	protected static String _getNumericStatistic(final SingleValueStatistic stat) {
-		return Integer.valueOf(Double.valueOf(Math.ceil(stat.getValue())).intValue()).toString();
-	}
-
-	public static String getNumericStatistic(final NumericStatistic stat) {
-		if (stat instanceof MinAvgMaxStatistic) {
-			return _getNumericStatistic((MinAvgMaxStatistic) stat);
-		} else if (stat instanceof SingleValueStatistic) {
-			return _getNumericStatistic((SingleValueStatistic) stat);
-		} else {
-			throw new IllegalArgumentException("Unhandled parameter types: " + Arrays.<Object>asList(stat).toString());
-		}
-	}
-}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosLabelGenerator.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosLabelGenerator.xtend
index 453631c..ac3d394 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosLabelGenerator.xtend
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosLabelGenerator.xtend
@@ -14,6 +14,7 @@
 package org.eclipse.app4mc.slg.ros2.generators
 
 import java.util.List
+import org.eclipse.app4mc.amalthea.model.Label
 
 class RosLabelGenerator {
 
@@ -22,6 +23,16 @@
 		throw new IllegalStateException("Utility class");
 	}
 
+	// ---------- names of generated 'C' functions ----------
+
+	static def String initCall(String labelName) { initCall(labelName, "_CacheLine* array,int array_elements") }
+
+	static def String initCall(String labelName, String param) 	'''initialize_«labelName»(«labelName»«param»)'''	
+	static def String readCall(String labelName, String param) 	'''read_«labelName»(«param»)'''	
+	static def String writeCall(String labelName, String param)	'''write_«labelName»(«param»)'''	
+
+	// ---------- generate file contents ----------
+
 	static def String toCMake(String libName, List<String> srcFiles)
 	'''
 		# «libName» ################################################################
@@ -38,21 +49,21 @@
 	'''
 
 
-	static def String toH(String name, String readCall, String writeCall)
+	static def String toH(Label label)
 	'''
-		typedef struct «name»_CacheLine
+		typedef struct «label.name»_CacheLine
 		{
-		  struct «name»_CacheLine* ptrCacheLine[8] ;
-		} «name»_CacheLine ;
-		void initialize_«name»(«name»_CacheLine* array,int array_elements);
-		void «readCall»;
-		void «writeCall»;
+		  struct «label.name»_CacheLine* ptrCacheLine[8] ;
+		} «label.name»_CacheLine ;
+		void «initCall(label.name, "_CacheLine* array, int array_elements")»;
+		void «readCall(label.name, "int labelAccessStatistics")»;
+		void «writeCall(label.name, "int labelAccessStatistics")»;
 		
 	'''
 
-	static def String toCpp(String name, String size, String readCall, String writeCall)
+	static def String toCpp(Label label)
 	'''
-		void initialize_«name»(«name»_CacheLine* array,int array_elements) {
+		void initialize_«label.name»(«label.name»_CacheLine* array,int array_elements) {
 		  int steps = array_elements / 2 ;
 		  int bottom = 0 ;
 		  int top = steps ;
@@ -68,23 +79,23 @@
 		
 		
 		
-		void «readCall» {
+		void «readCall(label.name, "int labelAccessStatistics")» {
 			static bool initialized = false;
-				int numberOfBytes = «size»;
-				static «name»_CacheLine* «name»;
+				int numberOfBytes = «label?.size?.numberBytes»;
+				static «label.name»_CacheLine* «label.name»;
 				if(!initialized) {
 					//init
-					«name» = («name»_CacheLine*) malloc(sizeof(«name»_CacheLine) * 17000);
-					initialize_«name»(«name», 17000);
+					«label.name» = («label.name»_CacheLine*) malloc(sizeof(«label.name»_CacheLine) * 17000);
+					initialize_«label.name»(«label.name», 17000);
 					initialized = true;
 				}
 			
-				static «name»_CacheLine* i = «name»;
+				static «label.name»_CacheLine* i = «label.name»;
 				static int counter = 0;
 			
 				if(counter > 16100) {
 					counter = 0;
-					i = «name»;
+					i = «label.name»;
 				}
 			
 				int end_value = counter + numberOfBytes;
@@ -97,23 +108,23 @@
 		
 		
 		
-		void «writeCall» {
+		void «writeCall(label.name, "int labelAccessStatistics")» {
 			static bool initialized = false;
-						int numberOfBytes = «size»;
-						static «name»_CacheLine* «name»;
+						int numberOfBytes = «label?.size?.numberBytes»;
+						static «label.name»_CacheLine* «label.name»;
 						if(!initialized) {
 							//init
-							«name» = («name»_CacheLine*) malloc(sizeof(«name»_CacheLine) * 17000);
-							initialize_«name»(«name», 17000);
+							«label.name» = («label.name»_CacheLine*) malloc(sizeof(«label.name»_CacheLine) * 17000);
+							initialize_«label.name»(«label.name», 17000);
 							initialized = true;
 						}
 					
-						static «name»_CacheLine* i = «name»;
+						static «label.name»_CacheLine* i = «label.name»;
 						static int counter = 0;
 					
 						if(counter > 16100) {
 							counter = 0;
-							i = «name»;
+							i = «label.name»;
 						}
 					
 						int end_value = counter + numberOfBytes;
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosLabelTranslationUnit.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosLabelTranslationUnit.java
deleted file mode 100644
index 9813d5d..0000000
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosLabelTranslationUnit.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * Copyright (c) 2020-2021 Robert Bosch GmbH.
- * 
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- * 
- * SPDX-License-Identifier: EPL-2.0
- * 
- * Contributors:
- *     Robert Bosch GmbH - initial API and implementation
- */
-
-package org.eclipse.app4mc.slg.ros2.generators;
-
-import org.eclipse.app4mc.amalthea.model.Label;
-import org.eclipse.app4mc.slg.commons.m2t.generators.LabelTranslationUnit;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-
-public class RosLabelTranslationUnit extends LabelTranslationUnit {
-	public static final String MODULLIB_NAME = "LABELS_LIB";
-	public static final String MODULE_NAME = "labels";
-	public static final String MODULE_PATH = "synthetic_gen/" + MODULE_NAME;
-	public static final String MAKEFILE_PATH = MODULE_PATH + "/CMakeLists.txt";
-
-	public RosLabelTranslationUnit(final OutputBuffer outputBuffer, final Label label) {
-		super(outputBuffer, label);
-	}
-
-	@Override
-	public String getModuleName() {
-		return MODULE_NAME;
-	}
-
-	@Override
-	public String getIncFile() {
-		return MODULE_NAME + ".h";
-	}
-
-	@Override
-	public void genFiles() {
-		if (isSrcFileEmpty()) {
-			srcAppend("#include \"" + getIncFile() + "\"\n\n");
-			srcAppend("#include <stdlib.h>\n");
-		}
-		String readCall = readCall("int labelAccessStatistics");
-		String writeCall = writeCall("int labelAccessStatistics");
-		
-		incAppend(RosLabelGenerator.toH(getName(), readCall, writeCall));
-		srcAppend(RosLabelGenerator.toCpp(getName(), "" + getSize(), readCall, writeCall));
-	}
-
-}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosRunnableGenerator.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosRunnableGenerator.xtend
index cc46ce5..1c8ded2 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosRunnableGenerator.xtend
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosRunnableGenerator.xtend
@@ -28,7 +28,7 @@
 	'''
 		# «libName» ################################################################
 		####
-		add_library(«RosRunnableTranslationUnit.libName» STATIC
+		add_library(«libName» STATIC
 		«FOR srcFile : srcFiles»
 			«""»	${CMAKE_CURRENT_LIST_DIR}/_src/«srcFile»
 		«ENDFOR»
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosRunnableTranslationUnit.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosRunnableTranslationUnit.java
deleted file mode 100644
index b097fa5..0000000
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosRunnableTranslationUnit.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/**
- * Copyright (c) 2020-2021 Robert Bosch GmbH.
- * 
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- * 
- * SPDX-License-Identifier: EPL-2.0
- * 
- * Contributors:
- *     Robert Bosch GmbH - initial API and implementation
- */
-
-package org.eclipse.app4mc.slg.ros2.generators;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.List;
-
-import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
-import org.eclipse.app4mc.amalthea.model.BooleanObject;
-import org.eclipse.app4mc.amalthea.model.Channel;
-import org.eclipse.app4mc.amalthea.model.ChannelSend;
-import org.eclipse.app4mc.amalthea.model.InterProcessStimulus;
-import org.eclipse.app4mc.amalthea.model.InterProcessTrigger;
-import org.eclipse.app4mc.slg.commons.m2t.generators.RunnableTranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.transformers.sw.ActivityGraphItemTransformer;
-import org.eclipse.app4mc.slg.ros2.transformers.utils.Utils;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-
-public class RosRunnableTranslationUnit extends RunnableTranslationUnit {
-	private String param;
-	private String nodeParam;
-	private boolean measurePerformance;
-	private List<String> publishers;
-	private List<String> client_declarations;
-	private List<String> client_inits;
-
-	public RosRunnableTranslationUnit(final OutputBuffer outputBuffer, final ActivityGraphItemTransformer transformer,
-			final org.eclipse.app4mc.amalthea.model.Runnable runnable) {
-		super(outputBuffer, transformer, runnable);
-	}
-
-	@Override
-	public String getCall() {
-		return "run_" + runnable.getName() + "(" + param + ")";
-	}
-
-	public String getNodeCall() {
-		return "run_" + runnable.getName() + "(" + nodeParam + ")";
-	}
-
-	public List<String> getPublishers() {
-		return this.publishers;
-	}
-
-	public List<String> getClientDeclarations() {
-		return this.client_declarations;
-	}
-
-	public List<String> getClientInits() {
-		return this.client_inits;
-	}
-
-	@Override
-	public void genFiles() {
-		param = "";
-		nodeParam = "";
-		publishers = new ArrayList<>();
-		client_declarations = new ArrayList<>();
-		client_inits = new ArrayList<>();
-
-		if (isSrcFileEmpty()) { // all stuff only required once regardless of runnable instance
-			srcAppend("#include \"" + this.getIncFile() + "\"\n");
-		}
-		final HashSet<String> includes = new LinkedHashSet<>();
-		final List<String> calls = new ArrayList<>();
-
-		measurePerformance = false;
-		if (runnable != null && runnable.getCustomProperties().get("measure_performance") instanceof BooleanObject) {
-			measurePerformance = ((BooleanObject) runnable.getCustomProperties().get("measure_performance")).isValue();
-		}
-
-		if (measurePerformance) {
-			includes.add("aml.h");
-		}
-
-		if (runnable != null && runnable.getActivityGraph() != null) {
-			for (ActivityGraphItem item : runnable.getActivityGraph().getItems()) {
-
-				final TranslationUnit tmp = callGraphItemTransformer.transform(item);
-				if (tmp.getIncFile() != null && !tmp.getIncFile().isEmpty() && !getIncFile().equals(tmp.getIncFile())) {
-					includes.add(tmp.getIncFile());
-				}
-
-				// check if item is publisher
-
-				if ((item instanceof ChannelSend)) {
-					ChannelSend cs = (ChannelSend) item;
-					Channel data = cs.getData();
-
-					publishers.add(data.getName() + "_publisher");
-
-					nodeParam = nodeParam + ((nodeParam.equals("")) ? "" : ";") + data.getName() + "_publisher";
-					param = ((param.equals("")) ? "" : ";") + "rclcpp::Publisher<std_msgs::msg::String>::SharedPtr& "
-							+ data.getName() + "_publisher";
-				}
-
-				if ((item instanceof InterProcessTrigger)) {
-					InterProcessTrigger trigger = (InterProcessTrigger) item;
-					InterProcessStimulus stimulus = trigger.getStimulus();
-					
-					includes.add(stimulus.getName() + "_service/srv/" + stimulus.getName() + "_service" + ".hpp");
-					client_declarations.add(
-							"rclcpp::Client<" + stimulus.getName() + "_service::srv::"
-							+ Utils.toIdlCompliantName(stimulus.getName() + "_service")
-							+ ">::SharedPtr " + stimulus.getName() + "_client");
-					client_inits.add(
-							stimulus.getName() + "_client =  this->create_client<" + stimulus.getName() + "_service::srv::"
-							+ Utils.toIdlCompliantName(stimulus.getName() + "_service") + ">"
-							+ "(\"" + stimulus.getName() + "_service\")");
-					nodeParam = nodeParam + (nodeParam.equals("") ? "" : ";") + stimulus.getName() + "_client";
-					param = (param.equals("") ? "" : ";") + "rclcpp::Client<"
-							+ stimulus.getName() + "_service::srv::" + Utils.toIdlCompliantName(stimulus.getName() + "_service")
-							+ ">::SharedPtr& " + stimulus.getName() + "_client";
-				}
-
-				final String call = tmp.getCall();
-				if (call != null && !call.isEmpty()) {
-					calls.add(call);
-				}
-			}
-		}
-
-		// write header
-		incAppend("\n//Runnable " + runnable.getName() + "----\n");
-		toH(includes);
-
-		// write body
-		srcAppend("\n//Runnable " + runnable.getName() + "----\n");
-		toCpp(includes, calls);
-	}
-
-	@Override
-	public void toH(final HashSet<String> includes) {
-		for (String include : includes) {
-			incAppend("#include \"" + include + "\"\n");
-		}
-		incAppend("void " + getCall() + ";\n");
-	}
-
-	@Override
-	public void toCpp(final HashSet<String> includes, final List<String> calls) {
-		this.srcAppend("void " + this.getCall() + "{\n");
-		if (measurePerformance) {
-			srcAppend(
-				"uint64_t event_list[] = {0x11, 0x13, 0x17}; //CPU CYCLES, MEM ACCESS, L2 Cache Refill\n"
-				+ "int total_events =  sizeof(event_list)/sizeof(event_list[0]);\n"
-				+ "int fd = instrument_start(0,event_list, total_events);\n");
-		}
-
-		for (String call : calls) {
-			srcAppend("\t" + call + ";\n");
-		}
-
-		if (this.measurePerformance) {
-			this.srcAppend("instrument_stop(fd, \"" + runnable.getName() + ".log\");\n");
-		}
-		this.srcAppend("}\n\n");
-	}
-
-}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTaskGenerator.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTaskGenerator.xtend
index 2b81adf..d70f2ad 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTaskGenerator.xtend
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTaskGenerator.xtend
@@ -13,8 +13,7 @@
 
 package org.eclipse.app4mc.slg.ros2.generators
 
-import java.util.List
-import java.util.Set
+import java.util.Collection
 import org.eclipse.app4mc.amalthea.model.EventStimulus
 import org.eclipse.app4mc.amalthea.model.InterProcessStimulus
 import org.eclipse.app4mc.amalthea.model.PeriodicStimulus
@@ -28,7 +27,7 @@
 		throw new IllegalStateException("Utility class");
 	}
 
-	static def String getDeclaration(List<Stimulus> stimuli, List<String> publishers, List<String> clientDeclarations) '''
+	static def String getDeclaration(Collection<Stimulus> stimuli, Collection<String> publishers, Collection<String> clientDeclarations) '''
 		«FOR stimulus : stimuli»
 			«IF stimulus instanceof PeriodicStimulus»
 				rclcpp::TimerBase::SharedPtr «(stimulus as PeriodicStimulus).name»_timer_;
@@ -48,7 +47,7 @@
 		«ENDFOR»
 	'''
 
-	static def String getInitialisation(String nodeName, List<Stimulus> stimuli, List<String> publishers, List<String> clientInits) '''
+	static def String getInitialisation(String nodeName, Collection<Stimulus> stimuli, Collection<String> publishers, Collection<String> clientInits) '''
 		«FOR stimulus : stimuli»
 			«IF stimulus instanceof PeriodicStimulus»
 				«(stimulus as PeriodicStimulus).name»_timer_ = this->create_wall_timer(
@@ -70,7 +69,7 @@
 		«ENDFOR»
 	'''
 
-	static def String getServiceCallback(List<Stimulus> stimuli, List<String> stepCalls) '''
+	static def String getServiceCallback(Collection<Stimulus> stimuli, Collection<String> stepCalls) '''
 		«FOR stimulus : stimuli»
 			«IF stimulus instanceof InterProcessStimulus»
 				void «(stimulus as InterProcessStimulus).name»_service_callback(const std::shared_ptr<«(stimulus as InterProcessStimulus).name»_service::srv::«Utils.toIdlCompliantName((stimulus as InterProcessStimulus).name + '_service')»::Request> request,
@@ -85,7 +84,7 @@
 		«ENDFOR»
 	'''
 	
-	static def String getCallback(List<Stimulus> stimuli, List<String> stepCalls) '''
+	static def String getCallback(Collection<Stimulus> stimuli, Collection<String> stepCalls) '''
 		«FOR stimulus : stimuli»
 			«IF stimulus instanceof PeriodicStimulus»
 				void «(stimulus as PeriodicStimulus).name»_timer_callback() {
@@ -104,7 +103,7 @@
 		«ENDFOR»
 	'''
 	
-	static def String getHeaders(Set<String> includes) '''
+	static def String getHeaders(Collection<String> includes) '''
 		«FOR include : includes»
 			#include "«include»"
 		«ENDFOR»
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTaskTranslationUnit.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTaskTranslationUnit.java
deleted file mode 100644
index 4e58591..0000000
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTaskTranslationUnit.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/**
- * Copyright (c) 2020-2021 Robert Bosch GmbH.
- * 
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- * 
- * SPDX-License-Identifier: EPL-2.0
- * 
- * Contributors:
- *     Robert Bosch GmbH - initial API and implementation
- */
-
-package org.eclipse.app4mc.slg.ros2.generators;
-
-import java.util.ArrayList;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-import java.util.function.BiConsumer;
-
-import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
-import org.eclipse.app4mc.amalthea.model.Component;
-import org.eclipse.app4mc.amalthea.model.Group;
-import org.eclipse.app4mc.amalthea.model.ITaggable;
-import org.eclipse.app4mc.amalthea.model.InterProcessStimulus;
-import org.eclipse.app4mc.amalthea.model.Runnable;
-import org.eclipse.app4mc.amalthea.model.RunnableCall;
-import org.eclipse.app4mc.amalthea.model.Stimulus;
-import org.eclipse.app4mc.amalthea.model.Tag;
-import org.eclipse.app4mc.amalthea.model.Task;
-import org.eclipse.app4mc.slg.commons.m2t.generators.LabelTranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TaskTranslationUnit;
-import org.eclipse.app4mc.slg.ros2.transformers.stimuli.RosInterProcessStimulusTransformer;
-import org.eclipse.app4mc.slg.ros2.transformers.sw.RosLabelTransformer;
-import org.eclipse.app4mc.slg.ros2.transformers.sw.RosRunnableTransformer;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-
-public class RosTaskTranslationUnit extends TaskTranslationUnit {
-	private RosInterProcessStimulusTransformer ipStimulusTransformer;
-	private Task task;
-
-	private final Set<String> includes = new LinkedHashSet<>();
-	private final List<String> initCalls = new LinkedList<>();
-	private final List<String> stepCalls = new LinkedList<>();
-	private final List<Stimulus> stimuli = new ArrayList<>();
-	private final List<String> publishers = new ArrayList<>();
-	private final List<String> clientDeclarations = new ArrayList<>();
-	private final List<String> clientInits = new ArrayList<>();
-
-	public RosTaskTranslationUnit(final OutputBuffer outputBuffer, final RosRunnableTransformer transformerRunnable,
-			final RosLabelTransformer transformerLabel, final RosInterProcessStimulusTransformer ipStimulusTransformer,
-			final Task task, final Component c) {
-		super(outputBuffer, transformerRunnable, transformerLabel, task);
-		this.ipStimulusTransformer = ipStimulusTransformer;
-		this.task = task;
-
-		this.genFiles();
-	}
-
-	@Override
-	public String getBasePath() {
-		return "";
-	}
-
-	@Override
-	public String getModuleName() {
-		return this.task.getName();
-	}
-
-	@Override
-	public void genFiles() {
-
-		if (task != null && task.getActivityGraph() != null) {
-			for (ActivityGraphItem item : task.getActivityGraph().getItems()) {
-
-				if ((item instanceof RunnableCall)) {
-					final RunnableCall runnableCall = (RunnableCall) item;
-					final Runnable runnable = runnableCall.getRunnable();
-
-					RosRunnableTranslationUnit tu = (RosRunnableTranslationUnit) runnableTransformer.transform(runnable);
-					includes.add(tu.getIncFile());
-
-					if (hasTagNamed(runnableCall, "initialize")) {
-						initCalls.add(tu.getNodeCall());
-					} else {
-						stepCalls.add(tu.getNodeCall());
-					}
-
-					// TODO: Make set
-					publishers.addAll(tu.getPublishers());
-					clientDeclarations.addAll(tu.getClientDeclarations());
-					clientInits.addAll(tu.getClientInits());
-					// TODO: add terminate function, if requested
-
-				} else if (item instanceof Group) {
-					final Group group = ((Group) item);
-					for (ActivityGraphItem groupitem : group.getItems()) {
-						if ((groupitem instanceof RunnableCall)) {
-							final RunnableCall runnableCall = (RunnableCall) groupitem;
-							final Runnable runnable = runnableCall.getRunnable();
-							
-							RosRunnableTranslationUnit tu = (RosRunnableTranslationUnit) runnableTransformer.transform(runnable);
-							includes.add(tu.getIncFile());
-							
-							if (hasTagNamed(runnableCall, "initialize")) {
-								initCalls.add((tu).getNodeCall());
-							} else {
-								stepCalls.add((tu).getNodeCall());
-							}
-							//TODO: add terminate function, if requested 
-						}
-					}
-				}
-			}
-		}
-
-		// labels must be initialized before usage, generated labels provide this method
-
-		for (LabelTranslationUnit tu : labelTransformer.getCache().values()) {
-			includes.add(tu.getIncFile());
-			initCalls.add(tu.getInitCall());
-		}
-
-		labelTransformer.getCache().forEach(
-				(BiConsumer<ArrayList<?>, LabelTranslationUnit>) (ArrayList<?> label, LabelTranslationUnit tu) -> {
-
-				});
-
-		// add header for srv file in case of an interprocessstimulus
-		// create .srv file for the messages to be translated
-
-		if (task != null) {
-			for (Stimulus stimulus : task.getStimuli()) {
-				if (stimulus instanceof InterProcessStimulus) {
-					String name = stimulus.getName();
-					includes.add(name + "_service/srv/" + name + "_service.hpp");
-
-					ipStimulusTransformer.transform(((InterProcessStimulus) stimulus));
-				}
-			}
-			
-			stimuli.addAll(task.getStimuli());
-		}
-
-	}
-
-	private boolean hasTagNamed(ITaggable element, String name) {
-		for (Tag tag : element.getTags()) {
-			if (tag.getName().equals(name))
-				return true;
-		}
-		return false;
-	}
-
-	public String getDeclaration() {
-		return RosTaskGenerator.getDeclaration(stimuli, publishers, clientDeclarations);
-	}
-	
-	public String getInitialisation(String nodeName) {
-		return RosTaskGenerator.getInitialisation(nodeName, stimuli, publishers, clientInits);
-	}
-	
-	public String getServiceCallback() {
-		return RosTaskGenerator.getServiceCallback(stimuli, stepCalls);
-	}
-	
-	public String getCallback() {
-		return RosTaskGenerator.getCallback(stimuli, stepCalls);
-	}
-	
-	public String getHeaders() {
-		return RosTaskGenerator.getHeaders(includes);
-	}
-}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosBaseTransformer.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosBaseTransformer.java
index 7bffcc3..50eae90 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosBaseTransformer.java
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosBaseTransformer.java
@@ -22,6 +22,11 @@
 import static org.eclipse.app4mc.slg.ros2.transformers.RosBaseSettings.SRC_FOLDER;
 import static org.eclipse.app4mc.slg.ros2.transformers.RosBaseSettings.SRC_TYPE;
 
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
 import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
 import org.eclipse.app4mc.transformation.util.OutputBuffer;
 
@@ -60,4 +65,19 @@
 	public String getSrcPath(SLGTranslationUnit tu) { return tu.getModulePath() + SRC_FOLDER + getSrcFile(tu); }
 	public String getIncPath(SLGTranslationUnit tu) { return tu.getModulePath() + INC_FOLDER + getIncFile(tu); }
 
+	// Generic cache handling
+
+	public List<String> getSrcFiles() {
+
+		return getCache().values().stream()
+				.map(this::getSrcFile)
+				.sorted()
+				.distinct()
+				.collect(Collectors.toList());
+	}
+
+	public Map<List<Object>, SLGTranslationUnit> getCache() {
+		return Collections.emptyMap();
+	}
+
 }
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosModel2TextTransformer.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosModel2TextTransformer.java
index ce9df52..fb1dc3f 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosModel2TextTransformer.java
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosModel2TextTransformer.java
@@ -39,8 +39,8 @@
 import org.eclipse.app4mc.amalthea.model.util.SoftwareUtil;
 import org.eclipse.app4mc.slg.commons.m2t.transformers.AmaltheaModel2TextTransformer;
 import org.eclipse.app4mc.slg.commons.m2t.transformers.sw.TicksUtilsTransformer;
-import org.eclipse.app4mc.slg.ros2.generators.RosAmlTranslationUnit;
 import org.eclipse.app4mc.slg.ros2.generators.RosModel2TextGenerator;
+import org.eclipse.app4mc.slg.ros2.transformers.common.RosAmlTransformer;
 import org.eclipse.app4mc.slg.ros2.transformers.common.RosTagTransformer;
 import org.eclipse.app4mc.slg.ros2.transformers.sw.RosLabelTransformer;
 import org.eclipse.app4mc.transformation.util.OutputBuffer;
@@ -52,6 +52,7 @@
 public class RosModel2TextTransformer extends AmaltheaModel2TextTransformer {
 
 	@Inject private OutputBuffer outputBuffer;
+	@Inject private RosAmlTransformer amlTransformer;
 	@Inject private RosTagTransformer tagTransformer;
 	@Inject private TicksUtilsTransformer ticksUtilsTransformer;
 	@Inject private RosLabelTransformer labelTransformer;
@@ -67,12 +68,9 @@
 
 		RosBaseSettings.initializeOutputBuffer(this.outputBuffer, outputFolder);
 
-		Set<String> nodes = new HashSet<>();
-		Set<String> services = new HashSet<>();
-
+		amlTransformer.transform(model);
+		
 		CommonElements commonElements = ModelUtil.getOrCreateCommonElements(model);
-		SWModel swModel = ModelUtil.getOrCreateSwModel(model);
-
 		for (Tag tag : commonElements.getTags()) {
 			// instance to know which node published a message
 			tagTransformer.transform(tag, model);
@@ -81,6 +79,10 @@
 		/* extract information needed for top-level CMake file */
 		/* find runnables that use service files and use the tag to set the dependencies */
 
+		Set<String> nodes = new HashSet<>();
+		Set<String> services = new HashSet<>();
+
+		SWModel swModel = ModelUtil.getOrCreateSwModel(model);
 		for (Task task : swModel.getTasks()) {
 
 			Stimulus stimulus = task.getStimuli().get(0);	// Mc: Why only the first ?
@@ -119,15 +121,16 @@
 			}
 		}
 
-		this.ticksUtilsTransformer.createCMake();
-		this.labelTransformer.createCMake();
-		new RosAmlTranslationUnit(this.outputBuffer);
-		this.outputBuffer.appendTo(OTHER_TYPE, "CMakeLists.txt", RosModel2TextGenerator.toCmake(nodes, services, label,
+		ticksUtilsTransformer.createCMake();
+		labelTransformer.createCMake();
+
+		outputBuffer.appendTo(OTHER_TYPE, "CMakeLists.txt", RosModel2TextGenerator.toCmake(nodes, services, label,
 				ticks, interprocess, channelSend, performance_measurement));
-		this.outputBuffer.appendTo(OTHER_TYPE, "package.xml", RosModel2TextGenerator.toPackageXml(services));
-		this.outputBuffer.appendTo(OTHER_TYPE, "build.sh", RosModel2TextGenerator.toBuildScript(services));
-		this.outputBuffer.appendTo(OTHER_TYPE, "launch.py", RosModel2TextGenerator.toLaunchFile(nodes));
-		this.outputBuffer.finish();
+		outputBuffer.appendTo(OTHER_TYPE, "package.xml", RosModel2TextGenerator.toPackageXml(services));
+		outputBuffer.appendTo(OTHER_TYPE, "build.sh", RosModel2TextGenerator.toBuildScript(services));
+		outputBuffer.appendTo(OTHER_TYPE, "launch.py", RosModel2TextGenerator.toLaunchFile(nodes));
+
+		outputBuffer.finish();
 	}
 
 }
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/common/RosAmlTransformer.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/common/RosAmlTransformer.java
new file mode 100644
index 0000000..a6d9f4a
--- /dev/null
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/common/RosAmlTransformer.java
@@ -0,0 +1,57 @@
+/**
+ ********************************************************************************
+ * Copyright (c) 2020-2021 Robert Bosch GmbH.
+ * 
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ * 
+ * Contributors:
+ *     Robert Bosch GmbH - initial API and implementation
+ * *******************************************************************************
+ */
+
+package org.eclipse.app4mc.slg.ros2.transformers.common;
+
+
+import org.eclipse.app4mc.amalthea.model.Amalthea;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
+import org.eclipse.app4mc.slg.ros2.generators.RosAmlGenerator;
+import org.eclipse.app4mc.slg.ros2.transformers.RosBaseTransformer;
+
+public class RosAmlTransformer extends RosBaseTransformer {
+
+	public SLGTranslationUnit transform(final Amalthea model) {
+		final SLGTranslationUnit tu = createTranslationUnit(model);
+
+		// if translation unit is newly created and valid -> create files
+		if (tu.isValid()) {
+			doTransform(tu, model);
+		}
+
+		return tu;
+	}
+
+	private SLGTranslationUnit createTranslationUnit(final Amalthea model) {
+		if (model == null) {
+			return new SLGTranslationUnit("UNSPECIFIED MODEL");
+		} else {
+			String basePath = "utils";
+			String moduleName = "aml";
+			String call = ""; // unused
+			return new SLGTranslationUnit(basePath, moduleName, call);
+		}
+	}
+
+	private void doTransform(final SLGTranslationUnit tu, final Amalthea model) {
+		genFiles(tu, model);
+	}
+
+	private void genFiles(SLGTranslationUnit tu, final Amalthea model) {
+		incAppend(tu, RosAmlGenerator.toH());
+		srcAppend(tu, RosAmlGenerator.toCpp());
+	}
+
+}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/common/RosTagTransformer.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/common/RosTagTransformer.java
index 302f1e1..e451c1c 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/common/RosTagTransformer.java
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/common/RosTagTransformer.java
@@ -28,8 +28,9 @@
 import org.eclipse.app4mc.amalthea.model.Task;
 import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
 import org.eclipse.app4mc.slg.ros2.generators.RosTagGenerator;
-import org.eclipse.app4mc.slg.ros2.generators.RosTaskTranslationUnit;
 import org.eclipse.app4mc.slg.ros2.transformers.RosBaseTransformer;
+import org.eclipse.app4mc.slg.ros2.transformers.sw.RosTaskCache;
+import org.eclipse.app4mc.slg.ros2.transformers.sw.RosTaskCache.TaskStore;
 import org.eclipse.app4mc.slg.ros2.transformers.sw.RosTaskTransformer;
 
 import com.google.inject.Inject;
@@ -39,6 +40,7 @@
 public class RosTagTransformer extends RosBaseTransformer {
 
 	@Inject private RosTaskTransformer rosTaskTransformer;
+	@Inject private RosTaskCache rosTaskCache;
 
 	// ---------- generic part "def create new transform(...)" ----------
 
@@ -96,12 +98,13 @@
 		if (model != null && model.getSwModel() != null) {
 			for (Task task : model.getSwModel().getTasks()) {
 				if (task.getTags().contains(tag)) {
-					final RosTaskTranslationUnit taskTU = (RosTaskTranslationUnit) rosTaskTransformer.transform(task, null);
-					header.add(taskTU.getHeaders());
-					declaration.add(taskTU.getDeclaration());
-					initialization.add(taskTU.getInitialisation(tu.getModuleName()));
-					calls.add(taskTU.getCallback());
-					serviceCallbacks.add(taskTU.getServiceCallback());
+					final SLGTranslationUnit taskTU = rosTaskTransformer.transform(task);
+					final TaskStore store = rosTaskCache.getStore(taskTU);
+					header.add(store.getHeaders());
+					declaration.add(store.getDeclaration());
+					initialization.add(store.getInitialisation(tu.getModuleName()));
+					calls.add(store.getCallback());
+					serviceCallbacks.add(store.getServiceCallback());
 				}
 			}
 		}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosActivityGraphItemTransformer.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosActivityGraphItemTransformer.java
index e6275df..13199a8 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosActivityGraphItemTransformer.java
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosActivityGraphItemTransformer.java
@@ -15,18 +15,11 @@
 
 package org.eclipse.app4mc.slg.ros2.transformers.sw;
 
-import java.util.Arrays;
-
 import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
-import org.eclipse.app4mc.amalthea.model.ChannelReceive;
 import org.eclipse.app4mc.amalthea.model.ChannelSend;
 import org.eclipse.app4mc.amalthea.model.InterProcessTrigger;
-import org.eclipse.app4mc.amalthea.model.LabelAccess;
-import org.eclipse.app4mc.amalthea.model.RunnableCall;
-import org.eclipse.app4mc.amalthea.model.Ticks;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
 import org.eclipse.app4mc.slg.commons.m2t.transformers.sw.ActivityGraphItemTransformer;
-import org.eclipse.xtend2.lib.StringConcatenation;
 
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
@@ -34,47 +27,23 @@
 @Singleton
 public class RosActivityGraphItemTransformer extends ActivityGraphItemTransformer {
 
-	@Inject private RosChannelSendTransformer channelSendTransformer;
 	@Inject private RosInterProcessTriggerTransformer ipTransformer;
+	@Inject private RosChannelSendTransformer channelSendTransformer;
 
 	@Override
-	protected TranslationUnit _transform(final ChannelSend cs) {
-		return this.channelSendTransformer.transform(cs);
-	}
+	public SLGTranslationUnit transform(final ActivityGraphItem graphItem) {
+		if (graphItem == null) {
+			throw new IllegalArgumentException("Unhandled parameter type: null");
+		}
 
-	protected TranslationUnit _transform(final InterProcessTrigger ip) {
-		return this.ipTransformer.transform(ip);
-	}
+		if (graphItem instanceof InterProcessTrigger) {
+			return ipTransformer.transform((InterProcessTrigger) graphItem);
 
-	@Override
-	protected TranslationUnit _transform(final ActivityGraphItem ActivityGraphItem) {
-		StringConcatenation _builder = new StringConcatenation();
-		_builder.append("/*[feature ");
-		Class<? extends org.eclipse.app4mc.amalthea.model.ActivityGraphItem> _class = ActivityGraphItem.getClass();
-		_builder.append(_class);
-		_builder.append(" in not supported]*/");
-		final String message = _builder.toString();
-		return new TranslationUnit("undefined", message, message, message);
-	}
+		} else if (graphItem instanceof ChannelSend) {
+			return channelSendTransformer.transform((ChannelSend) graphItem);
 
-	@Override
-	public TranslationUnit transform(final ActivityGraphItem cs) {
-		if (cs instanceof ChannelReceive) {
-			return _transform((ChannelReceive) cs);
-		} else if (cs instanceof ChannelSend) {
-			return _transform((ChannelSend) cs);
-		} else if (cs instanceof LabelAccess) {
-			return _transform((LabelAccess) cs);
-		} else if (cs instanceof Ticks) {
-			return _transform((Ticks) cs);
-		} else if (cs instanceof InterProcessTrigger) {
-			return _transform((InterProcessTrigger) cs);
-		} else if (cs instanceof RunnableCall) {
-			return _transform((RunnableCall) cs);
-		} else if (cs != null) {
-			return _transform(cs);
 		} else {
-			throw new IllegalArgumentException("Unhandled parameter types: " + Arrays.<Object>asList(cs).toString());
+			return super.transform(graphItem);
 		}
 	}
 
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosChannelSendTransformer.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosChannelSendTransformer.java
index 6794357..5cd8da3 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosChannelSendTransformer.java
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosChannelSendTransformer.java
@@ -16,9 +16,7 @@
 package org.eclipse.app4mc.slg.ros2.transformers.sw;
 
 import org.eclipse.app4mc.amalthea.model.ChannelSend;
-import org.eclipse.app4mc.slg.ros2.generators.RosChannelSendTranslationUnit;
-import org.eclipse.app4mc.slg.ros2.generators.RosChannelSendUtilsTranslationUnit;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
 
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
@@ -26,12 +24,28 @@
 @Singleton
 public class RosChannelSendTransformer {
 
-	@Inject private OutputBuffer outputBuffer;
 	@Inject private RosChannelSendUtilsTransformer channelSendUtilTransformer;
 
-	public RosChannelSendTranslationUnit transform(final ChannelSend cs) {
-		final RosChannelSendUtilsTranslationUnit tuIp = this.channelSendUtilTransformer.generate(cs);
-		return new RosChannelSendTranslationUnit(this.outputBuffer, tuIp, cs);
+	public SLGTranslationUnit transform(final ChannelSend cs) {
+		final SLGTranslationUnit utilTU = this.channelSendUtilTransformer.transform(cs);
+
+		return createTranslationUnit(cs, utilTU);
+	}
+
+	private SLGTranslationUnit createTranslationUnit(final ChannelSend cs, final SLGTranslationUnit utilTU) {
+		if (cs == null) {
+			return new SLGTranslationUnit("UNSPECIFIED CHANNEL SEND");
+		}
+
+		String basePath = utilTU.getBasePath();
+		String moduleName = utilTU.getModuleName();
+		String call = computeCall(cs);
+		return new SLGTranslationUnit(basePath, moduleName, call);
+	}
+
+	private String computeCall(final ChannelSend cs) {
+		String param = cs.getData().getName();
+		return "publish_to_" + param + "(" + param + "_publisher)";
 	}
 
 }
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosChannelSendUtilsTransformer.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosChannelSendUtilsTransformer.java
index 5bcba77..cb68a3e 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosChannelSendUtilsTransformer.java
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosChannelSendUtilsTransformer.java
@@ -15,53 +15,97 @@
 
 package org.eclipse.app4mc.slg.ros2.transformers.sw;
 
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
+
 import org.eclipse.app4mc.amalthea.model.ChannelSend;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGBaseTransformer;
-import org.eclipse.app4mc.slg.ros2.generators.RosChannelSendUtilsTranslationUnit;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.xtext.xbase.lib.CollectionLiterals;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
+import org.eclipse.app4mc.slg.ros2.generators.RosChannelSendUtilsGenerator;
+import org.eclipse.app4mc.slg.ros2.transformers.RosBaseTransformer;
+
+import com.google.inject.Singleton;
 
 @Singleton
-public class RosChannelSendUtilsTransformer extends SLGBaseTransformer {
+public class RosChannelSendUtilsTransformer extends RosBaseTransformer {
 
-	@Inject private OutputBuffer outputBuffer;
+	public static final String LIB_NAME = "CHANNELSEND_UTIL";
+	public static final String MODULE_NAME = "channelSendUtils";
+	public static final String MODULE_PATH = "synthetic_gen/" + MODULE_NAME;
+	public static final String MAKEFILE_PATH = MODULE_PATH + "/CMakeLists.txt";
 
-	private final HashMap<ArrayList<?>, RosChannelSendUtilsTranslationUnit> cache = CollectionLiterals
-			.newHashMap();
+	private List<String> topicList = new ArrayList<>();
 
-	public RosChannelSendUtilsTranslationUnit generate(final ChannelSend cs) {
-		return this.generateIntern(cs);	// hash according to class not instance
+	// ---------- generic part "def create new transform(...)" ----------
+
+	private final Map<List<Object>, SLGTranslationUnit> transformCache = new HashMap<>();
+
+	public Map<List<Object>, SLGTranslationUnit> getCache() {
+		return this.transformCache;
 	}
 
-	public RosChannelSendUtilsTranslationUnit generateIntern(final ChannelSend cs) {
-		final ArrayList<?> key = CollectionLiterals.newArrayList(cs);
-		final RosChannelSendUtilsTranslationUnit _result;
-		synchronized (cache) {
-			if (cache.containsKey(key)) {
-				return cache.get(key);
+	public SLGTranslationUnit transform(final ChannelSend cs) {
+		final List<Object> key = new ArrayList<>(Arrays.asList(cs));
+		final SLGTranslationUnit tu;
+
+		synchronized (transformCache) {
+			if (transformCache.containsKey(key)) {
+				return transformCache.get(key);
 			}
-			RosChannelSendUtilsTranslationUnit _rosChannelSendUtilsTranslationUnit = new RosChannelSendUtilsTranslationUnit(
-					this.outputBuffer, cs);
-			_result = _rosChannelSendUtilsTranslationUnit;
-			cache.put(key, _result);
+			tu = createTranslationUnit(cs);
+			transformCache.put(key, tu);
 		}
-		_init_generateIntern(_result, cs);
-		return _result;
+
+		// if translation unit is newly created and valid -> create files
+		if (tu.isValid()) {
+			doTransform(tu, cs);
+		}
+
+		return tu;
 	}
 
+	// ---------------------------------------------------
 
-	private void _init_generateIntern(final RosChannelSendUtilsTranslationUnit it, final ChannelSend cs) {
+	private SLGTranslationUnit createTranslationUnit(final ChannelSend cs) {
+		if (cs == null) {
+			return new SLGTranslationUnit("UNSPECIFIED CHANNEL SEND");
+		} else {
+			String basePath = "synthetic_gen";
+			String moduleName = "channelSendUtils";
+			String call = ""; // unused
+			return new SLGTranslationUnit(basePath, moduleName, call);
+		}
 	}
 
-	@Override
-	public Map<ArrayList<?>, ? extends TranslationUnit> getCache() {
-		return this.cache;
+	private void doTransform(final SLGTranslationUnit tu, final ChannelSend cs) {
+		genFiles(tu, cs);
+	}
+
+	private void genFiles(final SLGTranslationUnit tu, final ChannelSend cs) {
+		if (isSrcFileEmpty(tu)) {
+			incAppend(tu, RosChannelSendUtilsGenerator.toHeader());
+		}
+		if (isSrcFileEmpty(tu)) {
+			srcAppend(tu, RosChannelSendUtilsGenerator.toCPPHead());
+		}
+
+		defineData(tu, cs);
+	}
+
+	private void defineData(final SLGTranslationUnit tu, final ChannelSend cs) {
+		if (cs.getData() == null || cs.getData().getName() == null || cs.getData().getName().isEmpty())
+			return;
+
+		String topic = cs.getData().getName();
+
+		if (!topicList.contains(topic)) {
+			incAppend(tu, RosChannelSendUtilsGenerator.toH(cs));
+			srcAppend(tu, RosChannelSendUtilsGenerator.toCPP(cs));
+
+			topicList.add(topic);
+		}
 	}
 
 }
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosInterProcessTriggerTransformer.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosInterProcessTriggerTransformer.java
index 508ce20..ca0ffbc 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosInterProcessTriggerTransformer.java
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosInterProcessTriggerTransformer.java
@@ -16,9 +16,7 @@
 package org.eclipse.app4mc.slg.ros2.transformers.sw;
 
 import org.eclipse.app4mc.amalthea.model.InterProcessTrigger;
-import org.eclipse.app4mc.slg.ros2.generators.RosInterProcessTriggerTranslationUnit;
-import org.eclipse.app4mc.slg.ros2.generators.RosInterProcessTriggerUtilsTranslationUnit;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
 
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
@@ -26,12 +24,28 @@
 @Singleton
 public class RosInterProcessTriggerTransformer {
 
-	@Inject private OutputBuffer outputBuffer;
-	@Inject private RosInterProcessTriggerUtilsTransformer ipUtilTransformer;
+	@Inject private RosInterProcessTriggerUtilsTransformer iptUtilTransformer;
 
-	public RosInterProcessTriggerTranslationUnit transform(final InterProcessTrigger ip) {
-		final RosInterProcessTriggerUtilsTranslationUnit tuIp = this.ipUtilTransformer.generate(ip);
-		return new RosInterProcessTriggerTranslationUnit(this.outputBuffer, tuIp, ip);
+	public SLGTranslationUnit transform(final InterProcessTrigger ipt) {
+		final SLGTranslationUnit utilTU = this.iptUtilTransformer.transform(ipt);
+
+		return createTranslationUnit(ipt, utilTU);
+	}
+
+	private SLGTranslationUnit createTranslationUnit(final InterProcessTrigger ipt, final SLGTranslationUnit utilTU) {
+		if (ipt == null) {
+			return new SLGTranslationUnit("UNSPECIFIED INTER PROCESS TRIGGER");
+		}
+
+		String basePath = utilTU.getBasePath();
+		String moduleName = utilTU.getModuleName();
+		String call = computeCall(ipt);
+		return new SLGTranslationUnit(basePath, moduleName, call);
+	}
+
+	private String computeCall(final InterProcessTrigger ipt) {
+		String param = ipt.getStimulus().getName();
+		return "call_service_" + param + "(" + param + "_client)";
 	}
 
 }
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosInterProcessTriggerUtilsTransformer.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosInterProcessTriggerUtilsTransformer.java
index 509f4df..51c0a29 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosInterProcessTriggerUtilsTransformer.java
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosInterProcessTriggerUtilsTransformer.java
@@ -16,54 +16,81 @@
 package org.eclipse.app4mc.slg.ros2.transformers.sw;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.eclipse.app4mc.amalthea.model.InterProcessTrigger;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
 import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGBaseTransformer;
-import org.eclipse.app4mc.slg.ros2.generators.RosInterProcessTriggerUtilsTranslationUnit;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.xtext.xbase.lib.CollectionLiterals;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
+import org.eclipse.app4mc.slg.ros2.generators.RosInterProcessTriggerUtilsGenerator;
 
-import com.google.inject.Inject;
 import com.google.inject.Singleton;
 
 @Singleton
 public class RosInterProcessTriggerUtilsTransformer extends SLGBaseTransformer {
 
-	@Inject private OutputBuffer outputBuffer;
+	public static final String LIB_NAME = "INTERPROCESSTRIGGER_UTIL";
+	public static final String MODULE_NAME = "interProcessTriggerUtils";
+	public static final String MODULE_PATH = "synthetic_gen/" + MODULE_NAME;
+	public static final String MAKEFILE_PATH = MODULE_PATH + "/CMakeLists.txt";
 
-	private final HashMap<ArrayList<?>, RosInterProcessTriggerUtilsTranslationUnit> cache = CollectionLiterals
-			.newHashMap();
+	// ---------- generic part "def create new transform(...)" ----------
 
-	public RosInterProcessTriggerUtilsTranslationUnit generate(final InterProcessTrigger ip) {
-		return this.generateIntern(ip);	// hash according to class not instance
+	private final Map<List<Object>, SLGTranslationUnit> transformCache = new HashMap<>();
+
+	public Map<List<Object>, SLGTranslationUnit> getCache() {
+		return this.transformCache;
 	}
 
-	public RosInterProcessTriggerUtilsTranslationUnit generateIntern(final InterProcessTrigger ip) {
-		final ArrayList<?> key = CollectionLiterals.newArrayList(ip);
-		final RosInterProcessTriggerUtilsTranslationUnit _result;
-		synchronized (cache) {
-			if (cache.containsKey(key)) {
-				return cache.get(key);
+	public SLGTranslationUnit transform(final InterProcessTrigger ipt) {
+		final List<Object> key = new ArrayList<>(Arrays.asList(ipt));
+		final SLGTranslationUnit tu;
+
+		synchronized (transformCache) {
+			if (transformCache.containsKey(key)) {
+				return transformCache.get(key);
 			}
-			RosInterProcessTriggerUtilsTranslationUnit tu = new RosInterProcessTriggerUtilsTranslationUnit(
-					this.outputBuffer, ip);
-			_result = tu;
-			cache.put(key, _result);
+			tu = createTranslationUnit(ipt);
+			transformCache.put(key, tu);
 		}
-		_init_generateIntern(_result, ip);
-		return _result;
+
+		// if translation unit is newly created and valid -> create files
+		if (tu.isValid()) {
+			doTransform(tu, ipt);
+		}
+
+		return tu;
 	}
 
-	private void _init_generateIntern(final RosInterProcessTriggerUtilsTranslationUnit it,
-			final InterProcessTrigger ip) {
+	// ---------------------------------------------------
+
+	private SLGTranslationUnit createTranslationUnit(final InterProcessTrigger ipt) {
+		if (ipt == null) {
+			return new SLGTranslationUnit("UNSPECIFIED INTER PROCESS TRIGGER");
+		} else {
+			String basePath = "synthetic_gen";
+			String moduleName = "interProcessTriggerUtils";
+			String call = ""; // unused
+			return new SLGTranslationUnit(basePath, moduleName, call);
+		}
 	}
 
-	@Override
-	public Map<ArrayList<?>, ? extends TranslationUnit> getCache() {
-		return this.cache;
+	private void doTransform(final SLGTranslationUnit tu, final InterProcessTrigger ipt) {
+		genFiles(tu, ipt);
+	}
+
+	private void genFiles(final SLGTranslationUnit tu, final InterProcessTrigger ipt) {
+		if (isSrcFileEmpty(tu)) {
+			incAppend(tu, RosInterProcessTriggerUtilsGenerator.toHeader());
+		}
+		if (isSrcFileEmpty(tu)) {
+			srcAppend(tu, RosInterProcessTriggerUtilsGenerator.toCPPHead());
+		}
+
+		incAppend(tu, RosInterProcessTriggerUtilsGenerator.toH(ipt));
+		srcAppend(tu, RosInterProcessTriggerUtilsGenerator.toCPP(ipt));
 	}
 
 }
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosLabelTransformer.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosLabelTransformer.java
index 6ee6333..0d07a1c 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosLabelTransformer.java
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosLabelTransformer.java
@@ -15,57 +15,43 @@
 
 package org.eclipse.app4mc.slg.ros2.transformers.sw;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-
 import org.eclipse.app4mc.amalthea.model.Label;
-import org.eclipse.app4mc.slg.commons.m2t.generators.LabelTranslationUnit;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
 import org.eclipse.app4mc.slg.commons.m2t.transformers.sw.LabelTransformer;
 import org.eclipse.app4mc.slg.ros2.generators.RosLabelGenerator;
-import org.eclipse.app4mc.slg.ros2.generators.RosLabelTranslationUnit;
 import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.xtext.xbase.lib.CollectionLiterals;
 
 import com.google.inject.Inject;
 
 public class RosLabelTransformer extends LabelTransformer {
-	@Inject
-	private OutputBuffer outputBuffer;
 
-	private static final String LIB_NAME = "LABELS_LIB";
+	public static final String LIB_NAME = "LABELS_LIB";
+	public static final String BASE_PATH = "synthetic_gen";
+	public static final String MODULE_NAME = "labels";
+	public static final String MODULE_PATH = BASE_PATH + "/" + MODULE_NAME;
+	public static final String MAKEFILE_PATH = MODULE_PATH + "/CMakeLists.txt";
+
+	@Inject private OutputBuffer outputBuffer;
 
 	@Override
-	public LabelTranslationUnit transform(final Label label) {
-		final ArrayList<?> key = CollectionLiterals.newArrayList(label);
-		final RosLabelTranslationUnit _result;
-		synchronized (_createCache_transform) {
-			if (_createCache_transform.containsKey(key)) {
-				return _createCache_transform.get(key);
-			}
-			RosLabelTranslationUnit tu = new RosLabelTranslationUnit(this.outputBuffer, label);
-			_result = tu;
-			_createCache_transform.put(key, _result);
-		}
-		_init_transform(_result, label);
-		return _result;
-	}
-
-	private final HashMap<ArrayList<?>, LabelTranslationUnit> _createCache_transform = CollectionLiterals.newHashMap();
-
-	private void _init_transform(final RosLabelTranslationUnit it, final Label label) {
+	public SLGTranslationUnit transform(final Label label) {
+		return super.transform(label);
 	}
 
 	@Override
-	public HashMap<ArrayList<?>, LabelTranslationUnit> getCache() {
-		return this._createCache_transform;
+	public void genFiles(SLGTranslationUnit tu, Label label) {
+		if (isSrcFileEmpty(tu)) {
+			srcAppend(tu,"#include \"" + getIncFile(tu) + "\"\n\n");
+			srcAppend(tu, "#include <stdlib.h>\n");
+		}		
+		incAppend(tu, RosLabelGenerator.toH(label));
+		srcAppend(tu, RosLabelGenerator.toCpp(label));
 	}
 
 	@Override
 	public boolean createCMake() {
 		return outputBuffer.appendTo(
-				"OTHER",
-				RosLabelTranslationUnit.MAKEFILE_PATH,
-				RosLabelGenerator.toCMake(LIB_NAME, getSrcFiles()));
+				"OTHER", MAKEFILE_PATH, RosLabelGenerator.toCMake(LIB_NAME, getSrcFiles()));
 	}
 
 }
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosRunnableCache.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosRunnableCache.java
new file mode 100644
index 0000000..802eb44
--- /dev/null
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosRunnableCache.java
@@ -0,0 +1,93 @@
+/**
+ ********************************************************************************
+ * Copyright (c) 2020-2021 Robert Bosch GmbH.
+ * 
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ * 
+ * Contributors:
+ *     Robert Bosch GmbH - initial API and implementation
+ * *******************************************************************************
+ */
+
+package org.eclipse.app4mc.slg.ros2.transformers.sw;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.app4mc.amalthea.model.Runnable;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
+
+import com.google.inject.Singleton;
+
+@Singleton
+public class RosRunnableCache {
+
+	private Map<SLGTranslationUnit, RunnableStore> cache = new HashMap<>();
+
+	public RunnableStore getStore(SLGTranslationUnit tu) {
+		return cache.get(tu);
+	}
+
+	public void storeValues(SLGTranslationUnit tu, Runnable runnable, String param, String nodeParam,
+			Collection<String> publishers, Collection<String> clientDeclarations, Collection<String> clientInits) {
+		RunnableStore store = new RunnableStore(runnable, param, nodeParam, publishers, clientDeclarations, clientInits);
+		cache.put(tu, store);
+	}
+
+	public class RunnableStore {
+		private final Runnable runnable;
+		private final String param;
+		private final String nodeParam;
+		private final Collection<String> publishers;
+		private final Collection<String> clientDeclarations;
+		private final Collection<String> clientInits;
+
+		public RunnableStore(Runnable runnable, String param, String nodeParam, Collection<String> publishers,
+				Collection<String> clientDeclarations, Collection<String> clientInits) {
+			this.runnable = runnable;
+			this.param = param;
+			this.nodeParam = nodeParam;
+			this.publishers = publishers;
+			this.clientDeclarations = clientDeclarations;
+			this.clientInits = clientInits;
+		}
+
+		public Runnable getRunnable() {
+			return runnable;
+		}
+
+		public String getParam() {
+			return param;
+		}
+
+		public String getNodeParam() {
+			return nodeParam;
+		}
+
+		public Collection<String> getPublishers() {
+			return publishers;
+		}
+
+		public Collection<String> getClientDeclarations() {
+			return clientDeclarations;
+		}
+
+		public Collection<String> getClientInits() {
+			return clientInits;
+		}
+
+		public String getCall() {
+			return "run_" + runnable.getName() + "(" + param + ")";
+		}
+
+		public String getNodeCall() {
+			return "run_" + runnable.getName() + "(" + nodeParam + ")";
+		}
+	}
+
+}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosRunnableTransformer.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosRunnableTransformer.java
index 1854398..6cf53b7 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosRunnableTransformer.java
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosRunnableTransformer.java
@@ -16,59 +16,154 @@
 package org.eclipse.app4mc.slg.ros2.transformers.sw;
 
 import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
 
-import org.eclipse.app4mc.slg.commons.m2t.generators.RunnableTranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
+import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
+import org.eclipse.app4mc.amalthea.model.BooleanObject;
+import org.eclipse.app4mc.amalthea.model.Channel;
+import org.eclipse.app4mc.amalthea.model.ChannelSend;
+import org.eclipse.app4mc.amalthea.model.InterProcessStimulus;
+import org.eclipse.app4mc.amalthea.model.InterProcessTrigger;
+import org.eclipse.app4mc.amalthea.model.Runnable;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
 import org.eclipse.app4mc.slg.commons.m2t.transformers.sw.RunnableTransformer;
 import org.eclipse.app4mc.slg.ros2.generators.RosRunnableGenerator;
-import org.eclipse.app4mc.slg.ros2.generators.RosRunnableTranslationUnit;
+import org.eclipse.app4mc.slg.ros2.transformers.utils.Utils;
 import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.xtext.xbase.lib.CollectionLiterals;
 
 import com.google.inject.Inject;
 
 public class RosRunnableTransformer extends RunnableTransformer {
 
+	public static final String LIB_NAME = "RUNNABLES_LIB";
+	public static final String BASE_PATH = "synthetic_gen";
+	public static final String MODULE_NAME = "runnables";
+	public static final String MODULE_PATH = BASE_PATH + "/" + MODULE_NAME;
+	public static final String MAKEFILE_PATH = MODULE_PATH + "/CMakeLists.txt";
+
 	@Inject private OutputBuffer outputBuffer;
-	@Inject private RosActivityGraphItemTransformer psCallGraphItemTransformer;
-
-	private final HashMap<ArrayList<?>, RunnableTranslationUnit> cache = CollectionLiterals.newHashMap();
+	@Inject private RosActivityGraphItemTransformer activityGraphItemTransformer;
+	@Inject private RosRunnableCache rosRunnableCache;
 
 	@Override
-	public RunnableTranslationUnit transform(final org.eclipse.app4mc.amalthea.model.Runnable runnable) {
-		final ArrayList<?> key = CollectionLiterals.newArrayList(runnable);
-		final RosRunnableTranslationUnit _result;
-		synchronized (cache) {
-			if (cache.containsKey(key)) {
-				return cache.get(key);
-			}
-			RosRunnableTranslationUnit tu = new RosRunnableTranslationUnit(this.outputBuffer,
-					this.psCallGraphItemTransformer, runnable);
-			_result = tu;
-			cache.put(key, _result);
+	public void genFiles(SLGTranslationUnit tu, Runnable runnable) {
+		if (isSrcFileEmpty(tu)) { // all stuff only required once regardless of runnable instance
+			srcAppend(tu, "#include \"" + getIncFile(tu) + "\"\n");
 		}
-		_init_transform(_result, runnable);
-		return _result;
+		final HashSet<String> includes = new LinkedHashSet<>();
+		final List<String> calls = new ArrayList<>();
+
+		boolean measurePerformance = false;
+		if (runnable != null && runnable.getCustomProperties().get("measure_performance") instanceof BooleanObject) {
+			measurePerformance = ((BooleanObject) runnable.getCustomProperties().get("measure_performance")).isValue();
+		}
+
+		if (measurePerformance) {
+			includes.add("aml.h");
+		}
+
+		// Compute characteristic values of runnable
+
+		String param = "";
+		String nodeParam = "";
+		final List<String> publishers = new ArrayList<>();
+		final List<String> clientDeclarations = new ArrayList<>();
+		final List<String> clientInits = new ArrayList<>();
+
+		if (runnable != null && runnable.getActivityGraph() != null) {
+			for (ActivityGraphItem item : runnable.getActivityGraph().getItems()) {
+
+				final SLGTranslationUnit graphItemTU = activityGraphItemTransformer.transform(item);
+				String graphItemIncFile = getIncFile(graphItemTU);
+				if (graphItemIncFile != null && !graphItemIncFile.isEmpty() && !getIncFile(tu).equals(graphItemIncFile)) {
+					includes.add(graphItemIncFile);
+				}
+
+				// check if item is publisher
+
+				if (item instanceof ChannelSend) {
+					ChannelSend cs = (ChannelSend) item;
+					Channel data = cs.getData();
+
+					publishers.add(data.getName() + "_publisher");
+
+					nodeParam = nodeParam + ((nodeParam.equals("")) ? "" : ";") + data.getName() + "_publisher";
+					param = ((param.equals("")) ? "" : ";") + "rclcpp::Publisher<std_msgs::msg::String>::SharedPtr& "
+							+ data.getName() + "_publisher";
+				}
+
+				if (item instanceof InterProcessTrigger) {
+					InterProcessTrigger trigger = (InterProcessTrigger) item;
+					InterProcessStimulus stimulus = trigger.getStimulus();
+					
+					includes.add(stimulus.getName() + "_service/srv/" + stimulus.getName() + "_service" + ".hpp");
+					clientDeclarations.add(
+							"rclcpp::Client<" + stimulus.getName() + "_service::srv::"
+							+ Utils.toIdlCompliantName(stimulus.getName() + "_service")
+							+ ">::SharedPtr " + stimulus.getName() + "_client");
+					clientInits.add(
+							stimulus.getName() + "_client =  this->create_client<" + stimulus.getName() + "_service::srv::"
+							+ Utils.toIdlCompliantName(stimulus.getName() + "_service") + ">"
+							+ "(\"" + stimulus.getName() + "_service\")");
+					nodeParam = nodeParam + (nodeParam.equals("") ? "" : ";") + stimulus.getName() + "_client";
+					param = (param.equals("") ? "" : ";") + "rclcpp::Client<"
+							+ stimulus.getName() + "_service::srv::" + Utils.toIdlCompliantName(stimulus.getName() + "_service")
+							+ ">::SharedPtr& " + stimulus.getName() + "_client";
+				}
+
+				final String call = graphItemTU.getCall();
+				if (call != null && !call.isEmpty()) {
+					calls.add(call);
+				}
+			}
+		}
+
+		// store characteristic values in runnable cache
+		rosRunnableCache.storeValues(tu, runnable, param, nodeParam, publishers, clientDeclarations, clientInits);
+
+		String fullCall = "run_" + runnable.getName() + "(" + param + ")";
+
+		// write header
+		incAppend(tu, "\n//Runnable " + runnable.getName() + "----\n");
+		toH(tu, includes, fullCall);
+
+		// write body
+		srcAppend(tu, "\n//Runnable " + runnable.getName() + "----\n");
+		toCpp(tu, runnable.getName(), fullCall, calls, measurePerformance);
 	}
 
-
-	private void _init_transform(final RosRunnableTranslationUnit it,
-			final org.eclipse.app4mc.amalthea.model.Runnable runnable) {
+	private void toH(SLGTranslationUnit tu, final HashSet<String> includes, final String fullCall) {
+		for (String include : includes) {
+			incAppend(tu, "#include \"" + include + "\"\n");
+		}
+		incAppend(tu, "void " + fullCall + ";\n");
 	}
 
-	@Override
-	public Map<ArrayList<?>, ? extends TranslationUnit> getCache() {
-		return this.cache;
+	private void toCpp(SLGTranslationUnit tu, final String runnableName, final String fullCall, final List<String> calls, boolean measurePerformance) {
+		srcAppend(tu, "void " + fullCall + "{\n");
+		if (measurePerformance) {
+			srcAppend(tu,
+				"uint64_t event_list[] = {0x11, 0x13, 0x17}; //CPU CYCLES, MEM ACCESS, L2 Cache Refill\n"
+				+ "int total_events =  sizeof(event_list)/sizeof(event_list[0]);\n"
+				+ "int fd = instrument_start(0,event_list, total_events);\n");
+		}
+
+		for (String call : calls) {
+			srcAppend(tu, "\t" + call + ";\n");
+		}
+
+		if (measurePerformance) {
+			srcAppend(tu, "instrument_stop(fd, \"" + runnableName + ".log\");\n");
+		}
+		srcAppend(tu, "}\n\n");
 	}
 
 	@Override
 	public boolean createCMake() {
 		return outputBuffer.appendTo(
-				"OTHER",
-				RosRunnableTranslationUnit.getMakeFilePathStatic(),
-				RosRunnableGenerator.toCMake(RosRunnableTranslationUnit.getLibName(), getSrcFiles()));
+				"OTHER", MAKEFILE_PATH, RosRunnableGenerator.toCMake(LIB_NAME, getSrcFiles()));
 	}
 
 }
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosTaskCache.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosTaskCache.java
new file mode 100644
index 0000000..f7a44bb
--- /dev/null
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosTaskCache.java
@@ -0,0 +1,121 @@
+/**
+ ********************************************************************************
+ * Copyright (c) 2020-2021 Robert Bosch GmbH.
+ * 
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ * 
+ * Contributors:
+ *     Robert Bosch GmbH - initial API and implementation
+ * *******************************************************************************
+ */
+
+package org.eclipse.app4mc.slg.ros2.transformers.sw;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.app4mc.amalthea.model.Stimulus;
+import org.eclipse.app4mc.amalthea.model.Task;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
+import org.eclipse.app4mc.slg.ros2.generators.RosTaskGenerator;
+
+import com.google.inject.Singleton;
+
+@Singleton
+public class RosTaskCache {
+
+	private Map<SLGTranslationUnit, TaskStore> cache = new HashMap<>();
+
+	public TaskStore getStore(SLGTranslationUnit tu) {
+		return cache.get(tu);
+	}
+
+	public void storeValues(SLGTranslationUnit tu, Task task, Collection<Stimulus> stimuli,
+			Collection<String> includes, Collection<String> initCalls, Collection<String> stepCalls,
+			Collection<String> publishers, Collection<String> clientDeclarations, Collection<String> clientInits) {
+		TaskStore store = new TaskStore(task, stimuli, includes, initCalls, stepCalls, publishers, clientDeclarations, clientInits);
+		cache.put(tu, store);
+	}
+
+	public class TaskStore {
+		private final Task task;
+		private final Collection<Stimulus> stimuli;
+		private final Collection<String> includes;
+		private final Collection<String> initCalls;
+		private final Collection<String> stepCalls;
+		private final Collection<String> publishers;
+		private final Collection<String> clientDeclarations;
+		private final Collection<String> clientInits;
+
+		public TaskStore(Task task, Collection<Stimulus> stimuli,
+				Collection<String> includes, Collection<String> initCalls, Collection<String> stepCalls,
+				Collection<String> publishers, Collection<String> clientDeclarations, Collection<String> clientInits) {
+			this.task = task;
+			this.stimuli = stimuli;
+			this.includes = includes;
+			this.initCalls = initCalls;
+			this.stepCalls = stepCalls;
+			this.publishers = publishers;
+			this.clientDeclarations = clientDeclarations;
+			this.clientInits = clientInits;
+		}
+
+		public Task getTask() {
+			return task;
+		}
+
+		public Collection<Stimulus> getStimuli() {
+			return stimuli;
+		}
+
+		public Collection<String> getIncludes() {
+			return includes;
+		}
+
+		public Collection<String> getInitCalls() {
+			return initCalls;
+		}
+
+		public Collection<String> getStepCalls() {
+			return stepCalls;
+		}
+
+		public Collection<String> getPublishers() {
+			return publishers;
+		}
+
+		public Collection<String> getClientDeclarations() {
+			return clientDeclarations;
+		}
+
+		public Collection<String> getClientInits() {
+			return clientInits;
+		}
+
+		public String getDeclaration() {
+			return RosTaskGenerator.getDeclaration(stimuli, publishers, clientDeclarations);
+		}
+
+		public String getInitialisation(String nodeName) {
+			return RosTaskGenerator.getInitialisation(nodeName, stimuli, publishers, clientInits);
+		}
+
+		public String getServiceCallback() {
+			return RosTaskGenerator.getServiceCallback(stimuli, stepCalls);
+		}
+
+		public String getCallback() {
+			return RosTaskGenerator.getCallback(stimuli, stepCalls);
+		}
+
+		public String getHeaders() {
+			return RosTaskGenerator.getHeaders(includes);
+		}
+	}
+
+}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosTaskTransformer.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosTaskTransformer.java
index 03e16e6..117423a 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosTaskTransformer.java
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosTaskTransformer.java
@@ -16,18 +16,25 @@
 package org.eclipse.app4mc.slg.ros2.transformers.sw;
 
 import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
 
-import org.eclipse.app4mc.amalthea.model.Component;
+import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
+import org.eclipse.app4mc.amalthea.model.Group;
+import org.eclipse.app4mc.amalthea.model.ITaggable;
+import org.eclipse.app4mc.amalthea.model.InterProcessStimulus;
+import org.eclipse.app4mc.amalthea.model.Runnable;
+import org.eclipse.app4mc.amalthea.model.RunnableCall;
+import org.eclipse.app4mc.amalthea.model.Stimulus;
+import org.eclipse.app4mc.amalthea.model.Tag;
 import org.eclipse.app4mc.amalthea.model.Task;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TaskTranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
 import org.eclipse.app4mc.slg.commons.m2t.transformers.sw.TaskTransformer;
-import org.eclipse.app4mc.slg.ros2.generators.RosTaskTranslationUnit;
+import org.eclipse.app4mc.slg.ros2.generators.RosLabelGenerator;
 import org.eclipse.app4mc.slg.ros2.transformers.stimuli.RosInterProcessStimulusTransformer;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.xtext.xbase.lib.CollectionLiterals;
+import org.eclipse.app4mc.slg.ros2.transformers.sw.RosRunnableCache.RunnableStore;
 
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
@@ -35,36 +42,110 @@
 @Singleton
 public class RosTaskTransformer extends TaskTransformer {
 
-	@Inject private OutputBuffer outputBuffer;
-	@Inject private RosLabelTransformer rosTransformerLabel;
-	@Inject private RosRunnableTransformer rosTransformerRunnable;
-	@Inject private RosInterProcessStimulusTransformer ipStimulusTransformer;
-
-	private final HashMap<ArrayList<?>, TaskTranslationUnit> cache = CollectionLiterals.newHashMap();
+	@Inject private RosLabelTransformer rosLabelTransformer;
+	@Inject private RosRunnableTransformer rosRunnableTransformer;
+	@Inject private RosRunnableCache rosRunnableCache;
+	@Inject private RosInterProcessStimulusTransformer rosInterProcessStimulusTransformer;
+	@Inject private RosTaskCache rosTaskCache;
 
 	@Override
-	public TaskTranslationUnit transform(final Task task, final Component component) {
-		final ArrayList<?> key = CollectionLiterals.newArrayList(task, component);
-		final RosTaskTranslationUnit _result;
-		synchronized (cache) {
-			if (cache.containsKey(key)) {
-				return cache.get(key);
+	public void genFiles(SLGTranslationUnit tu, Task task) {
+
+		final Set<String> includes = new LinkedHashSet<>();
+		final List<String> initCalls = new LinkedList<>();
+		final List<String> stepCalls = new LinkedList<>();
+		final List<Stimulus> stimuli = new ArrayList<>();
+		final List<String> publishers = new ArrayList<>();
+		final List<String> clientDeclarations = new ArrayList<>();
+		final List<String> clientInits = new ArrayList<>();
+
+		if (task != null && task.getActivityGraph() != null) {
+			for (ActivityGraphItem item : task.getActivityGraph().getItems()) {
+
+				if ((item instanceof RunnableCall)) {
+					final RunnableCall runnableCall = (RunnableCall) item;
+					final Runnable runnable = runnableCall.getRunnable();
+
+					SLGTranslationUnit runnableTU = rosRunnableTransformer.transform(runnable);
+					RunnableStore runnableStore = rosRunnableCache.getStore(runnableTU);
+
+					includes.add(getIncFile(runnableTU));
+
+					if (hasTagNamed(runnableCall, "initialize")) {
+						initCalls.add(runnableStore.getNodeCall());
+					} else {
+						stepCalls.add(runnableStore.getNodeCall());
+					}
+
+					// TODO: Make set
+					publishers.addAll(runnableStore.getPublishers());
+					clientDeclarations.addAll(runnableStore.getClientDeclarations());
+					clientInits.addAll(runnableStore.getClientInits());
+					// TODO: add terminate function, if requested
+
+				} else if (item instanceof Group) {
+					final Group group = ((Group) item);
+					for (ActivityGraphItem groupitem : group.getItems()) {
+						if ((groupitem instanceof RunnableCall)) {
+							final RunnableCall runnableCall = (RunnableCall) groupitem;
+							final Runnable runnable = runnableCall.getRunnable();
+
+							SLGTranslationUnit runnableTU = rosRunnableTransformer.transform(runnable);
+							RunnableStore runnableStore = rosRunnableCache.getStore(runnableTU);
+
+							includes.add(getIncFile(runnableTU));
+
+							if (hasTagNamed(runnableCall, "initialize")) {
+								initCalls.add(runnableStore.getNodeCall());
+							} else {
+								stepCalls.add(runnableStore.getNodeCall());
+							}
+							// TODO: add terminate function, if requested
+						}
+					}
+				}
 			}
-			RosTaskTranslationUnit _rosTaskTranslationUnit = new RosTaskTranslationUnit(this.outputBuffer,
-					this.rosTransformerRunnable, this.rosTransformerLabel, this.ipStimulusTransformer, task, component);
-			_result = _rosTaskTranslationUnit;
-			cache.put(key, _result);
 		}
-		_init_transform(_result, task, component);
-		return _result;
+
+		// labels must be initialized before usage, generated labels provide this method
+
+		for (SLGTranslationUnit labelTU : rosLabelTransformer.getCache().values()) {
+			includes.add(getIncFile(labelTU));
+			initCalls.add(RosLabelGenerator.initCall(labelTU.getCall()));
+		}
+
+//		rosLabelTransformer.getCache().forEach(
+//				(BiConsumer<ArrayList<?>, LabelTranslationUnit>) (ArrayList<?> label, LabelTranslationUnit tu) -> {
+//
+//				});
+
+		// add header for srv file in case of an interprocessstimulus
+		// create .srv file for the messages to be translated
+
+		if (task != null) {
+			for (Stimulus stimulus : task.getStimuli()) {
+				if (stimulus instanceof InterProcessStimulus) {
+					String name = stimulus.getName();
+					includes.add(name + "_service/srv/" + name + "_service.hpp");
+
+					rosInterProcessStimulusTransformer.transform(((InterProcessStimulus) stimulus));
+				}
+			}
+
+			stimuli.addAll(task.getStimuli());
+		}
+
+		// store characteristic values in task cache
+		rosTaskCache.storeValues(tu, task, stimuli, includes, initCalls, stepCalls, publishers, clientDeclarations, clientInits);
+
 	}
 
-	private void _init_transform(final RosTaskTranslationUnit it, final Task task, final Component component) {
-	}
-
-	@Override
-	public Map<ArrayList<?>, ? extends TranslationUnit> getCache() {
-		return this.cache;
+	private boolean hasTagNamed(ITaggable element, String name) {
+		for (Tag tag : element.getTags()) {
+			if (tag.getName().equals(name))
+				return true;
+		}
+		return false;
 	}
 
 }
