Bug 567799 - [Robotics, ROS2] Lifecycle operations are incomplete

- Add ON_SHUTDOWN to FunctionKind enum in profile
- Regenerate static profile
- Enable invocation of multiple functions for a lifecycle transition
- Create a separate timer for each activity (currently, two activities with different periods lead to undefined results)
- Stop timers in case of de-activation and shutdown
- Adapt test code
- Delete accidental test file ros_out

Change-Id: Ib0085f1876014eeab50bd6968a81ff03a63b4ec6
Signed-off-by: Ansgar Radermacher <ansgar.radermacher@cea.fr>
diff --git a/plugins/customization/org.eclipse.papyrus.robotics.core/src/org/eclipse/papyrus/robotics/core/utils/FunctionUtils.java b/plugins/customization/org.eclipse.papyrus.robotics.core/src/org/eclipse/papyrus/robotics/core/utils/FunctionUtils.java
index dd1b0e8..8e4542c 100644
--- a/plugins/customization/org.eclipse.papyrus.robotics.core/src/org/eclipse/papyrus/robotics/core/utils/FunctionUtils.java
+++ b/plugins/customization/org.eclipse.papyrus.robotics.core/src/org/eclipse/papyrus/robotics/core/utils/FunctionUtils.java
@@ -1,5 +1,8 @@
 package org.eclipse.papyrus.robotics.core.utils;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.eclipse.papyrus.robotics.profile.robotics.components.Activity;
 import org.eclipse.papyrus.robotics.profile.robotics.components.ActivityPort;
 import org.eclipse.papyrus.robotics.profile.robotics.functions.Function;
@@ -55,14 +58,15 @@
 	 *            a specific kind (typically a handler)
 	 * @return the found function or null
 	 */
