[runtime.cpp] Refactored cpp runtime
- Refactored initialization process
- Fixed RTObject double deleting children
- Sub actors are now static members
- Added ReplicatedActorClassBase for replicated actors
[generator.cpp] Modified ActorClassGen and NodeGen to fit the runtime
changes


Change-Id: I172bcae0cba98234d61c8e741b23be6604cc6131
diff --git a/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/contentassist/RoomProposalProvider.java b/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/contentassist/RoomProposalProvider.java
index ea239ca..ba35fcb 100644
--- a/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/contentassist/RoomProposalProvider.java
+++ b/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/contentassist/RoomProposalProvider.java
@@ -26,14 +26,10 @@
 import org.eclipse.etrice.core.room.ActorInstanceMapping;
 import org.eclipse.etrice.core.room.ActorRef;
 import org.eclipse.etrice.core.room.DataClass;
-import org.eclipse.etrice.core.room.LayerConnection;
 import org.eclipse.etrice.core.room.Operation;
 import org.eclipse.etrice.core.room.RefPath;
-import org.eclipse.etrice.core.room.RefSAPoint;
-import org.eclipse.etrice.core.room.RelaySAPoint;
 import org.eclipse.etrice.core.room.RoomAnnotationTargetEnum;
 import org.eclipse.etrice.core.room.RoomPackage;
-import org.eclipse.etrice.core.room.SPP;
 import org.eclipse.etrice.core.room.StandardOperation;
 import org.eclipse.etrice.core.room.util.RoomHelpers;
 import org.eclipse.jface.text.contentassist.ICompletionProposal;
@@ -41,9 +37,7 @@
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.xtext.Assignment;
 import org.eclipse.xtext.RuleCall;
-import org.eclipse.xtext.naming.IQualifiedNameProvider;
 import org.eclipse.xtext.resource.IEObjectDescription;
-import org.eclipse.xtext.ui.editor.contentassist.ConfigurableCompletionProposal;
 import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
 import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor;
 
@@ -123,9 +117,6 @@
 	@Inject
 	protected RoomNameProvider roomNameProvider;
 	
-	@Inject
-	protected IQualifiedNameProvider fqnProvider;
-	
 	protected Function<IEObjectDescription, ICompletionProposal> getProposalFactory(String ruleName, ContentAssistContext contentAssistContext) {
 		if (contentAssistContext!=null && contentAssistContext.getCurrentModel().eClass()==RoomPackage.eINSTANCE.getActorRef())
 			return new FilteredProposalCreator(new ActorRefFilter(), contentAssistContext, ruleName);
@@ -228,37 +219,6 @@
 		return refs;
 	}
 
-	@Override
-	public void completeLayerConnection_To(EObject model,
-			Assignment assignment, ContentAssistContext context,
-			ICompletionProposalAcceptor acceptor) {
-		super.completeLayerConnection_To(model, assignment, context, acceptor);
-		
-		if (model instanceof LayerConnection) {
-			LayerConnection lc = (LayerConnection) model;
-			if (lc.getFrom() instanceof RefSAPoint) {
-				
-			}
-			else if (lc.getFrom() instanceof RelaySAPoint) {
-				SPP spp = ((RelaySAPoint)lc.getFrom()).getRelay();
-				List<ActorClass> classes = roomHelpers.getClassHierarchy((ActorClass) spp.eContainer());
-				for (ActorClass ac : classes) {
-					for (ActorRef ar : ac.getActorRefs()) {
-						StyledString displayString = getStyledDisplayString(ar, fqnProvider.apply(ar).toString(), ar.getName());
-						ICompletionProposal result = createCompletionProposal(ar.getName(), displayString, getImage(ar), getPriorityHelper().getDefaultPriority(),
-								context.getPrefix(), context);
-						if (result instanceof ConfigurableCompletionProposal) {
-							((ConfigurableCompletionProposal) result).setProposalContextResource(context.getResource());
-							((ConfigurableCompletionProposal) result).setAdditionalProposalInfo(ar);
-							((ConfigurableCompletionProposal) result).setHover(getHover());
-						}
-						acceptor.accept(result);
-					}
-				}
-			}
-		}
-	}
-	
 //	public void completeActorRef_Type(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 //		super.completeActorRef_Type(
 //			    model, 
diff --git a/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/naming/RoomFragmentProvider.java b/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/naming/RoomFragmentProvider.java
index c04d8d4..d772b0c 100644
--- a/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/naming/RoomFragmentProvider.java
+++ b/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/naming/RoomFragmentProvider.java
@@ -109,25 +109,16 @@
 		private String caseSAPointShort(SAPoint sapt) {
 			if (sapt==null)
 				return "null";
-			if (sapt instanceof RefSAPoint) {
-				if (((RefSAPoint) sapt).getRef()==null)
-					return "<not_resolved>";
+			if (sapt instanceof RefSAPoint)
 				return ((RefSAPoint) sapt).getRef().getName();
-			}
-			else if (sapt instanceof RelaySAPoint) {
-				if (((RelaySAPoint) sapt).getRelay()==null)
-					return "<not_resolved>";
+			else if (sapt instanceof RelaySAPoint)
 				return ((RelaySAPoint) sapt).getRelay().getName();
-			}
 
 			assert(false): "unexpectd sub type";
 			return null;
 		}
 
 		private String caseSPPointShort(SPPoint sppt) {
-			if (sppt==null || sppt.getRef()==null || sppt.getService()==null) {
-				return "<not_resolved>";
-			}
 			return sppt.getRef().getName()+EP_SEP+sppt.getService().getName();
 		}
 	}
diff --git a/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/scoping/RoomScopeProvider.java b/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/scoping/RoomScopeProvider.java
index 972e58a..11fcad7 100644
--- a/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/scoping/RoomScopeProvider.java
+++ b/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/scoping/RoomScopeProvider.java
@@ -415,7 +415,7 @@
 	 * @param ref
 	 * @return a list of scopes
 	 */
