diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/AbstractSLGTransformer.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/SLGBaseTransformer.java
similarity index 60%
rename from load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/AbstractSLGTransformer.java
rename to load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/SLGBaseTransformer.java
index 689b8ab..bd19384 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/AbstractSLGTransformer.java
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/SLGBaseTransformer.java
@@ -13,11 +13,18 @@
 
 package org.eclipse.app4mc.slg.commons.m2t;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+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 com.google.inject.Inject;
 
-public abstract class AbstractSLGTransformer {
+public abstract class SLGBaseTransformer {
 
 	@Inject Properties properties;
 
@@ -30,4 +37,17 @@
 		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/ActivityGraphItemTransformer.xtend b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/ActivityGraphItemTransformer.xtend
index 165fb9f..481fe3a 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/ActivityGraphItemTransformer.xtend
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/ActivityGraphItemTransformer.xtend
@@ -24,14 +24,14 @@
 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.AbstractSLGTransformer
 import org.eclipse.app4mc.slg.commons.m2t.generators.TicksTranslationUnit
 import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
+import org.eclipse.app4mc.slg.commons.m2t.SLGBaseTransformer
 
 @Singleton
-class ActivityGraphItemTransformer extends AbstractSLGTransformer {
+class ActivityGraphItemTransformer extends SLGBaseTransformer {
 
 	static final Logger LOG = LoggerFactory.getLogger(typeof(ActivityGraphItemTransformer))
 
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/AmaltheaModel2TextTransformer.xtend b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/AmaltheaModel2TextTransformer.xtend
index d7adf76..ab1fbec 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/AmaltheaModel2TextTransformer.xtend
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/AmaltheaModel2TextTransformer.xtend
@@ -19,13 +19,13 @@
 import org.eclipse.app4mc.amalthea.model.Amalthea
 import org.eclipse.app4mc.slg.config.ConfigModel
 import org.eclipse.app4mc.slg.config.util.ConfigurationFileLoader
-import org.eclipse.app4mc.slg.commons.m2t.AbstractSLGTransformer
 import org.eclipse.app4mc.slg.commons.m2t.CustomObjectsStore
 import org.eclipse.emf.ecore.resource.ResourceSet
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
+import org.eclipse.app4mc.slg.commons.m2t.SLGBaseTransformer
 
-class AmaltheaModel2TextTransformer extends AbstractSLGTransformer {
+class AmaltheaModel2TextTransformer extends SLGBaseTransformer {
 
 	static final Logger LOG = LoggerFactory.getLogger(typeof(AmaltheaModel2TextTransformer))
 
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/BaseTransformer.xtend b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/BaseTransformer.xtend
deleted file mode 100644
index c9ddf2b..0000000
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/BaseTransformer.xtend
+++ /dev/null
@@ -1,34 +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.transformers
-
-import java.util.ArrayList
-import java.util.HashMap
-import java.util.HashSet
-import org.eclipse.app4mc.slg.commons.m2t.AbstractSLGTransformer
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit
-
-abstract class BaseTransformer extends AbstractSLGTransformer {
-
-	abstract def HashMap<ArrayList<?>, ? extends TranslationUnit> getCache()
-
-	def getSrcFiles() {
-		val uniqueSrcFiles = new HashSet<String>();
-		getCache().values.forEach[uniqueSrcFiles.add(it.srcFile)]
-		return uniqueSrcFiles
-	}
-
-}
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/InstrumentationTransformer.xtend b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/InstrumentationTransformer.xtend
index bc1f65d..0b1a096 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/InstrumentationTransformer.xtend
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/InstrumentationTransformer.xtend
@@ -16,10 +16,10 @@
 package org.eclipse.app4mc.slg.commons.m2t.transformers
 
 import com.google.inject.Inject
-import org.eclipse.app4mc.slg.commons.m2t.AbstractSLGTransformer
 import org.eclipse.app4mc.transformation.util.OutputBuffer
+import org.eclipse.app4mc.slg.commons.m2t.SLGBaseTransformer
 
-class InstrumentationTransformer extends AbstractSLGTransformer {
+class InstrumentationTransformer extends SLGBaseTransformer {
 
 	@Inject OutputBuffer outputBuffer
 
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/LabelTransformer.xtend b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/LabelTransformer.xtend
index 12dac4b..f255906 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/LabelTransformer.xtend
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/LabelTransformer.xtend
@@ -20,11 +20,12 @@
 import java.util.ArrayList
 import java.util.HashMap
 import org.eclipse.app4mc.amalthea.model.Label
+import org.eclipse.app4mc.slg.commons.m2t.SLGBaseTransformer
 import org.eclipse.app4mc.slg.commons.m2t.generators.LabelTranslationUnit
 import org.eclipse.app4mc.transformation.util.OutputBuffer
 
 @Singleton
-class LabelTransformer extends SynteticTransformer<LabelTranslationUnit> {
+class LabelTransformer extends SLGBaseTransformer {
 
 	@Inject OutputBuffer outputBuffer
 
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/RunnableTransformer.xtend b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/RunnableTransformer.xtend
index 4a5c5f6..6de04ac 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/RunnableTransformer.xtend
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/RunnableTransformer.xtend
@@ -18,11 +18,12 @@
 import com.google.inject.Inject
 import com.google.inject.Singleton
 import org.eclipse.app4mc.amalthea.model.Runnable
+import org.eclipse.app4mc.slg.commons.m2t.SLGBaseTransformer
 import org.eclipse.app4mc.slg.commons.m2t.generators.RunnableTranslationUnit
 import org.eclipse.app4mc.transformation.util.OutputBuffer
 
 @Singleton
-class RunnableTransformer extends SynteticTransformer<RunnableTranslationUnit> {
+class RunnableTransformer extends SLGBaseTransformer {
 
 	@Inject OutputBuffer outputBuffer
 	@Inject ActivityGraphItemTransformer psCallGraphItemTransformer
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/SynteticTransformer.xtend b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/SynteticTransformer.xtend
deleted file mode 100644
index fd2d623..0000000
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/SynteticTransformer.xtend
+++ /dev/null
@@ -1,21 +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.transformers
-
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit
-
-abstract class SynteticTransformer<T extends TranslationUnit> extends BaseTransformer {
-}
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/TaskTransformer.xtend b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/TaskTransformer.xtend
index d778a19..c0a66bd 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/TaskTransformer.xtend
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/TaskTransformer.xtend
@@ -19,11 +19,12 @@
 import com.google.inject.Singleton
 import org.eclipse.app4mc.amalthea.model.Component
 import org.eclipse.app4mc.amalthea.model.Task
+import org.eclipse.app4mc.slg.commons.m2t.SLGBaseTransformer
 import org.eclipse.app4mc.slg.commons.m2t.generators.TaskTranslationUnit
 import org.eclipse.app4mc.transformation.util.OutputBuffer
 
 @Singleton
-class TaskTransformer extends BaseTransformer {
+class TaskTransformer extends SLGBaseTransformer {
 
 	@Inject OutputBuffer outputBuffer
 	@Inject RunnableTransformer runnableTransformer
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/TicksTransformer.xtend b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/TicksTransformer.xtend
index e5f7846..1bf7269 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/TicksTransformer.xtend
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/TicksTransformer.xtend
@@ -20,11 +20,12 @@
 import java.util.ArrayList
 import java.util.List
 import org.eclipse.app4mc.amalthea.model.Ticks
+import org.eclipse.app4mc.slg.commons.m2t.SLGBaseTransformer
 import org.eclipse.app4mc.slg.commons.m2t.generators.TicksTranslationUnit
 import org.eclipse.app4mc.transformation.util.OutputBuffer
 
 @Singleton
-class TicksTransformer {
+class TicksTransformer extends SLGBaseTransformer {
 
 	@Inject OutputBuffer outputBuffer
 	@Inject TicksUtilsTransformer ticksUtilsTransformer
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/TicksUtilsTransformer.xtend b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/TicksUtilsTransformer.xtend
index 92831f6..abac359 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/TicksUtilsTransformer.xtend
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/TicksUtilsTransformer.xtend
@@ -18,13 +18,14 @@
 import com.google.inject.Inject
 import com.google.inject.Singleton
 import org.eclipse.app4mc.amalthea.model.IDiscreteValueDeviation
-import org.eclipse.app4mc.slg.config.ConfigModel
 import org.eclipse.app4mc.slg.commons.m2t.CustomObjectsStore
+import org.eclipse.app4mc.slg.commons.m2t.SLGBaseTransformer
 import org.eclipse.app4mc.slg.commons.m2t.generators.TicksUtilsTranslationUnit
+import org.eclipse.app4mc.slg.config.ConfigModel
 import org.eclipse.app4mc.transformation.util.OutputBuffer
 
 @Singleton
-class TicksUtilsTransformer extends SynteticTransformer<TicksUtilsTranslationUnit> {
+class TicksUtilsTransformer extends SLGBaseTransformer {
 
 	@Inject OutputBuffer outputBuffer
 	@Inject CustomObjectsStore customObjsStore
diff --git a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/LinuxBaseSettings.java b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/LinuxBaseSettings.java
index a66f578..3d24e3b 100644
--- a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/LinuxBaseSettings.java
+++ b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/LinuxBaseSettings.java
@@ -32,11 +32,13 @@
 	static final String INC_EXT = ".h";
 	static final String INC_FOLDER = "/_inc/";
 
+	public static final String OTHER_TYPE = "OTHER";
+
 	public static void initializeOutputBuffer(OutputBuffer buffer, String outputFolder) {
 		buffer.initialize(outputFolder);
 		buffer.configureFiletype(SRC_TYPE, SRC_EXT, "// This code is auto-generated\n\n", null);
 		buffer.configureFiletype(INC_TYPE, INC_EXT, "// This code is auto-generated\n\n#pragma once\n\n", null);
-		buffer.configureFiletype("OTHER", "", "", "");
+		buffer.configureFiletype(OTHER_TYPE, "", "", "");
 	}
 
 }
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 d4b7835..d99aa63 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
@@ -14,7 +14,7 @@
 package org.eclipse.app4mc.slg.linux.transformers.sw;
 
 import org.eclipse.app4mc.amalthea.model.Ticks;
-import org.eclipse.app4mc.slg.commons.m2t.AbstractSLGTransformer;
+import org.eclipse.app4mc.slg.commons.m2t.SLGBaseTransformer;
 import org.eclipse.app4mc.slg.commons.m2t.SLGTranslationUnit;
 import org.eclipse.app4mc.slg.linux.generators.LinuxTicksGenerator;
 
@@ -22,7 +22,7 @@
 import com.google.inject.Singleton;
 
 @Singleton
-public class LinuxTicksTransformer extends AbstractSLGTransformer {
+public class LinuxTicksTransformer extends SLGBaseTransformer {
 
 	@Inject private LinuxTicksUtilsTransformer ticksUtilsTransformer;
 
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/artefacts/ROS2GoogleGuiceModule.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/artefacts/ROS2GoogleGuiceModule.java
index 6444c94..c6f27eb 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/artefacts/ROS2GoogleGuiceModule.java
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/artefacts/ROS2GoogleGuiceModule.java
@@ -20,10 +20,10 @@
 import org.eclipse.app4mc.slg.commons.m2t.transformers.LabelTransformer;
 import org.eclipse.app4mc.slg.commons.m2t.transformers.RunnableTransformer;
 import org.eclipse.app4mc.slg.commons.m2t.transformers.TaskTransformer;
-import org.eclipse.app4mc.slg.ros2.transformers.RosActivityGraphItemTransformer;
-import org.eclipse.app4mc.slg.ros2.transformers.RosLabelTransformer;
-import org.eclipse.app4mc.slg.ros2.transformers.RosRunnableTransformer;
-import org.eclipse.app4mc.slg.ros2.transformers.RosTaskTransformer;
+import org.eclipse.app4mc.slg.ros2.transformers.sw.RosActivityGraphItemTransformer;
+import org.eclipse.app4mc.slg.ros2.transformers.sw.RosLabelTransformer;
+import org.eclipse.app4mc.slg.ros2.transformers.sw.RosRunnableTransformer;
+import org.eclipse.app4mc.slg.ros2.transformers.sw.RosTaskTransformer;
 
 import com.google.inject.AbstractModule;
 
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessStimulusGenerator.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessStimulusGenerator.xtend
new file mode 100644
index 0000000..b196482
--- /dev/null
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessStimulusGenerator.xtend
@@ -0,0 +1,83 @@
+/**
+ ********************************************************************************
+ * 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
+
+class RosInterProcessStimulusGenerator {
+
+	// Suppress default constructor
+	private new() {
+		throw new IllegalStateException("Utility class");
+	}
+
+	static def String toPackageXML(RosIpStimulusTranslationunit tu) '''
+		<?xml version="1.0"?>
+		<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
+		<package format="3">
+		  <name>«tu.moduleName»</name>
+		  <version>0.0.0</version>
+		  <description>TODO: Package description</description>
+		  <maintainer email="fixedterm.Patrick.Will@de.bosch.com">wlp8fe</maintainer>
+		  <license>TODO: License declaration</license>
+		
+		    <build_depend>rosidl_default_generators</build_depend>
+		
+		    <exec_depend>rosidl_default_runtime</exec_depend>
+		
+		    <member_of_group>rosidl_interface_packages</member_of_group>
+		
+		  <buildtool_depend>ament_cmake</buildtool_depend>
+		
+		  <test_depend>ament_lint_auto</test_depend>
+		  <test_depend>ament_lint_common</test_depend>
+		
+		  <export>
+		    <build_type>ament_cmake</build_type>
+		  </export>
+		</package>
+		
+		
+		
+	'''
+
+	static def String toCMake() '''
+		
+		cmake_minimum_required(VERSION 3.5)
+		project(�ipUnit.moduleName�)
+		
+		
+		if(NOT CMAKE_C_STANDARD)
+		  set(CMAKE_C_STANDARD 99)
+		endif()
+		
+		# Default to C++14
+		if(NOT CMAKE_CXX_STANDARD)
+		  set(CMAKE_CXX_STANDARD 14)
+		endif()
+		if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+		
+		  add_compile_options(-Wall -Wextra -Wpedantic)
+		endif()
+		find_package(ament_cmake REQUIRED)
+		
+		
+		find_package(rosidl_default_generators REQUIRED)
+		rosidl_generate_interfaces(${PROJECT_NAME}
+		  "srv/�Utils.toIdlCompliantName(ipUnit.moduleName)�.srv"
+		 )
+		ament_package()
+	'''
+
+}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosModel2TextTransformer.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosModel2TextGenerator.xtend
similarity index 64%
rename from load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosModel2TextTransformer.xtend
rename to load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosModel2TextGenerator.xtend
index 217bdb9..cba4ccf 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosModel2TextTransformer.xtend
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosModel2TextGenerator.xtend
@@ -11,7 +11,7 @@
  *     Robert Bosch GmbH - initial API and implementation
  */
 
-package org.eclipse.app4mc.slg.ros2.transformers
+package org.eclipse.app4mc.slg.ros2.generators
 
 import com.google.inject.Inject
 import com.google.inject.Singleton
@@ -31,102 +31,14 @@
 import org.eclipse.app4mc.slg.commons.m2t.transformers.AmaltheaModel2TextTransformer
 import org.eclipse.app4mc.slg.commons.m2t.transformers.TicksUtilsTransformer
 import org.eclipse.app4mc.slg.ros2.generators.RosAmlTranslationUnit
+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
 
 @Singleton
-class RosModel2TextTransformer extends AmaltheaModel2TextTransformer {
+class RosModel2TextGenerator {
 
-	@Inject OutputBuffer outputBuffer
-	@Inject RosTagTransformer tagTransformer
-	@Inject TicksUtilsTransformer ticksUtilsTransformer
-	@Inject RosLabelTransformer labelTransformer
-
-	var label = false;
-	var ticks = false;
-	var interprocess = false;
-	var channelSend = false;
-	var performance_measurement = false;
-
-	override void transform(Amalthea model, String outputFolder) {
-
-		this.outputBuffer.initialize(outputFolder)
-		this.outputBuffer.configureFiletype("SRC", ".cpp", "// This code is auto-generated\n\n", null);
-		this.outputBuffer.configureFiletype("INC", ".h", "// This code is auto-generated\n\n", null);
-		this.outputBuffer.configureFiletype("OTHER", "", "", "");
-
-		var Set<String> services = new HashSet<String>()
-		var Set<String> nodes = new HashSet<String>()
-
-		model?.commonElements?.tags.forEach [ tag |
-
-			// instance to know which node published a message
-			tagTransformer.transform(tag, model)
-		]
-
-		/* extract information needed for top-level CMake file */
-		/* find runnables that use service files and use the tag to set the dependencies */
-		for (Task t : model?.swModel?.tasks) {
-			var stimuli = t.stimuli.get(0)
-
-			for (Tag tg : t.tags) {
-				nodes.add(tg.name)
-			}
-
-			// check if task has interprocess stimulus, if so task is service callback
-			if (stimuli instanceof InterProcessStimulus) {
-				services.add(stimuli.name + '_service')
-			} else {
-				// search for InterProcessTrigger
-				for (ActivityGraphItem r : t.activityGraph.items) {
-					if (r instanceof RunnableCall) {
-						if ((r?.runnable?.customProperties?.get('measure_performance') as BooleanObject)?.value) {
-							performance_measurement = true
-						}
-						for (ActivityGraphItem aci : r.runnable.activityGraph.items) {
-							if (aci instanceof LabelAccess) {
-								label = true;
-							}
-							if (aci instanceof Ticks) {
-								ticks = true;
-							}
-							if (aci instanceof InterProcessTrigger) {
-								interprocess = true;
-							}
-							if (aci instanceof ChannelSend) {
-								channelSend = true;
-							}
-						}
-					}
-				}
-			}
-		}
-
-		// create CMake files
-		// TransformerTicksUtils
-		ticksUtilsTransformer.createCMake()
-
-		// TransformerLabel
-		labelTransformer.createCMake()
-
-		// create aml if neccessary --> Side effect !!!
-		new RosAmlTranslationUnit(outputBuffer);
-
-		// tasks, containing only runnables
-		outputBuffer.appendTo("OTHER", 'CMakeLists.txt', toCmake(nodes, services).toString)
-
-		// create package.xml for ROS environment
-		outputBuffer.appendTo("OTHER", 'package.xml', toPackageXml(services).toString())
-
-		// create build script
-		outputBuffer.appendTo("OTHER", 'build.sh', toBuildScript(services).toString())
-
-		// create launch file
-		outputBuffer.appendTo("OTHER", 'launch.py', toLaunchFile(nodes).toString())
-
-		outputBuffer.finish
-	}
-
-	def toLaunchFile(Set<String> nodes) '''
+	static def String toLaunchFile(Set<String> nodes) '''
 		from launch import LaunchDescription
 		from launch_ros.actions import Node
 		
@@ -142,7 +54,7 @@
 			])
 	'''
 
-	def toBuildScript(Set<String> services) '''
+	static def String toBuildScript(Set<String> services) '''
 		«FOR service : services»
 			#building service «service»
 			
@@ -157,7 +69,7 @@
 	'''
 
 	// TODO: define attributes via ConfigModel
-	def toPackageXml(Set<String> services) '''
+	static def String toPackageXml(Set<String> services) '''
 		<?xml version="1.0"?>
 		<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
 		<package format="3">
@@ -184,7 +96,7 @@
 		</package>
 	'''
 
-	def toCmake(Set<String> tags, Set<String> services) '''
+	static def String toCmake(Set<String> tags, Set<String> services, boolean label, boolean ticks, boolean interprocess, boolean channelSend, boolean performance_measurement) '''
 		# CMakeLists for Nodes
 		cmake_minimum_required(VERSION 3.5)
 		project(amalthea_ros_model)
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTagTranslationUnit.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTagTranslationUnit.java
index 7eaad3e..6c59402 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTagTranslationUnit.java
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTagTranslationUnit.java
@@ -21,7 +21,7 @@
 import org.eclipse.app4mc.amalthea.model.Tag;
 import org.eclipse.app4mc.amalthea.model.Task;
 import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
-import org.eclipse.app4mc.slg.ros2.transformers.RosTaskTransformer;
+import org.eclipse.app4mc.slg.ros2.transformers.sw.RosTaskTransformer;
 import org.eclipse.app4mc.transformation.util.OutputBuffer;
 
 public class RosTagTranslationUnit extends TranslationUnit {
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 d572e49..c2564a9 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
@@ -32,9 +32,9 @@
 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.RosInterProcessStimulusTransformer;
-import org.eclipse.app4mc.slg.ros2.transformers.RosLabelTransformer;
-import org.eclipse.app4mc.slg.ros2.transformers.RosRunnableTransformer;
+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 {
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosActivityGraphItemTransformer.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosActivityGraphItemTransformer.xtend
deleted file mode 100644
index f3db0fc..0000000
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosActivityGraphItemTransformer.xtend
+++ /dev/null
@@ -1,43 +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.transformers
-
-import com.google.inject.Inject
-import com.google.inject.Singleton
-import org.eclipse.app4mc.amalthea.model.ActivityGraphItem
-import org.eclipse.app4mc.amalthea.model.ChannelSend
-import org.eclipse.app4mc.amalthea.model.InterProcessTrigger
-import org.eclipse.app4mc.slg.commons.m2t.transformers.ActivityGraphItemTransformer
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit
-
-@Singleton
-class RosActivityGraphItemTransformer extends ActivityGraphItemTransformer {
-
-	@Inject RosChannelSendTransformer channelSendTransformer
-	@Inject RosInterProcessTriggerTransformer ipTransformer
-
-	dispatch override TranslationUnit transform(ChannelSend cs) {
-		return channelSendTransformer.transform(cs);
-	}
-
-	dispatch def TranslationUnit transform(InterProcessTrigger ip) {
-		return ipTransformer.transform(ip)
-	}
-
-	dispatch override TranslationUnit transform(ActivityGraphItem ActivityGraphItem) {
-		val message = '''/*[feature «ActivityGraphItem.class» in not supported]*/'''
-		return new TranslationUnit("undefined", message, message, message)
-	}
-
-}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosBaseSettings.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosBaseSettings.java
new file mode 100644
index 0000000..f8d76e8
--- /dev/null
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosBaseSettings.java
@@ -0,0 +1,44 @@
+/**
+********************************************************************************
+* Copyright (c) 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;
+
+import org.eclipse.app4mc.transformation.util.OutputBuffer;
+
+public class RosBaseSettings {
+
+	// Suppress default constructor
+	private RosBaseSettings() {
+		throw new IllegalStateException("Utility class");
+	}
+
+	static final String SRC_TYPE = "SRC";
+	static final String SRC_EXT = ".cpp";
+	static final String SRC_FOLDER = "/_src/";
+
+	static final String INC_TYPE = "INC";
+	static final String INC_EXT = ".h";
+	static final String INC_FOLDER = "/_inc/";
+
+	public static final String OTHER_TYPE = "OTHER";
+
+	public static void initializeOutputBuffer(OutputBuffer buffer, String outputFolder) {
+		buffer.initialize(outputFolder);
+		buffer.configureFiletype(SRC_TYPE, SRC_EXT, "// This code is auto-generated\n\n", null);
+		buffer.configureFiletype(INC_TYPE, INC_EXT, "// This code is auto-generated\n\n", null);
+		buffer.configureFiletype(OTHER_TYPE, "", "", "");
+	}
+
+}
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
new file mode 100644
index 0000000..8a1b0f9
--- /dev/null
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosBaseTransformer.java
@@ -0,0 +1,63 @@
+/**
+ ********************************************************************************
+ * 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;
+
+import static org.eclipse.app4mc.slg.ros2.transformers.RosBaseSettings.INC_EXT;
+import static org.eclipse.app4mc.slg.ros2.transformers.RosBaseSettings.INC_FOLDER;
+import static org.eclipse.app4mc.slg.ros2.transformers.RosBaseSettings.INC_TYPE;
+import static org.eclipse.app4mc.slg.ros2.transformers.RosBaseSettings.SRC_EXT;
+import static org.eclipse.app4mc.slg.ros2.transformers.RosBaseSettings.SRC_FOLDER;
+import static org.eclipse.app4mc.slg.ros2.transformers.RosBaseSettings.SRC_TYPE;
+
+import org.eclipse.app4mc.slg.commons.m2t.SLGTranslationUnit;
+import org.eclipse.app4mc.transformation.util.OutputBuffer;
+
+import com.google.inject.Inject;
+
+public abstract class RosBaseTransformer {
+
+	@Inject private OutputBuffer outputBuffer;
+
+	// Buffer handling
+
+	public boolean isIncFileEmpty(SLGTranslationUnit tu) {
+		return !outputBuffer.bufferExists(INC_TYPE, getIncModulePath(tu));
+	}
+
+	public boolean isSrcFileEmpty(SLGTranslationUnit tu) {
+		return !outputBuffer.bufferExists(SRC_TYPE, getSrcModulePath(tu));
+	}
+
+	public boolean incAppend(SLGTranslationUnit tu, String str) {
+		return outputBuffer.appendTo(INC_TYPE, getIncModulePath(tu), str);
+	}
+
+	public boolean srcAppend(SLGTranslationUnit tu, String str) {
+		return outputBuffer.appendTo(SRC_TYPE, getSrcModulePath(tu), str);
+	}
+
+	// Attributes derived from translation unit 
+
+	public String getIncModulePath(SLGTranslationUnit tu) { return tu.getModulePath() + INC_FOLDER + tu.getModuleName(); }
+	public String getSrcModulePath(SLGTranslationUnit tu) { return tu.getModulePath() + SRC_FOLDER + tu.getModuleName(); }
+
+	public String getSrcFile(SLGTranslationUnit tu) { return tu.getModuleName() + SRC_EXT; }
+	public String getIncFile(SLGTranslationUnit tu) { return tu.getModuleName() + INC_EXT; }
+
+	public String getSrcPath(SLGTranslationUnit tu) { return tu.getModulePath() + SRC_FOLDER + getSrcFile(tu); }
+	public String getIncPath(SLGTranslationUnit tu) { return tu.getModulePath() + INC_FOLDER + getIncFile(tu); }
+
+}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosChannelSendTransformer.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosChannelSendTransformer.xtend
deleted file mode 100644
index 8c8826a..0000000
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosChannelSendTransformer.xtend
+++ /dev/null
@@ -1,34 +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.transformers
-
-import com.google.inject.Inject
-import com.google.inject.Singleton
-import org.eclipse.app4mc.amalthea.model.ChannelSend
-import org.eclipse.app4mc.slg.ros2.generators.RosChannelSendTranslationUnit
-import org.eclipse.app4mc.transformation.util.OutputBuffer
-
-@Singleton
-class RosChannelSendTransformer {
-
-	@Inject OutputBuffer outputBuffer
-	@Inject RosChannelSendUtilsTransformer channelSendUtilTransformer
-
-	def RosChannelSendTranslationUnit transform(ChannelSend cs) {
-
-		val tuIp = channelSendUtilTransformer.generate(cs)
-		return new RosChannelSendTranslationUnit(outputBuffer, tuIp, cs)
-	}
-
-}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosChannelSendUtilsTransformer.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosChannelSendUtilsTransformer.xtend
deleted file mode 100644
index 482b413..0000000
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosChannelSendUtilsTransformer.xtend
+++ /dev/null
@@ -1,37 +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.transformers
-
-import com.google.inject.Inject
-import com.google.inject.Singleton
-import org.eclipse.app4mc.amalthea.model.ChannelSend
-import org.eclipse.app4mc.slg.commons.m2t.transformers.SynteticTransformer
-import org.eclipse.app4mc.slg.ros2.generators.RosChannelSendUtilsTranslationUnit
-import org.eclipse.app4mc.transformation.util.OutputBuffer
-
-@Singleton
-class RosChannelSendUtilsTransformer extends SynteticTransformer<RosChannelSendUtilsTranslationUnit> {
-
-	@Inject OutputBuffer outputBuffer
-
-	def RosChannelSendUtilsTranslationUnit generate(ChannelSend cs) {
-		return generateIntern(cs) // hash according to class not instance
-	}
-
-	def create new RosChannelSendUtilsTranslationUnit(outputBuffer, cs) generateIntern(ChannelSend cs) {
-	}
-
-	override getCache() { return this._createCache_generateIntern }
-
-}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosInterProcessStimulusTransformer.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosInterProcessStimulusTransformer.xtend
deleted file mode 100644
index 9f81595..0000000
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosInterProcessStimulusTransformer.xtend
+++ /dev/null
@@ -1,100 +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.transformers
-
-import com.google.inject.Inject
-import com.google.inject.Singleton
-import org.eclipse.app4mc.amalthea.model.InterProcessStimulus
-import org.eclipse.app4mc.slg.commons.m2t.transformers.SynteticTransformer
-import org.eclipse.app4mc.slg.ros2.generators.RosIpStimulusTranslationunit
-import org.eclipse.app4mc.transformation.util.OutputBuffer
-
-@Singleton
-class RosInterProcessStimulusTransformer extends SynteticTransformer<RosIpStimulusTranslationunit> {
-
-	@Inject OutputBuffer outputBuffer
-
-	RosIpStimulusTranslationunit ipUnit
-
-	def RosIpStimulusTranslationunit transform(InterProcessStimulus ip) {
-		ipUnit = new RosIpStimulusTranslationunit(outputBuffer, ip)
-		outputBuffer.appendTo("OTHER", ipUnit.makeFilePath.toString(), "CMakeLists.txt")
-		outputBuffer.appendTo("OTHER", "services/" + ipUnit.moduleName + "/CMakeLists.txt", toCMake())
-		outputBuffer.appendTo("OTHER", "services/" + ipUnit.moduleName + "/package.xml", toPackageXML())
-		return ipUnit
-	}
-
-	def String toPackageXML() '''
-		<?xml version="1.0"?>
-		<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
-		<package format="3">
-		  <name>«ipUnit.moduleName»</name>
-		  <version>0.0.0</version>
-		  <description>TODO: Package description</description>
-		  <maintainer email="fixedterm.Patrick.Will@de.bosch.com">wlp8fe</maintainer>
-		  <license>TODO: License declaration</license>
-		
-		    <build_depend>rosidl_default_generators</build_depend>
-		
-		    <exec_depend>rosidl_default_runtime</exec_depend>
-		
-		    <member_of_group>rosidl_interface_packages</member_of_group>
-		
-		  <buildtool_depend>ament_cmake</buildtool_depend>
-		
-		  <test_depend>ament_lint_auto</test_depend>
-		  <test_depend>ament_lint_common</test_depend>
-		
-		  <export>
-		    <build_type>ament_cmake</build_type>
-		  </export>
-		</package>
-		
-		
-		
-	'''
-
-	def String toCMake() '''
-		
-		cmake_minimum_required(VERSION 3.5)
-		project(�ipUnit.moduleName�)
-		
-		
-		if(NOT CMAKE_C_STANDARD)
-		  set(CMAKE_C_STANDARD 99)
-		endif()
-		
-		# Default to C++14
-		if(NOT CMAKE_CXX_STANDARD)
-		  set(CMAKE_CXX_STANDARD 14)
-		endif()
-		if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
-		
-		  add_compile_options(-Wall -Wextra -Wpedantic)
-		endif()
-		find_package(ament_cmake REQUIRED)
-		
-		
-		find_package(rosidl_default_generators REQUIRED)
-		rosidl_generate_interfaces(${PROJECT_NAME}
-		  "srv/�Utils.toIdlCompliantName(ipUnit.moduleName)�.srv"
-		 )
-		ament_package()
-	'''
-
-	override getCache() {
-		throw new UnsupportedOperationException("TODO: auto-generated method stub")
-	}
-
-}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosInterProcessTriggerTransformer.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosInterProcessTriggerTransformer.xtend
deleted file mode 100644
index 1d2726c..0000000
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosInterProcessTriggerTransformer.xtend
+++ /dev/null
@@ -1,34 +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.transformers
-
-import com.google.inject.Inject
-import com.google.inject.Singleton
-import org.eclipse.app4mc.amalthea.model.InterProcessTrigger
-import org.eclipse.app4mc.slg.ros2.generators.RosInterProcessTriggerTranslationUnit
-import org.eclipse.app4mc.transformation.util.OutputBuffer
-
-@Singleton
-class RosInterProcessTriggerTransformer {
-
-	@Inject OutputBuffer outputBuffer
-	@Inject RosInterProcessTriggerUtilsTransformer ipUtilTransformer
-
-	def RosInterProcessTriggerTranslationUnit transform(InterProcessTrigger ip) {
-
-		val tuIp = ipUtilTransformer.generate(ip)
-		return new RosInterProcessTriggerTranslationUnit(outputBuffer, tuIp, ip)
-	}
-
-}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosInterProcessTriggerUtilsTransformer.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosInterProcessTriggerUtilsTransformer.xtend
deleted file mode 100644
index f6a9bfe..0000000
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosInterProcessTriggerUtilsTransformer.xtend
+++ /dev/null
@@ -1,40 +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.transformers
-
-import com.google.inject.Inject
-import com.google.inject.Singleton
-import org.eclipse.app4mc.amalthea.model.InterProcessTrigger
-import org.eclipse.app4mc.slg.commons.m2t.transformers.SynteticTransformer
-import org.eclipse.app4mc.slg.ros2.generators.RosInterProcessTriggerUtilsTranslationUnit
-import org.eclipse.app4mc.transformation.util.OutputBuffer
-
-@Singleton
-class RosInterProcessTriggerUtilsTransformer extends SynteticTransformer<RosInterProcessTriggerUtilsTranslationUnit> {
-
-	@Inject OutputBuffer outputBuffer
-
-	def RosInterProcessTriggerUtilsTranslationUnit generate(InterProcessTrigger ip) {
-		return generateIntern(ip) // hash according to class not instance
-	}
-
-	def create new RosInterProcessTriggerUtilsTranslationUnit(outputBuffer, ip)
-		generateIntern(InterProcessTrigger ip) {
-	}
-
-	override getCache() {
-		return this._createCache_generateIntern
-	}
-
-}
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
deleted file mode 100644
index 574672f..0000000
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosLabelTransformer.xtend
+++ /dev/null
@@ -1,52 +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.transformers;
-
-import com.google.inject.Inject
-import org.eclipse.app4mc.amalthea.model.Label
-import org.eclipse.app4mc.slg.commons.m2t.transformers.LabelTransformer
-import org.eclipse.app4mc.slg.ros2.generators.RosLabelTranslationUnit
-import org.eclipse.app4mc.transformation.util.OutputBuffer
-
-class RosLabelTransformer extends LabelTransformer {
-
-	@Inject OutputBuffer outputBuffer
-
-	static final String LIB_NAME = "LABELS_LIB"
-
-	override create new RosLabelTranslationUnit(outputBuffer, label)
-		transform(Label label) {
-	}
-
-	override getCache() { return this._createCache_transform }
-
-	override createCMake() {
-		outputBuffer.appendTo("OTHER", RosLabelTranslationUnit.MAKEFILE_PATH, toCMake())
-	}
-
-	override String toCMake() '''
-		# «LIB_NAME» ################################################################
-		####
-		add_library(«LIB_NAME»  STATIC
-		«FOR srcFile : getSrcFiles()»
-			«""»	${CMAKE_CURRENT_LIST_DIR}/_src/«srcFile»
-		«ENDFOR»
-		)
-		
-		target_include_directories(«LIB_NAME»
-			    PUBLIC ${CMAKE_CURRENT_LIST_DIR}/_inc
-		)	
-	'''
-
-}
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
new file mode 100644
index 0000000..9daca4d
--- /dev/null
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosModel2TextTransformer.java
@@ -0,0 +1,133 @@
+/**
+ ********************************************************************************
+ * 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;
+
+import static org.eclipse.app4mc.slg.ros2.transformers.RosBaseSettings.OTHER_TYPE;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
+import org.eclipse.app4mc.amalthea.model.Amalthea;
+import org.eclipse.app4mc.amalthea.model.BooleanObject;
+import org.eclipse.app4mc.amalthea.model.ChannelSend;
+import org.eclipse.app4mc.amalthea.model.CommonElements;
+import org.eclipse.app4mc.amalthea.model.InterProcessStimulus;
+import org.eclipse.app4mc.amalthea.model.InterProcessTrigger;
+import org.eclipse.app4mc.amalthea.model.LabelAccess;
+import org.eclipse.app4mc.amalthea.model.Runnable;
+import org.eclipse.app4mc.amalthea.model.SWModel;
+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.Ticks;
+import org.eclipse.app4mc.amalthea.model.Value;
+import org.eclipse.app4mc.amalthea.model.util.ModelUtil;
+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.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.RosTagTransformer;
+import org.eclipse.app4mc.slg.ros2.transformers.sw.RosLabelTransformer;
+import org.eclipse.app4mc.transformation.util.OutputBuffer;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class RosModel2TextTransformer extends AmaltheaModel2TextTransformer {
+
+	@Inject private OutputBuffer outputBuffer;
+	@Inject private RosTagTransformer tagTransformer;
+	@Inject private TicksUtilsTransformer ticksUtilsTransformer;
+	@Inject private RosLabelTransformer labelTransformer;
+
+	private boolean label = false;
+	private boolean ticks = false;
+	private boolean interprocess = false;
+	private boolean channelSend = false;
+	private boolean performance_measurement = false;
+
+	@Override
+	public void transform(final Amalthea model, final String outputFolder) {
+
+		RosBaseSettings.initializeOutputBuffer(this.outputBuffer, outputFolder);
+
+		Set<String> nodes = new HashSet<>();
+		Set<String> services = new HashSet<>();
+
+		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);
+		}
+
+		/* extract information needed for top-level CMake file */
+		/* find runnables that use service files and use the tag to set the dependencies */
+
+		for (Task task : swModel.getTasks()) {
+
+			Stimulus stimulus = task.getStimuli().get(0);	// Mc: Why only the first ?
+			for (final Tag tag : task.getTags()) {
+				nodes.add(tag.getName());
+			}
+
+			// check if task has interprocess stimulus, if so task is service callback
+			if ((stimulus instanceof InterProcessStimulus)) {
+				services.add(((InterProcessStimulus) stimulus).getName() + "_service");
+			} else {
+				// search for runnables called by task
+				for (Runnable run : SoftwareUtil.getRunnableList(task, null)) {
+					// check custom properties
+					Value perf = run.getCustomProperties().get("measure_performance");
+					if (perf instanceof BooleanObject && ((BooleanObject) perf).isValue()) {
+						performance_measurement = true;
+					}
+
+					// check activity graph
+					for (ActivityGraphItem item : run.getRunnableItems()) {
+						if (item instanceof LabelAccess) {
+							label = true;
+						}
+						if (item instanceof Ticks) {
+							ticks = true;
+						}
+						if (item instanceof InterProcessTrigger) {
+							interprocess = true;
+						}
+						if (item instanceof ChannelSend) {
+							channelSend = true;
+						}
+					}
+				}
+			}
+		}
+
+		this.ticksUtilsTransformer.createCMake();
+		this.labelTransformer.createCMake();
+		new RosAmlTranslationUnit(this.outputBuffer);
+		this.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();
+	}
+
+}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosRunnableTransformer.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosRunnableTransformer.xtend
deleted file mode 100644
index a096e98..0000000
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosRunnableTransformer.xtend
+++ /dev/null
@@ -1,61 +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.transformers
-
-import com.google.inject.Inject
-import org.eclipse.app4mc.amalthea.model.Runnable
-import org.eclipse.app4mc.slg.commons.m2t.transformers.RunnableTransformer
-import org.eclipse.app4mc.slg.ros2.generators.RosRunnableTranslationUnit
-import org.eclipse.app4mc.transformation.util.OutputBuffer
-
-class RosRunnableTransformer extends RunnableTransformer {
-
-	@Inject OutputBuffer outputBuffer
-
-	@Inject RosActivityGraphItemTransformer psCallGraphItemTransformer
-
-	override create new RosRunnableTranslationUnit(outputBuffer, psCallGraphItemTransformer, runnable)
-		transform(Runnable runnable) {
-	}
-
-	override getCache() { return this._createCache_transform }
-
-	override createCMake() {
-		outputBuffer.appendTo("OTHER", RosRunnableTranslationUnit.makeFilePathStatic, toCMake())
-	}
-
-	override String toCMake() '''
-		# «RosRunnableTranslationUnit.libName» ################################################################
-		####
-		add_library(«RosRunnableTranslationUnit.libName» STATIC
-		«FOR srcFile : getSrcFiles»
-			«""»	${CMAKE_CURRENT_LIST_DIR}/_src/«srcFile»
-		«ENDFOR»
-		)
-
-		target_include_directories(«RosRunnableTranslationUnit.libName»
-			PUBLIC  ${CMAKE_CURRENT_LIST_DIR}/_inc
-		)
-
-		target_include_directories(«RosRunnableTranslationUnit.libName»
-			PUBLIC ${CMAKE_CURRENT_LIST_DIR}/../ticksUtils/_inc
-			${CMAKE_CURRENT_LIST_DIR}/../labels/_inc
-			${CMAKE_CURRENT_LIST_DIR}/../channelSendUtils/_inc
-		)
-
-		target_link_libraries(RUNNABLES_LIB 
-			PRIVATE LABELS_LIB TICKS_UTILS CHANNELSEND_UTILS
-		)
-	'''
-}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosTagTransformer.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosTagTransformer.xtend
deleted file mode 100644
index f2673dc..0000000
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosTagTransformer.xtend
+++ /dev/null
@@ -1,36 +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.transformers
-
-import com.google.inject.Inject
-import com.google.inject.Singleton
-import org.eclipse.app4mc.amalthea.model.Amalthea
-import org.eclipse.app4mc.amalthea.model.Tag
-import org.eclipse.app4mc.slg.commons.m2t.transformers.BaseTransformer
-import org.eclipse.app4mc.slg.ros2.generators.RosTagTranslationUnit
-import org.eclipse.app4mc.transformation.util.OutputBuffer
-
-@Singleton
-class RosTagTransformer extends BaseTransformer {
-
-	@Inject OutputBuffer outputBuffer
-	@Inject RosTaskTransformer rosTaskTransformer
-
-	def create new RosTagTranslationUnit(outputBuffer, rosTaskTransformer, tag, model)
-		transform(Tag tag, Amalthea model) {
-	}
-
-	override getCache() { return this._createCache_transform }
-
-}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosTaskTransformer.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosTaskTransformer.xtend
deleted file mode 100644
index 96cbddf..0000000
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosTaskTransformer.xtend
+++ /dev/null
@@ -1,38 +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.transformers
-
-import com.google.inject.Inject
-import com.google.inject.Singleton
-import org.eclipse.app4mc.amalthea.model.Component
-import org.eclipse.app4mc.amalthea.model.Task
-import org.eclipse.app4mc.slg.commons.m2t.transformers.TaskTransformer
-import org.eclipse.app4mc.slg.ros2.generators.RosTaskTranslationUnit
-import org.eclipse.app4mc.transformation.util.OutputBuffer
-
-@Singleton
-class RosTaskTransformer extends TaskTransformer {
-
-	@Inject OutputBuffer outputBuffer
-	@Inject RosLabelTransformer rosTransformerLabel
-	@Inject RosRunnableTransformer rosTransformerRunnable
-	@Inject RosInterProcessStimulusTransformer ipStimulusTransformer
-
-	override create new RosTaskTranslationUnit(outputBuffer, rosTransformerRunnable, rosTransformerLabel, ipStimulusTransformer, task, component)
-		transform(Task task, Component component) {
-	}
-
-	override getCache() { return this._createCache_transform }
-
-}
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
new file mode 100644
index 0000000..87de071
--- /dev/null
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/common/RosTagTransformer.java
@@ -0,0 +1,66 @@
+/**
+ ********************************************************************************
+ * 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 java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.app4mc.amalthea.model.Amalthea;
+import org.eclipse.app4mc.amalthea.model.Tag;
+import org.eclipse.app4mc.slg.commons.m2t.SLGBaseTransformer;
+import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
+import org.eclipse.app4mc.slg.ros2.generators.RosTagTranslationUnit;
+import org.eclipse.app4mc.slg.ros2.transformers.sw.RosTaskTransformer;
+import org.eclipse.app4mc.transformation.util.OutputBuffer;
+import org.eclipse.xtext.xbase.lib.CollectionLiterals;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class RosTagTransformer extends SLGBaseTransformer {
+
+	@Inject private OutputBuffer outputBuffer;
+	@Inject private RosTaskTransformer rosTaskTransformer;
+
+	private final HashMap<ArrayList<?>, RosTagTranslationUnit> cache = CollectionLiterals.newHashMap();
+
+	public RosTagTranslationUnit transform(final Tag tag, final Amalthea model) {
+		final ArrayList<?> key = CollectionLiterals.newArrayList(tag, model);
+		final RosTagTranslationUnit _result;
+		synchronized (cache) {
+			if (cache.containsKey(key)) {
+				return cache.get(key);
+			}
+			RosTagTranslationUnit tu = new RosTagTranslationUnit(this.outputBuffer,
+					this.rosTaskTransformer, tag, model);
+			_result = tu;
+			cache.put(key, _result);
+		}
+		_init_transform(_result, tag, model);
+		return _result;
+	}
+
+	private void _init_transform(final RosTagTranslationUnit it, final Tag tag, final Amalthea model) {
+	}
+
+	@Override
+	public Map<ArrayList<?>, ? extends TranslationUnit> getCache() {
+		return this.cache;
+	}
+
+}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/stimuli/RosInterProcessStimulusTransformer.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/stimuli/RosInterProcessStimulusTransformer.java
new file mode 100644
index 0000000..cacf73b
--- /dev/null
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/stimuli/RosInterProcessStimulusTransformer.java
@@ -0,0 +1,52 @@
+/**
+ ********************************************************************************
+ * 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.stimuli;
+
+import java.util.ArrayList;
+import java.util.Map;
+
+import org.eclipse.app4mc.amalthea.model.InterProcessStimulus;
+import org.eclipse.app4mc.slg.commons.m2t.SLGBaseTransformer;
+import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
+import org.eclipse.app4mc.slg.ros2.generators.RosInterProcessStimulusGenerator;
+import org.eclipse.app4mc.slg.ros2.generators.RosIpStimulusTranslationunit;
+import org.eclipse.app4mc.transformation.util.OutputBuffer;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class RosInterProcessStimulusTransformer extends SLGBaseTransformer {
+
+	@Inject private OutputBuffer outputBuffer;
+
+	private RosIpStimulusTranslationunit ipUnit;
+
+	public RosIpStimulusTranslationunit transform(final InterProcessStimulus ip) {
+		RosIpStimulusTranslationunit tu = new RosIpStimulusTranslationunit(this.outputBuffer,
+				ip);
+		this.ipUnit = tu;
+		this.outputBuffer.appendTo("OTHER", this.ipUnit.getMakeFilePath().toString(), "CMakeLists.txt");
+		this.outputBuffer.appendTo("OTHER", (("services/" + this.ipUnit.getModuleName()) + "/CMakeLists.txt"), RosInterProcessStimulusGenerator.toCMake());
+		this.outputBuffer.appendTo("OTHER", (("services/" + this.ipUnit.getModuleName()) + "/package.xml"), RosInterProcessStimulusGenerator.toPackageXML(ipUnit));
+		return this.ipUnit;
+	}
+
+	@Override
+	public Map<ArrayList<?>, ? extends TranslationUnit> getCache() {
+		throw new UnsupportedOperationException("TODO: auto-generated method stub");
+	}
+}
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
new file mode 100644
index 0000000..6356c7e
--- /dev/null
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosActivityGraphItemTransformer.java
@@ -0,0 +1,81 @@
+/**
+ ********************************************************************************
+ * 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.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.ActivityGraphItemTransformer;
+import org.eclipse.xtend2.lib.StringConcatenation;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class RosActivityGraphItemTransformer extends ActivityGraphItemTransformer {
+
+	@Inject private RosChannelSendTransformer channelSendTransformer;
+	@Inject private RosInterProcessTriggerTransformer ipTransformer;
+
+	@Override
+	protected TranslationUnit _transform(final ChannelSend cs) {
+		return this.channelSendTransformer.transform(cs);
+	}
+
+	protected TranslationUnit _transform(final InterProcessTrigger ip) {
+		return this.ipTransformer.transform(ip);
+	}
+
+	@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);
+	}
+
+	@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());
+		}
+	}
+
+}
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
new file mode 100644
index 0000000..6794357
--- /dev/null
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosChannelSendTransformer.java
@@ -0,0 +1,37 @@
+/**
+ ********************************************************************************
+ * 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 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 com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@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);
+	}
+
+}
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
new file mode 100644
index 0000000..eb8b2b9
--- /dev/null
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosChannelSendUtilsTransformer.java
@@ -0,0 +1,67 @@
+/**
+ ********************************************************************************
+ * 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 com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.app4mc.amalthea.model.ChannelSend;
+import org.eclipse.app4mc.slg.commons.m2t.SLGBaseTransformer;
+import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
+import org.eclipse.app4mc.slg.ros2.generators.RosChannelSendUtilsTranslationUnit;
+import org.eclipse.app4mc.transformation.util.OutputBuffer;
+import org.eclipse.xtext.xbase.lib.CollectionLiterals;
+
+@Singleton
+public class RosChannelSendUtilsTransformer extends SLGBaseTransformer {
+
+	@Inject private OutputBuffer outputBuffer;
+
+	private final HashMap<ArrayList<?>, RosChannelSendUtilsTranslationUnit> cache = CollectionLiterals
+			.newHashMap();
+
+	public RosChannelSendUtilsTranslationUnit generate(final ChannelSend cs) {
+		return this.generateIntern(cs);	// hash according to class not instance
+	}
+
+	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);
+			}
+			RosChannelSendUtilsTranslationUnit _rosChannelSendUtilsTranslationUnit = new RosChannelSendUtilsTranslationUnit(
+					this.outputBuffer, cs);
+			_result = _rosChannelSendUtilsTranslationUnit;
+			cache.put(key, _result);
+		}
+		_init_generateIntern(_result, cs);
+		return _result;
+	}
+
+
+	private void _init_generateIntern(final RosChannelSendUtilsTranslationUnit it, final ChannelSend cs) {
+	}
+
+	@Override
+	public Map<ArrayList<?>, ? extends TranslationUnit> getCache() {
+		return this.cache;
+	}
+
+}
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
new file mode 100644
index 0000000..508ce20
--- /dev/null
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosInterProcessTriggerTransformer.java
@@ -0,0 +1,37 @@
+/**
+ ********************************************************************************
+ * 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 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 com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class RosInterProcessTriggerTransformer {
+
+	@Inject private OutputBuffer outputBuffer;
+	@Inject private RosInterProcessTriggerUtilsTransformer ipUtilTransformer;
+
+	public RosInterProcessTriggerTranslationUnit transform(final InterProcessTrigger ip) {
+		final RosInterProcessTriggerUtilsTranslationUnit tuIp = this.ipUtilTransformer.generate(ip);
+		return new RosInterProcessTriggerTranslationUnit(this.outputBuffer, tuIp, ip);
+	}
+
+}
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
new file mode 100644
index 0000000..941606f
--- /dev/null
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosInterProcessTriggerUtilsTransformer.java
@@ -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.ros2.transformers.sw;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.app4mc.amalthea.model.InterProcessTrigger;
+import org.eclipse.app4mc.slg.commons.m2t.SLGBaseTransformer;
+import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
+import org.eclipse.app4mc.slg.ros2.generators.RosInterProcessTriggerUtilsTranslationUnit;
+import org.eclipse.app4mc.transformation.util.OutputBuffer;
+import org.eclipse.xtext.xbase.lib.CollectionLiterals;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class RosInterProcessTriggerUtilsTransformer extends SLGBaseTransformer {
+
+	@Inject private OutputBuffer outputBuffer;
+
+	private final HashMap<ArrayList<?>, RosInterProcessTriggerUtilsTranslationUnit> cache = CollectionLiterals
+			.newHashMap();
+
+	public RosInterProcessTriggerUtilsTranslationUnit generate(final InterProcessTrigger ip) {
+		return this.generateIntern(ip);	// hash according to class not instance
+	}
+
+	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);
+			}
+			RosInterProcessTriggerUtilsTranslationUnit tu = new RosInterProcessTriggerUtilsTranslationUnit(
+					this.outputBuffer, ip);
+			_result = tu;
+			cache.put(key, _result);
+		}
+		_init_generateIntern(_result, ip);
+		return _result;
+	}
+
+	private void _init_generateIntern(final RosInterProcessTriggerUtilsTranslationUnit it,
+			final InterProcessTrigger ip) {
+	}
+
+	@Override
+	public Map<ArrayList<?>, ? extends TranslationUnit> getCache() {
+		return this.cache;
+	}
+
+}
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
new file mode 100644
index 0000000..474ef14
--- /dev/null
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosLabelTransformer.java
@@ -0,0 +1,102 @@
+/**
+ ********************************************************************************
+ * 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 com.google.inject.Inject;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import org.eclipse.app4mc.amalthea.model.Label;
+import org.eclipse.app4mc.slg.commons.m2t.generators.LabelTranslationUnit;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.LabelTransformer;
+import org.eclipse.app4mc.slg.ros2.generators.RosLabelTranslationUnit;
+import org.eclipse.app4mc.transformation.util.OutputBuffer;
+import org.eclipse.xtend2.lib.StringConcatenation;
+import org.eclipse.xtext.xbase.lib.CollectionLiterals;
+
+public class RosLabelTransformer extends LabelTransformer {
+	@Inject
+	private OutputBuffer outputBuffer;
+
+	private static final String LIB_NAME = "LABELS_LIB";
+
+	@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) {
+	}
+
+	@Override
+	public HashMap<ArrayList<?>, LabelTranslationUnit> getCache() {
+		return this._createCache_transform;
+	}
+
+	@Override
+	public boolean createCMake() {
+		return this.outputBuffer.appendTo("OTHER", RosLabelTranslationUnit.MAKEFILE_PATH, this.toCMake());
+	}
+
+	@Override
+	public String toCMake() {
+		StringConcatenation _builder = new StringConcatenation();
+		_builder.append("# ");
+		_builder.append(RosLabelTransformer.LIB_NAME);
+		_builder.append(" ################################################################");
+		_builder.newLineIfNotEmpty();
+		_builder.append("####");
+		_builder.newLine();
+		_builder.append("add_library(");
+		_builder.append(RosLabelTransformer.LIB_NAME);
+		_builder.append("  STATIC");
+		_builder.newLineIfNotEmpty();
+		{
+			List<String> _srcFiles = this.getSrcFiles();
+			for (final String srcFile : _srcFiles) {
+				_builder.append("\t${CMAKE_CURRENT_LIST_DIR}/_src/");
+				_builder.append(srcFile);
+				_builder.newLineIfNotEmpty();
+			}
+		}
+		_builder.append(")");
+		_builder.newLine();
+		_builder.newLine();
+		_builder.append("target_include_directories(");
+		_builder.append(RosLabelTransformer.LIB_NAME);
+		_builder.newLineIfNotEmpty();
+		_builder.append("\t    ");
+		_builder.append("PUBLIC ${CMAKE_CURRENT_LIST_DIR}/_inc");
+		_builder.newLine();
+		_builder.append(")\t");
+		_builder.newLine();
+		return _builder.toString();
+	}
+
+}
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
new file mode 100644
index 0000000..e8e55b1
--- /dev/null
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosRunnableTransformer.java
@@ -0,0 +1,134 @@
+/**
+ ********************************************************************************
+ * 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.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+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.RunnableTransformer;
+import org.eclipse.app4mc.slg.ros2.generators.RosRunnableTranslationUnit;
+import org.eclipse.app4mc.transformation.util.OutputBuffer;
+import org.eclipse.xtend2.lib.StringConcatenation;
+import org.eclipse.xtext.xbase.lib.CollectionLiterals;
+
+import com.google.inject.Inject;
+
+public class RosRunnableTransformer extends RunnableTransformer {
+
+	@Inject private OutputBuffer outputBuffer;
+	@Inject private RosActivityGraphItemTransformer psCallGraphItemTransformer;
+
+	private final HashMap<ArrayList<?>, RunnableTranslationUnit> cache = CollectionLiterals.newHashMap();
+
+	@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);
+		}
+		_init_transform(_result, runnable);
+		return _result;
+	}
+
+
+	private void _init_transform(final RosRunnableTranslationUnit it,
+			final org.eclipse.app4mc.amalthea.model.Runnable runnable) {
+	}
+
+	@Override
+	public Map<ArrayList<?>, ? extends TranslationUnit> getCache() {
+		return this.cache;
+	}
+
+	@Override
+	public boolean createCMake() {
+		return this.outputBuffer.appendTo("OTHER", RosRunnableTranslationUnit.getMakeFilePathStatic(), this.toCMake());
+	}
+
+	@Override
+	public String toCMake() {
+		StringConcatenation _builder = new StringConcatenation();
+		_builder.append("# ");
+		String _libName = RosRunnableTranslationUnit.getLibName();
+		_builder.append(_libName);
+		_builder.append(" ################################################################");
+		_builder.newLineIfNotEmpty();
+		_builder.append("####");
+		_builder.newLine();
+		_builder.append("add_library(");
+		String _libName_1 = RosRunnableTranslationUnit.getLibName();
+		_builder.append(_libName_1);
+		_builder.append(" STATIC");
+		_builder.newLineIfNotEmpty();
+		{
+			List<String> _srcFiles = this.getSrcFiles();
+			for (final String srcFile : _srcFiles) {
+				_builder.append("\t${CMAKE_CURRENT_LIST_DIR}/_src/");
+				_builder.append(srcFile);
+				_builder.newLineIfNotEmpty();
+			}
+		}
+		_builder.append(")");
+		_builder.newLine();
+		_builder.newLine();
+		_builder.append("target_include_directories(");
+		String _libName_2 = RosRunnableTranslationUnit.getLibName();
+		_builder.append(_libName_2);
+		_builder.newLineIfNotEmpty();
+		_builder.append("\t");
+		_builder.append("PUBLIC  ${CMAKE_CURRENT_LIST_DIR}/_inc");
+		_builder.newLine();
+		_builder.append(")");
+		_builder.newLine();
+		_builder.newLine();
+		_builder.append("target_include_directories(");
+		String _libName_3 = RosRunnableTranslationUnit.getLibName();
+		_builder.append(_libName_3);
+		_builder.newLineIfNotEmpty();
+		_builder.append("\t");
+		_builder.append("PUBLIC ${CMAKE_CURRENT_LIST_DIR}/../ticksUtils/_inc");
+		_builder.newLine();
+		_builder.append("\t");
+		_builder.append("${CMAKE_CURRENT_LIST_DIR}/../labels/_inc");
+		_builder.newLine();
+		_builder.append("\t");
+		_builder.append("${CMAKE_CURRENT_LIST_DIR}/../channelSendUtils/_inc");
+		_builder.newLine();
+		_builder.append(")");
+		_builder.newLine();
+		_builder.newLine();
+		_builder.append("target_link_libraries(RUNNABLES_LIB ");
+		_builder.newLine();
+		_builder.append("\t");
+		_builder.append("PRIVATE LABELS_LIB TICKS_UTILS CHANNELSEND_UTILS");
+		_builder.newLine();
+		_builder.append(")");
+		_builder.newLine();
+		return _builder.toString();
+	}
+
+}
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
new file mode 100644
index 0000000..0819475
--- /dev/null
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosTaskTransformer.java
@@ -0,0 +1,70 @@
+/**
+ ********************************************************************************
+ * 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.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.app4mc.amalthea.model.Component;
+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.TaskTransformer;
+import org.eclipse.app4mc.slg.ros2.generators.RosTaskTranslationUnit;
+import org.eclipse.app4mc.slg.ros2.transformers.stimuli.RosInterProcessStimulusTransformer;
+import org.eclipse.app4mc.transformation.util.OutputBuffer;
+import org.eclipse.xtext.xbase.lib.CollectionLiterals;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@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();
+
+	@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);
+			}
+			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;
+	}
+
+	private void _init_transform(final RosTaskTranslationUnit it, final Task task, final Component component) {
+	}
+
+	@Override
+	public Map<ArrayList<?>, ? extends TranslationUnit> getCache() {
+		return this.cache;
+	}
+
+}