-	public static Behavior getFunction(Activity activity, FunctionKind kind) {
+	public static List<Behavior> getFunctions(Activity activity, FunctionKind kind) {
+		List<Behavior> behaviorList = new ArrayList<Behavior>();
 		for (Function fct : activity.getFunctions()) {
 			if (fct.getKind() == kind && fct.getBase_Class() instanceof Behavior) {
 				Behavior base = (Behavior) fct.getBase_Class();
-				return base;
+				behaviorList.add(base);
 			}
 		}
-		return null;
+		return behaviorList;
 	}
 
 	/**
diff --git a/plugins/customization/org.eclipse.papyrus.robotics.profile/model/robotics.ecore b/plugins/customization/org.eclipse.papyrus.robotics.profile/model/robotics.ecore
index ade2674..367799b 100644
--- a/plugins/customization/org.eclipse.papyrus.robotics.profile/model/robotics.ecore
+++ b/plugins/customization/org.eclipse.papyrus.robotics.profile/model/robotics.ecore
@@ -124,11 +124,12 @@
       <eLiterals name="ON_CONFIGURE"/>
       <eLiterals name="ON_ACTIVATE" value="1"/>
       <eLiterals name="ON_DEACTIVATE" value="2"/>
-      <eLiterals name="ON_CLEANUP" value="3"/>
-      <eLiterals name="ON_ERROR" value="4"/>
-      <eLiterals name="HANDLER" value="5"/>
-      <eLiterals name="PERIODIC" value="6"/>
-      <eLiterals name="MANUALLY_CALLED" value="7"/>
+      <eLiterals name="ON_SHUTDOWN" value="3"/>
+      <eLiterals name="ON_CLEANUP" value="4"/>
+      <eLiterals name="ON_ERROR" value="5"/>
+      <eLiterals name="HANDLER" value="6"/>
+      <eLiterals name="PERIODIC" value="7"/>
+      <eLiterals name="MANUALLY_CALLED" value="8"/>
     </eClassifiers>
     <eClassifiers xsi:type="ecore:EClass" name="Function" eSuperTypes="platform:/plugin/org.eclipse.papyrus.robotics.bpc.profile/model/bpc.ecore#//Block">
       <eStructuralFeatures xsi:type="ecore:EReference" name="arguments" ordered="false"
diff --git a/plugins/customization/org.eclipse.papyrus.robotics.profile/model/robotics.profile.genmodel b/plugins/customization/org.eclipse.papyrus.robotics.profile/model/robotics.profile.genmodel
index 9c55624..2b7d9b6 100644
--- a/plugins/customization/org.eclipse.papyrus.robotics.profile/model/robotics.profile.genmodel
+++ b/plugins/customization/org.eclipse.papyrus.robotics.profile/model/robotics.profile.genmodel
@@ -123,6 +123,7 @@
         <genEnumLiterals xsi:type="genmodel:GenEnumLiteral" ecoreEnumLiteral="robotics.ecore#//functions/FunctionKind/ON_CONFIGURE"/>
         <genEnumLiterals xsi:type="genmodel:GenEnumLiteral" ecoreEnumLiteral="robotics.ecore#//functions/FunctionKind/ON_ACTIVATE"/>
         <genEnumLiterals xsi:type="genmodel:GenEnumLiteral" ecoreEnumLiteral="robotics.ecore#//functions/FunctionKind/ON_DEACTIVATE"/>
+        <genEnumLiterals xsi:type="genmodel:GenEnumLiteral" ecoreEnumLiteral="robotics.ecore#//functions/FunctionKind/ON_SHUTDOWN"/>
         <genEnumLiterals xsi:type="genmodel:GenEnumLiteral" ecoreEnumLiteral="robotics.ecore#//functions/FunctionKind/ON_CLEANUP"/>
         <genEnumLiterals xsi:type="genmodel:GenEnumLiteral" ecoreEnumLiteral="robotics.ecore#//functions/FunctionKind/ON_ERROR"/>
         <genEnumLiterals xsi:type="genmodel:GenEnumLiteral" ecoreEnumLiteral="robotics.ecore#//functions/FunctionKind/HANDLER"/>
diff --git a/plugins/customization/org.eclipse.papyrus.robotics.profile/model/robotics.profile.notation b/plugins/customization/org.eclipse.papyrus.robotics.profile/model/robotics.profile.notation
index 21a82f2..4b3998e 100644
--- a/plugins/customization/org.eclipse.papyrus.robotics.profile/model/robotics.profile.notation
+++ b/plugins/customization/org.eclipse.papyrus.robotics.profile/model/robotics.profile.notation
@@ -4626,13 +4626,17 @@
           <element xmi:type="uml:EnumerationLiteral" href="robotics.profile.uml#_yWtY4GMVEeq3RO23rtQA0g"/>
           <layoutConstraint xmi:type="notation:Location" xmi:id="_Pq-YoWMgEeqnwOKXIadaoQ"/>
         </children>
+        <children xmi:type="notation:Shape" xmi:id="_Dq-10Ax3EeuIedt4csBL7g" type="EnumerationLiteral_LiteralLabel">
+          <element xmi:type="uml:EnumerationLiteral" href="robotics.profile.uml#_DqGsEAx3EeuIedt4csBL7g"/>
+          <layoutConstraint xmi:type="notation:Location" xmi:id="_Dq-10Qx3EeuIedt4csBL7g"/>
+        </children>
         <styles xmi:type="notation:TitleStyle" xmi:id="_2ZoGMksjEeqojt4A_a-YAw"/>
         <styles xmi:type="notation:SortingStyle" xmi:id="_2ZoGM0sjEeqojt4A_a-YAw"/>
         <styles xmi:type="notation:FilteringStyle" xmi:id="_2ZoGNEsjEeqojt4A_a-YAw"/>
         <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2ZoGNUsjEeqojt4A_a-YAw"/>
       </children>
       <element xmi:type="uml:Enumeration" href="robotics.profile.uml#_2ZbR4EsjEeqojt4A_a-YAw"/>
-      <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2ZnfIEsjEeqojt4A_a-YAw" x="60" y="320" width="201" height="181"/>
+      <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2ZnfIEsjEeqojt4A_a-YAw" x="60" y="320" width="201" height="221"/>
     </children>
     <styles xmi:type="notation:StringValueStyle" xmi:id="_c4BzkS6LEei0V9-WLHIyvg" name="diagram_compatibility_version" stringValue="1.4.0"/>
     <styles xmi:type="notation:DiagramStyle" xmi:id="_c4Bzki6LEei0V9-WLHIyvg"/>
diff --git a/plugins/customization/org.eclipse.papyrus.robotics.profile/model/robotics.profile.uml b/plugins/customization/org.eclipse.papyrus.robotics.profile/model/robotics.profile.uml
index e230cb1..598eaa7 100644
--- a/plugins/customization/org.eclipse.papyrus.robotics.profile/model/robotics.profile.uml
+++ b/plugins/customization/org.eclipse.papyrus.robotics.profile/model/robotics.profile.uml
@@ -838,6 +838,7 @@
       <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_gUyEgGMVEeq3RO23rtQA0g" name="ON_CONFIGURE"/>
       <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_HwrRkEskEeqojt4A_a-YAw" name="ON_ACTIVATE"/>
       <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_MKB3cEskEeqojt4A_a-YAw" name="ON_DEACTIVATE"/>
+      <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_DqGsEAx3EeuIedt4csBL7g" name="ON_SHUTDOWN"/>
       <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_uSadAGMVEeq3RO23rtQA0g" name="ON_CLEANUP"/>
       <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_Hsmz4GMgEeqnwOKXIadaoQ" name="ON_ERROR"/>
       <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_NdFawEskEeqojt4A_a-YAw" name="HANDLER"/>
diff --git a/plugins/customization/org.eclipse.papyrus.robotics.profile/src-gen/org/eclipse/papyrus/robotics/profile/robotics/functions/FunctionKind.java b/plugins/customization/org.eclipse.papyrus.robotics.profile/src-gen/org/eclipse/papyrus/robotics/profile/robotics/functions/FunctionKind.java
index 9c1226f..ccf9ab7 100644
--- a/plugins/customization/org.eclipse.papyrus.robotics.profile/src-gen/org/eclipse/papyrus/robotics/profile/robotics/functions/FunctionKind.java
+++ b/plugins/customization/org.eclipse.papyrus.robotics.profile/src-gen/org/eclipse/papyrus/robotics/profile/robotics/functions/FunctionKind.java
@@ -52,6 +52,14 @@
 	 * @ordered
 	 */
 	ON_DEACTIVATE(2, "ON_DEACTIVATE", "ON_DEACTIVATE"), /**
+	 * The '<em><b>ON SHUTDOWN</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #ON_SHUTDOWN_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	ON_SHUTDOWN(3, "ON_SHUTDOWN", "ON_SHUTDOWN"), /**
 	 * The '<em><b>ON CLEANUP</b></em>' literal object.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -59,7 +67,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	ON_CLEANUP(3, "ON_CLEANUP", "ON_CLEANUP"), /**
+	ON_CLEANUP(4, "ON_CLEANUP", "ON_CLEANUP"), /**
 	 * The '<em><b>ON ERROR</b></em>' literal object.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -67,7 +75,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	ON_ERROR(4, "ON_ERROR", "ON_ERROR"), //$NON-NLS-1$ //$NON-NLS-2$
+	ON_ERROR(5, "ON_ERROR", "ON_ERROR"), //$NON-NLS-1$ //$NON-NLS-2$
 
 	/**
 	 * The '<em><b>HANDLER</b></em>' literal object.
@@ -77,7 +85,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	HANDLER(5, "HANDLER", "HANDLER"), //$NON-NLS-1$ //$NON-NLS-2$
+	HANDLER(6, "HANDLER", "HANDLER"), //$NON-NLS-1$ //$NON-NLS-2$
 
 	/**
 	 * The '<em><b>PERIODIC</b></em>' literal object.
@@ -87,7 +95,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	PERIODIC(6, "PERIODIC", "PERIODIC"), /**
+	PERIODIC(7, "PERIODIC", "PERIODIC"), /**
 	 * The '<em><b>MANUALLY CALLED</b></em>' literal object.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -95,7 +103,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	MANUALLY_CALLED(7, "MANUALLY_CALLED", "MANUALLY_CALLED"); //$NON-NLS-1$ //$NON-NLS-2$
+	MANUALLY_CALLED(8, "MANUALLY_CALLED", "MANUALLY_CALLED"); //$NON-NLS-1$ //$NON-NLS-2$
 
 	/**
 	 * The '<em><b>ON CONFIGURE</b></em>' literal value.
@@ -131,6 +139,17 @@
 	public static final int ON_DEACTIVATE_VALUE = 2;
 
 	/**
+	 * The '<em><b>ON SHUTDOWN</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #ON_SHUTDOWN
+	 * @model
+	 * @generated
+	 * @ordered
+	 */
+	public static final int ON_SHUTDOWN_VALUE = 3;
+
+	/**
 	 * The '<em><b>ON CLEANUP</b></em>' literal value.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -139,7 +158,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	public static final int ON_CLEANUP_VALUE = 3;
+	public static final int ON_CLEANUP_VALUE = 4;
 
 	/**
 	 * The '<em><b>ON ERROR</b></em>' literal value.
@@ -150,7 +169,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	public static final int ON_ERROR_VALUE = 4;
+	public static final int ON_ERROR_VALUE = 5;
 
 	/**
 	 * The '<em><b>HANDLER</b></em>' literal value.
@@ -161,7 +180,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	public static final int HANDLER_VALUE = 5;
+	public static final int HANDLER_VALUE = 6;
 
 	/**
 	 * The '<em><b>PERIODIC</b></em>' literal value.
@@ -172,7 +191,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	public static final int PERIODIC_VALUE = 6;
+	public static final int PERIODIC_VALUE = 7;
 
 	/**
 	 * The '<em><b>MANUALLY CALLED</b></em>' literal value.
@@ -183,7 +202,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	public static final int MANUALLY_CALLED_VALUE = 7;
+	public static final int MANUALLY_CALLED_VALUE = 8;
 
 	/**
 	 * An array of all the '<em><b>Function Kind</b></em>' enumerators.
@@ -196,6 +215,7 @@
 			ON_CONFIGURE,
 			ON_ACTIVATE,
 			ON_DEACTIVATE,
+			ON_SHUTDOWN,
 			ON_CLEANUP,
 			ON_ERROR,
 			HANDLER,
@@ -260,6 +280,7 @@
 			case ON_CONFIGURE_VALUE: return ON_CONFIGURE;
 			case ON_ACTIVATE_VALUE: return ON_ACTIVATE;
 			case ON_DEACTIVATE_VALUE: return ON_DEACTIVATE;
+			case ON_SHUTDOWN_VALUE: return ON_SHUTDOWN;
 			case ON_CLEANUP_VALUE: return ON_CLEANUP;
 			case ON_ERROR_VALUE: return ON_ERROR;
 			case HANDLER_VALUE: return HANDLER;
diff --git a/plugins/customization/org.eclipse.papyrus.robotics.profile/src-gen/org/eclipse/papyrus/robotics/profile/robotics/functions/impl/FunctionsPackageImpl.java b/plugins/customization/org.eclipse.papyrus.robotics.profile/src-gen/org/eclipse/papyrus/robotics/profile/robotics/functions/impl/FunctionsPackageImpl.java
index ec5ff7e..8db5c0a 100644
--- a/plugins/customization/org.eclipse.papyrus.robotics.profile/src-gen/org/eclipse/papyrus/robotics/profile/robotics/functions/impl/FunctionsPackageImpl.java
+++ b/plugins/customization/org.eclipse.papyrus.robotics.profile/src-gen/org/eclipse/papyrus/robotics/profile/robotics/functions/impl/FunctionsPackageImpl.java
@@ -352,6 +352,7 @@
 		addEEnumLiteral(functionKindEEnum, FunctionKind.ON_CONFIGURE);
 		addEEnumLiteral(functionKindEEnum, FunctionKind.ON_ACTIVATE);
 		addEEnumLiteral(functionKindEEnum, FunctionKind.ON_DEACTIVATE);
+		addEEnumLiteral(functionKindEEnum, FunctionKind.ON_SHUTDOWN);
 		addEEnumLiteral(functionKindEEnum, FunctionKind.ON_CLEANUP);
 		addEEnumLiteral(functionKindEEnum, FunctionKind.ON_ERROR);
 		addEEnumLiteral(functionKindEEnum, FunctionKind.HANDLER);
diff --git a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/clientServer/src-gen/addClientCompdef/AddClient.cpp b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/clientServer/src-gen/addClientCompdef/AddClient.cpp
index d95259e..42f508b 100644
--- a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/clientServer/src-gen/addClientCompdef/AddClient.cpp
+++ b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/clientServer/src-gen/addClientCompdef/AddClient.cpp
@@ -86,8 +86,7 @@
  */
 AddClient::AddClient(rclcpp::NodeOptions /*in*/options) :
 		rclcpp_lifecycle::LifecycleNode("AddClient", options) {
-	useAdd_client_ = create_client < simple::srv::AddServiceDef
-			> ("AddServiceDef");
+	useAdd_client_ = create_client<simple::srv::AddServiceDef>("AddServiceDef");
 
 }
 
diff --git a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/clientServer/src-gen/addClientCompdef/AddClient.h b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/clientServer/src-gen/addClientCompdef/AddClient.h
index 26aaf93..d189cc2 100644
--- a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/clientServer/src-gen/addClientCompdef/AddClient.h
+++ b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/clientServer/src-gen/addClientCompdef/AddClient.h
@@ -49,7 +49,7 @@
 	/**
 	 * 
 	 */
-	rclcpp::TimerBase::SharedPtr timer_;
+	rclcpp::TimerBase::SharedPtr timer_CallAdd_;
 
 	/**
 	 * 
diff --git a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/clientServer/src-gen/addClientCompdef/AddClient_main.cpp b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/clientServer/src-gen/addClientCompdef/AddClient_main.cpp
index 0e425d2..e257457 100644
--- a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/clientServer/src-gen/addClientCompdef/AddClient_main.cpp
+++ b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/clientServer/src-gen/addClientCompdef/AddClient_main.cpp
@@ -11,8 +11,8 @@
 int main(int argc, char **argv) {
 	rclcpp::init(argc, argv);
 
-	auto addclient = std::make_shared < addClientCompdef::AddClient
-			> (addclient_options);
+	auto addclient = std::make_shared<addClientCompdef::AddClient>(
+			addclient_options);
 
 	RCLCPP_INFO(addclient->get_logger(), "AddClient has been initialized");
 
@@ -20,12 +20,26 @@
 			[addclient](const rclcpp_lifecycle::State&) {
 				addclient->fOnActivate();
 				// periodic execution (1s) using a wall timer
-				addclient->timer_ = addclient->create_wall_timer(1s,
+				addclient->timer_CallAdd_ = addclient->create_wall_timer(1s,
 						std::bind(&addClientCompdef::AddClient::fPeriodic,
 								addclient));
 				return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
 			}
 	);
+	addclient->register_on_deactivate(
+			[addclient](const rclcpp_lifecycle::State&) {
+				// stop timer
+				addclient->timer_CallAdd_->cancel();
+				return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
+			}
+	);
+	addclient->register_on_shutdown(
+			[addclient](const rclcpp_lifecycle::State&) {
+				// stop timer
+				addclient->timer_CallAdd_->cancel();
+				return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
+			}
+	);
 
 	rclcpp::executors::MultiThreadedExecutor executor;
 
diff --git a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/clientServer/src-gen/addServerCompdef/AddServer.cpp b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/clientServer/src-gen/addServerCompdef/AddServer.cpp
index 061f018..6a0125f 100644
--- a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/clientServer/src-gen/addServerCompdef/AddServer.cpp
+++ b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/clientServer/src-gen/addServerCompdef/AddServer.cpp
@@ -29,10 +29,10 @@
 		const simple::srv::AddServiceDef::Request::SharedPtr /*in*/request,
 		const simple::srv::AddServiceDef::Response::SharedPtr /*in*/response) {
 	response->sum = request->x + request->y;
-	RCLCPP_INFO(get_logger(), "request: x=%ld, y=%ld", (long int) request->x,
-			(long int) request->y);
+	RCLCPP_INFO(get_logger(), "request: x=%ld, y=%ld", (long int ) request->x,
+			(long int ) request->y);
 	RCLCPP_INFO(get_logger(), "sending back response: [%ld]",
-			(long int) response->sum);
+			(long int ) response->sum);
 	return true;
 }
 
