Converted SLG ROS2 transformers to Java - step 1
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;
+	}
+
+}