diff --git a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxActivityGraphItemTransformer.java b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxActivityGraphItemTransformer.java
index 9806951..0dc2cb1 100644
--- a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxActivityGraphItemTransformer.java
+++ b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxActivityGraphItemTransformer.java
@@ -15,8 +15,6 @@
 
 package org.eclipse.app4mc.slg.linux.transformers.sw;
 
-import java.util.Arrays;
-
 import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
 import org.eclipse.app4mc.amalthea.model.LabelAccess;
 import org.eclipse.app4mc.amalthea.model.Ticks;
@@ -31,17 +29,18 @@
 	@Inject private LinuxTicksTransformer linuxTicksTransformer;
 
 	public LinuxTranslationUnit transform(final ActivityGraphItem graphItem) {
+		if (graphItem == null) {
+			throw new IllegalArgumentException("Unhandled parameter type: null");
+		}
+		
 		if (graphItem instanceof LabelAccess) {
 			return linuxLabelAccessTransformer.transform((LabelAccess) graphItem);
 		} else if (graphItem instanceof Ticks) {
 			return linuxTicksTransformer.transform((Ticks) graphItem);
-		} else if (graphItem != null) {
-			String warning = "/*[feature " + graphItem.eClass().getName() + " in not supported]";
-			return new LinuxTranslationUnit(warning);
-		} else {
-			throw new IllegalArgumentException(
-					"Unhandled parameter types: " + Arrays.<Object>asList(graphItem).toString());
 		}
+		
+		String warning = "/*[feature " + graphItem.eClass().getName() + " in not supported]";
+		return new LinuxTranslationUnit(warning);
 	}
 
 }
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosAmlGenerator.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosAmlGenerator.xtend
index 05610b5..b54dcf1 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosAmlGenerator.xtend
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosAmlGenerator.xtend
@@ -15,6 +15,11 @@
 
 class RosAmlGenerator {
 
+	// Suppress default constructor
+	private new() {
+		throw new IllegalStateException("Utility class");
+	}
+
 	static def String toCpp() '''
 		#include "aml.h"
 		#include <mutex>
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosChannelSendUtilsGenerator.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosChannelSendUtilsGenerator.xtend
similarity index 79%
rename from load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosChannelSendUtilsGenerator.xtend
rename to load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosChannelSendUtilsGenerator.xtend
index aa1729e..e1a1a75 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosChannelSendUtilsGenerator.xtend
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosChannelSendUtilsGenerator.xtend
@@ -11,18 +11,23 @@
  *     Robert Bosch GmbH - initial API and implementation
  */
 
-package org.eclipse.app4mc.slg.ros2.transformers
+package org.eclipse.app4mc.slg.ros2.generators
 
 import org.eclipse.app4mc.amalthea.model.ChannelSend
 
 class RosChannelSendUtilsGenerator {
 
-	static def toCPPHead() '''
+	// Suppress default constructor
+	private new() {
+		throw new IllegalStateException("Utility class");
+	}
+
+	static def String toCPPHead() '''
 		#include "channelSendUtils.h"
 		
 	'''
 
-	static def toCPP(ChannelSend cs) '''
+	static def String toCPP(ChannelSend cs) '''
 		
 		void publish_to_«cs.data.name»(rclcpp::Publisher<std_msgs::msg::String>::SharedPtr& publisher) {
 			
@@ -32,7 +37,7 @@
 		}
 	'''
 
-	static def toHeader() '''
+	static def String toHeader() '''
 		#include <string>
 		
 		#include "rclcpp/rclcpp.hpp"
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
index c09cdbb..b81a9b3 100644
--- 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
@@ -18,10 +18,14 @@
 
 import org.eclipse.app4mc.amalthea.model.ChannelSend;
 import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
-import org.eclipse.app4mc.slg.ros2.transformers.RosChannelSendUtilsGenerator;
 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;
 
@@ -35,29 +39,13 @@
 
 	private static List<String> topic_list = new ArrayList<>();
 
-	public static String getModulePathStatic() {
-		return "synthetic_gen" + "/" + RosChannelSendUtilsTranslationUnit.getModuleNameStatic();
-	}
-
-	public static String getMakeFilePathStatic() {
-		return RosChannelSendUtilsTranslationUnit.getModulePathStatic() + "/" + "CMakeLists.txt";
-	}
-
-	public static String getModuleNameStatic() {
-		return "channelSendUtils";
-	}
-
-	public static String getLibName() {
-		return "CHANNELSEND_UTIL";
-	}
-
 	public String getModuleName() {
-		return getModuleNameStatic();
+		return MODULE_NAME;
 	}
 
 	@Override
 	public String getIncFile() {
-		return (getModuleName() + ".h");
+		return (MODULE_NAME + ".h");
 	}
 
 	public String getExecCall(final String param) {
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 7c5a2a8..8b2d0ed 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
@@ -18,6 +18,11 @@
 
 class RosInterProcessTriggerUtilsGenerator {
 
+	// Suppress default constructor
+	private new() {
+		throw new IllegalStateException("Utility class");
+	}
+
 	static def String toCPPHead() '''
 		#include "interProcessTriggerUtils.h"
 		
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
index 31e534d..3c127de 100644
--- 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
@@ -15,11 +15,14 @@
 
 import org.eclipse.app4mc.amalthea.model.InterProcessTrigger;
 import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
-import org.eclipse.app4mc.slg.ros2.transformers.utils.Utils;
 import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.xtend2.lib.StringConcatenation;
 
 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;
 
@@ -30,29 +33,13 @@
 		this.genFiles();
 	}
 