@@ -42,10 +42,9 @@
  */
 AddServer::AddServer(rclcpp::NodeOptions /*in*/options) :
 		rclcpp_lifecycle::LifecycleNode("AddServer", options) {
-	addSvc_srv_ = create_service < simple::srv::AddServiceDef
-			> ("AddServiceDef", std::bind(&addServerCompdef::AddServer::fAdder,
-					(AddServer*) this, std::placeholders::_1,
-					std::placeholders::_2));
+	addSvc_srv_ = create_service<simple::srv::AddServiceDef>("AddServiceDef",
+			std::bind(&addServerCompdef::AddServer::fAdder, (AddServer*) this,
+					std::placeholders::_1, std::placeholders::_2));
 
 }
 
diff --git a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/clientServer/src-gen/addServerCompdef/AddServer_main.cpp b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/clientServer/src-gen/addServerCompdef/AddServer_main.cpp
index 9dccc3e..3479f86 100644
--- a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/clientServer/src-gen/addServerCompdef/AddServer_main.cpp
+++ b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/clientServer/src-gen/addServerCompdef/AddServer_main.cpp
@@ -10,8 +10,8 @@
 int main(int argc, char **argv) {
 	rclcpp::init(argc, argv);
 
-	auto addserver = std::make_shared < addServerCompdef::AddServer
-			> (addserver_options);
+	auto addserver = std::make_shared<addServerCompdef::AddServer>(
+			addserver_options);
 
 	RCLCPP_INFO(addserver->get_logger(), "AddServer has been initialized");
 
diff --git a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe/src-gen/periodicPublisherCompdef/PeriodicPublisher.cpp b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe/src-gen/periodicPublisherCompdef/PeriodicPublisher.cpp
index b96430b..87d77b7 100644
--- a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe/src-gen/periodicPublisherCompdef/PeriodicPublisher.cpp
+++ b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe/src-gen/periodicPublisherCompdef/PeriodicPublisher.cpp
@@ -40,7 +40,7 @@
  */
 PeriodicPublisher::PeriodicPublisher(rclcpp::NodeOptions /*in*/options) :
 		rclcpp_lifecycle::LifecycleNode("PeriodicPublisher", options) {
-	pMap_pub_ = create_publisher < simple::msg::Map > ("pMap", 1);
+	pMap_pub_ = create_publisher<simple::msg::Map>("pMap", 1);
 	// directly activate a publisher
 	pMap_pub_->on_activate();
 
diff --git a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe/src-gen/periodicPublisherCompdef/PeriodicPublisher.h b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe/src-gen/periodicPublisherCompdef/PeriodicPublisher.h
index a59e322..4c3fbd3 100644
--- a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe/src-gen/periodicPublisherCompdef/PeriodicPublisher.h
+++ b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe/src-gen/periodicPublisherCompdef/PeriodicPublisher.h
@@ -45,7 +45,7 @@
 	/**
 	 * 
 	 */
-	rclcpp::TimerBase::SharedPtr timer_;
+	rclcpp::TimerBase::SharedPtr timer_Activity1_;
 
 	/**
 	 * 
diff --git a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe/src-gen/periodicPublisherCompdef/PeriodicPublisher_main.cpp b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe/src-gen/periodicPublisherCompdef/PeriodicPublisher_main.cpp
index c371efc..12ce185 100644
--- a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe/src-gen/periodicPublisherCompdef/PeriodicPublisher_main.cpp
+++ b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe/src-gen/periodicPublisherCompdef/PeriodicPublisher_main.cpp
@@ -11,9 +11,9 @@
 int main(int argc, char **argv) {
 	rclcpp::init(argc, argv);
 
-	auto periodicpublisher = std::make_shared<
-			periodicPublisherCompdef::PeriodicPublisher>(
-			periodicpublisher_options);
+	auto periodicpublisher = std::make_shared
+			< periodicPublisherCompdef::PeriodicPublisher
+			> (periodicpublisher_options);
 
 	RCLCPP_INFO(periodicpublisher->get_logger(),
 			"PeriodicPublisher has been initialized");
@@ -21,7 +21,7 @@
 	periodicpublisher->register_on_activate(
 			[periodicpublisher](const rclcpp_lifecycle::State&) {
 				// periodic execution (250ms) using a wall timer
-				periodicpublisher->timer_ =
+				periodicpublisher->timer_Activity1_ =
 						periodicpublisher->create_wall_timer(250ms,
 								std::bind(
 										&periodicPublisherCompdef::PeriodicPublisher::fPublishing,
@@ -29,6 +29,20 @@
 				return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
 			}
 	);
+	periodicpublisher->register_on_deactivate(
+			[periodicpublisher](const rclcpp_lifecycle::State&) {
+				// stop timer
+				periodicpublisher->timer_Activity1_->cancel();
+				return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
+			}
+	);
+	periodicpublisher->register_on_shutdown(
+			[periodicpublisher](const rclcpp_lifecycle::State&) {
+				// stop timer
+				periodicpublisher->timer_Activity1_->cancel();
+				return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
+			}
+	);
 	periodicpublisher->declareParameters();
 	periodicpublisher->initParameterVars();
 
diff --git a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe/src-gen/subscriberCompdef/Subscriber.cpp b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe/src-gen/subscriberCompdef/Subscriber.cpp
index bbd98c1..b53a71d 100644
--- a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe/src-gen/subscriberCompdef/Subscriber.cpp
+++ b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe/src-gen/subscriberCompdef/Subscriber.cpp
@@ -41,11 +41,10 @@
  */
 Subscriber::Subscriber(rclcpp::NodeOptions /*in*/options) :
 		rclcpp_lifecycle::LifecycleNode("Subscriber", options) {
-	rMap_sub_ =
-			create_subscription < simple::msg::Map
-					> ("rMap", rclcpp::QoS(rclcpp::KeepLast(100)).best_effort(), std::bind(
-							&subscriberCompdef::Subscriber::fListening,
-							(Subscriber*) this, std::placeholders::_1));
+	rMap_sub_ = create_subscription<simple::msg::Map>("rMap",
+			rclcpp::QoS(rclcpp::KeepLast(100)).best_effort(),
+			std::bind(&subscriberCompdef::Subscriber::fListening,
+					(Subscriber*) this, std::placeholders::_1));
 
 }
 
diff --git a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe/src-gen/subscriberCompdef/Subscriber_main.cpp b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe/src-gen/subscriberCompdef/Subscriber_main.cpp
index 47cb456..c182eb2 100644
--- a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe/src-gen/subscriberCompdef/Subscriber_main.cpp
+++ b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe/src-gen/subscriberCompdef/Subscriber_main.cpp
@@ -10,8 +10,8 @@
 int main(int argc, char **argv) {
 	rclcpp::init(argc, argv);
 
-	auto subscriber = std::make_shared<subscriberCompdef::Subscriber>(
-			subscriber_options);
+	auto subscriber = std::make_shared < subscriberCompdef::Subscriber
+			> (subscriber_options);
 
 	RCLCPP_INFO(subscriber->get_logger(), "Subscriber has been initialized");
 
diff --git a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe_extcode/src-gen/periodicPublisherCompdef/PeriodicPublisher.cpp b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe_extcode/src-gen/periodicPublisherCompdef/PeriodicPublisher.cpp
index 3099f50..ad5d61d 100644
--- a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe_extcode/src-gen/periodicPublisherCompdef/PeriodicPublisher.cpp
+++ b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe_extcode/src-gen/periodicPublisherCompdef/PeriodicPublisher.cpp
@@ -26,7 +26,7 @@
  */
 PeriodicPublisher::PeriodicPublisher(rclcpp::NodeOptions /*in*/options) :
 		rclcpp_lifecycle::LifecycleNode("PeriodicPublisher", options) {
-	pMap_pub_ = create_publisher < simple::msg::Map > ("pMap", 1);
+	pMap_pub_ = create_publisher<simple::msg::Map>("pMap", 1);
 	// directly activate a publisher
 	pMap_pub_->on_activate();
 
diff --git a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe_extcode/src-gen/periodicPublisherCompdef/PeriodicPublisher.h b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe_extcode/src-gen/periodicPublisherCompdef/PeriodicPublisher.h
index 3e643cb..2e1b442 100644
--- a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe_extcode/src-gen/periodicPublisherCompdef/PeriodicPublisher.h
+++ b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe_extcode/src-gen/periodicPublisherCompdef/PeriodicPublisher.h
@@ -45,7 +45,7 @@
 	/**
 	 * 
 	 */
-	rclcpp::TimerBase::SharedPtr timer_;
+	rclcpp::TimerBase::SharedPtr timer_Activity1_;
 
 	/**
 	 * 
diff --git a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe_extcode/src-gen/periodicPublisherCompdef/PeriodicPublisher_main.cpp b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe_extcode/src-gen/periodicPublisherCompdef/PeriodicPublisher_main.cpp
index c7448e8..7dde710 100644
--- a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe_extcode/src-gen/periodicPublisherCompdef/PeriodicPublisher_main.cpp
+++ b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe_extcode/src-gen/periodicPublisherCompdef/PeriodicPublisher_main.cpp
@@ -21,7 +21,7 @@
 	periodicpublisher->register_on_activate(
 			[periodicpublisher](const rclcpp_lifecycle::State&) {
 				// periodic execution (250ms) using a wall timer
-				periodicpublisher->timer_ =
+				periodicpublisher->timer_Activity1_ =
 						periodicpublisher->create_wall_timer(250ms,
 								std::bind(
 										&periodicPublisherCompdef::PeriodicPublisher_impl::fPublishing,
@@ -29,6 +29,20 @@
 				return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
 			}
 	);
+	periodicpublisher->register_on_deactivate(
+			[periodicpublisher](const rclcpp_lifecycle::State&) {
+				// stop timer
+				periodicpublisher->timer_Activity1_->cancel();
+				return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
+			}
+	);
+	periodicpublisher->register_on_shutdown(
+			[periodicpublisher](const rclcpp_lifecycle::State&) {
+				// stop timer
+				periodicpublisher->timer_Activity1_->cancel();
+				return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
+			}
+	);
 	periodicpublisher->declareParameters();
 	periodicpublisher->initParameterVars();
 
diff --git a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe_extcode/src-gen/subscriberCompdef/Subscriber.cpp b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe_extcode/src-gen/subscriberCompdef/Subscriber.cpp
index 0a26510..1f0e5b0 100644
--- a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe_extcode/src-gen/subscriberCompdef/Subscriber.cpp
+++ b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/publishSubscribe_extcode/src-gen/subscriberCompdef/Subscriber.cpp
@@ -31,11 +31,10 @@
  */
 Subscriber::Subscriber(rclcpp::NodeOptions /*in*/options) :
 		rclcpp_lifecycle::LifecycleNode("Subscriber", options) {
-	rMap_sub_ =
-			create_subscription < simple::msg::Map
-					> ("rMap", rclcpp::QoS(rclcpp::KeepLast(100)).best_effort(), std::bind(
-							&subscriberCompdef::Subscriber_impl::fListening,
-							(Subscriber_impl*) this, std::placeholders::_1));
+	rMap_sub_ = create_subscription<simple::msg::Map>("rMap",
+			rclcpp::QoS(rclcpp::KeepLast(100)).best_effort(),
+			std::bind(&subscriberCompdef::Subscriber_impl::fListening,
+					(Subscriber_impl*) this, std::placeholders::_1));
 
 }
 
diff --git a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/sendReceive/src-gen/sendReceive/SendClient.cpp b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/sendReceive/src-gen/sendReceive/SendClient.cpp
index 054295e..5e967b6 100644
--- a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/sendReceive/src-gen/sendReceive/SendClient.cpp
+++ b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/sendReceive/src-gen/sendReceive/SendClient.cpp
@@ -26,7 +26,7 @@
 // Register the component with class_loader.
 // This acts as a sort of entry point, allowing the component to be discoverable when its library
 // is being loaded into a running process.
-RCLCPP_COMPONENTS_REGISTER_NODE (sendReceive::SendClient)
+RCLCPP_COMPONENTS_REGISTER_NODE(sendReceive::SendClient)
 
 // End of Include declaration (body)
 
@@ -54,7 +54,7 @@
  */
 SendClient::SendClient(rclcpp::NodeOptions /*in*/options) :
 		rclcpp_lifecycle::LifecycleNode("SendClient", options) {
-	map_send_ = create_publisher < simple::msg::Map > ("map", 1);
+	map_send_ = create_publisher<simple::msg::Map>("map", 1);
 	// directly activate a publisher
 	map_send_->on_activate();
 
diff --git a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/sendReceive/src-gen/sendReceive/SendClient.h b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/sendReceive/src-gen/sendReceive/SendClient.h
index f23138f..e852bd3 100644
--- a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/sendReceive/src-gen/sendReceive/SendClient.h
+++ b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/sendReceive/src-gen/sendReceive/SendClient.h
@@ -44,7 +44,7 @@
 	/**
 	 * 
 	 */
-	rclcpp::TimerBase::SharedPtr timer_;
+	rclcpp::TimerBase::SharedPtr timer_Request_;
 
 	/**
 	 * 
diff --git a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/sendReceive/src-gen/sendReceive/SendClient_main.cpp b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/sendReceive/src-gen/sendReceive/SendClient_main.cpp
index f69040e..83b01e1 100644
--- a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/sendReceive/src-gen/sendReceive/SendClient_main.cpp
+++ b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/sendReceive/src-gen/sendReceive/SendClient_main.cpp
@@ -11,20 +11,34 @@
 int main(int argc, char **argv) {
 	rclcpp::init(argc, argv);
 
-	auto sendclient = std::make_shared<sendReceive::SendClient>(
-			sendclient_options);
+	auto sendclient = std::make_shared < sendReceive::SendClient
+			> (sendclient_options);
 
 	RCLCPP_INFO(sendclient->get_logger(), "SendClient has been initialized");
 
 	sendclient->register_on_activate(
 			[sendclient](const rclcpp_lifecycle::State&) {
 				// periodic execution (1s) using a wall timer
-				sendclient->timer_ = sendclient->create_wall_timer(1s,
+				sendclient->timer_Request_ = sendclient->create_wall_timer(1s,
 						std::bind(&sendReceive::SendClient::fSendMap,
 								sendclient));
 				return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
 			}
 	);
+	sendclient->register_on_deactivate(
+			[sendclient](const rclcpp_lifecycle::State&) {
+				// stop timer
+				sendclient->timer_Request_->cancel();
+				return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
+			}
+	);
+	sendclient->register_on_shutdown(
+			[sendclient](const rclcpp_lifecycle::State&) {
+				// stop timer
+				sendclient->timer_Request_->cancel();
+				return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
+			}
+	);
 
 	rclcpp::executors::MultiThreadedExecutor executor;
 
diff --git a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/sendReceive/src-gen/sendReceive/SendServer.cpp b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/sendReceive/src-gen/sendReceive/SendServer.cpp
index aee7ea8..3e51a78 100644
--- a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/sendReceive/src-gen/sendReceive/SendServer.cpp
+++ b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/sendReceive/src-gen/sendReceive/SendServer.cpp
@@ -21,7 +21,7 @@
 // Register the component with class_loader.
 // This acts as a sort of entry point, allowing the component to be discoverable when its library
 // is being loaded into a running process.
-RCLCPP_COMPONENTS_REGISTER_NODE (sendReceive::SendServer)
+RCLCPP_COMPONENTS_REGISTER_NODE(sendReceive::SendServer)
 
 // End of Include declaration (body)
 
@@ -46,11 +46,10 @@
  */
 SendServer::SendServer(rclcpp::NodeOptions /*in*/options) :
 		rclcpp_lifecycle::LifecycleNode("SendServer", options) {
-	map_recv_ =
-			create_subscription < simple::msg::Map
-					> ("map", rclcpp::QoS(rclcpp::KeepLast(100)).best_effort(), std::bind(
-							&sendReceive::SendServer::fReceive,
-							(SendServer*) this, std::placeholders::_1));
+	map_recv_ = create_subscription<simple::msg::Map>("map",
+			rclcpp::QoS(rclcpp::KeepLast(100)).best_effort(),
+			std::bind(&sendReceive::SendServer::fReceive, (SendServer*) this,
+					std::placeholders::_1));
 
 }
 
diff --git a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/sendReceive/src-gen/sendReceive/SendServer_main.cpp b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/sendReceive/src-gen/sendReceive/SendServer_main.cpp
index dc38a40..5bb604a 100644
--- a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/sendReceive/src-gen/sendReceive/SendServer_main.cpp
+++ b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/expectedResult/sendReceive/src-gen/sendReceive/SendServer_main.cpp
@@ -10,8 +10,8 @@
 int main(int argc, char **argv) {
 	rclcpp::init(argc, argv);
 
-	auto sendserver = std::make_shared<sendReceive::SendServer>(
-			sendserver_options);
+	auto sendserver = std::make_shared < sendReceive::SendServer
+			> (sendserver_options);
 
 	RCLCPP_INFO(sendserver->get_logger(), "SendServer has been initialized");
 
diff --git a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/ros_out b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/ros_out
deleted file mode 100644
index 4e7bfb7..0000000
--- a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen.tests/ros_out
+++ /dev/null
@@ -1,99 +0,0 @@
-$ ros2 node info /amcl 
-/amcl
-  Subscribers:
-    /clock: rosgraph_msgs/msg/Clock
-    /initialpose: geometry_msgs/msg/PoseWithCovarianceStamped
-    /map: nav_msgs/msg/OccupancyGrid
-    /parameter_events: rcl_interfaces/msg/ParameterEvent
-  Publishers:
-    /amcl/transition_event: lifecycle_msgs/msg/TransitionEvent
-    /amcl_pose: geometry_msgs/msg/PoseWithCovarianceStamped
-    /parameter_events: rcl_interfaces/msg/ParameterEvent
-    /particlecloud: geometry_msgs/msg/PoseArray
-    /rosout: rcl_interfaces/msg/Log
-  Service Servers:
-    /amcl/change_state: lifecycle_msgs/srv/ChangeState
-    /amcl/describe_parameters: rcl_interfaces/srv/DescribeParameters
-    /amcl/get_available_states: lifecycle_msgs/srv/GetAvailableStates
-    /amcl/get_available_transitions: lifecycle_msgs/srv/GetAvailableTransitions
-    /amcl/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
-    /amcl/get_parameters: rcl_interfaces/srv/GetParameters
-    /amcl/get_state: lifecycle_msgs/srv/GetState
-    /amcl/get_transition_graph: lifecycle_msgs/srv/GetAvailableTransitions
-    /amcl/list_parameters: rcl_interfaces/srv/ListParameters
-    /amcl/set_parameters: rcl_interfaces/srv/SetParameters
-    /amcl/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
-    /reinitialize_global_localization: std_srvs/srv/Empty
-    /request_nomotion_update: std_srvs/srv/Empty
-  Service Clients:
-
-  Action Servers:
-
-  Action Clients:
-
-$ ros2 node info /bt_navigator
-/bt_navigator
-  Subscribers:
-    /clock: rosgraph_msgs/msg/Clock
-    /goal_pose: geometry_msgs/msg/PoseStamped
-    /parameter_events: rcl_interfaces/msg/ParameterEvent
-    /tf: tf2_msgs/msg/TFMessage
-    /tf_static: tf2_msgs/msg/TFMessage
-  Publishers:
-    /bt_navigator/transition_event: lifecycle_msgs/msg/TransitionEvent
-    /parameter_events: rcl_interfaces/msg/ParameterEvent
-    /rosout: rcl_interfaces/msg/Log
-  Service Servers:
-    /bt_navigator/change_state: lifecycle_msgs/srv/ChangeState
-    /bt_navigator/describe_parameters: rcl_interfaces/srv/DescribeParameters
-    /bt_navigator/get_available_states: lifecycle_msgs/srv/GetAvailableStates
-    /bt_navigator/get_available_transitions: lifecycle_msgs/srv/GetAvailableTransitions
-    /bt_navigator/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
-    /bt_navigator/get_parameters: rcl_interfaces/srv/GetParameters
-    /bt_navigator/get_state: lifecycle_msgs/srv/GetState
-    /bt_navigator/get_transition_graph: lifecycle_msgs/srv/GetAvailableTransitions
-    /bt_navigator/list_parameters: rcl_interfaces/srv/ListParameters
-    /bt_navigator/set_parameters: rcl_interfaces/srv/SetParameters
-    /bt_navigator/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
-  Service Clients:
-
-  Action Servers:
-    /NavigateToPose: nav2_msgs/action/NavigateToPose
-  Action Clients:
-
-$ ros2 node info /controller_server
-/controller_server
-  Subscribers:
-    /clock: rosgraph_msgs/msg/Clock
-    /odom: nav_msgs/msg/Odometry
-    /parameter_events: rcl_interfaces/msg/ParameterEvent
-  Publishers:
-    /cmd_vel: geometry_msgs/msg/Twist
-    /controller_server/transition_event: lifecycle_msgs/msg/TransitionEvent
-    /cost_cloud: sensor_msgs/msg/PointCloud
-    /evaluation: dwb_msgs/msg/LocalPlanEvaluation
-    /local_plan: nav_msgs/msg/Path
-    /marker: visualization_msgs/msg/MarkerArray
-    /parameter_events: rcl_interfaces/msg/ParameterEvent
-    /received_global_plan: nav_msgs/msg/Path
-    /rosout: rcl_interfaces/msg/Log
-    /transformed_global_plan: nav_msgs/msg/Path
-  Service Servers:
-    /controller_server/change_state: lifecycle_msgs/srv/ChangeState
-    /controller_server/describe_parameters: rcl_interfaces/srv/DescribeParameters
-    /controller_server/get_available_states: lifecycle_msgs/srv/GetAvailableStates
-    /controller_server/get_available_transitions: lifecycle_msgs/srv/GetAvailableTransitions
-    /controller_server/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
-    /controller_server/get_parameters: rcl_interfaces/srv/GetParameters
-    /controller_server/get_state: lifecycle_msgs/srv/GetState
-    /controller_server/get_transition_graph: lifecycle_msgs/srv/GetAvailableTransitions
-    /controller_server/list_parameters: rcl_interfaces/srv/ListParameters
-    /controller_server/set_parameters: rcl_interfaces/srv/SetParameters
-    /controller_server/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
-  Service Clients:
-
-  Action Servers:
-
-  Action Clients:
-
-
diff --git a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen/src/org/eclipse/papyrus/robotics/ros2/codegen/component/ComponentTransformations.xtend b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen/src/org/eclipse/papyrus/robotics/ros2/codegen/component/ComponentTransformations.xtend
index 5238ad4..88e068a 100644
--- a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen/src/org/eclipse/papyrus/robotics/ros2/codegen/component/ComponentTransformations.xtend
+++ b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen/src/org/eclipse/papyrus/robotics/ros2/codegen/component/ComponentTransformations.xtend
@@ -23,7 +23,6 @@
 import org.eclipse.papyrus.robotics.profile.robotics.components.Activity
 import org.eclipse.papyrus.robotics.profile.robotics.components.ComponentDefinition
 import org.eclipse.papyrus.robotics.profile.robotics.functions.Function
-import org.eclipse.papyrus.robotics.ros2.codegen.RosTransformations
 import org.eclipse.papyrus.robotics.ros2.codegen.utils.ApplyProfiles
 import org.eclipse.papyrus.robotics.ros2.codegen.utils.ProjectTools
 import org.eclipse.papyrus.uml.tools.utils.StereotypeUtil
diff --git a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen/src/org/eclipse/papyrus/robotics/ros2/codegen/component/CreateMain.xtend b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen/src/org/eclipse/papyrus/robotics/ros2/codegen/component/CreateMain.xtend
index c350464..ac40586 100644
--- a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen/src/org/eclipse/papyrus/robotics/ros2/codegen/component/CreateMain.xtend
+++ b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen/src/org/eclipse/papyrus/robotics/ros2/codegen/component/CreateMain.xtend
@@ -1,15 +1,15 @@
 /*****************************************************************************
  * Copyright (c) 2020 CEA LIST.
- *
- *
+ * 
+ * 
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v2.0
  * which accompanies this distribution, and is available at
  * https://www.eclipse.org/legal/epl-2.0/
- *
+ * 
  * Contributors:
  *  Ansgar Radermacher  ansgar.radermacher@cea.fr
- *
+ * 
  *****************************************************************************/
 
 package org.eclipse.papyrus.robotics.ros2.codegen.component
@@ -17,7 +17,7 @@
 import org.eclipse.uml2.uml.Class
 
 import static extension org.eclipse.papyrus.robotics.core.utils.ParameterUtils.*
-import static extension org.eclipse.papyrus.robotics.core.utils.FunctionUtils.getFunction
+import static extension org.eclipse.papyrus.robotics.core.utils.FunctionUtils.getFunctions
 import static extension org.eclipse.papyrus.robotics.ros2.codegen.utils.ActivityUtils.*
 import static extension org.eclipse.papyrus.uml.tools.utils.StereotypeUtil.applyApp
 import static extension org.eclipse.papyrus.uml.tools.utils.StereotypeUtil.apply
@@ -50,76 +50,151 @@
 		main.apply(ManualGeneration)
 		val include = main.applyApp(Include);
 		include.body = component.createMainCode.toString
-	}	
-	
+	}
+
 	def static createMainCode(Class component) '''
 		«val instRef = component.instName + "->"»
+		«val onConfigure = component.onLifecycleEvent(instRef, FunctionKind.ON_CONFIGURE)»
 		«val onActivate = component.onActivate(instRef)»
+		«val onDeActivate = component.onQuitActive(instRef, FunctionKind.ON_DEACTIVATE)»
+		«val onShutdown = component.onQuitActive(instRef, FunctionKind.ON_SHUTDOWN)»
+		«val onCleanup = component.onLifecycleEvent(instRef, FunctionKind.ON_CLEANUP)»
 		«val compClassName = component.qualifiedName + component.postfix»
 		#include "«component.nearestPackage.name»/«component.name»«component.postfix».h"
-
+		
 		«IF component.hasPeriodicActivities»
 			using namespace std::chrono_literals;
 		«ENDIF»
 		«component.createTimer»
 		// declare options
 		rclcpp::NodeOptions «component.instName»_options;
-
+		
 		int main(int argc, char **argv) {
 			rclcpp::init(argc, argv);
-
+		
 			auto «component.instName» = std::make_shared<«compClassName»>(«component.instName»_options);
-
+		
 			RCLCPP_INFO(«instRef»get_logger(), "«component.name» has been initialized");
-
-«««			«component.initializeParameters(component)»
+		
+			«IF onConfigure.length > 0»
+				«instRef»register_on_configure(
+					«onConfigure»
+				);
+			«ENDIF»
 			«IF onActivate.length > 0»
 				«instRef»register_on_activate(
 					«onActivate»
 				);
 			«ENDIF»
-			«IF component.allParameters.size > 0»
-				«instRef»declareParameters();
-				«instRef»initParameterVars();
+			«IF onDeActivate.length > 0»
+				«instRef»register_on_deactivate(
+					«onDeActivate»
+				);
 			«ENDIF»
-
+			«IF onShutdown.length > 0»
+				«instRef»register_on_shutdown(
+					«onShutdown»
+				);
+			«ENDIF»
+			«IF onCleanup.length > 0»
+				«instRef»register_on_cleanup(
+					«onCleanup»
+				);
+			«ENDIF»
+			«IF component.allParameters.size > 0»
+			«instRef»declareParameters();
+			«instRef»initParameterVars();
+			«ENDIF»
+		
 			rclcpp::executors::MultiThreadedExecutor executor;
-
+		
 			executor.add_node(«instRef»get_node_base_interface());
-
+		
 			executor.spin();
 			rclcpp::shutdown();
 		}
 	'''
 
 	def static void createTimer(Class component) {
-		if (component.functionsToActivate.size > 0) {
-			val timerBase = ElementUtils.getQualifiedElementFromRS(component, "ros2Library::rclcpp::timer::TimerBase") as Type;
-			val timer = component.createOwnedAttribute("timer_", timerBase);
-			Helpers.useSharedPtr(timer)
+		for (activity : component.activities) {
+			val period = activity.period
+			if (period !== null) {
+				val timerBase = ElementUtils.getQualifiedElementFromRS(component,
+					"ros2Library::rclcpp::timer::TimerBase") as Type;
+				val timer = component.createOwnedAttribute('''timer_«activity.base_Class.name»_''', timerBase);
+				Helpers.useSharedPtr(timer)
+			}
 		}
 	}
 
 	/**
-	 * If an activity is associated with a port publishing port, call
-	 * this activity when the component (node) gets activated
+	 * Create a function to call during the state transition towards a certain
+	 * state. Calls the function with the passed "kind"
+	 */
+	def static onLifecycleEvent(Class component, String instRef, FunctionKind kind) '''
+		«FOR activity : component.activities»
+			«val associatedFcts = activity.getFunctions(kind)»
+			«IF associatedFcts.size > 0»
+				[«component.instName»](const rclcpp_lifecycle::State&) {
+					«FOR associatedFct : associatedFcts»
+						«instRef»«associatedFct.name»();
+					«ENDFOR»
+					return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
+				}
+			«ENDIF»
+		«ENDFOR»
+	'''
+
+	/**
+	 * Create a function to call during the state transition towards activation.
+	 * In particular, call the functions with "kind" ON_ACTIVATE and start periodic timers
 	 */
 	def static onActivate(Class component, String instRef) '''
-		«FOR activity : component.functionsToActivate»
+		«FOR activity : component.activities»
+			«val activityCl = activity.base_Class»
 			«val period = activity.period»
-			«val activateFct = activity.getFunction(FunctionKind.ON_ACTIVATE)»
-			«val periodicFct = activity.getFunction(FunctionKind.PERIODIC)»
-			[«component.instName»](const rclcpp_lifecycle::State&) {
-				«IF activateFct !== null»
-					«instRef»«activateFct.name»();
-				«ENDIF»
-				«IF period !== null && periodicFct !== null»
-					// periodic execution («period») using a wall timer
-					«instRef»timer_ = «instRef»create_wall_timer(«period»,
-						std::bind(&«component.nearestPackage.name»::«component.name»«component.postfix»::«periodicFct.name», «component.instName»));
-				«ENDIF»
-				return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
-			}
+			«val activateFcts = activity.getFunctions(FunctionKind.ON_ACTIVATE)»
+			«val periodicFcts = activity.getFunctions(FunctionKind.PERIODIC)»
+			«IF (period !== null && periodicFcts.size > 0) || activateFcts.size > 0»
+				[«component.instName»](const rclcpp_lifecycle::State&) {
+					«FOR activateFct : activateFcts»
+						«instRef»«activateFct.name»();
+					«ENDFOR»
+					«IF period !== null && periodicFcts.size > 0»
+						// periodic execution («period») using a wall timer
+						«FOR periodicFct : periodicFcts»
+							«instRef»timer_«activityCl.name»_ = «instRef»create_wall_timer(«period»,
+								std::bind(&«component.nearestPackage.name»::«component.name»«component.postfix»::«periodicFct.name», «component.instName»));
+						«ENDFOR»
+					«ENDIF»
+					return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
+				}
+			«ENDIF»
+		«ENDFOR»
+	'''
+
+	/**
+	 * Create a function to call during the state transition leaving the active state (either shutdown or deactivate).
+	 * In particular, call the functions with "kind" ON_DEACTIVATE and stop periodic timers
+	 */
+	def static onQuitActive(Class component, String instRef, FunctionKind kind) '''
+		«FOR activity : component.activities»
+			«val activityCl = activity.base_Class»
+			«val period = activity.period»
+			«val associatedFcts = activity.getFunctions(kind)»
+			«val periodicFcts = activity.getFunctions(FunctionKind.PERIODIC)»
+			«IF (period !== null && periodicFcts.size > 0) || associatedFcts.size > 0»
+				[«component.instName»](const rclcpp_lifecycle::State&) {
+					«FOR activateFct : associatedFcts»
+						«instRef»«activateFct.name»();
+					«ENDFOR»
+					«IF period !== null && periodicFcts.size > 0»
+						// stop timer
+						«instRef»timer_«activityCl.name»_->cancel();
+					«ENDIF»
+					return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS;
+				}
+			«ENDIF»
 		«ENDFOR»
 	'''
 
@@ -129,4 +204,4 @@
 	def static getInstName(Class component) {
 		return component.name.toLowerCase
 	}
-}
\ No newline at end of file
+}
diff --git a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen/src/org/eclipse/papyrus/robotics/ros2/codegen/utils/ActivityUtils.xtend b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen/src/org/eclipse/papyrus/robotics/ros2/codegen/utils/ActivityUtils.xtend
index 32af946..c42dcf9 100644
--- a/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen/src/org/eclipse/papyrus/robotics/ros2/codegen/utils/ActivityUtils.xtend
+++ b/plugins/ros2/org.eclipse.papyrus.robotics.ros2.codegen/src/org/eclipse/papyrus/robotics/ros2/codegen/utils/ActivityUtils.xtend
@@ -21,11 +21,10 @@
 import org.eclipse.uml2.uml.util.UMLUtil
 import org.eclipse.papyrus.robotics.profile.robotics.components.PeriodicTimer
 import java.util.List
-import org.eclipse.emf.common.util.UniqueEList
 import org.eclipse.papyrus.robotics.profile.robotics.functions.FunctionKind
 import org.eclipse.papyrus.robotics.ros2.codegen.component.CodeSkeleton
 import org.eclipse.papyrus.robotics.profile.robotics.components.ActivityPort
-import static extension org.eclipse.papyrus.robotics.core.utils.FunctionUtils.getFunction
+import static extension org.eclipse.papyrus.robotics.core.utils.FunctionUtils.getFunctions
 
 class ActivityUtils {
 
@@ -95,36 +94,15 @@
 		return ""
 	}
 	
-	def static functionsToActivate(Class component) {
-		val list = new UniqueEList<Activity>()
-		for (activity : component.activities) {
-			if (activity.getFunction(FunctionKind.ON_ACTIVATE) !== null ||
-				activity.getFunction(FunctionKind.PERIODIC) !== null) {
-				list.add(activity)
-			}
-		}
-		return list
-	}
-
 	def static hasPeriodicActivities(Class component) {
 		for (activity : component.activities) {
-			if (activity.getFunction(FunctionKind.PERIODIC) !== null) {
+			if (activity.getFunctions(FunctionKind.PERIODIC).size > 0) {
 				return true;
 			}
 		}
 		return false
 	}
 
-	def static activitesToDeActivate(Class component) {
-		val list = new UniqueEList<Activity>()
-		for (activity : component.activities) {
-			if (activity.getFunction(FunctionKind.ON_DEACTIVATE) !== null) {
-				list.add(activity)
-			}
-		}
-		return list
-	}
-
 	/**
 	 * return period length of an activity or null, if non-specified
 	 */