diff --git a/simulators/c++av/src_simulator/app/AvActionCmd.cpp b/simulators/c++av/src_simulator/app/AvActionCmd.cpp
index 56b8ab3ca1ab5c1855beee2f8590dbf0784d734e..820e6cdddb8cce5f9b54180af9dbecf63f2f1f56 100644
--- a/simulators/c++av/src_simulator/app/AvActionCmd.cpp
+++ b/simulators/c++av/src_simulator/app/AvActionCmd.cpp
@@ -40,14 +40,16 @@ Ludovic Apvrille, Renaud Pacalet
 #include<AvActionCmd.h>
 #include<AvTransition.h>
 
-AvActionCmd::AvActionCmd(ID iID, AvBlock* iBlock, ActionFuncPointer iActionFunc, std::string iActionDescr, bool iDirectExec=false): AvSingleTransCmd(iID, "Action", iBlock,1), _actionFunc(iActionFunc), _actionDescr(iActionDescr), _directExec(iDirectExec){
+AvActionCmd::AvActionCmd(ID iID, AvBlock* iBlock, ActionFuncPointer iActionFunc, std::string iActionDescr, bool iDirectExec): AvSingleTransCmd(iID, "Action", iBlock,1), _actionFunc(iActionFunc), _actionDescr(iActionDescr), _directExec(iDirectExec){
 }
 
 AvActionCmd::~AvActionCmd(){
 }
 
 AvNode* AvActionCmd::prepare(bool iControlTransfer){
+	//std::cout << "action prepare";
 	if (iControlTransfer && _directExec){
+		//std::cout << "go on\n";
 		(_block->*_actionFunc)();
 		return _outgoingTrans[0]->prepare(true);
 	}
@@ -55,8 +57,11 @@ AvNode* AvActionCmd::prepare(bool iControlTransfer){
 }
 
 AvNode* AvActionCmd::execute(const SystemTransition& iTrans){
+	//std::cout << "action execute\n";
 	(_block->*_actionFunc)();
+	//std::cout << "action exec after func\n";
 	_outgoingTrans[0]->prepare(true);
+	//std::cout << "end action execute\n";
 	return this;
 }
 
@@ -70,3 +75,7 @@ bool AvActionCmd::isEnabled(EnabledTransList& iEnaTransList, AvTransition* iInco
 AvNode* AvActionCmd::cancel(){
 	return this;
 }
+
+bool AvActionCmd::directExecution(){
+	return _directExec;
+}
diff --git a/simulators/c++av/src_simulator/app/AvActionCmd.h b/simulators/c++av/src_simulator/app/AvActionCmd.h
index 7c9eae0de2569043e507b8c97b0548954366dbde..c0e320ab132704c3ea486667063a94b45db8cf59 100644
--- a/simulators/c++av/src_simulator/app/AvActionCmd.h
+++ b/simulators/c++av/src_simulator/app/AvActionCmd.h
@@ -47,12 +47,13 @@ class AvBlock;
 
 class AvActionCmd: public AvSingleTransCmd{
 public:
-	AvActionCmd(ID iID, AvBlock* iBlock, ActionFuncPointer iActionFunc, std::string iActionDescr, bool iDirectExec);
+	AvActionCmd(ID iID, AvBlock* iBlock, ActionFuncPointer iActionFunc, std::string iActionDescr, bool iDirectExec=true);
 	~AvActionCmd();
 	AvNode* prepare(bool iControlTransfer);
 	AvNode* execute(const SystemTransition& iTrans);
 	bool isEnabled(EnabledTransList& iEnaTransList, AvTransition* iIncomingTrans);
 	AvNode* cancel();
+	bool directExecution();
 protected:
 	ActionFuncPointer _actionFunc;
 	std::string _actionDescr;
diff --git a/simulators/c++av/src_simulator/app/AvBlock.cpp b/simulators/c++av/src_simulator/app/AvBlock.cpp
index 0ba01a8ef63022501aa7d032caa03f085b5092d9..3ec319169b5e0dd568bedad60637e1df4399f4cb 100644
--- a/simulators/c++av/src_simulator/app/AvBlock.cpp
+++ b/simulators/c++av/src_simulator/app/AvBlock.cpp
@@ -84,5 +84,6 @@ AvCmd* AvBlock::getCommandByID(ID iID){
 }
 
 void AvBlock::setCurrCommand(AvCheckpoint* iCmd){
+	//std::cout << toString() << ".setCurrCmd: " << iCmd->toString() << "\n";
 	_currCommand = iCmd;
 }
diff --git a/simulators/c++av/src_simulator/app/AvBlock.h b/simulators/c++av/src_simulator/app/AvBlock.h
index b18c1907f4c0924d0d42ab9fbee689f96f8265f6..a5d4547d6870d198265d343c584dcee148abdb63 100644
--- a/simulators/c++av/src_simulator/app/AvBlock.h
+++ b/simulators/c++av/src_simulator/app/AvBlock.h
@@ -70,5 +70,9 @@ protected:
 	AvCheckpoint* _currCommand;
 	///Pointer to the first command of the task
 	AvCmd* _firstCommand;
+	///Look up table for task variables (by name)
+	VariableLookUpTableName _varLookUpName;
+	///Look up table for task variables (by ID)
+	VariableLookUpTableID _varLookUpID;
 };
 #endif
diff --git a/simulators/c++av/src_simulator/app/AvCheckpoint.h b/simulators/c++av/src_simulator/app/AvCheckpoint.h
index 28709e3aa4fa637f57ba4417a36645b44d5cd3ac..59aa43f8c48db1d42612def9af5ff5f879c6f4a7 100644
--- a/simulators/c++av/src_simulator/app/AvCheckpoint.h
+++ b/simulators/c++av/src_simulator/app/AvCheckpoint.h
@@ -48,6 +48,8 @@ public:
 	AvCheckpoint(){}
 	virtual AvNode* execute(const SystemTransition& iTrans)=0;
 	virtual bool isEnabled(EnabledTransList& iEnaTransList, AvTransition* iIncomingTrans)=0;
+	//virtual AvNode* prepare(bool iControlTransfer)=0;
+	virtual std::string toString() const=0;
 	virtual ~AvCheckpoint() {}
 protected:
 };
diff --git a/simulators/c++av/src_simulator/app/AvNode.cpp b/simulators/c++av/src_simulator/app/AvNode.cpp
index 9e6289568bd7268317f722f2b776f46f7aff6e9f..3bb226314c1710e96d0e55f4ce7dc75eef8b1afa 100644
--- a/simulators/c++av/src_simulator/app/AvNode.cpp
+++ b/simulators/c++av/src_simulator/app/AvNode.cpp
@@ -38,6 +38,7 @@ Ludovic Apvrille, Renaud Pacalet
  *
  */ 
 #include<AvNode.h>
+#include<AvBlock.h>
 
 AvNode::AvNode(ID iID, std::string iName, AvBlock* iBlock): _ID(iID), _name(iName), _block(iBlock){
 }
@@ -51,7 +52,7 @@ ID AvNode::getID() const{
 
 std::string AvNode::toString() const{
 	std::ostringstream aTransText;
-	aTransText << _name << "_" << _ID;
+	aTransText << _block->toString() << "." << _name << "(" << _ID << ")";
 	return aTransText.str();
 }
 
diff --git a/simulators/c++av/src_simulator/app/AvNode.h b/simulators/c++av/src_simulator/app/AvNode.h
index 2c639805c411d616f44667d42a193b349fb0354f..48deac7fb10ef26aa820407e42b1a343886b8dcf 100644
--- a/simulators/c++av/src_simulator/app/AvNode.h
+++ b/simulators/c++av/src_simulator/app/AvNode.h
@@ -49,12 +49,13 @@ public:
 	AvNode(ID iID, std::string iName, AvBlock* iBlock);
 	virtual ~AvNode();
 	ID getID() const;
-	std::string toString() const;
+	virtual std::string toString() const;
 	AvBlock* getBlock() const;
 	virtual AvNode* prepare(bool iControlTransfer)=0;
 	virtual AvNode* execute(const SystemTransition& iTrans)=0;
 	virtual bool isEnabled(EnabledTransList& iEnaTransList, AvTransition* iIncomingTrans)=0;
 	virtual AvNode* cancel()=0;
+	virtual bool directExecution(){return false;}
 	//virtual AvTransition* getIncomingTrans();
 	//virtual void setParams(Parameter<ParamType>& ioParam);
 protected:
diff --git a/simulators/c++av/src_simulator/app/AvReceiveCmd.cpp b/simulators/c++av/src_simulator/app/AvReceiveCmd.cpp
index ed4ff7c4d3abd4570a956c7b1fb897aaa3123147..7ce76596bad941e17687745fa738a6f686d78108 100644
--- a/simulators/c++av/src_simulator/app/AvReceiveCmd.cpp
+++ b/simulators/c++av/src_simulator/app/AvReceiveCmd.cpp
@@ -57,12 +57,17 @@ AvNode* AvReceiveCmd::prepare(bool iControlTransfer){
 }
 
 AvNode* AvReceiveCmd::execute(const SystemTransition& iTrans){
+	//std::cout << "execute receive 1\n";
 	Parameter* aParamData = _signal->read(_incomingTrans);
+	//std::cout << "execute receive 2\n";
 	if (aParamData!=0){
+		//std::cout << "execute receive 3\n";
 		if(_paramSetFunc!=0) (_block->*_paramSetFunc)(aParamData);
 		delete aParamData;
 	}
+	//std::cout << "execute receive 4\n";
 	_outgoingTrans[0]->prepare(true);
+	//std::cout << "execute receive 5\n";
 	return this;
 }
 
diff --git a/simulators/c++av/src_simulator/app/AvSendCmd.cpp b/simulators/c++av/src_simulator/app/AvSendCmd.cpp
index a195b0181429bc50ce198ca8fbcb4d0c5b8bfb35..3e83addee166f1dc9d269b7cbef043c73b95510e 100644
--- a/simulators/c++av/src_simulator/app/AvSendCmd.cpp
+++ b/simulators/c++av/src_simulator/app/AvSendCmd.cpp
@@ -58,9 +58,13 @@ AvNode* AvSendCmd::prepare(bool iControlTransfer){
 
 AvNode* AvSendCmd::execute(const SystemTransition& iTrans){
 	Parameter* aParamData;
+	//std::cout << "execute send 1\n";
 	aParamData = (_paramGetFunc==0)? 0: (_block->*_paramGetFunc)();
+	//std::cout << "execute send 2\n";
 	_signal->write(_incomingTrans, iTrans.syncTrans, aParamData);
+	//std::cout << "execute send 3\n";
 	_outgoingTrans[0]->prepare(true);
+	//std::cout << "execute send 4\n";
 	return this;
 }
 
diff --git a/simulators/c++av/src_simulator/app/AvState.cpp b/simulators/c++av/src_simulator/app/AvState.cpp
index cecc51dab0e2bf2813c01823a916c9124b2c17b4..9e47c87e27a5387af862c35edaa7a9fa16343db7 100644
--- a/simulators/c++av/src_simulator/app/AvState.cpp
+++ b/simulators/c++av/src_simulator/app/AvState.cpp
@@ -50,12 +50,20 @@ AvState::~AvState(){
 
 AvNode* AvState::prepare(bool iControlTransfer){
 	//if _lastControlTransfer==true set actual cmd in block to this one and call execute
+	std::cout<< "prepare " << _name << "\n";
 	_lastControlTransfer=iControlTransfer;
 	if(_lastControlTransfer){
+		AvTransition* directAccessTrans = determineDirectAccessTrans();
+		if (directAccessTrans!=0){
+			std::cout<< _name << " go on to next\n";
+			return directAccessTrans->prepare(true);
+		}
+		std::cout<< "prepare transitions " << _name << "\n";
 		_block->setCurrCommand(this);
 		for (unsigned int i=0; i<_nbOfOutgoingTrans; i++)
 			_outgoingTrans[i]->prepare(false);
 	}
+	std::cout<< "end prepare " << _name << "\n";
 	return this;
 }
 
@@ -92,10 +100,30 @@ AvNode* AvState::cancel(){
 	return this;
 }
 
+void AvState::setIncomingTrans(AvTransition* iTrans){
+}
+
+std::string AvState::toString() const{
+	return AvNode::toString();
+}
+
+bool AvState::directExecution(){
+	return true;
+}
+
+AvTransition* AvState::determineDirectAccessTrans(){
+	AvTransition* aResTrans=0;
+	for (unsigned int i=0; i<_nbOfOutgoingTrans; i++){
+		if (_outgoingTrans[i]->directExecution()){
+			if (aResTrans!=0) return 0;
+			aResTrans=_outgoingTrans[i];
+		}else{
+			return 0;
+		}
+	}
+	return aResTrans;
+}
+
 //void AvState::setOutgoingTrans(AvTransition** iTrans){
 //	_outgoingTrans=iTrans;
 //}
-
-//void AvState::setIncomingTrans(AvTransition* iTrans){
-	//empty
-//}
diff --git a/simulators/c++av/src_simulator/app/AvState.h b/simulators/c++av/src_simulator/app/AvState.h
index 8040b405feedc5423eeaf1ecee5b5dfd7e54d275..2fd23b8502857b87f8779ef3156a0e779692f09d 100644
--- a/simulators/c++av/src_simulator/app/AvState.h
+++ b/simulators/c++av/src_simulator/app/AvState.h
@@ -54,8 +54,12 @@ public:
 	AvNode* execute(const SystemTransition& iTrans);
 	bool isEnabled(EnabledTransList& iEnaTransList, AvTransition* iIncomingTrans);
 	AvNode* cancel();
+	void setIncomingTrans(AvTransition* iTrans);
+	std::string toString() const;
+	bool directExecution();
 	//void setOutgoingTrans(AvTransition** iTrans);
 protected:
 	bool _lastControlTransfer;
+	AvTransition* determineDirectAccessTrans();
 };
 #endif
diff --git a/simulators/c++av/src_simulator/app/AvSyncSignal.cpp b/simulators/c++av/src_simulator/app/AvSyncSignal.cpp
index a606e58060bbc4804a86e904eb2d78045867e678..e7536a65dc7468950896ff4ff71e955fbeb302ce 100644
--- a/simulators/c++av/src_simulator/app/AvSyncSignal.cpp
+++ b/simulators/c++av/src_simulator/app/AvSyncSignal.cpp
@@ -40,6 +40,7 @@ Ludovic Apvrille, Renaud Pacalet
 #include <AvSyncSignal.h>
 #include <AvTransition.h>
 #include <AvCmd.h>
+#include<AvBlock.h>
 
 AvSyncSignal::AvSyncSignal(ID iID, std::string iName): AvSignal(iID, iName), _paramData(0){
 }
@@ -70,17 +71,18 @@ Parameter* AvSyncSignal::read(AvTransition* iReader){
 }
 
 void AvSyncSignal::write(AvTransition* iWriter, AvTransition* iReader, Parameter* iParamData){
-	SystemTransition aDummy;
+	//(AvBlock* iBlock, AvTransition* iFiringTrans, AvTransition* iSyncTrans, std::string iText
+	SystemTransition aSysTrans(iReader->getBlock(), iReader, 0, "");
 	_paramData = iParamData;
-	iReader->execute(aDummy);
-	//cancelWriter(iWriter);
+	//iReader->execute(aDummy);
+	aSysTrans.block->execute(aSysTrans);
 	_writers.erase(iWriter);
 }
 
 bool AvSyncSignal::getSyncTransitionsWriter(AvBlock* iBlock, AvTransition* iWriter, EnabledTransList& iTransList){
 	for(AvTransSet::iterator i=_readers.begin(); i != _readers.end(); ++i){
 		std::ostringstream aTransText;
-		aTransText << iWriter->getOutgoingCmd()->toString() << " synchronizes with " << (*i)->getOutgoingCmd()->toString();
+		aTransText << iWriter->getOutgoingCmd()->toString() << " synchronizes with " << (*i)->getOutgoingCmd()->toString() << " via signal " << toString();
 		iTransList.push_back(SystemTransition(iBlock, iWriter, *i, aTransText.str()));
 		return true;
 	}
diff --git a/simulators/c++av/src_simulator/app/AvTimer.h b/simulators/c++av/src_simulator/app/AvTimer.h
index 6cfbcc5890da322dd069d80d0e023f853f68a1e6..59fab5f17020f3bd69a824dd4a849a189f336eb5 100644
--- a/simulators/c++av/src_simulator/app/AvTimer.h
+++ b/simulators/c++av/src_simulator/app/AvTimer.h
@@ -51,11 +51,14 @@ public:
 	}
 	
 	void set(AVTTime iSetTime){
+		std::cout << "set timer\n";
 		_expired=false;
 		registerEventIn(iSetTime);
+		std::cout << "end set timer\n";
 	}
 	
 	void reset(){
+		std::cout << "reset timer\n";
 		cancelEvent();
 	}
 	
@@ -64,6 +67,7 @@ public:
 	}
 	
 	void eventQCallback(){
+		std::cout << "timer expired\n";
 		_expired=true;
 	}
 	
diff --git a/simulators/c++av/src_simulator/app/AvTimerExpCmd.cpp b/simulators/c++av/src_simulator/app/AvTimerExpCmd.cpp
index 03c4b3b6f98e9ddc3708f09750d4297035e53916..1c61f656b8bf5bce8642e714ac8b056ece32b6c8 100644
--- a/simulators/c++av/src_simulator/app/AvTimerExpCmd.cpp
+++ b/simulators/c++av/src_simulator/app/AvTimerExpCmd.cpp
@@ -42,7 +42,7 @@ Ludovic Apvrille, Renaud Pacalet
 #include<AvTimer.h>
 #include<AvTransition.h>
 
-AvTimerExpCmd::AvTimerExpCmd(ID iID, AvBlock* iBlock, AvTimer* iTimer): AvSingleTransCmd(iID, "TimerExp", iBlock, 1){
+AvTimerExpCmd::AvTimerExpCmd(ID iID, AvBlock* iBlock, AvTimer* iTimer): AvSingleTransCmd(iID, "TimerExp", iBlock, 1), _timer(iTimer){
 }
 
 AvTimerExpCmd::~AvTimerExpCmd(){
diff --git a/simulators/c++av/src_simulator/app/AvTransition.cpp b/simulators/c++av/src_simulator/app/AvTransition.cpp
index 640cd3b69c068142e0577dac3a56745a41d6937a..0851ca26b17e3bad22b3fa39b0ea8fabd9057cf8 100644
--- a/simulators/c++av/src_simulator/app/AvTransition.cpp
+++ b/simulators/c++av/src_simulator/app/AvTransition.cpp
@@ -42,7 +42,7 @@ Ludovic Apvrille, Renaud Pacalet
 #include<AvCmd.h>
 #include<AvBlock.h>
 
-AvTransition::AvTransition(ID iID, AvBlock* iBlock, CondFuncPointer iCondFunc, AVTTime iAfterMin, AVTTime iAfterMax, AVTTime iComputeMin, AVTTime iComputeMax, ActionFuncPointer iActionFunc): AvNode(iID, "Transition", iBlock), AvCheckpoint(), _outgoingCmd(0), _condFunc(iCondFunc), _afterMin(iAfterMin), _afterMax(iAfterMax), _computeMin(iComputeMin), _computeMax(iComputeMax), _actionFunc(iActionFunc), _state(DISABLED), _lastControlTransfer(true){
+AvTransition::AvTransition(ID iID, AvBlock* iBlock, CondFuncPointer iCondFunc, ParamType iAfterMin, ParamType iAfterMax, ParamType iComputeMin, ParamType iComputeMax, ActionFuncPointer iActionFunc): AvNode(iID, "Transition", iBlock), AvCheckpoint(), _outgoingCmd(0), _condFunc(iCondFunc), _afterMin(iAfterMin), _afterMax(iAfterMax), _computeMin(iComputeMin), _computeMax(iComputeMax), _computeFor(0), _actionFunc(iActionFunc), _state(DISABLED), _lastControlTransfer(true){
 }
 
 AvTransition::~AvTransition(){
@@ -50,38 +50,62 @@ AvTransition::~AvTransition(){
 
 AvNode* AvTransition::prepare(bool iControlTransfer){
 	_lastControlTransfer=iControlTransfer;
+	std::cout << "trans prepare 1\n";
 	if (_lastControlTransfer){
+		std::cout << "trans prepare 2\n";
 		_block->setCurrCommand(this);
 		if (_actionFunc!=0) (_block->*_actionFunc)();
 	}
+	std::cout << "trans prepare 3\n";
 	if(_condFunc!=0 && (_block->*_condFunc)()==0){
 		_state=DISABLED;
 	}else{
+		std::cout << "trans prepare 4\n";
 		AVTTime aTime2Wait = myrand(_afterMin, _afterMax);
 		if (aTime2Wait==0){
-			aTime2Wait = myrand(_computeMin, _computeMax);
-			if(aTime2Wait==0){
+			std::cout << "trans prepare 5\n";
+			_computeFor = myrand(_computeMin, _computeMax);
+			if(_computeFor==0){
+				std::cout << "trans prepare 5a\n";
 				_state = WAIT4CMD;
 				return _outgoingCmd->prepare(_lastControlTransfer);
 			}else{
-				registerEventIn(aTime2Wait);
-				_state = WAIT4COMP;
+				std::cout << "trans prepare 5b\n";
+				//registerEventIn(_computeFor);
+				_state = PREPCOMP;
 			}
 		}else{
+			std::cout << "trans prepare 6\n";
 			registerEventIn(aTime2Wait);
 			_state = WAIT4AFTER;
 		}
 			
 	}
+	//std::cout << "trans prepare 7\n";
 	return this;
 }
 
 AvNode* AvTransition::execute(const SystemTransition& iSyncCmd){
-	if (!_lastControlTransfer && _actionFunc!=0) (_block->*_actionFunc)();
-	return _outgoingCmd->execute(iSyncCmd);
+	if (_state==PREPCOMP){
+		registerEventIn(_computeFor);
+		_block->setCurrCommand(this);
+		_state=WAIT4COMP;
+		return this;
+	}
+	if (_state==WAIT4CMD){
+		if (!_lastControlTransfer && _actionFunc!=0) (_block->*_actionFunc)();
+		return _outgoingCmd->execute(iSyncCmd);
+	}
+	return this;
 }
 
 bool AvTransition::isEnabled(EnabledTransList& iEnaTransList, AvTransition* iIncomingTrans){
+	if (_state==PREPCOMP){
+		std::ostringstream aTransText;
+		aTransText << "compute for " << _computeFor << " in " << toString();
+		iEnaTransList.push_back(SystemTransition(_block, this, 0, aTransText.str()));
+		return true;
+	}
 	if (_state==WAIT4CMD) return _outgoingCmd->isEnabled(iEnaTransList,this);
 	return false;
 }
@@ -90,7 +114,6 @@ AvNode* AvTransition::cancel(){
 	AvNode* aResult=0;
 	switch(_state){
 	case WAIT4AFTER:
-	case WAIT4COMP:
 		cancelEvent();
 		break;
 	case WAIT4CMD:
@@ -102,10 +125,9 @@ AvNode* AvTransition::cancel(){
 }
 
 void AvTransition::eventQCallback(){
-	AVTTime aTime2Wait;
-	if(_state==WAIT4AFTER && (aTime2Wait = myrand(_computeMin, _computeMax))!=0){
-		registerEventIn(aTime2Wait);
-		_state = WAIT4COMP;
+	if(_state==WAIT4AFTER && (_computeFor = myrand(_computeMin, _computeMax))!=0){
+		//registerEventIn(_computeFor);
+		_state = PREPCOMP;
 	}else{
 		_state = WAIT4CMD;
 		_outgoingCmd->prepare(_lastControlTransfer);
@@ -115,8 +137,20 @@ void AvTransition::eventQCallback(){
 
 void AvTransition::setOutgoingCmd(AvCmd* iCmd){
 	_outgoingCmd = iCmd;
+	_outgoingCmd->setIncomingTrans(this);
 }
 
 AvCmd* AvTransition::getOutgoingCmd(){
 	return _outgoingCmd;
 }
+
+std::string AvTransition::toString() const{
+	return AvNode::toString();
+}
+
+bool AvTransition::directExecution(){
+	std::cout << "let's crash\n";
+	bool anErg = !(_afterMin!=0 || _afterMax!=0 || (_actionFunc==0 && _computeMin==0 && _computeMax==0 && !_outgoingCmd->directExecution()) || (_condFunc!=0 && (_block->*_condFunc)()==0));
+	std::cout << "not crashed\n";
+	return anErg;
+}
diff --git a/simulators/c++av/src_simulator/app/AvTransition.h b/simulators/c++av/src_simulator/app/AvTransition.h
index dd2267349a2fe3a2a1c76060e39d342780da57f1..eed402e11d2b54234e545fe0cb1807f179727ee7 100644
--- a/simulators/c++av/src_simulator/app/AvTransition.h
+++ b/simulators/c++av/src_simulator/app/AvTransition.h
@@ -45,14 +45,14 @@ Ludovic Apvrille, Renaud Pacalet
 #include <AvCheckpoint.h>
 #include <EventQueueCallback.h>
 
-enum state_enum{DISABLED, WAIT4AFTER, WAIT4COMP, WAIT4CMD};
+enum state_enum{DISABLED, WAIT4AFTER, PREPCOMP, WAIT4COMP, WAIT4CMD};
 typedef enum state_enum TransitionState;
 
 class AvCmd;
 
 class AvTransition: public AvNode, public AvCheckpoint, public EventQueueCallback{
 public:
-	AvTransition(ID iID, AvBlock* iBlock, CondFuncPointer iCondFunc, AVTTime iAfterMin, AVTTime iAfterMax, AVTTime iComputeMin, AVTTime iComputeMax, ActionFuncPointer iActionFunc);
+	AvTransition(ID iID, AvBlock* iBlock, CondFuncPointer iCondFunc, ParamType iAfterMin, ParamType iAfterMax, ParamType iComputeMin, ParamType iComputeMax, ActionFuncPointer iActionFunc);
 	~AvTransition();
 	AvNode* prepare(bool iControlTransfer);
 	AvNode* execute(const SystemTransition& iSyncCmd);
@@ -61,10 +61,12 @@ public:
 	void eventQCallback();
 	void setOutgoingCmd(AvCmd* iCmd);
 	AvCmd* getOutgoingCmd();
+	std::string toString() const;
+	bool directExecution();
 protected:
 	AvCmd* _outgoingCmd;
 	CondFuncPointer _condFunc;
-	AVTTime _afterMin, _afterMax, _computeMin, _computeMax;
+	ParamType _afterMin, _afterMax, _computeMin, _computeMax, _computeFor;
 	ActionFuncPointer _actionFunc;
 	TransitionState _state;
 	bool _lastControlTransfer;
diff --git a/simulators/c++av/src_simulator/definitions.h b/simulators/c++av/src_simulator/definitions.h
index bc481cec0b54a0f469844bcc136bc11319fe2acb..02b9f274523d3c0db944ad46a4fff9d3d44dbf70 100644
--- a/simulators/c++av/src_simulator/definitions.h
+++ b/simulators/c++av/src_simulator/definitions.h
@@ -68,8 +68,9 @@ Ludovic Apvrille, Renaud Pacalet
 
 #define xx__VARS(a1, a2, a3, a4, a5, a6, a7, a8, ...) (void*)&(a1), sizeof(a1), (void*)&(a2), sizeof(a2), (void*)&(a3), sizeof(a3), (void*)&(a4), sizeof(a4), (void*)&(a5), sizeof(a5), (void*)&(a6), sizeof(a6), (void*)&(a7), sizeof(a7), (void*)&(a8), sizeof(a8)
 #define xx__SIZE(a1, a2, a3, a4, a5, a6, a7, a8, ...) sizeof(a1)+sizeof(a2)+sizeof(a3)+sizeof(a4)+sizeof(a5)+sizeof(a6)+sizeof(a7)+sizeof(a8)
-#define PARAM_CPY(nb, a1, ...) nb, xx__VARS(a1, __VA_ARGS__, a1, a1, a1, a1, a1, a1, a1, a1)
+#define PARAM_CPY(nb, a1, ...) nb, xx__VARS(a1, ##__VA_ARGS__, a1, a1, a1, a1, a1, a1, a1, a1)
 #define PARAM_INIT(nb, ...) xx__SIZE(__VA_ARGS__, int[0], int[0], int[0], int[0], int[0], int[0], int[0], int[0]), PARAM_CPY(nb, __VA_ARGS__)
+#define COMMENTS
 
 class AvBlock;
 class TMLTask;
@@ -85,8 +86,8 @@ typedef unsigned int EventID;
 typedef unsigned int ID;
 typedef unsigned int AVTTime;
 typedef unsigned int (AvBlock::*CondFuncPointer) ();
-typedef unsigned int (AvBlock::*ActionFuncPointer) ();
-typedef unsigned int (AvBlock::*ParamSetFuncPointer) (Parameter*);
+typedef void (AvBlock::*ActionFuncPointer) ();
+typedef void (AvBlock::*ParamSetFuncPointer) (Parameter*);
 typedef Parameter* (AvBlock::*ParamGetFuncPointer) ();
 typedef std::vector<SystemTransition> EnabledTransList;
 ///keep track of reading/writing transitions in channels
@@ -94,6 +95,17 @@ typedef std::set<AvTransition*> AvTransSet;
 typedef std::queue<Parameter*> ParamQueue;
 typedef std::priority_queue< EvtQueueNode, std::vector<EvtQueueNode>, std::greater<EvtQueueNode> > PrioEventQueue;
 typedef std::list<AvBlock*> BlockList;
+struct ltstr{
+	bool operator()(const char* s1, const char* s2) const{
+		return strcmp(s1, s2) < 0;
+	}
+};
+
+///Datatype which associates a variable name with the coresponding pointer to that variable, used for look-up table of tasks
+typedef std::map<const char*, ParamType*, ltstr> VariableLookUpTableName;
+///Datatype which associates a variable ID with the coresponding pointer to that variable, used for look-up table of tasks
+typedef std::map<ID, ParamType*> VariableLookUpTableID;
+
 
 class SystemTransition{
 public:
diff --git a/simulators/c++av/src_simulator/sim/EventQueueCallback.h b/simulators/c++av/src_simulator/sim/EventQueueCallback.h
index 374afca20cb2bafb5ccfb2d602be23613d4d4fbc..644b9435cc26e5f305d1715e3aa9813c47820521 100644
--- a/simulators/c++av/src_simulator/sim/EventQueueCallback.h
+++ b/simulators/c++av/src_simulator/sim/EventQueueCallback.h
@@ -62,7 +62,9 @@ protected:
 	}
 	
 	void registerEventIn(AVTTime iTime){
+		std::cout << "register event in " << _simulator << "\n";
 		_simulator->registerEvent(EvtQueueNode(this, iTime + _simulator->getSimulationTime(), _evtID));
+		std::cout << "register event in end\n";
 	}
 	
 	void cancelEvent(){
diff --git a/simulators/c++av/src_simulator/sim/Simulator.cpp b/simulators/c++av/src_simulator/sim/Simulator.cpp
index 707dbf5d819db1c6df69eee011ca9bd51ae20779..51e200e62348b80bfb53dd18ab3742a1cba3e88a 100644
--- a/simulators/c++av/src_simulator/sim/Simulator.cpp
+++ b/simulators/c++av/src_simulator/sim/Simulator.cpp
@@ -40,6 +40,7 @@ Ludovic Apvrille, Renaud Pacalet
 #include<Simulator.h>
 #include<AvBlock.h>
 #include<EventQueueCallback.h>
+#include<AvCheckpoint.h>
 
 Simulator::Simulator(): _simTime(0){
 }
@@ -51,6 +52,7 @@ Simulator::~Simulator(){
 //}
 
 void Simulator::registerEvent(const EvtQueueNode &iNode){
+	std::cout << "evt queue register event for time: " << iNode.time << "\n";
 	_evtQueue.push(iNode);
 }
 
@@ -58,40 +60,52 @@ void Simulator::registerEvent(const EvtQueueNode &iNode){
 //}
 
 void Simulator::run(){
-	EnabledTransList aTransList(100);
-	unsigned int aUserChoice;
-	for (BlockList::const_iterator i=_blockList.begin(); i!= _blockList.end(); ++i){
-		(*i)->isEnabled(aTransList);
-	}
-	while(!aTransList.empty()){
+	EnabledTransList aTransList;
+	unsigned int aUserChoice=1;
+	while(aUserChoice>0 && advanceSimulationTime(aTransList)){
+		displaySystemState();
 		std::cout << "*** Enabled System Transitions ***\n";
 		for (unsigned int i=0; i< aTransList.size(); ++i){
-			std::cout << "(" << i+1 << ") " << aTransList[i].text << "\n";
+			std::cout << "(" << i+1 << ") in Block " << aTransList[i].block->toString() << " " << aTransList[i].text << "\n";
 		}
+		std::cout << "(0) Quit simulation\n";
 		aUserChoice=0;
-		while(aUserChoice<1 || aUserChoice>aTransList.size()){
+		do{
 			std::cout << "Please enter a transition no: ";
 			std::cin >> aUserChoice;
 			std::cout << "\n";
+		}while(aUserChoice>aTransList.size());
+		if (aUserChoice!=0){
+			aTransList[aUserChoice-1].block->execute(aTransList[aUserChoice-1]);
+			aTransList.clear();
+			//std::cout << "run: is enabled\n";
 		}
-		aUserChoice--;
-		aTransList[aUserChoice].block->execute(aTransList[aUserChoice]);
-		aTransList.clear();
-		for (BlockList::const_iterator i=_blockList.begin(); i!= _blockList.end(); ++i){
-			(*i)->isEnabled(aTransList);
+	}
+	displaySystemState();
+}
+
+void Simulator::displaySystemState(){
+	std::cout << "*** Current System State at time "<< _simTime << " ***\n";
+	for (BlockList::const_iterator i=_blockList.begin(); i!= _blockList.end(); ++i){
+		std::cout << "Block " << (*i)->toString() << ": " << (*i)->getCurrCommand()->toString() << "\n";
+	}
+}
+
+bool Simulator::advanceSimulationTime(EnabledTransList& iTransList){
+	for (BlockList::const_iterator i=_blockList.begin(); i!= _blockList.end(); ++i){
+		(*i)->isEnabled(iTransList);
+	}
+	while(iTransList.empty() && !_evtQueue.empty()){
+		_simTime = _evtQueue.top().time;
+		while(!_evtQueue.empty() && _simTime == _evtQueue.top().time){
+			_evtQueue.top().callBack->notifyEvent(_evtQueue.top().evtID);
+			_evtQueue.pop();
 		}
-		while(aTransList.empty() && !_evtQueue.empty()){
-			_simTime = _evtQueue.top().time;
-			while(!_evtQueue.empty() && _simTime == _evtQueue.top().time){
-				_evtQueue.top().callBack->notifyEvent(_evtQueue.top().evtID);
-				_evtQueue.pop();
-			}
-			for (BlockList::const_iterator i=_blockList.begin(); i!= _blockList.end(); ++i){
-				(*i)->isEnabled(aTransList);
-			}
+		for (BlockList::const_iterator i=_blockList.begin(); i!= _blockList.end(); ++i){
+			(*i)->isEnabled(iTransList);
 		}
-		
 	}
+	return !(iTransList.empty());
 }
 
 AVTTime Simulator::getSimulationTime(){
diff --git a/simulators/c++av/src_simulator/sim/Simulator.h b/simulators/c++av/src_simulator/sim/Simulator.h
index 1de03af322e0384c87b465bc645b16a91ccc3871..75c060325b89971c6d4664bc1f7cd25af195c8e8 100644
--- a/simulators/c++av/src_simulator/sim/Simulator.h
+++ b/simulators/c++av/src_simulator/sim/Simulator.h
@@ -54,6 +54,8 @@ public:
 	AVTTime getSimulationTime();
 	void addBlock(AvBlock* iBlock);
 protected:
+	bool advanceSimulationTime(EnabledTransList& iTransList);
+	void displaySystemState();
 	AVTTime _simTime;
 	PrioEventQueue _evtQueue;
 	BlockList _blockList;