-	public IScope scope_SPPoint_ref(SPPoint pt, EReference ref) {
+	public IScope scope_SPPoint_actorRef(SPPoint pt, EReference ref) {
 		final List<IEObjectDescription> scopes = new ArrayList<IEObjectDescription>();
 
 		ActorContainerClass acc = getActorContainerClass(pt);
diff --git a/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/validation/RoomJavaValidator.java b/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/validation/RoomJavaValidator.java
index c82a1c4..5945e23 100644
--- a/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/validation/RoomJavaValidator.java
+++ b/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/validation/RoomJavaValidator.java
@@ -222,6 +222,7 @@
 			if (ar.getMultiplicity()>1) {
 				for (Port p : ac.getInterfacePorts()) {
 					if (p.getMultiplicity()<0) {
+						int idx = ((ActorContainerClass)ar.eContainer()).getActorRefs().indexOf(ar);
 						error("replicated actor must not have replicated port with arbitrary multiplicity", null);
 					}
 				}
@@ -231,7 +232,7 @@
 
 	@Check
 	public void checkLayerConnectiontarget(LayerConnection lc) {
-		if (lc!=null && lc.getTo()!=null && lc.getTo().getRef() instanceof ActorRef)
+		if (lc.getTo().getRef() instanceof ActorRef)
 			if (((ActorRef)lc.getTo().getRef()).getMultiplicity()>1)
 				error("layer connection must not connect to replicated actor", null);
 	}
@@ -424,7 +425,7 @@
 	public void checkServiceCompatibility(LayerConnection conn) {
 		Result result = validationUtil.isValid(conn);
 		if (!result.isOk())
-			error(result.getMsg(), result.getSource(), result.getFeature());
+			error(result.getMsg(), RoomPackage.eINSTANCE.getLayerConnection_From());
 	}
 
 	@Check
diff --git a/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/validation/ValidationUtil.java b/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/validation/ValidationUtil.java
index 1cb69b5..a14c160 100644
--- a/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/validation/ValidationUtil.java
+++ b/plugins/org.eclipse.etrice.core.room/src/org/eclipse/etrice/core/validation/ValidationUtil.java
@@ -41,7 +41,6 @@
 import org.eclipse.etrice.core.room.ReferenceType;
 import org.eclipse.etrice.core.room.RelaySAPoint;
 import org.eclipse.etrice.core.room.RoomModel;
-import org.eclipse.etrice.core.room.RoomPackage;
 import org.eclipse.etrice.core.room.SPP;
 import org.eclipse.etrice.core.room.SPPoint;
 import org.eclipse.etrice.core.room.ServiceImplementation;
@@ -491,18 +490,10 @@
 	}
 	
 	public Result isValid(LayerConnection lc) {
-		if (lc.getFrom() instanceof RelaySAPoint) {
-			if (((RelaySAPoint)lc.getFrom())!=null && lc.getTo()!=null && lc.getTo().getService()!=null)
-				return isConnectable(lc, ((RelaySAPoint)lc.getFrom()).getRelay(), null, lc.getTo().getService(), lc.getTo().getRef(), (StructureClass)lc.eContainer(), lc);
-			else
-				return Result.error("incomplete layer connection");
-		}
-		else if (lc.getFrom() instanceof RefSAPoint) {
-			if (((RefSAPoint)lc.getFrom())!=null && ((RefSAPoint)lc.getFrom()).getRef()!=null && lc.getTo()!=null && lc.getTo().getService()!=null && lc.getTo().getRef()!=null)
-				return isConnectable(lc, null, ((RefSAPoint)lc.getFrom()).getRef(), lc.getTo().getService(), lc.getTo().getRef(), (StructureClass)lc.eContainer(), lc);
-			else
-				return Result.error("incomplete layer connection");
-		}
+		if (lc.getFrom() instanceof RelaySAPoint)
+			return isConnectable(((RelaySAPoint)lc.getFrom()).getRelay(), null, lc.getTo().getService(), lc.getTo().getRef(), (StructureClass)lc.eContainer(), lc);
+		else if (lc.getFrom() instanceof RefSAPoint)
+			return isConnectable(null, ((RefSAPoint)lc.getFrom()).getRef(), lc.getTo().getService(), lc.getTo().getRef(), (StructureClass)lc.eContainer(), lc);
 		else {
 			assert(false): "unexpected sub type";
 			return Result.error("internal error");
@@ -511,10 +502,10 @@
 	
 	public Result isConnectable(SPP src, ActorContainerRef srcRef,
 			SPP tgt, ActorContainerRef tgtRef, StructureClass ac) {
-		return isConnectable(null, src, srcRef, tgt, tgtRef, ac, null);
+		return isConnectable(src, srcRef, tgt, tgtRef, ac, null);
 	}
 	
-	public Result isConnectable(LayerConnection lc, SPP src, ActorContainerRef srcRef,
+	public Result isConnectable(SPP src, ActorContainerRef srcRef,
 			SPP dst, ActorContainerRef dstRef, StructureClass sc, LayerConnection exclude) {
 
 		if (sc==null) {
@@ -522,13 +513,13 @@
 		}
 		
 		if ((src==null && srcRef==null) || (src!=null && srcRef!=null))
-			return Result.error("source can be an own SPP _or_ a ref", lc, RoomPackage.Literals.LAYER_CONNECTION__FROM);
+			return Result.error("source can be an own SPP _or_ a ref");
 		
 		if (dst==null || dstRef==null)
-			return Result.error("destination must be an SPP on a ref", lc, RoomPackage.Literals.LAYER_CONNECTION__TO);
+			return Result.error("destination must be an SPP on a ref");
 
 		if (src!=null && isConnectedSrc(src, sc, exclude))
-			return Result.error("source SPP is already connected", lc, RoomPackage.Literals.LAYER_CONNECTION__FROM);
+			return Result.error("source SPP is already connected");
 		
 		// the destination may be connected several times, so don't check this
 		//		if (isConnectedDst(dst, dstRef, sc, exclude))
diff --git a/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/ActorClassGen.xtend b/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/ActorClassGen.xtend
index 8251fce..e122809 100644
--- a/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/ActorClassGen.xtend
+++ b/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/ActorClassGen.xtend
@@ -16,7 +16,6 @@
 import com.google.inject.Singleton
 import java.util.Map
 import org.eclipse.etrice.core.fsm.fSM.ComponentCommunicationType
-import org.eclipse.etrice.core.genmodel.builder.GenmodelConstants
 import org.eclipse.etrice.core.genmodel.etricegen.ExpandedActorClass
 import org.eclipse.etrice.core.genmodel.etricegen.Root
 import org.eclipse.etrice.core.genmodel.etricegen.WiredActorClass
@@ -73,6 +72,7 @@
 		#include "common/etDatatypesCpp.hpp"
 		#include "common/messaging/IRTObject.h"
 		#include "common/modelbase/PortBase.h"
+		#include "common/modelbase/ReplicatedActorClassBase.h"
 		#include "common/modelbase/InterfaceItemBase.h"
 		#include "common/modelbase/SubSystemClassBase.h"
 		#include "common/messaging/Address.h"
@@ -92,6 +92,9 @@
 		«ELSE»
 			#include "«ac.actorBase.path»«ac.actorBase.name».h"
 		«ENDIF»
+		«FOR ar : ac.actorRefs»
+			#include "«ar.type.actorIncludePath»"
+		«ENDFOR»
 
 		«ac.userCode1.userCode»
 
@@ -108,6 +111,15 @@
 					«ep.getPortClassName» «ep.name»;
 				«ENDFOR»
 
+				//--------------------- sub actors
+				«FOR sub : ac.actorRefs»
+					«IF sub.multiplicity > 1»
+						Replicated«sub.type.implementationClassName» «sub.name»;
+					«ELSE»
+						«sub.type.implementationClassName» «sub.name»;
+					«ENDIF»
+				«ENDFOR»
+
 				//--------------------- saps
 				«FOR sap : ac.serviceAccessPoints»
 					«sap.getPortClassName» «sap.name»;
@@ -128,6 +140,10 @@
 			public:
 				//--------------------- construction
 				«ac.name»(etRuntime::IRTObject* parent, const std::string& name);
+				void initialize(void);
+				«IF Main::settings.generateMSCInstrumentation»
+					void setProbesActive(bool recursive, bool active);
+				«ENDIF»
 
 «««	TODO: check whether attribute setters/getters are necessary at all, if yes own cpp implementation is needed for *,[],& variables
 «««				«attributeSettersGettersImplementation(ac.attributes, ac.name)»
@@ -162,6 +178,17 @@
 
 		};
 
+		class Replicated«clsname» : public ReplicatedActorClassBase {
+		public:
+			Replicated«clsname»(IRTObject* parent, const std::string& name) :
+				ReplicatedActorClassBase(parent, name) {}
+			
+		protected:
+			ActorClassBase* createActor(IRTObject* parent, const std::string& name) {
+				return new «clsname»(parent, name);
+			}
+		};
+
 		«ac.generateNamespaceEnd»
 
 		«generateIncludeGuardEnd(ac, '')»
@@ -176,6 +203,8 @@
 		initList += '''«ac.actorBase?.name ?: 'ActorClassBase'»(parent, name)'''
 	    // own ports
 	    initList += ac.endPorts.map['''«name»(this, "«name»", IFITEM_«name»)''']
+	    // own sub actors
+	    initList += ac.actorRefs.map['''«name»(this, "«name»")''']
 		// own saps
 		initList += ac.serviceAccessPoints.map['''«name»(this, "«name»", IFITEM_«name»)''']
 		// own service implementations
@@ -205,10 +234,8 @@
 
 		#include "common/messaging/RTObject.h"
 		#include "common/messaging/RTServices.h"
-
-		«FOR ar : ac.actorRefs»
-			#include "«ar.type.actorIncludePath»"
-		«ENDFOR»
+		#include "common/debugging/DebuggingService.h"
+		#include "common/debugging/MSCFunctionObject.h"
 
 		using namespace etRuntime;
 
@@ -217,6 +244,10 @@
 		«clsname»::«clsname»(etRuntime::IRTObject* parent, const std::string& name)
 				«ac.generateConstructorInitalizerList»
 		{
+			«IF Main::settings.generateMSCInstrumentation»
+				MSCFunctionObject mscFunctionObject(getInstancePathName(), "Constructor");
+			«ENDIF»
+			
 			«IF ac.hasNonEmptyStateMachine»
 				for (int i = 0; i < s_numberOfStates; i++) {
 					history[i] = NO_STATE;
@@ -227,20 +258,34 @@
 			// sub actors
 			«FOR sub : ac.actorRefs»
 				«IF sub.multiplicity>1»
-					for (int i=0; i<«sub.multiplicity»; ++i) {
-						«IF Main::settings.generateMSCInstrumentation»
-							DebuggingService::getInstance().addMessageActorCreate(*this, "«sub.name»«GenmodelConstants::INDEX_SEP»"+i);
-						«ENDIF»
-						new «sub.type.implementationClassName»(this, "«sub.name»«GenmodelConstants::INDEX_SEP»"+i);
-					}
-				«ELSE»
-					«IF Main::settings.generateMSCInstrumentation»
-						DebuggingService::getInstance().addMessageActorCreate(*this, "«sub.name»");
-					«ENDIF»
-					new «sub.type.implementationClassName»(this, "«sub.name»");
+					«sub.name».createSubActors(«sub.multiplicity»);
 				«ENDIF»
 			«ENDFOR»
 
+			«initHelper.genExtraInitializers(ac.attributes)»
+			«ac.userStructorBody(true)»
+		}
+		
+		void «ac.name»::initialize() {
+			«IF Main::settings.generateMSCInstrumentation»
+				MSCFunctionObject mscFunctionObject(getInstancePathName(), "initialize()");
+				«FOR sub : ac.actorRefs»
+					«IF sub.multiplicity > 1»
+						for (int i=0; i<«sub.multiplicity»; ++i) {
+							DebuggingService::getInstance().addMessageActorCreate(*this, «sub.name».getSubActor(i)->getName());
+						}
+					«ELSE»
+						DebuggingService::getInstance().addMessageActorCreate(*this, "«sub.name»");
+					«ENDIF»
+				«ENDFOR»
+			«ENDIF»
+			
+			ActorClassBase::initialize();
+			
+			«FOR sub : ac.actorRefs»
+				«sub.name».initialize();
+			«ENDFOR»
+			
 			// wiring
 			«FOR wire: wired.wires»
 				«if (wire.dataDriven) "DataPortBase" else "InterfaceItemBase"»::connect(this, "«wire.path1.join('/')»", "«wire.path2.join('/')»");
@@ -250,12 +295,43 @@
 				// activate polling for data-driven communication
 				RTServices::getInstance().getMsgSvcCtrl().getMsgSvc(getThread())->addPollingMessageReceiver(*this);
 			«ENDIF»
-
-			«initHelper.genExtraInitializers(ac.attributes)»
-			«ac.userStructorBody(true)»
 		}
+		
+		«IF Main::settings.generateMSCInstrumentation»
+			void «ac.name»::setProbesActive(bool recursive, bool active) {
+				DebuggingService::getInstance().addPortInstance(m_RTSystemPort);
+				«IF ac.actorRefs.size > 0»
+					if(recursive) {
+						«FOR sub : ac.actorRefs»
+							«sub.name».setProbesActive(recursive, active);
+						«ENDFOR»
+					}
+				«ENDIF»
+				«FOR ep : ac.endPorts»
+					«IF !ep.dataDriven»
+						«IF ep.replicated»
+							for(int i = 0; i < «ep.name».getNInterfaceItems(); i++)
+								DebuggingService::getInstance().addPortInstance(*(«ep.name».getInterfaceItem(i)));
+						«ELSE»
+							DebuggingService::getInstance().addPortInstance(«ep.name»);
+						«ENDIF»
+					«ENDIF»
+				«ENDFOR»
+				«FOR sap : ac.serviceAccessPoints»
+					DebuggingService::getInstance().addPortInstance(«sap.name»);
+				«ENDFOR»
+				«FOR spp : ac.serviceProvisionPoints»
+					for(int i = 0; i < «spp.name».getNInterfaceItems(); i++)
+							DebuggingService::getInstance().addPortInstance(*(«spp.name».getInterfaceItem(i)));
+				«ENDFOR»
+			}
+		«ENDIF»
 
 		void «ac.name»::destroy(){
+			«IF Main::settings.generateMSCInstrumentation»
+				MSCFunctionObject mscFunctionObject(getInstancePathName(), "destroy()");
+			«ENDIF»
+			
 			«ac.userStructorBody(false)»
 			«IF Main::settings.generateMSCInstrumentation»
 				DebuggingService::getInstance().addMessageActorDestroy(*this);
diff --git a/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/NodeGen.xtend b/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/NodeGen.xtend
index eb071ad..2635252 100644
--- a/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/NodeGen.xtend
+++ b/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/NodeGen.xtend
@@ -16,14 +16,13 @@
 import com.google.inject.Singleton
 import java.util.Collection
 import java.util.Map
+import org.eclipse.etrice.core.common.converter.TimeConverter
 import org.eclipse.etrice.core.etmap.util.ETMapUtil
 import org.eclipse.etrice.core.etphys.eTPhys.ExecMode
 import org.eclipse.etrice.core.etphys.eTPhys.PhysicalThread
-import org.eclipse.etrice.core.genmodel.builder.GenmodelConstants
 import org.eclipse.etrice.core.genmodel.etricegen.Root
 import org.eclipse.etrice.core.genmodel.etricegen.SubSystemInstance
 import org.eclipse.etrice.core.genmodel.etricegen.WiredSubSystemClass
-import org.eclipse.etrice.core.genmodel.fsm.fsmgen.IDiagnostician
 import org.eclipse.etrice.core.room.SubSystemClass
 import org.eclipse.etrice.generator.cpp.Main
 import org.eclipse.etrice.generator.fsm.base.FileSystemHelpers
@@ -32,7 +31,6 @@
 import org.eclipse.etrice.generator.generic.RoomExtensions
 
 import static extension org.eclipse.etrice.generator.fsm.base.Indexed.*
-import org.eclipse.etrice.core.common.converter.TimeConverter
 
 @Singleton
 class NodeGen {
@@ -41,9 +39,9 @@
 	@Inject extension RoomExtensions
 	@Inject extension ProcedureHelpers
 	@Inject extension FileSystemHelpers
-
+	
 	@Inject IGeneratorFileIo fileIO
-	@Inject IDiagnostician diagnostician
+	@Inject Initialization initHelper
 
 	def doGenerate(Root root) {
 		val Map<SubSystemClass, WiredSubSystemClass> sscc2wired = newHashMap
@@ -86,6 +84,9 @@
 		«generateIncludeGuardBegin(cc, '')»
 
 		#include "common/modelbase/SubSystemClassBase.h"
+		«FOR ai : comp.actorInstances»
+			#include "«ai.actorClass.actorIncludePath»"
+		«ENDFOR»
 
 «««		«FOR model : root.getReferencedModels(cc)»
 «««		«««			#include "«model.name».h"
@@ -104,11 +105,25 @@
 					static const int «thread.value.threadId»;
 				«ENDFOR»
 
+				// sub actors
+				«FOR sub : cc.actorRefs»
+					«IF sub.multiplicity>1»
+						Replicated«sub.type.implementationClassName» «sub.name»;
+					«ELSE»
+						«sub.type.implementationClassName» «sub.name»;
+					«ENDIF»
+				«ENDFOR»
+
 				«clsname»(IRTObject* parent, const std::string& name);
+				~«clsname»();
 
 				virtual void receiveEvent(etRuntime::InterfaceItemBase* ifitem, int evt, void* data);
 				virtual void instantiateMessageServices();
-				virtual void instantiateActors();
+				virtual void mapThreads(void);
+				virtual void initialize(void);
+				«IF Main::settings.generateMSCInstrumentation»
+					virtual void setProbesActive(bool recursive, bool active);
+				«ENDIF»
 
 				virtual void init();
 
@@ -134,6 +149,18 @@
 		"THREAD_"+thread.name.toUpperCase
 	}
 
+	def private generateConstructorInitalizerList(SubSystemClass cc) {
+		val extension initHelper = initHelper
+		var initList = <CharSequence>newArrayList
+
+		// super class
+		initList += '''SubSystemClassBase(parent, name)'''
+	    // own sub actors
+	    initList += cc.actorRefs.map['''«name»(this, "«name»")''']
+
+		initList.generateCtorInitializerList
+	}
+
 	def generateSourceFile(Root root, SubSystemInstance comp, WiredSubSystemClass wired, Collection<PhysicalThread> usedThreads) {
 		val cc = comp.subSystemClass
 		val models = root.getReferencedModels(cc)
@@ -152,16 +179,13 @@
 		#include "«getCppHeaderFileName(nr, comp)»"
 
 		#include "common/debugging/DebuggingService.h"
+		#include "common/debugging/MSCFunctionObject.h"
 		#include "common/messaging/IMessageService.h"
 		#include "common/messaging/MessageService.h"
 		#include "common/messaging/MessageServiceController.h"
 		#include "common/messaging/RTServices.h"
 		#include "common/modelbase/InterfaceItemBase.h"
 
-		«FOR ai : comp.actorInstances»
-			#include "«ai.actorClass.actorIncludePath»"
-		«ENDFOR»
-
 		using namespace etRuntime;
 
 		«cc.generateNamespaceBegin»
@@ -170,9 +194,23 @@
 			const int «clsname»::«thread.value.threadId» = «thread.index0»;
 		«ENDFOR»
 
-		«clsname»::«clsname»(IRTObject* parent, const std::string& name) :
-				SubSystemClassBase(parent, name)
+		«clsname»::«clsname»(IRTObject* parent, const std::string& name)
+				«cc.generateConstructorInitalizerList»
 		{
+			«IF Main::settings.generateMSCInstrumentation»
+				MSCFunctionObject mscFunctionObject(getInstancePathName(), "Constructor");
+			«ENDIF»
+			«FOR sub : cc.actorRefs»
+				«IF sub.multiplicity>1»
+					«sub.name».createSubActors(«sub.multiplicity»);
+				«ENDIF»
+			«ENDFOR»
+		}
+		
+		«clsname»::~«clsname»() {
+			«IF Main::settings.generateMSCInstrumentation»
+				MSCFunctionObject mscFunctionObject(getInstancePathName(), "Destructor");
+			«ENDIF»
 		}
 
 		void «clsname»::receiveEvent(InterfaceItemBase* ifitem, int evt, void* data){
@@ -180,6 +218,10 @@
 
 		void «clsname»::instantiateMessageServices(){
 
+			«IF Main::settings.generateMSCInstrumentation»
+				MSCFunctionObject mscFunctionObject(getInstancePathName(), "instantiateMessageServices()");
+			«ENDIF»
+
 			IMessageService* msgService;
 			«FOR thread: threads»
 				{
@@ -197,8 +239,7 @@
 			«ENDFOR»
 		}
 
-		void «clsname»::instantiateActors(){
-
+		void «clsname»::mapThreads() {
 			// thread mappings
 			«FOR ai : comp.allContainedInstances»
 				«val mapped = ETMapUtil::getMappedThread(ai)»
@@ -206,34 +247,47 @@
 					addPathToThread("«ai.path»", «mapped.thread.threadId»);
 				«ENDIF»
 			«ENDFOR»
+		}
 
-			// sub actors
-			«FOR sub : cc.actorRefs»
-				«IF sub.multiplicity>1»
-					for (int i=0; i<«sub.multiplicity»; ++i) {
-						«IF Main::settings.generateMSCInstrumentation»
-							DebuggingService::getInstance().addMessageActorCreate(*this, "«sub.name»«GenmodelConstants::INDEX_SEP»"+i);
-						«ENDIF»
-						new «sub.type.implementationClassName»(this, "«sub.name»«GenmodelConstants::INDEX_SEP»"+i);
-					}
-				«ELSE»
-					«IF Main::settings.generateMSCInstrumentation»
+		void «clsname»::initialize() {
+			«IF Main::settings.generateMSCInstrumentation»
+				DebuggingService::getInstance().getSyncLogger().addVisibleComment("starting initialization");
+				MSCFunctionObject mscFunctionObject(getInstancePathName(), "initialize()");
+				«FOR sub : cc.actorRefs»
+					«IF sub.multiplicity>1»
+						for (int i=0; i<«sub.multiplicity»; ++i) {
+							DebuggingService::getInstance().addMessageActorCreate(*this, «sub.name».getSubActor(i)->getName());
+						}
+					«ELSE»
 						DebuggingService::getInstance().addMessageActorCreate(*this, "«sub.name»");
 					«ENDIF»
-					new «sub.type.implementationClassName»(this, "«sub.name»");
-				«ENDIF»
-			«ENDFOR»
-
+				«ENDFOR»			
+			«ENDIF»
+			
 			// wiring
 			«FOR wire: wired.wires»
 				«if (wire.dataDriven) "DataPortBase" else "InterfaceItemBase"»::connect(this, "«wire.path1.join('/')»", "«wire.path2.join('/')»");
 			«ENDFOR»
+			
+			// call initialize of sub actors
+			«FOR sub : cc.actorRefs»
+				«sub.name».initialize();
+			«ENDFOR»
 		}
+		
+		«IF Main::settings.generateMSCInstrumentation»
+			void «clsname»::setProbesActive(bool recursive, bool active) {
+				for(int i = 0; i < m_RTSystemPort.getNInterfaceItems(); i++)
+					DebuggingService::getInstance().addPortInstance(*(m_RTSystemPort.getInterfaceItem(i)));
+				if(recursive) {
+					«FOR sub : cc.actorRefs»
+						«sub.name».setProbesActive(recursive, active);
+					«ENDFOR»
+				}
+			}
+		«ENDIF»
 
 		void «clsname»::init(){
-			«IF Main::settings.generateMSCInstrumentation»
-				DebuggingService::getInstance().addVisibleComment("begin sub system initialization");
-			«ENDIF»
 			SubSystemClassBase::init();
 			«IF Main::settings.generateMSCInstrumentation»
 				DebuggingService::getInstance().addVisibleComment("done sub system initialization");
@@ -242,9 +296,15 @@
 		«IF Main::settings.generateMSCInstrumentation»
 
 			void «clsname»::destroy() {
-				DebuggingService::getInstance().addVisibleComment("begin sub system destruction");
+				«IF Main::settings.generateMSCInstrumentation»
+					DebuggingService::getInstance().getSyncLogger().addVisibleComment("starting destruction");
+					MSCFunctionObject mscFunctionObject(getInstancePathName(), "destroy()");
+					DebuggingService::getInstance().addVisibleComment("begin sub system destruction");
+				«ENDIF»
 				SubSystemClassBase::destroy();
-				DebuggingService::getInstance().addVisibleComment("done sub system destruction");
+				«IF Main::settings.generateMSCInstrumentation»
+					DebuggingService::getInstance().addVisibleComment("done sub system destruction");
+				«ENDIF»
 			}
 		«ENDIF»
 
diff --git a/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/ProtocolClassGen.xtend b/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/ProtocolClassGen.xtend
index ca48d51..b588e27 100644
--- a/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/ProtocolClassGen.xtend
+++ b/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/gen/ProtocolClassGen.xtend
@@ -62,7 +62,6 @@
 				case CommunicationType::SYNCHRONOUS:
 					logger.logError("synchronous protocols not supported yet", pc)
 			}
-
 		}
 	}
 
@@ -200,6 +199,7 @@
 		#include "«pc.getCppHeaderFileName»"
 
 		#include "common/debugging/DebuggingService.h"
+		#include "common/debugging/MSCFunctionObject.h"
 		#include "common/messaging/AbstractMessageReceiver.h"
 		#include "common/messaging/Address.h"
 		#include "common/messaging/Message.h"
@@ -247,18 +247,12 @@
 	«portClassName»::«portClassName»(IInterfaceItemOwner* actor, const std::string& name, int localId)
 		«pclass.generateConstructorInitalizerList('0')»
 	{
-		«IF Main::settings.generateMSCInstrumentation»
-			DebuggingService::getInstance().addPortInstance(*this);
-		«ENDIF»
 	}
 
 	«portClassName»::«portClassName»(IInterfaceItemOwner* actor, const std::string& name, int localId, int idx)
 		«pclass.generateConstructorInitalizerList('idx')»
 	{
 		«IF pclass != null»«initHelper.genExtraInitializers(pclass.attributes)»«ENDIF»
-		«IF Main::settings.generateMSCInstrumentation»
-			DebuggingService::getInstance().addPortInstance(*this);
-		«ENDIF»
 	}
 	«IF Main::settings.generateMSCInstrumentation»
 
@@ -372,8 +366,10 @@
 					«FOR command : hdlr.detailCode.lines»	«command»
 					«ENDFOR»
 				«ELSE»
-					DebuggingService::getInstance().addMessageAsyncOut(getAddress(), getPeerAddress(),
-						«portClassName»::getMessageString(«portClassName»::«dir»_«m.name»));
+					«IF Main::settings.generateMSCInstrumentation»
+						DebuggingService::getInstance().addMessageAsyncOut(getAddress(), getPeerAddress(),
+							«portClassName»::getMessageString(«portClassName»::«dir»_«m.name»));
+					«ENDIF»
 					if (getPeerAddress().isValid()){
 						getPeerMsgReceiver()->receive(«message»);
 					}
diff --git a/plugins/org.eclipse.etrice.generator.cpp/xtend-gen/org/eclipse/etrice/generator/cpp/gen/ActorClassGen.java b/plugins/org.eclipse.etrice.generator.cpp/xtend-gen/org/eclipse/etrice/generator/cpp/gen/ActorClassGen.java
index 03811a8..42c4a09 100644
--- a/plugins/org.eclipse.etrice.generator.cpp/xtend-gen/org/eclipse/etrice/generator/cpp/gen/ActorClassGen.java
+++ b/plugins/org.eclipse.etrice.generator.cpp/xtend-gen/org/eclipse/etrice/generator/cpp/gen/ActorClassGen.java
@@ -21,7 +21,6 @@
 import org.eclipse.etrice.core.fsm.fSM.ComponentCommunicationType;
 import org.eclipse.etrice.core.fsm.fSM.DetailCode;
 import org.eclipse.etrice.core.fsm.fSM.StateGraph;
-import org.eclipse.etrice.core.genmodel.builder.GenmodelConstants;
 import org.eclipse.etrice.core.genmodel.etricegen.ExpandedActorClass;
 import org.eclipse.etrice.core.genmodel.etricegen.Root;
 import org.eclipse.etrice.core.genmodel.etricegen.Wire;
@@ -194,6 +193,8 @@
       _builder.newLine();
       _builder.append("#include \"common/modelbase/PortBase.h\"");
       _builder.newLine();
+      _builder.append("#include \"common/modelbase/ReplicatedActorClassBase.h\"");
+      _builder.newLine();
       _builder.append("#include \"common/modelbase/InterfaceItemBase.h\"");
       _builder.newLine();
       _builder.append("#include \"common/modelbase/SubSystemClassBase.h\"");
@@ -250,6 +251,17 @@
           _builder.newLineIfNotEmpty();
         }
       }
+      {
+        EList<ActorRef> _actorRefs = ac.getActorRefs();
+        for(final ActorRef ar : _actorRefs) {
+          _builder.append("#include \"");
+          ActorClass _type = ar.getType();
+          String _actorIncludePath = this._cppExtensions.getActorIncludePath(_type);
+          _builder.append(_actorIncludePath, "");
+          _builder.append("\"");
+          _builder.newLineIfNotEmpty();
+        }
+      }
       _builder.newLine();
       DetailCode _userCode1 = ac.getUserCode1();
       CharSequence _userCode = this._procedureHelpers.userCode(_userCode1);
@@ -292,6 +304,41 @@
       }
       _builder.newLine();
       _builder.append("\t\t");
+      _builder.append("//--------------------- sub actors");
+      _builder.newLine();
+      {
+        EList<ActorRef> _actorRefs_1 = ac.getActorRefs();
+        for(final ActorRef sub : _actorRefs_1) {
+          {
+            int _multiplicity = sub.getMultiplicity();
+            boolean _greaterThan = (_multiplicity > 1);
+            if (_greaterThan) {
+              _builder.append("\t\t");
+              _builder.append("Replicated");
+              ActorClass _type_1 = sub.getType();
+              String _implementationClassName = this._cppExtensions.getImplementationClassName(_type_1);
+              _builder.append(_implementationClassName, "\t\t");
+              _builder.append(" ");
+              String _name_6 = sub.getName();
+              _builder.append(_name_6, "\t\t");
+              _builder.append(";");
+              _builder.newLineIfNotEmpty();
+            } else {
+              _builder.append("\t\t");
+              ActorClass _type_2 = sub.getType();
+              String _implementationClassName_1 = this._cppExtensions.getImplementationClassName(_type_2);
+              _builder.append(_implementationClassName_1, "\t\t");
+              _builder.append(" ");
+              String _name_7 = sub.getName();
+              _builder.append(_name_7, "\t\t");
+              _builder.append(";");
+              _builder.newLineIfNotEmpty();
+            }
+          }
+        }
+      }
+      _builder.newLine();
+      _builder.append("\t\t");
       _builder.append("//--------------------- saps");
       _builder.newLine();
       {
@@ -301,8 +348,8 @@
           String _portClassName_1 = this._roomExtensions.getPortClassName(sap);
           _builder.append(_portClassName_1, "\t\t");
           _builder.append(" ");
-          String _name_6 = sap.getName();
-          _builder.append(_name_6, "\t\t");
+          String _name_8 = sap.getName();
+          _builder.append(_name_8, "\t\t");
           _builder.append(";");
           _builder.newLineIfNotEmpty();
         }
@@ -319,8 +366,8 @@
           _builder.append(_portClassName_2, "\t\t");
           _builder.append(" ");
           SPP _spp = svc.getSpp();
-          String _name_7 = _spp.getName();
-          _builder.append(_name_7, "\t\t");
+          String _name_9 = _spp.getName();
+          _builder.append(_name_9, "\t\t");
           _builder.append(";");
           _builder.newLineIfNotEmpty();
         }
@@ -342,8 +389,8 @@
       _builder.newLine();
       _builder.append("\t\t");
       EList<StandardOperation> _operations = ac.getOperations();
-      String _name_8 = ac.getName();
-      CharSequence _operationsDeclaration = this._procedureHelpers.operationsDeclaration(_operations, _name_8);
+      String _name_10 = ac.getName();
+      CharSequence _operationsDeclaration = this._procedureHelpers.operationsDeclaration(_operations, _name_10);
       _builder.append(_operationsDeclaration, "\t\t");
       _builder.newLineIfNotEmpty();
       _builder.newLine();
@@ -354,10 +401,22 @@
       _builder.append("//--------------------- construction");
       _builder.newLine();
       _builder.append("\t\t");
-      String _name_9 = ac.getName();
-      _builder.append(_name_9, "\t\t");
+      String _name_11 = ac.getName();
+      _builder.append(_name_11, "\t\t");
       _builder.append("(etRuntime::IRTObject* parent, const std::string& name);");
       _builder.newLineIfNotEmpty();
+      _builder.append("\t\t");
+      _builder.append("void initialize(void);");
+      _builder.newLine();
+      {
+        GlobalGeneratorSettings _settings = Main.getSettings();
+        boolean _isGenerateMSCInstrumentation = _settings.isGenerateMSCInstrumentation();
+        if (_isGenerateMSCInstrumentation) {
+          _builder.append("\t\t");
+          _builder.append("void setProbesActive(bool recursive, bool active);");
+          _builder.newLine();
+        }
+      }
       _builder.newLine();
       _builder.append("\t\t");
       _builder.append("//--------------------- port getters");
@@ -479,6 +538,38 @@
       _builder.append("};");
       _builder.newLine();
       _builder.newLine();
+      _builder.append("class Replicated");
+      _builder.append(clsname, "");
+      _builder.append(" : public ReplicatedActorClassBase {");
+      _builder.newLineIfNotEmpty();
+      _builder.append("public:");
+      _builder.newLine();
+      _builder.append("\t");
+      _builder.append("Replicated");
+      _builder.append(clsname, "\t");
+      _builder.append("(IRTObject* parent, const std::string& name) :");
+      _builder.newLineIfNotEmpty();
+      _builder.append("\t\t");
+      _builder.append("ReplicatedActorClassBase(parent, name) {}");
+      _builder.newLine();
+      _builder.append("\t");
+      _builder.newLine();
+      _builder.append("protected:");
+      _builder.newLine();
+      _builder.append("\t");
+      _builder.append("ActorClassBase* createActor(IRTObject* parent, const std::string& name) {");
+      _builder.newLine();
+      _builder.append("\t\t");
+      _builder.append("return new ");
+      _builder.append(clsname, "\t\t");
+      _builder.append("(parent, name);");
+      _builder.newLineIfNotEmpty();
+      _builder.append("\t");
+      _builder.append("}");
+      _builder.newLine();
+      _builder.append("};");
+      _builder.newLine();
+      _builder.newLine();
       String _generateNamespaceEnd = this._cppExtensions.generateNamespaceEnd(ac);
       _builder.append(_generateNamespaceEnd, "");
       _builder.newLineIfNotEmpty();
@@ -530,8 +621,23 @@
       };
       List<String> _map = ListExtensions.<Port, String>map(_endPorts, _function);
       Iterables.<CharSequence>addAll(initList, _map);
+      EList<ActorRef> _actorRefs = ac.getActorRefs();
+      final Function1<ActorRef, String> _function_1 = new Function1<ActorRef, String>() {
+        public String apply(final ActorRef it) {
+          StringConcatenation _builder = new StringConcatenation();
+          String _name = it.getName();
+          _builder.append(_name, "");
+          _builder.append("(this, \"");
+          String _name_1 = it.getName();
+          _builder.append(_name_1, "");
+          _builder.append("\")");
+          return _builder.toString();
+        }
+      };
+      List<String> _map_1 = ListExtensions.<ActorRef, String>map(_actorRefs, _function_1);
+      Iterables.<CharSequence>addAll(initList, _map_1);
       EList<SAP> _serviceAccessPoints = ac.getServiceAccessPoints();
-      final Function1<SAP, String> _function_1 = new Function1<SAP, String>() {
+      final Function1<SAP, String> _function_2 = new Function1<SAP, String>() {
         public String apply(final SAP it) {
           StringConcatenation _builder = new StringConcatenation();
           String _name = it.getName();
@@ -546,10 +652,10 @@
           return _builder.toString();
         }
       };
-      List<String> _map_1 = ListExtensions.<SAP, String>map(_serviceAccessPoints, _function_1);
-      Iterables.<CharSequence>addAll(initList, _map_1);
+      List<String> _map_2 = ListExtensions.<SAP, String>map(_serviceAccessPoints, _function_2);
+      Iterables.<CharSequence>addAll(initList, _map_2);
       EList<ServiceImplementation> _serviceImplementations = ac.getServiceImplementations();
-      final Function1<ServiceImplementation, String> _function_2 = new Function1<ServiceImplementation, String>() {
+      final Function1<ServiceImplementation, String> _function_3 = new Function1<ServiceImplementation, String>() {
         public String apply(final ServiceImplementation it) {
           StringConcatenation _builder = new StringConcatenation();
           SPP _spp = it.getSpp();
@@ -567,10 +673,10 @@
           return _builder.toString();
         }
       };
-      List<String> _map_2 = ListExtensions.<ServiceImplementation, String>map(_serviceImplementations, _function_2);
-      Iterables.<CharSequence>addAll(initList, _map_2);
+      List<String> _map_3 = ListExtensions.<ServiceImplementation, String>map(_serviceImplementations, _function_3);
+      Iterables.<CharSequence>addAll(initList, _map_3);
       EList<Attribute> _attributes = ac.getAttributes();
-      final Function1<Attribute, String> _function_3 = new Function1<Attribute, String>() {
+      final Function1<Attribute, String> _function_4 = new Function1<Attribute, String>() {
         public String apply(final Attribute it) {
           StringConcatenation _builder = new StringConcatenation();
           String _name = it.getName();
@@ -582,8 +688,8 @@
           return _builder.toString();
         }
       };
-      List<String> _map_3 = ListExtensions.<Attribute, String>map(_attributes, _function_3);
-      Iterables.<CharSequence>addAll(initList, _map_3);
+      List<String> _map_4 = ListExtensions.<Attribute, String>map(_attributes, _function_4);
+      Iterables.<CharSequence>addAll(initList, _map_4);
       _xblockexpression = initHelper.generateCtorInitializerList(initList);
     }
     return _xblockexpression;
@@ -644,18 +750,10 @@
       _builder.newLine();
       _builder.append("#include \"common/messaging/RTServices.h\"");
       _builder.newLine();
+      _builder.append("#include \"common/debugging/DebuggingService.h\"");
       _builder.newLine();
-      {
-        EList<ActorRef> _actorRefs = ac.getActorRefs();
-        for(final ActorRef ar : _actorRefs) {
-          _builder.append("#include \"");
-          ActorClass _type = ar.getType();
-          String _actorIncludePath = this._cppExtensions.getActorIncludePath(_type);
-          _builder.append(_actorIncludePath, "");
-          _builder.append("\"");
-          _builder.newLineIfNotEmpty();
-        }
-      }
+      _builder.append("#include \"common/debugging/MSCFunctionObject.h\"");
+      _builder.newLine();
       _builder.newLine();
       _builder.append("using namespace etRuntime;");
       _builder.newLine();
@@ -676,6 +774,17 @@
       _builder.append("{");
       _builder.newLine();
       {
+        GlobalGeneratorSettings _settings = Main.getSettings();
+        boolean _isGenerateMSCInstrumentation = _settings.isGenerateMSCInstrumentation();
+        if (_isGenerateMSCInstrumentation) {
+          _builder.append("\t");
+          _builder.append("MSCFunctionObject mscFunctionObject(getInstancePathName(), \"Constructor\");");
+          _builder.newLine();
+        }
+      }
+      _builder.append("\t");
+      _builder.newLine();
+      {
         boolean _hasNonEmptyStateMachine = this._roomHelpers.hasNonEmptyStateMachine(ac);
         if (_hasNonEmptyStateMachine) {
           _builder.append("\t");
@@ -701,69 +810,19 @@
       _builder.append("// sub actors");
       _builder.newLine();
       {
-        EList<ActorRef> _actorRefs_1 = ac.getActorRefs();
-        for(final ActorRef sub : _actorRefs_1) {
+        EList<ActorRef> _actorRefs = ac.getActorRefs();
+        for(final ActorRef sub : _actorRefs) {
           {
             int _multiplicity = sub.getMultiplicity();
             boolean _greaterThan = (_multiplicity > 1);
             if (_greaterThan) {
               _builder.append("\t");
-              _builder.append("for (int i=0; i<");
+              String _name_4 = sub.getName();
+              _builder.append(_name_4, "\t");
+              _builder.append(".createSubActors(");
               int _multiplicity_1 = sub.getMultiplicity();
               _builder.append(_multiplicity_1, "\t");
-              _builder.append("; ++i) {");
-              _builder.newLineIfNotEmpty();
-              {
-                GlobalGeneratorSettings _settings = Main.getSettings();
-                boolean _isGenerateMSCInstrumentation = _settings.isGenerateMSCInstrumentation();
-                if (_isGenerateMSCInstrumentation) {
-                  _builder.append("\t");
-                  _builder.append("\t");
-                  _builder.append("DebuggingService::getInstance().addMessageActorCreate(*this, \"");
-                  String _name_4 = sub.getName();
-                  _builder.append(_name_4, "\t\t");
-                  _builder.append(GenmodelConstants.INDEX_SEP, "\t\t");
-                  _builder.append("\"+i);");
-                  _builder.newLineIfNotEmpty();
-                }
-              }
-              _builder.append("\t");
-              _builder.append("\t");
-              _builder.append("new ");
-              ActorClass _type_1 = sub.getType();
-              String _implementationClassName = this._cppExtensions.getImplementationClassName(_type_1);
-              _builder.append(_implementationClassName, "\t\t");
-              _builder.append("(this, \"");
-              String _name_5 = sub.getName();
-              _builder.append(_name_5, "\t\t");
-              _builder.append(GenmodelConstants.INDEX_SEP, "\t\t");
-              _builder.append("\"+i);");
-              _builder.newLineIfNotEmpty();
-              _builder.append("\t");
-              _builder.append("}");
-              _builder.newLine();
-            } else {
-              {
-                GlobalGeneratorSettings _settings_1 = Main.getSettings();
-                boolean _isGenerateMSCInstrumentation_1 = _settings_1.isGenerateMSCInstrumentation();
-                if (_isGenerateMSCInstrumentation_1) {
-                  _builder.append("\t");
-                  _builder.append("DebuggingService::getInstance().addMessageActorCreate(*this, \"");
-                  String _name_6 = sub.getName();
-                  _builder.append(_name_6, "\t");
-                  _builder.append("\");");
-                  _builder.newLineIfNotEmpty();
-                }
-              }
-              _builder.append("\t");
-              _builder.append("new ");
-              ActorClass _type_2 = sub.getType();
-              String _implementationClassName_1 = this._cppExtensions.getImplementationClassName(_type_2);
-              _builder.append(_implementationClassName_1, "\t");
-              _builder.append("(this, \"");
-              String _name_7 = sub.getName();
-              _builder.append(_name_7, "\t");
-              _builder.append("\");");
+              _builder.append(");");
               _builder.newLineIfNotEmpty();
             }
           }
@@ -771,6 +830,85 @@
       }
       _builder.newLine();
       _builder.append("\t");
+      EList<Attribute> _attributes = ac.getAttributes();
+      CharSequence _genExtraInitializers = this.initHelper.genExtraInitializers(_attributes);
+      _builder.append(_genExtraInitializers, "\t");
+      _builder.newLineIfNotEmpty();
+      _builder.append("\t");
+      String _userStructorBody = this._procedureHelpers.userStructorBody(ac, true);
+      _builder.append(_userStructorBody, "\t");
+      _builder.newLineIfNotEmpty();
+      _builder.append("}");
+      _builder.newLine();
+      _builder.newLine();
+      _builder.append("void ");
+      String _name_5 = ac.getName();
+      _builder.append(_name_5, "");
+      _builder.append("::initialize() {");
+      _builder.newLineIfNotEmpty();
+      {
+        GlobalGeneratorSettings _settings_1 = Main.getSettings();
+        boolean _isGenerateMSCInstrumentation_1 = _settings_1.isGenerateMSCInstrumentation();
+        if (_isGenerateMSCInstrumentation_1) {
+          _builder.append("\t");
+          _builder.append("MSCFunctionObject mscFunctionObject(getInstancePathName(), \"initialize()\");");
+          _builder.newLine();
+          {
+            EList<ActorRef> _actorRefs_1 = ac.getActorRefs();
+            for(final ActorRef sub_1 : _actorRefs_1) {
+              {
+                int _multiplicity_2 = sub_1.getMultiplicity();
+                boolean _greaterThan_1 = (_multiplicity_2 > 1);
+                if (_greaterThan_1) {
+                  _builder.append("\t");
+                  _builder.append("for (int i=0; i<");
+                  int _multiplicity_3 = sub_1.getMultiplicity();
+                  _builder.append(_multiplicity_3, "\t");
+                  _builder.append("; ++i) {");
+                  _builder.newLineIfNotEmpty();
+                  _builder.append("\t");
+                  _builder.append("\t");
+                  _builder.append("DebuggingService::getInstance().addMessageActorCreate(*this, ");
+                  String _name_6 = sub_1.getName();
+                  _builder.append(_name_6, "\t\t");
+                  _builder.append(".getSubActor(i)->getName());");
+                  _builder.newLineIfNotEmpty();
+                  _builder.append("\t");
+                  _builder.append("}");
+                  _builder.newLine();
+                } else {
+                  _builder.append("\t");
+                  _builder.append("DebuggingService::getInstance().addMessageActorCreate(*this, \"");
+                  String _name_7 = sub_1.getName();
+                  _builder.append(_name_7, "\t");
+                  _builder.append("\");");
+                  _builder.newLineIfNotEmpty();
+                }
+              }
+            }
+          }
+        }
+      }
+      _builder.append("\t");
+      _builder.newLine();
+      _builder.append("\t");
+      _builder.append("ActorClassBase::initialize();");
+      _builder.newLine();
+      _builder.append("\t");
+      _builder.newLine();
+      {
+        EList<ActorRef> _actorRefs_2 = ac.getActorRefs();
+        for(final ActorRef sub_2 : _actorRefs_2) {
+          _builder.append("\t");
+          String _name_8 = sub_2.getName();
+          _builder.append(_name_8, "\t");
+          _builder.append(".initialize();");
+          _builder.newLineIfNotEmpty();
+        }
+      }
+      _builder.append("\t");
+      _builder.newLine();
+      _builder.append("\t");
       _builder.append("// wiring");
       _builder.newLine();
       {
@@ -818,32 +956,139 @@
           _builder.newLine();
         }
       }
-      _builder.newLine();
-      _builder.append("\t");
-      EList<Attribute> _attributes = ac.getAttributes();
-      CharSequence _genExtraInitializers = this.initHelper.genExtraInitializers(_attributes);
-      _builder.append(_genExtraInitializers, "\t");
-      _builder.newLineIfNotEmpty();
-      _builder.append("\t");
-      String _userStructorBody = this._procedureHelpers.userStructorBody(ac, true);
-      _builder.append(_userStructorBody, "\t");
-      _builder.newLineIfNotEmpty();
       _builder.append("}");
       _builder.newLine();
       _builder.newLine();
+      {
+        GlobalGeneratorSettings _settings_2 = Main.getSettings();
+        boolean _isGenerateMSCInstrumentation_2 = _settings_2.isGenerateMSCInstrumentation();
+        if (_isGenerateMSCInstrumentation_2) {
+          _builder.append("void ");
+          String _name_9 = ac.getName();
+          _builder.append(_name_9, "");
+          _builder.append("::setProbesActive(bool recursive, bool active) {");
+          _builder.newLineIfNotEmpty();
+          _builder.append("\t");
+          _builder.append("DebuggingService::getInstance().addPortInstance(m_RTSystemPort);");
+          _builder.newLine();
+          {
+            EList<ActorRef> _actorRefs_3 = ac.getActorRefs();
+            int _size = _actorRefs_3.size();
+            boolean _greaterThan_2 = (_size > 0);
+            if (_greaterThan_2) {
+              _builder.append("\t");
+              _builder.append("if(recursive) {");
+              _builder.newLine();
+              {
+                EList<ActorRef> _actorRefs_4 = ac.getActorRefs();
+                for(final ActorRef sub_3 : _actorRefs_4) {
+                  _builder.append("\t");
+                  _builder.append("\t");
+                  String _name_10 = sub_3.getName();
+                  _builder.append(_name_10, "\t\t");
+                  _builder.append(".setProbesActive(recursive, active);");
+                  _builder.newLineIfNotEmpty();
+                }
+              }
+              _builder.append("\t");
+              _builder.append("}");
+              _builder.newLine();
+            }
+          }
+          {
+            List<Port> _endPorts = this._roomHelpers.getEndPorts(ac);
+            for(final Port ep : _endPorts) {
+              {
+                boolean _isDataDriven_1 = this._roomHelpers.isDataDriven(ep);
+                boolean _not = (!_isDataDriven_1);
+                if (_not) {
+                  {
+                    boolean _isReplicated = ep.isReplicated();
+                    if (_isReplicated) {
+                      _builder.append("\t");
+                      _builder.append("for(int i = 0; i < ");
+                      String _name_11 = ep.getName();
+                      _builder.append(_name_11, "\t");
+                      _builder.append(".getNInterfaceItems(); i++)");
+                      _builder.newLineIfNotEmpty();
+                      _builder.append("\t");
+                      _builder.append("\t");
+                      _builder.append("DebuggingService::getInstance().addPortInstance(*(");
+                      String _name_12 = ep.getName();
+                      _builder.append(_name_12, "\t\t");
+                      _builder.append(".getInterfaceItem(i)));");
+                      _builder.newLineIfNotEmpty();
+                    } else {
+                      _builder.append("\t");
+                      _builder.append("DebuggingService::getInstance().addPortInstance(");
+                      String _name_13 = ep.getName();
+                      _builder.append(_name_13, "\t");
+                      _builder.append(");");
+                      _builder.newLineIfNotEmpty();
+                    }
+                  }
+                }
+              }
+            }
+          }
+          {
+            EList<SAP> _serviceAccessPoints = ac.getServiceAccessPoints();
+            for(final SAP sap : _serviceAccessPoints) {
+              _builder.append("\t");
+              _builder.append("DebuggingService::getInstance().addPortInstance(");
+              String _name_14 = sap.getName();
+              _builder.append(_name_14, "\t");
+              _builder.append(");");
+              _builder.newLineIfNotEmpty();
+            }
+          }
+          {
+            EList<SPP> _serviceProvisionPoints = ac.getServiceProvisionPoints();
+            for(final SPP spp : _serviceProvisionPoints) {
+              _builder.append("\t");
+              _builder.append("for(int i = 0; i < ");
+              String _name_15 = spp.getName();
+              _builder.append(_name_15, "\t");
+              _builder.append(".getNInterfaceItems(); i++)");
+              _builder.newLineIfNotEmpty();
+              _builder.append("\t");
+              _builder.append("\t\t");
+              _builder.append("DebuggingService::getInstance().addPortInstance(*(");
+              String _name_16 = spp.getName();
+              _builder.append(_name_16, "\t\t\t");
+              _builder.append(".getInterfaceItem(i)));");
+              _builder.newLineIfNotEmpty();
+            }
+          }
+          _builder.append("}");
+          _builder.newLine();
+        }
+      }
+      _builder.newLine();
       _builder.append("void ");
-      String _name_8 = ac.getName();
-      _builder.append(_name_8, "");
+      String _name_17 = ac.getName();
+      _builder.append(_name_17, "");
       _builder.append("::destroy(){");
       _builder.newLineIfNotEmpty();
+      {
+        GlobalGeneratorSettings _settings_3 = Main.getSettings();
+        boolean _isGenerateMSCInstrumentation_3 = _settings_3.isGenerateMSCInstrumentation();
+        if (_isGenerateMSCInstrumentation_3) {
+          _builder.append("\t");
+          _builder.append("MSCFunctionObject mscFunctionObject(getInstancePathName(), \"destroy()\");");
+          _builder.newLine();
+        }
+      }
+      _builder.append("\t");
+      _builder.newLine();
       _builder.append("\t");
       String _userStructorBody_1 = this._procedureHelpers.userStructorBody(ac, false);
       _builder.append(_userStructorBody_1, "\t");
       _builder.newLineIfNotEmpty();
       {
-        GlobalGeneratorSettings _settings_2 = Main.getSettings();
-        boolean _isGenerateMSCInstrumentation_2 = _settings_2.isGenerateMSCInstrumentation();
-        if (_isGenerateMSCInstrumentation_2) {
+        GlobalGeneratorSettings _settings_4 = Main.getSettings();
+        boolean _isGenerateMSCInstrumentation_4 = _settings_4.isGenerateMSCInstrumentation();
+        if (_isGenerateMSCInstrumentation_4) {
           _builder.append("\t");
           _builder.append("DebuggingService::getInstance().addMessageActorDestroy(*this);");
           _builder.newLine();
@@ -874,8 +1119,8 @@
       _builder.newLine();
       _builder.newLine();
       EList<StandardOperation> _operations = ac.getOperations();
-      String _name_9 = ac.getName();
-      CharSequence _operationsImplementation = this._procedureHelpers.operationsImplementation(_operations, _name_9);
+      String _name_18 = ac.getName();
+      CharSequence _operationsImplementation = this._procedureHelpers.operationsImplementation(_operations, _name_18);
       _builder.append(_operationsImplementation, "");
       _builder.newLineIfNotEmpty();
       _builder.newLine();
@@ -890,8 +1135,8 @@
             boolean _equals_4 = Objects.equal(_commType_4, ComponentCommunicationType.DATA_DRIVEN);
             if (_equals_4) {
               _builder.append("void ");
-              String _name_10 = ac.getName();
-              _builder.append(_name_10, "");
+              String _name_19 = ac.getName();
+              _builder.append(_name_19, "");
               _builder.append("::receiveEvent(InterfaceItemBase* ifitem, int evt, void* generic_data) {");
               _builder.newLineIfNotEmpty();
               _builder.append("\t");
@@ -914,8 +1159,8 @@
             }
             if (_or_2) {
               _builder.append("void ");
-              String _name_11 = ac.getName();
-              _builder.append(_name_11, "");
+              String _name_20 = ac.getName();
+              _builder.append(_name_20, "");
               _builder.append("::receive(const Message* msg) {");
               _builder.newLineIfNotEmpty();
               {
@@ -942,8 +1187,8 @@
             _builder.append("//--------------------- no state machine");
             _builder.newLine();
             _builder.append("void ");
-            String _name_12 = ac.getName();
-            _builder.append(_name_12, "");
+            String _name_21 = ac.getName();
+            _builder.append(_name_21, "");
             _builder.append("::receiveEvent(InterfaceItemBase* ifitem, int evt, void* data) {");
             _builder.newLineIfNotEmpty();
             _builder.append("\t");
diff --git a/plugins/org.eclipse.etrice.generator.cpp/xtend-gen/org/eclipse/etrice/generator/cpp/gen/NodeGen.java b/plugins/org.eclipse.etrice.generator.cpp/xtend-gen/org/eclipse/etrice/generator/cpp/gen/NodeGen.java
index b50a808..dcf3e71 100644
--- a/plugins/org.eclipse.etrice.generator.cpp/xtend-gen/org/eclipse/etrice/generator/cpp/gen/NodeGen.java
+++ b/plugins/org.eclipse.etrice.generator.cpp/xtend-gen/org/eclipse/etrice/generator/cpp/gen/NodeGen.java
@@ -14,6 +14,7 @@
 import com.google.common.collect.Iterables;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -26,7 +27,6 @@
 import org.eclipse.etrice.core.etphys.eTPhys.NodeRef;
 import org.eclipse.etrice.core.etphys.eTPhys.PhysicalThread;
 import org.eclipse.etrice.core.fsm.fSM.DetailCode;
-import org.eclipse.etrice.core.genmodel.builder.GenmodelConstants;
 import org.eclipse.etrice.core.genmodel.etricegen.ActorInstance;
 import org.eclipse.etrice.core.genmodel.etricegen.Root;
 import org.eclipse.etrice.core.genmodel.etricegen.StructureInstance;
@@ -34,7 +34,6 @@
 import org.eclipse.etrice.core.genmodel.etricegen.Wire;
 import org.eclipse.etrice.core.genmodel.etricegen.WiredStructureClass;
 import org.eclipse.etrice.core.genmodel.etricegen.WiredSubSystemClass;
-import org.eclipse.etrice.core.genmodel.fsm.fsmgen.IDiagnostician;
 import org.eclipse.etrice.core.room.ActorClass;
 import org.eclipse.etrice.core.room.ActorRef;
 import org.eclipse.etrice.core.room.RoomModel;
@@ -42,6 +41,7 @@
 import org.eclipse.etrice.generator.base.GlobalGeneratorSettings;
 import org.eclipse.etrice.generator.cpp.Main;
 import org.eclipse.etrice.generator.cpp.gen.CppExtensions;
+import org.eclipse.etrice.generator.cpp.gen.Initialization;
 import org.eclipse.etrice.generator.fsm.base.FileSystemHelpers;
 import org.eclipse.etrice.generator.fsm.base.IGeneratorFileIo;
 import org.eclipse.etrice.generator.fsm.base.Indexed;
@@ -52,6 +52,7 @@
 import org.eclipse.xtext.xbase.lib.Extension;
 import org.eclipse.xtext.xbase.lib.Functions.Function1;
 import org.eclipse.xtext.xbase.lib.IterableExtensions;
+import org.eclipse.xtext.xbase.lib.ListExtensions;
 import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
 
 @Singleton
@@ -77,7 +78,7 @@
   private IGeneratorFileIo fileIO;
   
   @Inject
-  private IDiagnostician diagnostician;
+  private Initialization initHelper;
   
   public void doGenerate(final Root root) {
     final Map<SubSystemClass, WiredSubSystemClass> sscc2wired = CollectionLiterals.<SubSystemClass, WiredSubSystemClass>newHashMap();
@@ -173,6 +174,17 @@
       _builder.newLine();
       _builder.append("#include \"common/modelbase/SubSystemClassBase.h\"");
       _builder.newLine();
+      {
+        EList<ActorInstance> _actorInstances = comp.getActorInstances();
+        for(final ActorInstance ai : _actorInstances) {
+          _builder.append("#include \"");
+          ActorClass _actorClass = ai.getActorClass();
+          String _actorIncludePath = this._cppExtensions.getActorIncludePath(_actorClass);
+          _builder.append(_actorIncludePath, "");
+          _builder.append("\"");
+          _builder.newLineIfNotEmpty();
+        }
+      }
       _builder.newLine();
       DetailCode _userCode1 = cc.getUserCode1();
       CharSequence _userCode = this._procedureHelpers.userCode(_userCode1);
@@ -212,9 +224,49 @@
       }
       _builder.newLine();
       _builder.append("\t\t");
+      _builder.append("// sub actors");
+      _builder.newLine();
+      {
+        EList<ActorRef> _actorRefs = cc.getActorRefs();
+        for(final ActorRef sub : _actorRefs) {
+          {
+            int _multiplicity = sub.getMultiplicity();
+            boolean _greaterThan = (_multiplicity > 1);
+            if (_greaterThan) {
+              _builder.append("\t\t");
+              _builder.append("Replicated");
+              ActorClass _type_1 = sub.getType();
+              String _implementationClassName = this._cppExtensions.getImplementationClassName(_type_1);
+              _builder.append(_implementationClassName, "\t\t");
+              _builder.append(" ");
+              String _name = sub.getName();
+              _builder.append(_name, "\t\t");
+              _builder.append(";");
+              _builder.newLineIfNotEmpty();
+            } else {
+              _builder.append("\t\t");
+              ActorClass _type_2 = sub.getType();
+              String _implementationClassName_1 = this._cppExtensions.getImplementationClassName(_type_2);
+              _builder.append(_implementationClassName_1, "\t\t");
+              _builder.append(" ");
+              String _name_1 = sub.getName();
+              _builder.append(_name_1, "\t\t");
+              _builder.append(";");
+              _builder.newLineIfNotEmpty();
+            }
+          }
+        }
+      }
+      _builder.newLine();
+      _builder.append("\t\t");
       _builder.append(clsname, "\t\t");
       _builder.append("(IRTObject* parent, const std::string& name);");
       _builder.newLineIfNotEmpty();
+      _builder.append("\t\t");
+      _builder.append("~");
+      _builder.append(clsname, "\t\t");
+      _builder.append("();");
+      _builder.newLineIfNotEmpty();
       _builder.newLine();
       _builder.append("\t\t");
       _builder.append("virtual void receiveEvent(etRuntime::InterfaceItemBase* ifitem, int evt, void* data);");
@@ -223,17 +275,29 @@
       _builder.append("virtual void instantiateMessageServices();");
       _builder.newLine();
       _builder.append("\t\t");
-      _builder.append("virtual void instantiateActors();");
+      _builder.append("virtual void mapThreads(void);");
       _builder.newLine();
+      _builder.append("\t\t");
+      _builder.append("virtual void initialize(void);");
+      _builder.newLine();
+      {
+        GlobalGeneratorSettings _settings = Main.getSettings();
+        boolean _isGenerateMSCInstrumentation = _settings.isGenerateMSCInstrumentation();
+        if (_isGenerateMSCInstrumentation) {
+          _builder.append("\t\t");
+          _builder.append("virtual void setProbesActive(bool recursive, bool active);");
+          _builder.newLine();
+        }
+      }
       _builder.newLine();
       _builder.append("\t\t");
       _builder.append("virtual void init();");
       _builder.newLine();
       _builder.newLine();
       {
-        GlobalGeneratorSettings _settings = Main.getSettings();
-        boolean _isGenerateMSCInstrumentation = _settings.isGenerateMSCInstrumentation();
-        if (_isGenerateMSCInstrumentation) {
+        GlobalGeneratorSettings _settings_1 = Main.getSettings();
+        boolean _isGenerateMSCInstrumentation_1 = _settings_1.isGenerateMSCInstrumentation();
+        if (_isGenerateMSCInstrumentation_1) {
           _builder.append("\t\t");
           _builder.append("etBool hasGeneratedMSCInstrumentation() const { return true; }");
           _builder.newLine();
@@ -284,6 +348,35 @@
     return ("THREAD_" + _upperCase);
   }
   
+  private CharSequence generateConstructorInitalizerList(final SubSystemClass cc) {
+    CharSequence _xblockexpression = null;
+    {
+      @Extension
+      final Initialization initHelper = this.initHelper;
+      ArrayList<CharSequence> initList = CollectionLiterals.<CharSequence>newArrayList();
+      StringConcatenation _builder = new StringConcatenation();
+      _builder.append("SubSystemClassBase(parent, name)");
+      initList.add(_builder.toString());
+      EList<ActorRef> _actorRefs = cc.getActorRefs();
+      final Function1<ActorRef, String> _function = new Function1<ActorRef, String>() {
+        public String apply(final ActorRef it) {
+          StringConcatenation _builder = new StringConcatenation();
+          String _name = it.getName();
+          _builder.append(_name, "");
+          _builder.append("(this, \"");
+          String _name_1 = it.getName();
+          _builder.append(_name_1, "");
+          _builder.append("\")");
+          return _builder.toString();
+        }
+      };
+      List<String> _map = ListExtensions.<ActorRef, String>map(_actorRefs, _function);
+      Iterables.<CharSequence>addAll(initList, _map);
+      _xblockexpression = initHelper.generateCtorInitializerList(initList);
+    }
+    return _xblockexpression;
+  }
+  
   public CharSequence generateSourceFile(final Root root, final SubSystemInstance comp, final WiredSubSystemClass wired, final Collection<PhysicalThread> usedThreads) {
     CharSequence _xblockexpression = null;
     {
@@ -327,6 +420,8 @@
       _builder.newLine();
       _builder.append("#include \"common/debugging/DebuggingService.h\"");
       _builder.newLine();
+      _builder.append("#include \"common/debugging/MSCFunctionObject.h\"");
+      _builder.newLine();
       _builder.append("#include \"common/messaging/IMessageService.h\"");
       _builder.newLine();
       _builder.append("#include \"common/messaging/MessageService.h\"");
@@ -338,18 +433,6 @@
       _builder.append("#include \"common/modelbase/InterfaceItemBase.h\"");
       _builder.newLine();
       _builder.newLine();
-      {
-        EList<ActorInstance> _actorInstances = comp.getActorInstances();
-        for(final ActorInstance ai : _actorInstances) {
-          _builder.append("#include \"");
-          ActorClass _actorClass = ai.getActorClass();
-          String _actorIncludePath = this._cppExtensions.getActorIncludePath(_actorClass);
-          _builder.append(_actorIncludePath, "");
-          _builder.append("\"");
-          _builder.newLineIfNotEmpty();
-        }
-      }
-      _builder.newLine();
       _builder.append("using namespace etRuntime;");
       _builder.newLine();
       _builder.newLine();
@@ -377,13 +460,59 @@
       _builder.append(clsname, "");
       _builder.append("::");
       _builder.append(clsname, "");
-      _builder.append("(IRTObject* parent, const std::string& name) :");
+      _builder.append("(IRTObject* parent, const std::string& name)");
       _builder.newLineIfNotEmpty();
       _builder.append("\t\t");
-      _builder.append("SubSystemClassBase(parent, name)");
-      _builder.newLine();
+      CharSequence _generateConstructorInitalizerList = this.generateConstructorInitalizerList(cc);
+      _builder.append(_generateConstructorInitalizerList, "\t\t");
+      _builder.newLineIfNotEmpty();
       _builder.append("{");
       _builder.newLine();
+      {
+        GlobalGeneratorSettings _settings = Main.getSettings();
+        boolean _isGenerateMSCInstrumentation = _settings.isGenerateMSCInstrumentation();
+        if (_isGenerateMSCInstrumentation) {
+          _builder.append("\t");
+          _builder.append("MSCFunctionObject mscFunctionObject(getInstancePathName(), \"Constructor\");");
+          _builder.newLine();
+        }
+      }
+      {
+        EList<ActorRef> _actorRefs = cc.getActorRefs();
+        for(final ActorRef sub : _actorRefs) {
+          {
+            int _multiplicity = sub.getMultiplicity();
+            boolean _greaterThan = (_multiplicity > 1);
+            if (_greaterThan) {
+              _builder.append("\t");
+              String _name = sub.getName();
+              _builder.append(_name, "\t");
+              _builder.append(".createSubActors(");
+              int _multiplicity_1 = sub.getMultiplicity();
+              _builder.append(_multiplicity_1, "\t");
+              _builder.append(");");
+              _builder.newLineIfNotEmpty();
+            }
+          }
+        }
+      }
+      _builder.append("}");
+      _builder.newLine();
+      _builder.newLine();
+      _builder.append(clsname, "");
+      _builder.append("::~");
+      _builder.append(clsname, "");
+      _builder.append("() {");
+      _builder.newLineIfNotEmpty();
+      {
+        GlobalGeneratorSettings _settings_1 = Main.getSettings();
+        boolean _isGenerateMSCInstrumentation_1 = _settings_1.isGenerateMSCInstrumentation();
+        if (_isGenerateMSCInstrumentation_1) {
+          _builder.append("\t");
+          _builder.append("MSCFunctionObject mscFunctionObject(getInstancePathName(), \"Destructor\");");
+          _builder.newLine();
+        }
+      }
       _builder.append("}");
       _builder.newLine();
       _builder.newLine();
@@ -399,6 +528,16 @@
       _builder.append("::instantiateMessageServices(){");
       _builder.newLineIfNotEmpty();
       _builder.newLine();
+      {
+        GlobalGeneratorSettings _settings_2 = Main.getSettings();
+        boolean _isGenerateMSCInstrumentation_2 = _settings_2.isGenerateMSCInstrumentation();
+        if (_isGenerateMSCInstrumentation_2) {
+          _builder.append("\t");
+          _builder.append("MSCFunctionObject mscFunctionObject(getInstancePathName(), \"instantiateMessageServices()\");");
+          _builder.newLine();
+        }
+      }
+      _builder.newLine();
       _builder.append("\t");
       _builder.append("IMessageService* msgService;");
       _builder.newLine();
@@ -444,14 +583,14 @@
               _builder.append("\t");
               _builder.append("msgService = new MessageService(this, IMessageService::");
               ExecMode _execmode_2 = thread_1.getExecmode();
-              String _name = _execmode_2.getName();
-              _builder.append(_name, "\t\t");
+              String _name_1 = _execmode_2.getName();
+              _builder.append(_name_1, "\t\t");
               _builder.append(", interval, 0, ");
               String _threadId_1 = this.getThreadId(thread_1);
               _builder.append(_threadId_1, "\t\t");
               _builder.append(", \"MessageService_");
-              String _name_1 = thread_1.getName();
-              _builder.append(_name_1, "\t\t");
+              String _name_2 = thread_1.getName();
+              _builder.append(_name_2, "\t\t");
               _builder.append("\", ");
               long _prio = thread_1.getPrio();
               _builder.append(_prio, "\t\t");
@@ -462,14 +601,14 @@
               _builder.append("\t");
               _builder.append("msgService = new MessageService(this, IMessageService::");
               ExecMode _execmode_3 = thread_1.getExecmode();
-              String _name_2 = _execmode_3.getName();
-              _builder.append(_name_2, "\t\t");
+              String _name_3 = _execmode_3.getName();
+              _builder.append(_name_3, "\t\t");
               _builder.append(", 0, ");
               String _threadId_2 = this.getThreadId(thread_1);
               _builder.append(_threadId_2, "\t\t");
               _builder.append(", \"MessageService_");
-              String _name_3 = thread_1.getName();
-              _builder.append(_name_3, "\t\t");
+              String _name_4 = thread_1.getName();
+              _builder.append(_name_4, "\t\t");
               _builder.append("\", ");
               long _prio_1 = thread_1.getPrio();
               _builder.append(_prio_1, "\t\t");
@@ -491,17 +630,16 @@
       _builder.newLine();
       _builder.append("void ");
       _builder.append(clsname, "");
-      _builder.append("::instantiateActors(){");
+      _builder.append("::mapThreads() {");
       _builder.newLineIfNotEmpty();
-      _builder.newLine();
       _builder.append("\t");
       _builder.append("// thread mappings");
       _builder.newLine();
       {
         EList<ActorInstance> _allContainedInstances = comp.getAllContainedInstances();
-        for(final ActorInstance ai_1 : _allContainedInstances) {
+        for(final ActorInstance ai : _allContainedInstances) {
           _builder.append("\t");
-          final ETMapUtil.MappedThread mapped = ETMapUtil.getMappedThread(ai_1);
+          final ETMapUtil.MappedThread mapped = ETMapUtil.getMappedThread(ai);
           _builder.newLineIfNotEmpty();
           {
             boolean _or_1 = false;
@@ -516,7 +654,7 @@
             if (_not) {
               _builder.append("\t");
               _builder.append("addPathToThread(\"");
-              String _path = ai_1.getPath();
+              String _path = ai.getPath();
               _builder.append(_path, "\t");
               _builder.append("\", ");
               PhysicalThread _thread = mapped.getThread();
@@ -528,79 +666,60 @@
           }
         }
       }
+      _builder.append("}");
       _builder.newLine();
-      _builder.append("\t");
-      _builder.append("// sub actors");
       _builder.newLine();
+      _builder.append("void ");
+      _builder.append(clsname, "");
+      _builder.append("::initialize() {");
+      _builder.newLineIfNotEmpty();
       {
-        EList<ActorRef> _actorRefs = cc.getActorRefs();
-        for(final ActorRef sub : _actorRefs) {
+        GlobalGeneratorSettings _settings_3 = Main.getSettings();
+        boolean _isGenerateMSCInstrumentation_3 = _settings_3.isGenerateMSCInstrumentation();
+        if (_isGenerateMSCInstrumentation_3) {
+          _builder.append("\t");
+          _builder.append("DebuggingService::getInstance().getSyncLogger().addVisibleComment(\"starting initialization\");");
+          _builder.newLine();
+          _builder.append("\t");
+          _builder.append("MSCFunctionObject mscFunctionObject(getInstancePathName(), \"initialize()\");");
+          _builder.newLine();
           {
-            int _multiplicity = sub.getMultiplicity();
-            boolean _greaterThan = (_multiplicity > 1);
-            if (_greaterThan) {
-              _builder.append("\t");
-              _builder.append("for (int i=0; i<");
-              int _multiplicity_1 = sub.getMultiplicity();
-              _builder.append(_multiplicity_1, "\t");
-              _builder.append("; ++i) {");
-              _builder.newLineIfNotEmpty();
+            EList<ActorRef> _actorRefs_1 = cc.getActorRefs();
+            for(final ActorRef sub_1 : _actorRefs_1) {
               {
-                GlobalGeneratorSettings _settings = Main.getSettings();
-                boolean _isGenerateMSCInstrumentation = _settings.isGenerateMSCInstrumentation();
-                if (_isGenerateMSCInstrumentation) {
+                int _multiplicity_2 = sub_1.getMultiplicity();
+                boolean _greaterThan_1 = (_multiplicity_2 > 1);
+                if (_greaterThan_1) {
                   _builder.append("\t");
-                  _builder.append("\t");
-                  _builder.append("DebuggingService::getInstance().addMessageActorCreate(*this, \"");
-                  String _name_4 = sub.getName();
-                  _builder.append(_name_4, "\t\t");
-                  _builder.append(GenmodelConstants.INDEX_SEP, "\t\t");
-                  _builder.append("\"+i);");
+                  _builder.append("for (int i=0; i<");
+                  int _multiplicity_3 = sub_1.getMultiplicity();
+                  _builder.append(_multiplicity_3, "\t");
+                  _builder.append("; ++i) {");
                   _builder.newLineIfNotEmpty();
-                }
-              }
-              _builder.append("\t");
-              _builder.append("\t");
-              _builder.append("new ");
-              ActorClass _type_1 = sub.getType();
-              String _implementationClassName = this._cppExtensions.getImplementationClassName(_type_1);
-              _builder.append(_implementationClassName, "\t\t");
-              _builder.append("(this, \"");
-              String _name_5 = sub.getName();
-              _builder.append(_name_5, "\t\t");
-              _builder.append(GenmodelConstants.INDEX_SEP, "\t\t");
-              _builder.append("\"+i);");
-              _builder.newLineIfNotEmpty();
-              _builder.append("\t");
-              _builder.append("}");
-              _builder.newLine();
-            } else {
-              {
-                GlobalGeneratorSettings _settings_1 = Main.getSettings();
-                boolean _isGenerateMSCInstrumentation_1 = _settings_1.isGenerateMSCInstrumentation();
-                if (_isGenerateMSCInstrumentation_1) {
+                  _builder.append("\t");
+                  _builder.append("\t");
+                  _builder.append("DebuggingService::getInstance().addMessageActorCreate(*this, ");
+                  String _name_5 = sub_1.getName();
+                  _builder.append(_name_5, "\t\t");
+                  _builder.append(".getSubActor(i)->getName());");
+                  _builder.newLineIfNotEmpty();
+                  _builder.append("\t");
+                  _builder.append("}");
+                  _builder.newLine();
+                } else {
                   _builder.append("\t");
                   _builder.append("DebuggingService::getInstance().addMessageActorCreate(*this, \"");
-                  String _name_6 = sub.getName();
+                  String _name_6 = sub_1.getName();
                   _builder.append(_name_6, "\t");
                   _builder.append("\");");
                   _builder.newLineIfNotEmpty();
                 }
               }
-              _builder.append("\t");
-              _builder.append("new ");
-              ActorClass _type_2 = sub.getType();
-              String _implementationClassName_1 = this._cppExtensions.getImplementationClassName(_type_2);
-              _builder.append(_implementationClassName_1, "\t");
-              _builder.append("(this, \"");
-              String _name_7 = sub.getName();
-              _builder.append(_name_7, "\t");
-              _builder.append("\");");
-              _builder.newLineIfNotEmpty();
             }
           }
         }
       }
+      _builder.append("\t");
       _builder.newLine();
       _builder.append("\t");
       _builder.append("// wiring");
@@ -629,29 +748,70 @@
           _builder.newLineIfNotEmpty();
         }
       }
+      _builder.append("\t");
+      _builder.newLine();
+      _builder.append("\t");
+      _builder.append("// call initialize of sub actors");
+      _builder.newLine();
+      {
+        EList<ActorRef> _actorRefs_2 = cc.getActorRefs();
+        for(final ActorRef sub_2 : _actorRefs_2) {
+          _builder.append("\t");
+          String _name_7 = sub_2.getName();
+          _builder.append(_name_7, "\t");
+          _builder.append(".initialize();");
+          _builder.newLineIfNotEmpty();
+        }
+      }
       _builder.append("}");
       _builder.newLine();
       _builder.newLine();
+      {
+        GlobalGeneratorSettings _settings_4 = Main.getSettings();
+        boolean _isGenerateMSCInstrumentation_4 = _settings_4.isGenerateMSCInstrumentation();
+        if (_isGenerateMSCInstrumentation_4) {
+          _builder.append("void ");
+          _builder.append(clsname, "");
+          _builder.append("::setProbesActive(bool recursive, bool active) {");
+          _builder.newLineIfNotEmpty();
+          _builder.append("\t");
+          _builder.append("for(int i = 0; i < m_RTSystemPort.getNInterfaceItems(); i++)");
+          _builder.newLine();
+          _builder.append("\t\t");
+          _builder.append("DebuggingService::getInstance().addPortInstance(*(m_RTSystemPort.getInterfaceItem(i)));");
+          _builder.newLine();
+          _builder.append("\t");
+          _builder.append("if(recursive) {");
+          _builder.newLine();
+          {
+            EList<ActorRef> _actorRefs_3 = cc.getActorRefs();
+            for(final ActorRef sub_3 : _actorRefs_3) {
+              _builder.append("\t\t");
+              String _name_8 = sub_3.getName();
+              _builder.append(_name_8, "\t\t");
+              _builder.append(".setProbesActive(recursive, active);");
+              _builder.newLineIfNotEmpty();
+            }
+          }
+          _builder.append("\t");
+          _builder.append("}");
+          _builder.newLine();
+          _builder.append("}");
+          _builder.newLine();
+        }
+      }
+      _builder.newLine();
       _builder.append("void ");
       _builder.append(clsname, "");
       _builder.append("::init(){");
       _builder.newLineIfNotEmpty();
-      {
-        GlobalGeneratorSettings _settings_2 = Main.getSettings();
-        boolean _isGenerateMSCInstrumentation_2 = _settings_2.isGenerateMSCInstrumentation();
-        if (_isGenerateMSCInstrumentation_2) {
-          _builder.append("\t");
-          _builder.append("DebuggingService::getInstance().addVisibleComment(\"begin sub system initialization\");");
-          _builder.newLine();
-        }
-      }
       _builder.append("\t");
       _builder.append("SubSystemClassBase::init();");
       _builder.newLine();
       {
-        GlobalGeneratorSettings _settings_3 = Main.getSettings();
-        boolean _isGenerateMSCInstrumentation_3 = _settings_3.isGenerateMSCInstrumentation();
-        if (_isGenerateMSCInstrumentation_3) {
+        GlobalGeneratorSettings _settings_5 = Main.getSettings();
+        boolean _isGenerateMSCInstrumentation_5 = _settings_5.isGenerateMSCInstrumentation();
+        if (_isGenerateMSCInstrumentation_5) {
           _builder.append("\t");
           _builder.append("DebuggingService::getInstance().addVisibleComment(\"done sub system initialization\");");
           _builder.newLine();
@@ -660,23 +820,41 @@
       _builder.append("}");
       _builder.newLine();
       {
-        GlobalGeneratorSettings _settings_4 = Main.getSettings();
-        boolean _isGenerateMSCInstrumentation_4 = _settings_4.isGenerateMSCInstrumentation();
-        if (_isGenerateMSCInstrumentation_4) {
+        GlobalGeneratorSettings _settings_6 = Main.getSettings();
+        boolean _isGenerateMSCInstrumentation_6 = _settings_6.isGenerateMSCInstrumentation();
+        if (_isGenerateMSCInstrumentation_6) {
           _builder.newLine();
           _builder.append("void ");
           _builder.append(clsname, "");
           _builder.append("::destroy() {");
           _builder.newLineIfNotEmpty();
-          _builder.append("\t");
-          _builder.append("DebuggingService::getInstance().addVisibleComment(\"begin sub system destruction\");");
-          _builder.newLine();
+          {
+            GlobalGeneratorSettings _settings_7 = Main.getSettings();
+            boolean _isGenerateMSCInstrumentation_7 = _settings_7.isGenerateMSCInstrumentation();
+            if (_isGenerateMSCInstrumentation_7) {
+              _builder.append("\t");
+              _builder.append("DebuggingService::getInstance().getSyncLogger().addVisibleComment(\"starting destruction\");");
+              _builder.newLine();
+              _builder.append("\t");
+              _builder.append("MSCFunctionObject mscFunctionObject(getInstancePathName(), \"destroy()\");");
+              _builder.newLine();
+              _builder.append("\t");
+              _builder.append("DebuggingService::getInstance().addVisibleComment(\"begin sub system destruction\");");
+              _builder.newLine();
+            }
+          }
           _builder.append("\t");
           _builder.append("SubSystemClassBase::destroy();");
           _builder.newLine();
-          _builder.append("\t");
-          _builder.append("DebuggingService::getInstance().addVisibleComment(\"done sub system destruction\");");
-          _builder.newLine();
+          {
+            GlobalGeneratorSettings _settings_8 = Main.getSettings();
+            boolean _isGenerateMSCInstrumentation_8 = _settings_8.isGenerateMSCInstrumentation();
+            if (_isGenerateMSCInstrumentation_8) {
+              _builder.append("\t");
+              _builder.append("DebuggingService::getInstance().addVisibleComment(\"done sub system destruction\");");
+              _builder.newLine();
+            }
+          }
           _builder.append("}");
           _builder.newLine();
         }
diff --git a/plugins/org.eclipse.etrice.generator.cpp/xtend-gen/org/eclipse/etrice/generator/cpp/gen/ProtocolClassGen.java b/plugins/org.eclipse.etrice.generator.cpp/xtend-gen/org/eclipse/etrice/generator/cpp/gen/ProtocolClassGen.java
index 74878fd..66fc725 100644
--- a/plugins/org.eclipse.etrice.generator.cpp/xtend-gen/org/eclipse/etrice/generator/cpp/gen/ProtocolClassGen.java
+++ b/plugins/org.eclipse.etrice.generator.cpp/xtend-gen/org/eclipse/etrice/generator/cpp/gen/ProtocolClassGen.java
@@ -512,6 +512,8 @@
     _builder.newLine();
     _builder.append("#include \"common/debugging/DebuggingService.h\"");
     _builder.newLine();
+    _builder.append("#include \"common/debugging/MSCFunctionObject.h\"");
+    _builder.newLine();
     _builder.append("#include \"common/messaging/AbstractMessageReceiver.h\"");
     _builder.newLine();
     _builder.append("#include \"common/messaging/Address.h\"");
@@ -638,15 +640,6 @@
       _builder.newLineIfNotEmpty();
       _builder.append("{");
       _builder.newLine();
-      {
-        GlobalGeneratorSettings _settings = Main.getSettings();
-        boolean _isGenerateMSCInstrumentation = _settings.isGenerateMSCInstrumentation();
-        if (_isGenerateMSCInstrumentation) {
-          _builder.append("\t");
-          _builder.append("DebuggingService::getInstance().addPortInstance(*this);");
-          _builder.newLine();
-        }
-      }
       _builder.append("}");
       _builder.newLine();
       _builder.newLine();
@@ -671,21 +664,12 @@
         }
       }
       _builder.newLineIfNotEmpty();
-      {
-        GlobalGeneratorSettings _settings_1 = Main.getSettings();
-        boolean _isGenerateMSCInstrumentation_1 = _settings_1.isGenerateMSCInstrumentation();
-        if (_isGenerateMSCInstrumentation_1) {
-          _builder.append("\t");
-          _builder.append("DebuggingService::getInstance().addPortInstance(*this);");
-          _builder.newLine();
-        }
-      }
       _builder.append("}");
       _builder.newLine();
       {
-        GlobalGeneratorSettings _settings_2 = Main.getSettings();
-        boolean _isGenerateMSCInstrumentation_2 = _settings_2.isGenerateMSCInstrumentation();
-        if (_isGenerateMSCInstrumentation_2) {
+        GlobalGeneratorSettings _settings = Main.getSettings();
+        boolean _isGenerateMSCInstrumentation = _settings.isGenerateMSCInstrumentation();
+        if (_isGenerateMSCInstrumentation) {
           _builder.newLine();
           _builder.append("void ");
           _builder.append(portClassName, "");
@@ -731,9 +715,9 @@
       _builder.newLine();
       _builder.newLine();
       {
-        GlobalGeneratorSettings _settings_3 = Main.getSettings();
-        boolean _isGenerateMSCInstrumentation_3 = _settings_3.isGenerateMSCInstrumentation();
-        if (_isGenerateMSCInstrumentation_3) {
+        GlobalGeneratorSettings _settings_1 = Main.getSettings();
+        boolean _isGenerateMSCInstrumentation_1 = _settings_1.isGenerateMSCInstrumentation();
+        if (_isGenerateMSCInstrumentation_1) {
           _builder.append("\t");
           _builder.append("DebuggingService::getInstance().addMessageAsyncIn(getPeerAddress(), getAddress(), ");
           String _name_1 = pc.getName();
@@ -1115,21 +1099,27 @@
             }
           }
         } else {
-          _builder_2.append("\t");
-          _builder_2.append("DebuggingService::getInstance().addMessageAsyncOut(getAddress(), getPeerAddress(),");
-          _builder_2.newLine();
-          _builder_2.append("\t");
-          _builder_2.append("\t");
-          _builder_2.append(portClassName, "\t\t");
-          _builder_2.append("::getMessageString(");
-          _builder_2.append(portClassName, "\t\t");
-          _builder_2.append("::");
-          _builder_2.append(dir, "\t\t");
-          _builder_2.append("_");
-          String _name_3 = m.getName();
-          _builder_2.append(_name_3, "\t\t");
-          _builder_2.append("));");
-          _builder_2.newLineIfNotEmpty();
+          {
+            GlobalGeneratorSettings _settings = Main.getSettings();
+            boolean _isGenerateMSCInstrumentation = _settings.isGenerateMSCInstrumentation();
+            if (_isGenerateMSCInstrumentation) {
+              _builder_2.append("\t");
+              _builder_2.append("DebuggingService::getInstance().addMessageAsyncOut(getAddress(), getPeerAddress(),");
+              _builder_2.newLine();
+              _builder_2.append("\t");
+              _builder_2.append("\t");
+              _builder_2.append(portClassName, "\t\t");
+              _builder_2.append("::getMessageString(");
+              _builder_2.append(portClassName, "\t\t");
+              _builder_2.append("::");
+              _builder_2.append(dir, "\t\t");
+              _builder_2.append("_");
+              String _name_3 = m.getName();
+              _builder_2.append(_name_3, "\t\t");
+              _builder_2.append("));");
+              _builder_2.newLineIfNotEmpty();
+            }
+          }
           _builder_2.append("\t");
           _builder_2.append("if (getPeerAddress().isValid()){");
           _builder_2.newLine();
diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src-gen/common/modelbase/RTSystemServicesProtocol.cpp b/runtime/org.eclipse.etrice.runtime.cpp/src-gen/common/modelbase/RTSystemServicesProtocol.cpp
index 55276e7..0f201c2 100644
--- a/runtime/org.eclipse.etrice.runtime.cpp/src-gen/common/modelbase/RTSystemServicesProtocol.cpp
+++ b/runtime/org.eclipse.etrice.runtime.cpp/src-gen/common/modelbase/RTSystemServicesProtocol.cpp
@@ -7,14 +7,13 @@
 
 #include "RTSystemServicesProtocol.h"
 
-#include <common/debugging/DebuggingService.h>
-#include <common/messaging/AbstractMessageReceiver.h>
-#include <common/messaging/Address.h>
-#include <common/messaging/Message.h>
-#include <common/modelbase/IEventReceiver.h>
-#include <iostream>
+#include "common/debugging/DebuggingService.h"
+#include "common/debugging/MSCFunctionObject.h"
+#include "common/messaging/AbstractMessageReceiver.h"
+#include "common/messaging/Address.h"
+#include "common/messaging/Message.h"
+#include "common/modelbase/IEventReceiver.h"
 #include <iterator>
-#include <string>
 #include <vector>
 
 using namespace etRuntime;
@@ -38,16 +37,14 @@
 // port class
 //------------------------------------------------------------------------------------------------------------
 
-RTSystemServicesProtocolPort::RTSystemServicesProtocolPort(IInterfaceItemOwner* actor, const std::string& name, int localId) :
-		PortBase(actor, name, localId, 0)
+RTSystemServicesProtocolPort::RTSystemServicesProtocolPort(IInterfaceItemOwner* actor, const std::string& name, int localId)
+	: PortBase(actor, name, localId, 0)
 {
-	DebuggingService::getInstance().addPortInstance(*this);
 }
 
-RTSystemServicesProtocolPort::RTSystemServicesProtocolPort(IInterfaceItemOwner* actor, const std::string& name, int localId, int idx) :
-		PortBase(actor, name, localId, idx)
+RTSystemServicesProtocolPort::RTSystemServicesProtocolPort(IInterfaceItemOwner* actor, const std::string& name, int localId, int idx)
+	: PortBase(actor, name, localId, idx)
 {
-	DebuggingService::getInstance().addPortInstance(*this);
 }
 
 void RTSystemServicesProtocolPort::destroy() {
@@ -82,16 +79,14 @@
 // conjugated port class
 //------------------------------------------------------------------------------------------------------------
 
-RTSystemServicesProtocolConjPort::RTSystemServicesProtocolConjPort(IInterfaceItemOwner* actor, const std::string& name, int localId) :
-		PortBase(actor, name, localId, 0)
+RTSystemServicesProtocolConjPort::RTSystemServicesProtocolConjPort(IInterfaceItemOwner* actor, const std::string& name, int localId)
+	: PortBase(actor, name, localId, 0)
 {
-	DebuggingService::getInstance().addPortInstance(*this);
 }
 
-RTSystemServicesProtocolConjPort::RTSystemServicesProtocolConjPort(IInterfaceItemOwner* actor, const std::string& name, int localId, int idx) :
-		PortBase(actor, name, localId, idx)
+RTSystemServicesProtocolConjPort::RTSystemServicesProtocolConjPort(IInterfaceItemOwner* actor, const std::string& name, int localId, int idx)
+	: PortBase(actor, name, localId, idx)
 {
-	DebuggingService::getInstance().addPortInstance(*this);
 }
 
 void RTSystemServicesProtocolConjPort::destroy() {
@@ -159,3 +154,4 @@
 	}
 }
 
+
diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src-gen/common/modelbase/RTSystemServicesProtocol.h b/runtime/org.eclipse.etrice.runtime.cpp/src-gen/common/modelbase/RTSystemServicesProtocol.h
index 69c914d..7682e93 100644
--- a/runtime/org.eclipse.etrice.runtime.cpp/src-gen/common/modelbase/RTSystemServicesProtocol.h
+++ b/runtime/org.eclipse.etrice.runtime.cpp/src-gen/common/modelbase/RTSystemServicesProtocol.h
@@ -5,15 +5,15 @@
  *
  */
 
-#ifndef _RTSYSTEMSERVICESPROTOCOL_H_
-#define _RTSYSTEMSERVICESPROTOCOL_H_
+#ifndef _COMMON_MODELBASE_RTSYSTEMSERVICESPROTOCOL_H_
+#define _COMMON_MODELBASE_RTSYSTEMSERVICESPROTOCOL_H_
 
-#include <common/modelbase/InterfaceItemBase.h>
-#include <common/modelbase/PortBase.h>
-#include <common/modelbase/ReplicatedInterfaceItemBase.h>
-#include <common/modelbase/ReplicatedPortBase.h>
-#include <etDatatypes.h>
-#include <string>
+#include "common/modelbase/InterfaceItemBase.h"
+#include "common/modelbase/PortBase.h"
+#include "common/modelbase/ReplicatedInterfaceItemBase.h"
+#include "common/modelbase/ReplicatedPortBase.h"
+#include "common/etDatatypesCpp.hpp"
+
 
 
 
@@ -43,7 +43,6 @@
 	private:
 		static const std::string s_messageStrings[];
 
-
 };
 
 //------------------------------------------------------------------------------------------------------------
@@ -124,4 +123,6 @@
 		}
 
 };
-#endif /* _RTSYSTEMSERVICESPROTOCOL_H_ */
+
+
+#endif /* _COMMON_MODELBASE_RTSYSTEMSERVICESPROTOCOL_H_ */
diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/debugging/DebuggingService.cpp b/runtime/org.eclipse.etrice.runtime.cpp/src/common/debugging/DebuggingService.cpp
index 89a8bc6..b2dedc3 100644
--- a/runtime/org.eclipse.etrice.runtime.cpp/src/common/debugging/DebuggingService.cpp
+++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/debugging/DebuggingService.cpp
@@ -14,7 +14,7 @@
 
 #include "common/modelbase/ActorClassBase.h"
 #include "common/modelbase/SubSystemClassBase.h"
-#include "common/modelbase/PortBase.h"
+#include "common/modelbase/InterfaceItemBase.h"
 #include <iostream>
 
 namespace etRuntime {
@@ -31,8 +31,8 @@
 		m_portInstances() {
 }
 
-const PortBase* DebuggingService::getPort(const Address& address) const {
-	std::map<Address, const PortBase*>::const_iterator it = m_portInstances.find(address);
+const InterfaceItemBase* DebuggingService::getPort(const Address& address) const {
+	std::map<Address, const InterfaceItemBase*>::const_iterator it = m_portInstances.find(address);
 	if (it != m_portInstances.end())
 		return it->second;
 
@@ -40,8 +40,8 @@
 }
 
 void DebuggingService::addMessageAsyncOut(const Address& source, const Address& target, const std::string& msg) {
-	const PortBase* srcPort = getPort(source);
-	const PortBase* tgtPort = getPort(target);
+	const InterfaceItemBase* srcPort = getPort(source);
+	const InterfaceItemBase* tgtPort = getPort(target);
 	if (srcPort != 0 && tgtPort != 0)
 		m_asyncLogger.addMessageAsyncOut(srcPort->getActor()->getInstancePath(), tgtPort->getActor()->getInstancePath(),
 				msg);
@@ -49,24 +49,24 @@
 }
 
 void DebuggingService::addMessageAsyncIn(const Address& source, const Address& target, const std::string& msg) {
-	const PortBase* srcPort = getPort(source);
-	const PortBase* tgtPort = getPort(target);
+	const InterfaceItemBase* srcPort = getPort(source);
+	const InterfaceItemBase* tgtPort = getPort(target);
 	if (srcPort != 0 && tgtPort != 0)
 		m_asyncLogger.addMessageAsyncIn(srcPort->getActor()->getInstancePath(), tgtPort->getActor()->getInstancePath(),
 				msg);
 }
 
 void DebuggingService::addMessageSyncCall(const Address& source, const Address& target, const std::string& msg) {
-	const PortBase* srcPort = getPort(source);
-	const PortBase* tgtPort = getPort(target);
+	const InterfaceItemBase* srcPort = getPort(source);
+	const InterfaceItemBase* tgtPort = getPort(target);
 	if (srcPort != 0 && tgtPort != 0)
 		m_asyncLogger.addMessageSyncCall(srcPort->getActor()->getInstancePath(), tgtPort->getActor()->getInstancePath(),
 				msg);
 }
 
 void DebuggingService::addMessageSyncReturn(const Address& source, const Address& target, const std::string& msg) {
-	const PortBase* srcPort = getPort(source);
-	const PortBase* tgtPort = getPort(target);
+	const InterfaceItemBase* srcPort = getPort(source);
+	const InterfaceItemBase* tgtPort = getPort(target);
 	if (srcPort != 0 && tgtPort != 0)
 		m_asyncLogger.addMessageSyncReturn(srcPort->getActor()->getInstancePath(),
 				tgtPort->getActor()->getInstancePath(), msg);
@@ -95,11 +95,11 @@
 	m_asyncLogger.addVisibleComment(comment);
 }
 
-void DebuggingService::addPortInstance(const PortBase& port) {
+void DebuggingService::addPortInstance(const InterfaceItemBase& port) {
 	m_portInstances[port.getAddress()] = &port;
 }
 
-void DebuggingService::removePortInstance(const PortBase& port) {
+void DebuggingService::removePortInstance(const InterfaceItemBase& port) {
 	m_portInstances.erase(port.getAddress());
 }
 
diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/debugging/DebuggingService.h b/runtime/org.eclipse.etrice.runtime.cpp/src/common/debugging/DebuggingService.h
index c7ef3e6..0ac9e63 100644
--- a/runtime/org.eclipse.etrice.runtime.cpp/src/common/debugging/DebuggingService.h
+++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/debugging/DebuggingService.h
@@ -16,6 +16,7 @@
 #include "common/debugging/MSCLogger.h"
 #include "common/messaging/Address.h"
 #include "etDatatypes.h"
+#include "common/modelbase/InterfaceItemBase.h"
 #include <string>
 #include <map>
 
@@ -41,8 +42,8 @@
 	void addMessageActorCreate(const ActorClassBase& parent, const std::string& refName);
 	void addMessageActorDestroy(const ActorClassBase& inst);
 	void addVisibleComment(const std::string& comment);
-	void addPortInstance(const PortBase& port);
-	void removePortInstance(const PortBase& port);
+	void addPortInstance(const InterfaceItemBase& port);
+	void removePortInstance(const InterfaceItemBase& port);
 
 	MSCLogger& getSyncLogger() { return m_syncLogger; }
 	MSCLogger& getAsyncLogger() { return m_asyncLogger; }
@@ -51,9 +52,9 @@
 
 	MSCLogger m_asyncLogger;
 	MSCLogger m_syncLogger;
-	std::map<Address, const PortBase*> m_portInstances;
+	std::map<Address, const InterfaceItemBase*> m_portInstances;
 
-	const PortBase* getPort(const Address& address) const;
+	const InterfaceItemBase* getPort(const Address& address) const;
 
 	DebuggingService();
 	DebuggingService(DebuggingService const&);
diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/messaging/RTObject.cpp b/runtime/org.eclipse.etrice.runtime.cpp/src/common/messaging/RTObject.cpp
index 19e146a..6c3182e 100644
--- a/runtime/org.eclipse.etrice.runtime.cpp/src/common/messaging/RTObject.cpp
+++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/messaging/RTObject.cpp
@@ -33,12 +33,6 @@
 	}
 }
 
-RTObject::~RTObject() {
-	for (std::vector<IRTObject*>::iterator it = m_children.begin(); it != m_children.end(); ++it) {
-		delete *it;
-	}
-}
-
 void RTObject::destroy() {
 	for (std::vector<IRTObject*>::iterator it = m_children.begin(); it != m_children.end(); ++it) {
 		RTObject* child = dynamic_cast<RTObject*>(*it);
diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/messaging/RTObject.h b/runtime/org.eclipse.etrice.runtime.cpp/src/common/messaging/RTObject.h
index a4bb6cd..ceb2b6c 100644
--- a/runtime/org.eclipse.etrice.runtime.cpp/src/common/messaging/RTObject.h
+++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/messaging/RTObject.h
@@ -23,7 +23,7 @@
 public:
 	RTObject(IRTObject* parent, const std::string& name);
 
-	virtual ~RTObject();
+	virtual ~RTObject() {}
 
 	virtual const std::string& getName() const {
 		return m_name;
diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ActorClassBase.cpp b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ActorClassBase.cpp
index 931449b..5f67b8a 100644
--- a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ActorClassBase.cpp
+++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ActorClassBase.cpp
@@ -33,6 +33,17 @@
 	m_state = 0;
 }
 
+void ActorClassBase::initialize() {
+	// since we have no mapping for the system ports we connect them directly here
+	IReplicatedInterfaceItem* systemPort = getSystemPort();
+	if (systemPort != 0) {
+		InterfaceItemBase* peer = systemPort->createSubInterfaceItem();
+		m_RTSystemPort.connectWith(peer);
+	}
+}
+
+
+
 //SubSystemClassBase* ActorClassBase::getSubSystem() const {
 //	return 0; // TODO JH
 //}
diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ActorClassBase.h b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ActorClassBase.h
index 7bd002c..52d876b 100644
--- a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ActorClassBase.h
+++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ActorClassBase.h
@@ -23,7 +23,6 @@
 namespace etRuntime {
 
 
-
 class ActorClassBase: public SystemPortOwner, public virtual IMessageReceiver {
 public:
 
@@ -42,6 +41,9 @@
 		return Address::EMPTY;
 	}
 
+	virtual void initialize(void);
+	virtual void setProbesActive(bool recursive, bool active) {}
+
 	//SubSystemClassBase* getSubSystem() const;
 
 	//--------------------- lifecycle functions
diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/InterfaceItemBase.cpp b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/InterfaceItemBase.cpp
index 2834ff4..498137c 100644
--- a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/InterfaceItemBase.cpp
+++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/InterfaceItemBase.cpp
@@ -44,8 +44,16 @@
 		m_replicator(0) {
 
 	m_replicator = dynamic_cast<IReplicatedInterfaceItem*>(owner);
+}
 
-	int thread = owner->getEventReceiver()->getThread();
+InterfaceItemBase::~InterfaceItemBase() {
+	m_peerAddress = Address::EMPTY;
+	m_ownMsgReceiver = 0;
+	m_peerMsgReceiver = 0;
+}
+
+void InterfaceItemBase::init() {
+	int thread = dynamic_cast<IEventReceiver*> (getParent())->getThread();
 	if (thread >= 0) {
 		IMessageService* msgSvc = RTServices::getInstance().getMsgSvcCtrl().getMsgSvc(thread);
 		Address addr = msgSvc->getFreeAddress();
@@ -56,12 +64,6 @@
 	}
 }
 
-InterfaceItemBase::~InterfaceItemBase() {
-	m_peerAddress = Address::EMPTY;
-	m_ownMsgReceiver = 0;
-	m_peerMsgReceiver = 0;
-}
-
 IInterfaceItem* InterfaceItemBase::connectWith(IInterfaceItem* peer) {
 	if (peer != 0) {
 		m_peer = peer;
@@ -78,6 +80,10 @@
 
 		InterfaceItemBase* ifItemPeer = dynamic_cast<InterfaceItemBase*>(m_peer);
 		if (ifItemPeer != 0) {
+			// initialize Ports
+			this->init();
+			ifItemPeer->init();
+
 			// connect with each other
 			m_peerAddress = ifItemPeer->getAddress();
 			ifItemPeer->m_peerAddress = getAddress();
@@ -121,8 +127,10 @@
 		m_replicator->removeItem(*this);
 	}
 
-	m_ownMsgReceiver->removeMessageReceiver(*this);
-	m_ownMsgReceiver->freeAddress(getAddress());
+	if(m_ownMsgReceiver) {
+		m_ownMsgReceiver->removeMessageReceiver(*this);
+		m_ownMsgReceiver->freeAddress(getAddress());
+	}
 
 	AbstractMessageReceiver::destroy();
 }
diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/InterfaceItemBase.h b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/InterfaceItemBase.h
index 0cc5de2..cdb12d9 100644
--- a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/InterfaceItemBase.h
+++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/InterfaceItemBase.h
@@ -61,6 +61,7 @@
 		return m_peerMsgReceiver;
 	}
 
+	void init(void);
 	virtual void destroy();
 
 
diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/RTSystemProtocol.cpp b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/RTSystemProtocol.cpp
index 91eb0e8..9a9f930 100644
--- a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/RTSystemProtocol.cpp
+++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/RTSystemProtocol.cpp
@@ -20,13 +20,6 @@
 
 RTSystemPort::RTSystemPort(IInterfaceItemOwner* actor, int localId) :
 		RTSystemServicesProtocolPort(actor, RTSystemProtocol::RT_SYSTEM_PORT_NAME, localId) {
-
-	// since we have no mapping for the system ports we connect them directly here
-	IReplicatedInterfaceItem* systemPort = actor->getSystemPort();
-	if (systemPort != 0) {
-		InterfaceItemBase* peer = systemPort->createSubInterfaceItem();
-		connectWith(peer);
-	}
 }
 
 RTSystemConjPort::RTSystemConjPort(IInterfaceItemOwner* actor, int localId) :
diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ReplicatedActorClassBase.cpp b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ReplicatedActorClassBase.cpp
new file mode 100644
index 0000000..52be7ec
--- /dev/null
+++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ReplicatedActorClassBase.cpp
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2016 protos software gmbh (http://www.protos.de).
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * CONTRIBUTORS:
+ * 		Jan Belle (initial contribution)
+ *
+ *******************************************************************************/
+
+#include "ReplicatedActorClassBase.h"
+
+namespace etRuntime {
+
+ReplicatedActorClassBase::ReplicatedActorClassBase(IRTObject* parent, const std::string& name) :
+		RTObject(parent, name), m_items() {
+}
+
+ReplicatedActorClassBase::~ReplicatedActorClassBase() {
+	for(std::vector<ActorClassBase*>::iterator it = m_items.begin(); it != m_items.end(); it++)
+		delete *it;
+}
+
+void ReplicatedActorClassBase::createSubActors(int number) {
+	for (int i = 0; i < number; i++) {
+		std::stringstream itemName;
+		itemName << getName() << SEP << i;
+		ActorClassBase* item = createActor(getParent(), itemName.str());
+		m_items.push_back(item);
+	}
+}
+
+void ReplicatedActorClassBase::initialize() {
+	for(std::vector<ActorClassBase*>::iterator it = m_items.begin(); it != m_items.end(); it++)
+		(*it)->initialize();
+}
+
+void ReplicatedActorClassBase::setProbesActive(bool recursive, bool active) {
+	for(std::vector<ActorClassBase*>::iterator it = m_items.begin(); it != m_items.end(); it++)
+			(*it)->setProbesActive(recursive, active);
+}
+
+} // namespace etRuntime
diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ReplicatedActorClassBase.h b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ReplicatedActorClassBase.h
new file mode 100644
index 0000000..6a1eba3
--- /dev/null
+++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ReplicatedActorClassBase.h
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2016 protos software gmbh (http://www.protos.de).
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * CONTRIBUTORS:
+ * 		Jan Belle (initial contribution)
+ *
+ *******************************************************************************/
+
+#ifndef SRC_COMMON_MODELBASE_REPLICATEDACTORCLASSBASE_H_
+#define SRC_COMMON_MODELBASE_REPLICATEDACTORCLASSBASE_H_
+
+#include "common/messaging/RTObject.h"
+#include "common/modelbase/ActorClassBase.h"
+
+namespace etRuntime {
+
+class ReplicatedActorClassBase : public RTObject {
+
+public:
+	static const char SEP = ':';
+
+	ReplicatedActorClassBase(IRTObject* parent, const std::string& name);
+	virtual ~ReplicatedActorClassBase(void);
+	void createSubActors(int number);
+	void initialize(void);
+	void setProbesActive(bool recursive, bool active);
+	int getNSubActors(void) { return m_items.size(); }
+	ActorClassBase* getSubActor(int index) { return m_items.at(index); }
+
+protected:
+	virtual ActorClassBase* createActor(IRTObject* parent, const std::string& name) = 0;
+
+private:
+	std::vector<ActorClassBase*> m_items;
+};
+
+} // namespace et Runtime
+
+#endif /* SRC_COMMON_MODELBASE_REPLICATEDACTORCLASSBASE_H_ */
diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ReplicatedInterfaceItemBase.cpp b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ReplicatedInterfaceItemBase.cpp
index 9b716f9..6e5b536 100644
--- a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ReplicatedInterfaceItemBase.cpp
+++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ReplicatedInterfaceItemBase.cpp
@@ -25,7 +25,12 @@
 		m_localId(localId),
 		m_items(),
 		m_releasedIndices() {
+}
 
+ReplicatedInterfaceItemBase::~ReplicatedInterfaceItemBase() {
+	for(std::vector<InterfaceItemBase*>::iterator it = m_items.begin(); it != m_items.end(); ++it) {
+		delete *it;
+	}
 }
 
 InterfaceItemBase* ReplicatedInterfaceItemBase::createSubInterfaceItem() {
diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ReplicatedInterfaceItemBase.h b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ReplicatedInterfaceItemBase.h
index e1460d1..4738382 100644
--- a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ReplicatedInterfaceItemBase.h
+++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/ReplicatedInterfaceItemBase.h
@@ -28,7 +28,7 @@
 public:
 	static const char SEP = ':';
 
-	virtual ~ReplicatedInterfaceItemBase(){}
+	virtual ~ReplicatedInterfaceItemBase();
 
 	virtual InterfaceItemBase* createSubInterfaceItem();
 	virtual void removeItem(InterfaceItemBase& item);
diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/SubSystemClassBase.cpp b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/SubSystemClassBase.cpp
index 854d6ed..d7e33a0 100644
--- a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/SubSystemClassBase.cpp
+++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/SubSystemClassBase.cpp
@@ -33,6 +33,7 @@
 	DebuggingService::getInstance().getAsyncLogger().open();
 	DebuggingService::getInstance().getSyncLogger().setMSC(name + "_Sync", "log/");
 	DebuggingService::getInstance().getSyncLogger().open();
+	DebuggingService::getInstance().getSyncLogger().setObjectName("main");
 
 	RTServices::getInstance().setSubSystem(this);
 }
@@ -48,8 +49,9 @@
 	// normaly the ports will address the correct target message service directly
 	// it is just for test purposes
 	// RTServices::getInstance().getMsgSvcCtrl().connectAll();
-
-	instantiateActors();
+	mapThreads();
+	initialize();
+	setProbesActive(true, true);
 //	std::cout << toStringRecursive() << std::endl;
 
 	// initialize all actor instances
diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/SubSystemClassBase.h b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/SubSystemClassBase.h
index bc80bed..11bd28c 100644
--- a/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/SubSystemClassBase.h
+++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/modelbase/SubSystemClassBase.h
@@ -32,7 +32,9 @@
 
 	virtual void init();
 	virtual void instantiateMessageServices() = 0;
-	virtual void instantiateActors() = 0;
+	virtual void mapThreads(void) = 0;
+	virtual void initialize(void) = 0;
+	virtual void setProbesActive(bool recursive, bool active) {}
 
 	void start();
 	void stop();