Consolidated (intermediate) state of SLG, Linux and ROS2: transformers, generators, reduced translation units, ...
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;
 	}
 
 }