-	public static String getModulePathStatic() {
-		return "synthetic_gen" + "/" + getModuleNameStatic();
-	}
-
-	public static String getMakeFilePathStatic() {
-		return getModulePathStatic() + "/" + "CMakeLists.txt";
-	}
-
-	public static String getModuleNameStatic() {
-		return "interProcessTriggerUtils";
-	}
-
-	public static String getLibName() {
-		return "INTERPROCESSTRIGGER_UTIL";
-	}
-
 	public String getModuleName() {
-		return getModuleNameStatic();
+		return MODULE_NAME;
 	}
 
 	@Override
 	public String getIncFile() {
-		return getModuleName() + ".h";
+		return MODULE_NAME + ".h";
 	}
 
 	public String getExecCall(final String param) {
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 d35f7d6..eaba3c2 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
@@ -15,6 +15,11 @@
 
 class RosLabelGenerator {
 
+	// Suppress default constructor
+	private new() {
+		throw new IllegalStateException("Utility class");
+	}
+
 	static def String toH(String name, String readCall, String writeCall) '''
 		typedef struct «name»_CacheLine
 		{
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
index becce25..9813d5d 100644
--- 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
@@ -18,36 +18,23 @@
 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);
 	}
 
-	// static helper functions (cannot be put to base class)
-	public static String getModulePathStatic() {
-		return "synthetic_gen" + "/" + getModuleNameStatic();
-	}
-
-	public static String getMakeFilePathStatic() {
-		return getModulePathStatic() + "/" + "CMakeLists.txt";
-	}
-
-	// translation unit specific settings
-	public static String getModuleNameStatic() {
-		return "labels";
-	}
-
-	public static String getLibName() {
-		return "LABELS_LIB";
-	}
-
 	@Override
 	public String getModuleName() {
-		return getModuleNameStatic();
+		return MODULE_NAME;
 	}
 
 	@Override
 	public String getIncFile() {
-		return getModuleName() + ".h";
+		return MODULE_NAME + ".h";
 	}
 
 	@Override
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
new file mode 100644
index 0000000..1173798
--- /dev/null
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosRunnableGenerator.xtend
@@ -0,0 +1,65 @@
+/**
+ * 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.Runnable
+import java.util.HashSet
+import java.util.List
+
+class RosRunnableGenerator {
+
+	// Suppress default constructor
+	private new() {
+		throw new IllegalStateException("Utility class");
+	}
+
+	static def String toH(String call, HashSet<String> includes) {
+		val builder = new StringBuilder()
+
+		includes.forEach [ include |
+			builder.append("#include \"" + include + "\"\n")
+		]
+		builder.append('''void «call»;
+		''')
+
+		builder.toString
+	}
+
+	static def String toCpp(Runnable runnable, HashSet<String> includes, String call, List<String> calls,
+		boolean measure_performance) {
+		val builder = new StringBuilder()
+
+		// write runnable body
+		builder.append("void " + call + "{\n")
+		if (measure_performance) {
+			builder.append('''
+				uint64_t event_list[] = {0x11, 0x13, 0x17}; //CPU CYCLES, MEM ACCESS, L2 Cache Refill
+				int total_events =  sizeof(event_list)/sizeof(event_list[0]);
+				int fd = instrument_start(0,event_list, total_events);
+			''')
+		}
+		calls.forEach [ c |
+			builder.append("\t" + c + ";\n")
+		]
+		if (measure_performance) {
+			builder.append('''
+				instrument_stop(fd, "«runnable.name».log");
+			''')
+		}
+		builder.append("}\n\n")
+
+		builder.toString
+	}
+
+}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTagGenerator.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTagGenerator.xtend
index 7c99b81..882eb09 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTagGenerator.xtend
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTagGenerator.xtend
@@ -20,6 +20,11 @@
 
 class RosTagGenerator {
 
+	// Suppress default constructor
+	private new() {
+		throw new IllegalStateException("Utility class");
+	}
+
 	static def String toCpp(Tag tag, String moduleName, HashSet<String> headers,  List<String> declarations,
 							List<String> inits, List<String> calls, List<String> serviceCallbacks) '''
 		#include <chrono>
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
new file mode 100644
index 0000000..2b81adf
--- /dev/null
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTaskGenerator.xtend
@@ -0,0 +1,113 @@
+/**
+ * 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.List
+import java.util.Set
+import org.eclipse.app4mc.amalthea.model.EventStimulus
+import org.eclipse.app4mc.amalthea.model.InterProcessStimulus
+import org.eclipse.app4mc.amalthea.model.PeriodicStimulus
+import org.eclipse.app4mc.amalthea.model.Stimulus
+import org.eclipse.app4mc.slg.ros2.transformers.utils.Utils
+
+class RosTaskGenerator {
+
+	// Suppress default constructor
+	private new() {
+		throw new IllegalStateException("Utility class");
+	}
+
+	static def String getDeclaration(List<Stimulus> stimuli, List<String> publishers, List<String> clientDeclarations) '''
+		«FOR stimulus : stimuli»
+			«IF stimulus instanceof PeriodicStimulus»
+				rclcpp::TimerBase::SharedPtr «(stimulus as PeriodicStimulus).name»_timer_;
+			«ENDIF»
+			«IF stimulus instanceof EventStimulus»
+				rclcpp::Subscription<std_msgs::msg::String>::SharedPtr «(stimulus as EventStimulus).name»_subscription_;
+			«ENDIF»
+			«IF stimulus instanceof InterProcessStimulus»
+				rclcpp::Service<«(stimulus as InterProcessStimulus).name»_service::srv::«Utils.toIdlCompliantName((stimulus as InterProcessStimulus).name + '_service')»>::SharedPtr «(stimulus as InterProcessStimulus).name»_service;
+			«ENDIF»
+		«ENDFOR»
+		«FOR publisher : publishers»
+			rclcpp::Publisher<std_msgs::msg::String>::SharedPtr «publisher»;
+  		«ENDFOR»
+  		«FOR decl: clientDeclarations»
+			«decl»;
+		«ENDFOR»
+	'''
+
+	static def String getInitialisation(String nodeName, List<Stimulus> stimuli, List<String> publishers, List<String> clientInits) '''
+		«FOR stimulus : stimuli»
+			«IF stimulus instanceof PeriodicStimulus»
+				«(stimulus as PeriodicStimulus).name»_timer_ = this->create_wall_timer(
+						«(stimulus as PeriodicStimulus).recurrence.value»«(stimulus as PeriodicStimulus).recurrence.unit», std::bind(&«nodeName»::«(stimulus as PeriodicStimulus).name»_timer_callback, this));
+			«ENDIF»
+			«IF stimulus instanceof EventStimulus»
+				«(stimulus as EventStimulus).name»_subscription_ = this->create_subscription<std_msgs::msg::String>(
+					"«(stimulus as EventStimulus).name»", 10, std::bind(&«nodeName»::«(stimulus as EventStimulus).name»_subscription_callback, this, _1));
+			«ENDIF»
+			«IF stimulus instanceof InterProcessStimulus»
+				«(stimulus as InterProcessStimulus).name»_service = this->create_service<«(stimulus as InterProcessStimulus).name»_service::srv::«Utils.toIdlCompliantName((stimulus as InterProcessStimulus).name + '_service')»>("«(stimulus as InterProcessStimulus).name»_service", &«(stimulus as InterProcessStimulus).name»_service_callback);
+			«ENDIF»
+		«ENDFOR»
+		«FOR publisher : publishers»
+			«publisher» = this->create_publisher<std_msgs::msg::String>("«publisher.replace("_publisher", "")»", 10);
+		«ENDFOR»
+		«FOR init : clientInits»
+			«init»;
+		«ENDFOR»
+	'''
+
+	static def String getServiceCallback(List<Stimulus> stimuli, List<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,
+					std::shared_ptr<«(stimulus as InterProcessStimulus).name»_service::srv::«Utils.toIdlCompliantName((stimulus as InterProcessStimulus).name + '_service')»::Response>      response) {
+				«FOR call : stepCalls»
+					«""»		«call»;
+				«ENDFOR»
+					}
+			«ENDIF»
+
+
+		«ENDFOR»
+	'''
+	
+	static def String getCallback(List<Stimulus> stimuli, List<String> stepCalls) '''
+		«FOR stimulus : stimuli»
+			«IF stimulus instanceof PeriodicStimulus»
+				void «(stimulus as PeriodicStimulus).name»_timer_callback() {
+				«FOR call : stepCalls»
+					«""»	«call»;
+				«ENDFOR»
+				}
+			«ENDIF»
+			«IF stimulus instanceof EventStimulus»
+				void «(stimulus as EventStimulus).name»_subscription_callback(const std_msgs::msg::String::SharedPtr msg) {
+				«FOR call : stepCalls»
+					«""»	«call»;
+				«ENDFOR»
+				}
+			«ENDIF»
+		«ENDFOR»
+	'''
+	
+	static def String getHeaders(Set<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
index 3ff80ce..d572e49 100644
--- 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
@@ -13,411 +13,166 @@
 
 package org.eclipse.app4mc.slg.ros2.generators;
 
-import java.math.BigInteger;
 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 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.EventStimulus;
 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.PeriodicStimulus;
+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.amalthea.model.TimeUnit;
 import org.eclipse.app4mc.slg.commons.m2t.generators.LabelTranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.generators.RunnableTranslationUnit;
 import org.eclipse.app4mc.slg.commons.m2t.generators.TaskTranslationUnit;
 import org.eclipse.app4mc.slg.ros2.transformers.RosInterProcessStimulusTransformer;
 import org.eclipse.app4mc.slg.ros2.transformers.RosLabelTransformer;
 import org.eclipse.app4mc.slg.ros2.transformers.RosRunnableTransformer;
-import org.eclipse.app4mc.slg.ros2.transformers.utils.Utils;
 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.Functions.Function1;
-import org.eclipse.xtext.xbase.lib.IterableExtensions;
 
 public class RosTaskTranslationUnit extends TaskTranslationUnit {
-  private RosInterProcessStimulusTransformer ipStimulusTransformer;
-  
-  private Task task;
-  
-  private final LinkedHashSet<String> includes = new LinkedHashSet<>();
-  
-  private final LinkedList<String> initCalls = new LinkedList<>();
-  
-  private final LinkedList<String> stepCalls = new LinkedList<>();
-  
-  private final ArrayList<Stimulus> stimuli = new ArrayList<>();
-  
-  private ArrayList<String> publishers = new ArrayList<>();
-  
-  private ArrayList<String> clientDeclarations = new ArrayList<>();
-  
-  private ArrayList<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 boolean genFiles() {
-    boolean _xblockexpression = false;
-    {
-      ActivityGraph _activityGraph = null;
-      if (this.task!=null) {
-        _activityGraph=this.task.getActivityGraph();
-      }
-      EList<ActivityGraphItem> _items = null;
-      if (_activityGraph!=null) {
-        _items=_activityGraph.getItems();
-      }
-      if (_items!=null) {
-        final Consumer<ActivityGraphItem> _function = (ActivityGraphItem item) -> {
-          if ((item instanceof RunnableCall)) {
-            final org.eclipse.app4mc.amalthea.model.Runnable runnable = ((RunnableCall) item).getRunnable();
-            RunnableTranslationUnit _transform = this.runnableTransformer.transform(runnable);
-            final RosRunnableTranslationUnit tu = ((RosRunnableTranslationUnit) _transform);
-            this.includes.add(tu.getIncFile());
-            final Function1<Tag, Boolean> _function_1 = (Tag tag) -> {
-              return Boolean.valueOf("initialize".equals(tag.getName()));
-            };
-            boolean _isEmpty = IterableExtensions.isEmpty(IterableExtensions.<Tag>filter(((RunnableCall)item).getTags(), _function_1));
-            boolean _not = (!_isEmpty);
-            if (_not) {
-              this.initCalls.add(tu.getNodeCall());
-            } else {
-              this.stepCalls.add(tu.getNodeCall());
-            }
-            this.publishers.addAll(tu.getPublishers());
-            this.clientDeclarations.addAll(tu.getClientDeclarations());
-            this.clientInits.addAll(tu.getClientInits());
-          } else {
-            if ((item instanceof Group)) {
-              final Group group = ((Group) item);
-              final Consumer<ActivityGraphItem> _function_2 = (ActivityGraphItem groupitem) -> {
-                if ((groupitem instanceof RunnableCall)) {
-                  final org.eclipse.app4mc.amalthea.model.Runnable runnable_1 = ((RunnableCall) groupitem).getRunnable();
-                  RunnableTranslationUnit _transform_1 = this.runnableTransformer.transform(((org.eclipse.app4mc.amalthea.model.Runnable) runnable_1));
-                  final RosRunnableTranslationUnit tu_1 = ((RosRunnableTranslationUnit) _transform_1);
-                  this.includes.add(tu_1.getIncFile());
-                  final Function1<Tag, Boolean> _function_3 = (Tag tag) -> {
-                    return Boolean.valueOf("initialize".equals(tag.getName()));
-                  };
-                  boolean _isEmpty_1 = IterableExtensions.isEmpty(IterableExtensions.<Tag>filter(((RunnableCall)groupitem).getTags(), _function_3));
-                  boolean _not_1 = (!_isEmpty_1);
-                  if (_not_1) {
-                    this.initCalls.add(tu_1.getNodeCall());
-                  } else {
-                    this.stepCalls.add(tu_1.getNodeCall());
-                  }
-                }
-              };
-              group.getItems().forEach(_function_2);
-            }
-          }
-        };
-        _items.forEach(_function);
-      }
-      final BiConsumer<ArrayList<?>, LabelTranslationUnit> _function_1 = (ArrayList<?> label, LabelTranslationUnit tu) -> {
-        this.includes.add(tu.getIncFile());
-        this.initCalls.add(tu.getInitCall());
-      };
-      this.labelTransformer.getCache().forEach(_function_1);
-      final Function1<Stimulus, Boolean> _function_2 = (Stimulus stimulus) -> {
-        return Boolean.valueOf((stimulus instanceof InterProcessStimulus));
-      };
-      final Consumer<Stimulus> _function_3 = (Stimulus stimulus) -> {
-        StringConcatenation _builder = new StringConcatenation();
-        String _name = stimulus.getName();
-        _builder.append(_name);
-        _builder.append("_service/srv/");
-        String _name_1 = stimulus.getName();
-        _builder.append(_name_1);
-        _builder.append("_service.hpp");
-        this.includes.add(_builder.toString());
-        this.ipStimulusTransformer.transform(((InterProcessStimulus) stimulus));
-      };
-      IterableExtensions.<Stimulus>filter(IterableExtensions.<Stimulus>toList(this.task.getStimuli()), _function_2).forEach(_function_3);
-      _xblockexpression = this.stimuli.addAll(IterableExtensions.<Stimulus>toList(this.task.getStimuli()));
-    }
-    return _xblockexpression;
-  }
-  
-  public CharSequence getDeclaration() {
-    StringConcatenation _builder = new StringConcatenation();
-    {
-      for(final Stimulus stimulus : this.stimuli) {
-        {
-          if ((stimulus instanceof PeriodicStimulus)) {
-            _builder.append("rclcpp::TimerBase::SharedPtr ");
-            String _name = ((PeriodicStimulus) stimulus).getName();
-            _builder.append(_name);
-            _builder.append("_timer_;");
-            _builder.newLineIfNotEmpty();
-          }
-        }
-        {
-          if ((stimulus instanceof EventStimulus)) {
-            _builder.append("rclcpp::Subscription<std_msgs::msg::String>::SharedPtr ");
-            String _name_1 = ((EventStimulus) stimulus).getName();
-            _builder.append(_name_1);
-            _builder.append("_subscription_;");
-            _builder.newLineIfNotEmpty();
-          }
-        }
-        {
-          if ((stimulus instanceof InterProcessStimulus)) {
-            _builder.append("rclcpp::Service<");
-            String _name_2 = ((InterProcessStimulus) stimulus).getName();
-            _builder.append(_name_2);
-            _builder.append("_service::srv::");
-            String _name_3 = ((InterProcessStimulus) stimulus).getName();
-            String _plus = (_name_3 + "_service");
-            String _idlCompliantName = Utils.toIdlCompliantName(_plus);
-            _builder.append(_idlCompliantName);
-            _builder.append(">::SharedPtr ");
-            String _name_4 = ((InterProcessStimulus) stimulus).getName();
-            _builder.append(_name_4);
-            _builder.append("_service;");
-            _builder.newLineIfNotEmpty();
-          }
-        }
-      }
-    }
-    {
-      for(final String publisher : this.publishers) {
-        _builder.append("rclcpp::Publisher<std_msgs::msg::String>::SharedPtr ");
-        _builder.append(publisher);
-        _builder.append(";");
-        _builder.newLineIfNotEmpty();
-      }
-    }
-    {
-      for(final String decl : this.clientDeclarations) {
-        _builder.append(decl);
-        _builder.append(";");
-        _builder.newLineIfNotEmpty();
-      }
-    }
-    return _builder;
-  }
-  
-  public CharSequence getInitialisation(final String nodeName) {
-    StringConcatenation _builder = new StringConcatenation();
-    {
-      for(final Stimulus stimulus : this.stimuli) {
-        {
-          if ((stimulus instanceof PeriodicStimulus)) {
-            String _name = ((PeriodicStimulus) stimulus).getName();
-            _builder.append(_name);
-            _builder.append("_timer_ = this->create_wall_timer(");
-            _builder.newLineIfNotEmpty();
-            _builder.append("\t\t");
-            BigInteger _value = ((PeriodicStimulus) stimulus).getRecurrence().getValue();
-            _builder.append(_value, "\t\t");
-            TimeUnit _unit = ((PeriodicStimulus) stimulus).getRecurrence().getUnit();
-            _builder.append(_unit, "\t\t");
-            _builder.append(", std::bind(&");
-            _builder.append(nodeName, "\t\t");
-            _builder.append("::");
-            String _name_1 = ((PeriodicStimulus) stimulus).getName();
-            _builder.append(_name_1, "\t\t");
-            _builder.append("_timer_callback, this));");
-            _builder.newLineIfNotEmpty();
-          }
-        }
-        {
-          if ((stimulus instanceof EventStimulus)) {
-            String _name_2 = ((EventStimulus) stimulus).getName();
-            _builder.append(_name_2);
-            _builder.append("_subscription_ = this->create_subscription<std_msgs::msg::String>(");
-            _builder.newLineIfNotEmpty();
-            _builder.append("\t");
-            _builder.append("\"");
-            String _name_3 = ((EventStimulus) stimulus).getName();
-            _builder.append(_name_3, "\t");
-            _builder.append("\", 10, std::bind(&");
-            _builder.append(nodeName, "\t");
-            _builder.append("::");
-            String _name_4 = ((EventStimulus) stimulus).getName();
-            _builder.append(_name_4, "\t");
-            _builder.append("_subscription_callback, this, _1));");
-            _builder.newLineIfNotEmpty();
-          }
-        }
-        {
-          if ((stimulus instanceof InterProcessStimulus)) {
-            String _name_5 = ((InterProcessStimulus) stimulus).getName();
-            _builder.append(_name_5);
-            _builder.append("_service = this->create_service<");
-            String _name_6 = ((InterProcessStimulus) stimulus).getName();
-            _builder.append(_name_6);
-            _builder.append("_service::srv::");
-            String _name_7 = ((InterProcessStimulus) stimulus).getName();
-            String _plus = (_name_7 + "_service");
-            String _idlCompliantName = Utils.toIdlCompliantName(_plus);
-            _builder.append(_idlCompliantName);
-            _builder.append(">(\"");
-            String _name_8 = ((InterProcessStimulus) stimulus).getName();
-            _builder.append(_name_8);
-            _builder.append("_service\", &");
-            String _name_9 = ((InterProcessStimulus) stimulus).getName();
-            _builder.append(_name_9);
-            _builder.append("_service_callback);");
-            _builder.newLineIfNotEmpty();
-          }
-        }
-      }
-    }
-    {
-      for(final String publisher : this.publishers) {
-        _builder.append(publisher);
-        _builder.append(" = this->create_publisher<std_msgs::msg::String>(\"");
-        String _replace = publisher.replace("_publisher", "");
-        _builder.append(_replace);
-        _builder.append("\", 10);");
-        _builder.newLineIfNotEmpty();
-      }
-    }
-    {
-      for(final String init : this.clientInits) {
-        _builder.append(init);
-        _builder.append(";");
-        _builder.newLineIfNotEmpty();
-      }
-    }
-    return _builder;
-  }
-  
-  public CharSequence getServiceCallback() {
-    StringConcatenation _builder = new StringConcatenation();
-    {
-      for(final Stimulus stimulus : this.stimuli) {
-        {
-          if ((stimulus instanceof InterProcessStimulus)) {
-            _builder.append("void ");
-            String _name = ((InterProcessStimulus) stimulus).getName();
-            _builder.append(_name);
-            _builder.append("_service_callback(const std::shared_ptr<");
-            String _name_1 = ((InterProcessStimulus) stimulus).getName();
-            _builder.append(_name_1);
-            _builder.append("_service::srv::");
-            String _name_2 = ((InterProcessStimulus) stimulus).getName();
-            String _plus = (_name_2 + "_service");
-            String _idlCompliantName = Utils.toIdlCompliantName(_plus);
-            _builder.append(_idlCompliantName);
-            _builder.append("::Request> request,");
-            _builder.newLineIfNotEmpty();
-            _builder.append("\t");
-            _builder.append("std::shared_ptr<");
-            String _name_3 = ((InterProcessStimulus) stimulus).getName();
-            _builder.append(_name_3, "\t");
-            _builder.append("_service::srv::");
-            String _name_4 = ((InterProcessStimulus) stimulus).getName();
-            String _plus_1 = (_name_4 + "_service");
-            String _idlCompliantName_1 = Utils.toIdlCompliantName(_plus_1);
-            _builder.append(_idlCompliantName_1, "\t");
-            _builder.append("::Response>      response) {");
-            _builder.newLineIfNotEmpty();
-            {
-              for(final String call : this.stepCalls) {
-                _builder.append("\t\t");
-                _builder.append(call);
-                _builder.append(";");
-                _builder.newLineIfNotEmpty();
-              }
-            }
-            _builder.append("\t");
-            _builder.append("}");
-            _builder.newLine();
-          }
-        }
-        _builder.newLine();
-        _builder.newLine();
-      }
-    }
-    return _builder;
-  }
-  
-  public CharSequence getCallback() {
-    StringConcatenation _builder = new StringConcatenation();
-    {
-      for(final Stimulus stimulus : this.stimuli) {
-        {
-          if ((stimulus instanceof PeriodicStimulus)) {
-            _builder.append("void ");
-            String _name = ((PeriodicStimulus) stimulus).getName();
-            _builder.append(_name);
-            _builder.append("_timer_callback() {");
-            _builder.newLineIfNotEmpty();
-            {
-              for(final String call : this.stepCalls) {
-                _builder.append("\t");
-                _builder.append(call);
-                _builder.append(";");
-                _builder.newLineIfNotEmpty();
-              }
-            }
-            _builder.append("}");
-            _builder.newLine();
-          }
-        }
-        {
-          if ((stimulus instanceof EventStimulus)) {
-            _builder.append("void ");
-            String _name_1 = ((EventStimulus) stimulus).getName();
-            _builder.append(_name_1);
-            _builder.append("_subscription_callback(const std_msgs::msg::String::SharedPtr msg) {");
-            _builder.newLineIfNotEmpty();
-            {
-              for(final String call_1 : this.stepCalls) {
-                _builder.append("\t");
-                _builder.append(call_1);
-                _builder.append(";");
-                _builder.newLineIfNotEmpty();
-              }
-            }
-            _builder.append("}");
-            _builder.newLine();
-          }
-        }
-      }
-    }
-    return _builder;
-  }
-  
-  public CharSequence getHeaders() {
-    StringConcatenation _builder = new StringConcatenation();
-    {
-      for(final String include : this.includes) {
-        _builder.append("#include \"");
-        _builder.append(include);
-        _builder.append("\"");
-        _builder.newLineIfNotEmpty();
-      }
-    }
-    return _builder;
-  }
+	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 boolean 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());
+		}
+
+		return true;
+	}
+
+	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/RosLabelTransformer.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosLabelTransformer.xtend
index 6ad0d0b..574672f 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosLabelTransformer.xtend
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosLabelTransformer.xtend
@@ -23,6 +23,8 @@
 
 	@Inject OutputBuffer outputBuffer
 
+	static final String LIB_NAME = "LABELS_LIB"
+
 	override create new RosLabelTranslationUnit(outputBuffer, label)
 		transform(Label label) {
 	}
@@ -30,19 +32,19 @@
 	override getCache() { return this._createCache_transform }
 
 	override createCMake() {
-		outputBuffer.appendTo("OTHER", RosLabelTranslationUnit.makeFilePathStatic, toCMake())
+		outputBuffer.appendTo("OTHER", RosLabelTranslationUnit.MAKEFILE_PATH, toCMake())
 	}
 
 	override String toCMake() '''
-		# «RosLabelTranslationUnit.libName» ################################################################
+		# «LIB_NAME» ################################################################
 		####
-		add_library(«RosLabelTranslationUnit.libName»  STATIC
+		add_library(«LIB_NAME»  STATIC
 		«FOR srcFile : getSrcFiles()»
 			«""»	${CMAKE_CURRENT_LIST_DIR}/_src/«srcFile»
 		«ENDFOR»
 		)
-
-		target_include_directories(«RosLabelTranslationUnit.getLibName()»
+		
+		target_include_directories(«LIB_NAME»
 			    PUBLIC ${CMAKE_CURRENT_LIST_DIR}/_inc
 		)	
 	'''
