diff --git a/build.txt b/build.txt
index 899d2c43f2dccc5c3253225b7e233d8351664536..b3fe745b31585769d17fc7ee582695183da6eece 100644
--- a/build.txt
+++ b/build.txt
@@ -1 +1 @@
-13049
\ No newline at end of file
+13057
\ No newline at end of file
diff --git a/simulators/c++2/src_simulator/app/TMLChannel.cpp b/simulators/c++2/src_simulator/app/TMLChannel.cpp
index 0f2bb5bafd489365fcb12cee6dd3c2f40bc99552..f014e8ad81c0a84b0febf39ba0187dff5f60e502 100755
--- a/simulators/c++2/src_simulator/app/TMLChannel.cpp
+++ b/simulators/c++2/src_simulator/app/TMLChannel.cpp
@@ -67,7 +67,7 @@ BusMaster* TMLChannel::getNextMaster(TMLTransaction* iTrans){
 }
 
 BusMaster* TMLChannel::getFirstMaster(TMLTransaction* iTrans){
-  std::cout<<"get First master"<<std::endl;
+  //std::cout<<"get First master"<<std::endl;
   //if (iTrans->getCommand()->getTask()==_writeTask){
   //std::cout << "fima 1\n";
   if (_masters==0 || _slaves==0 || _numberOfHops==0 ) {return 0;}
diff --git a/simulators/c++2/src_simulator/app/TMLTask.cpp b/simulators/c++2/src_simulator/app/TMLTask.cpp
index 4df24602a0f495474707dfdaf820d651f6f31b93..44e942fdc466cf5631547629bd0f7f8916d380eb 100755
--- a/simulators/c++2/src_simulator/app/TMLTask.cpp
+++ b/simulators/c++2/src_simulator/app/TMLTask.cpp
@@ -362,7 +362,7 @@ unsigned int TMLTask::getState() const{
 }
 
 TMLTransaction* TMLTask::getNextTransaction(TMLTime iEndSchedule) const{
-  std::cout<<"TMLTask get next trans"<<std::endl;
+  //std::cout<<"TMLTask get next trans"<<std::endl;
 	return (_currCommand==0)?0:_currCommand->getCurrTransaction();
 	//return (_currCommand==0 || _isScheduled)?0:_currCommand->getCurrTransaction();
 }
diff --git a/simulators/c++2/src_simulator/app/TMLWriteCommand.cpp b/simulators/c++2/src_simulator/app/TMLWriteCommand.cpp
index 8f8a4c9a6b52da35d10a128ed9dd7ed2b8631923..7001e2e016529efcf98a6367fa1a4e5788682a9d 100755
--- a/simulators/c++2/src_simulator/app/TMLWriteCommand.cpp
+++ b/simulators/c++2/src_simulator/app/TMLWriteCommand.cpp
@@ -50,13 +50,13 @@ TMLWriteCommand::TMLWriteCommand(ID iID, TMLTask* iTask, LengthFuncPointer iLeng
 }
 
 void TMLWriteCommand::execute(){
-	std::cout << "in write " << _channel << "\n";
-        std::cout << "Length of write:" << _length << std::endl;
+  //std::cout << "in write " << _channel << "\n";
+  //std::cout << "Length of write:" << _length << std::endl;
 	_channel->write();
 	//std::cout << "channel not zero\n";
-	std::cout << _currTransaction->getVirtualLength() << " samples written\n";
+	//std::cout << _currTransaction->getVirtualLength() << " samples written\n";
 	_progress+=_currTransaction->getVirtualLength();
-	 std::cout << "WriteCommand progress: " << _progress << std::endl << std::endl;
+	//std::cout << "WriteCommand progress: " << _progress << std::endl << std::endl;
 	//_task->setEndLastTransaction(_currTransaction->getEndTime());
 	_task->addTransaction(_currTransaction);
 	//std::cout << "Trans written: " << _currTransaction->toString() << "\n";
diff --git a/simulators/c++2/src_simulator/app/TMLbrbwChannel.cpp b/simulators/c++2/src_simulator/app/TMLbrbwChannel.cpp
index 16017733dcb7a02a18e3027c8047d1f11fde2845..2b6d56954494eb0ed6cf5b32c9401f48d4985450 100755
--- a/simulators/c++2/src_simulator/app/TMLbrbwChannel.cpp
+++ b/simulators/c++2/src_simulator/app/TMLbrbwChannel.cpp
@@ -61,7 +61,7 @@ void TMLbrbwChannel::testRead(TMLTransaction* iTrans){
 }
 
 void TMLbrbwChannel::write(){
-std::cout<<"write!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"<<std::endl;
+  //std::cout<<"write!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"<<std::endl;
 #ifdef LOSS_ENABLED
   if (_maxNbOfLosses > _nbOfLosses){
     TMLLength aLostBytes = _writeTrans->getVirtualLength() * _lossRate + _lossRemainder;
@@ -70,12 +70,12 @@ std::cout<<"write!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"<<std::endl;
     //aLostBytes /= 100;
     aLostBytes = min(aLostBytes/100, _maxNbOfLosses - _nbOfLosses);
     _content += _writeTrans->getVirtualLength() - aLostBytes;
-    std::cout << "Bytes to write: " << _writeTrans->getVirtualLength()-aLostBytes << "\n";
-    std::cout << "Bytes lost: " << aLostBytes << "\n";
+    //std::cout << "Bytes to write: " << _writeTrans->getVirtualLength()-aLostBytes << "\n";
+    //std::cout << "Bytes lost: " << aLostBytes << "\n";
     _nbOfLosses +=  aLostBytes;
   } else {
 #endif
-    std::cout << "write all  " << _writeTrans->getVirtualLength() << "\n";
+    //std::cout << "write all  " << _writeTrans->getVirtualLength() << "\n";
     _content+=_writeTrans->getVirtualLength();
 #ifdef LOSS_ENABLED
   }
diff --git a/simulators/c++2/src_simulator/arch/Bus.cpp b/simulators/c++2/src_simulator/arch/Bus.cpp
index ecafa4852a429a55971104ec7f6d6b956349f31f..4f5e782a26cde7b62ae7cf6a223701fbd53c6e19 100644
--- a/simulators/c++2/src_simulator/arch/Bus.cpp
+++ b/simulators/c++2/src_simulator/arch/Bus.cpp
@@ -91,7 +91,7 @@ void Bus::schedule(){
 
 //Adds the transaction determined by the scheduling algorithm to the internal list of scheduled transactions
 bool Bus::addTransaction(TMLTransaction* iTransToBeAdded){
-	std::cout << "Bus add trans ####" << _nextTransaction << "\n";
+  //std::cout << "Bus add trans ####" << _nextTransaction << "\n";
 	_endSchedule = _nextTransaction->getEndTime();
 	//std::cout << "set end time to " << _endSchedule << "\n";
 	//_transactList.push_back(_nextTransaction);
@@ -107,7 +107,7 @@ bool Bus::addTransaction(TMLTransaction* iTransToBeAdded){
 #endif
 	_nextTransaction = 0;
 	_schedulingNeeded=true;
-	std::cout << "End Bus add trans\n";
+	//std::cout << "End Bus add trans\n";
 	return true;
 }
 
@@ -257,14 +257,14 @@ void Bus::latencies2XML(std::ostringstream& glob, unsigned int id1, unsigned int
 
 //Returns the next signal change (for vcd output)
 void Bus::getNextSignalChange(bool iInit, SignalChangeData* oSigData){
-	std::cout<<"bus getnext"<<std::endl;
+  //std::cout<<"bus getnext"<<std::endl;
 	//std::ostringstream outp;
 	//std::cout << _transactList.size() << " elements in List of " << _name << std::endl;
 	if (iInit){
 		 _posTrasactListVCD=_transactList.begin();
 		_previousTransEndTime=0;
 		 _vcdOutputState=INIT_BUS;
-		std::cout<<"bus init"<<std::endl;
+		 //std::cout<<"bus init"<<std::endl;
 	}
 	if (_posTrasactListVCD == _transactList.end()){
 		//outp << VCD_PREFIX << vcdValConvert(END_IDLE_BUS) << "bus" << _ID;
@@ -272,13 +272,13 @@ void Bus::getNextSignalChange(bool iInit, SignalChangeData* oSigData){
 		//oNoMoreTrans=true;
 		//return _previousTransEndTime;
 		new (oSigData) SignalChangeData(END_IDLE_BUS, _previousTransEndTime, this);
-		std::cout<<"bus end "<<std::endl;
+		//std::cout<<"bus end "<<std::endl;
 	}else{
 		TMLTransaction* aCurrTrans=*_posTrasactListVCD;
 		//oNoMoreTrans=false;
 		switch (_vcdOutputState){
 			case END_READ_BUS:
-			std::cout<<"BUS END_READ_BUS"<<std::endl;
+			  //std::cout<<"BUS END_READ_BUS"<<std::endl;
 				do{
 					_previousTransEndTime=(*_posTrasactListVCD)->getEndTime();
 					_posTrasactListVCD++;
@@ -297,7 +297,7 @@ void Bus::getNextSignalChange(bool iInit, SignalChangeData* oSigData){
 				//return _previousTransEndTime;
 			break;
 			case END_WRITE_BUS:
-			std::cout<<"BUS END_WRTIE_BUS"<<std::endl;
+			  //std::cout<<"BUS END_WRTIE_BUS"<<std::endl;
 				do{
 					_previousTransEndTime=(*_posTrasactListVCD)->getEndTime();
 					_posTrasactListVCD++;
@@ -316,7 +316,7 @@ void Bus::getNextSignalChange(bool iInit, SignalChangeData* oSigData){
 				//return _previousTransEndTime;
 			break;
 			case INIT_BUS:
-			std::cout<<"BUS INIT_BUS"<<std::endl;
+			  //std::cout<<"BUS INIT_BUS"<<std::endl;
 				if (aCurrTrans->getStartTimeOperation()!=0){
 					_vcdOutputState=END_IDLE_BUS;
 					//outp << VCD_PREFIX << vcdValConvert(END_IDLE_BUS) << "bus" << _ID;
@@ -326,7 +326,7 @@ void Bus::getNextSignalChange(bool iInit, SignalChangeData* oSigData){
 					return;
 				}
 			case END_IDLE_BUS:
-			std::cout<<"BUS END_IDLE_BUS"<<std::endl;
+			  //std::cout<<"BUS END_IDLE_BUS"<<std::endl;
 				if (aCurrTrans->getCommand()->getTask()==aCurrTrans->getChannel()->getBlockedReadTask()){
 					_vcdOutputState=END_READ_BUS;
 					new (oSigData) SignalChangeData(END_READ_BUS, aCurrTrans->getStartTimeOperation(), this);
diff --git a/simulators/c++2/src_simulator/arch/CPU.cpp b/simulators/c++2/src_simulator/arch/CPU.cpp
index 7eb14f6474a3de5ef686b9c814ad4caaf953ad75..980964ea42163a533d969b32c66daa15efc7f2ca 100644
--- a/simulators/c++2/src_simulator/arch/CPU.cpp
+++ b/simulators/c++2/src_simulator/arch/CPU.cpp
@@ -51,7 +51,7 @@ double CPU::averageLoad (unsigned int n) const{
       _maxEndTime=max(_maxEndTime,_endTime);
     }
   }
-  std::cout<<"max end time is "<<_maxEndTime<<std::endl;
+  //std::cout<<"max end time is "<<_maxEndTime<<std::endl;
   for( TransactionList::const_iterator i = _transactList.begin(); i != _transactList.end(); ++i ) {
     if( (*i)->getTransactCoreNumber() == n ){
       _averageLoad += (*i)->getEndTime() - (*i)->getStartTime();
@@ -124,8 +124,8 @@ void CPU::schedule2HTML(std::ofstream& myfile) const {
     TMLTime aCurrTime = 0;
 
     for( TransactionList::const_iterator i = _transactList.begin(); i != _transactList.end(); ++i ) {
-      std::cout<<"get transaction core number is: "<<(*i)->getTransactCoreNumber()<<std::endl;
-      std::cout<<"time : "<<_cycleTime<<std::endl;
+      //std::cout<<"get transaction core number is: "<<(*i)->getTransactCoreNumber()<<std::endl;
+      //std::cout<<"time : "<<_cycleTime<<std::endl;
       //std::cout << "CPU:calcSTL: html of CPU " << _name << ": " << (*i)->toString() << std::endl;
       if( (*i)->getTransactCoreNumber() == this->_cycleTime ){
 	TMLTransaction* aCurrTrans = *i;
diff --git a/simulators/c++2/src_simulator/arch/MultiCoreCPU.cpp b/simulators/c++2/src_simulator/arch/MultiCoreCPU.cpp
index 308aaa8c2286f21377e0a3e3d518daee42b8b7f3..4028e122f6ba5486a59d096e248af328fc89befc 100644
--- a/simulators/c++2/src_simulator/arch/MultiCoreCPU.cpp
+++ b/simulators/c++2/src_simulator/arch/MultiCoreCPU.cpp
@@ -110,13 +110,13 @@ void MultiCoreCPU::initCore(){
 TMLTime MultiCoreCPU::getMinEndSchedule(){
   TMLTime minTime=multiCore[0];
   for( TMLTime i = 0; i < multiCore.size(); i++){
-    std::cout<<"core number is: "<<i<<" end schedule is "<<multiCore[i]<<std::endl;
+    //std::cout<<"core number is: "<<i<<" end schedule is "<<multiCore[i]<<std::endl;
     if( minTime >= multiCore[i]){
       minTime=multiCore[i];
       coreNumber=i;
       } 
   }
-  std::cout<<"in getMinEndSchedule core number is "<<coreNumber<<std::endl;
+  //std::cout<<"in getMinEndSchedule core number is "<<coreNumber<<std::endl;
   return minTime;
 }
     
@@ -149,12 +149,12 @@ std::cout<<"getNextTransaction"<<_name<<std::endl;
 }
 
 void MultiCoreCPU::calcStartTimeLength(TMLTime iTimeSlice){
-std::cout<<"calcStartTimeLength"<<_name<<std::endl;
+  //std::cout<<"calcStartTimeLength"<<_name<<std::endl;
 #ifdef DEBUG_CPU
   std::cout << "CPU:calcSTL: scheduling decision of CPU " << _name << ": " << _nextTransaction->toString() << std::endl;
 #endif
 #ifdef BUS_ENABLED
-std::cout << "CPU:calcSTL: scheduling decision of CPU " << _name << ": " << _nextTransaction->toString() << std::endl;
+  std::cout << "CPU:calcSTL: scheduling decision of CPU " << _name << ": " << _nextTransaction->toString() << std::endl;
   //std::cout << " " << std::endl;
   TMLChannel* aChannel=_nextTransaction->getCommand()->getChannel(0);
   //std::cout << "after get channel " << std::endl;
diff --git a/simulators/c++2/src_simulator/arch/SchedulableDevice.cpp b/simulators/c++2/src_simulator/arch/SchedulableDevice.cpp
index d528b73267a381e33a9940b623bef4e6dd2938a9..346ac1b21c0a9b2e4f7b4e6a10ebf24bad5c318a 100644
--- a/simulators/c++2/src_simulator/arch/SchedulableDevice.cpp
+++ b/simulators/c++2/src_simulator/arch/SchedulableDevice.cpp
@@ -197,7 +197,7 @@ double SchedulableDevice::averageLoad() const{
       TMLTime _endTime= (*i)->getEndTime();
       _maxEndTime=max(_maxEndTime,_endTime);
   }
-  std::cout<<"max end time is "<<_maxEndTime<<std::endl;
+  //std::cout<<"max end time is "<<_maxEndTime<<std::endl;
   for( TransactionList::const_iterator i = _transactList.begin(); i != _transactList.end(); ++i ) {
      _averageLoad += (*i)->getEndTime() - (*i)->getStartTime();  
   
@@ -264,9 +264,9 @@ void SchedulableDevice::schedule2HTML(std::ofstream& myfile) const {
 		TMLTime aCurrTime = 0;
 
 		for( TransactionList::const_iterator i = _transactList.begin(); i != _transactList.end(); ++i ) {
-		  std::cout<<"get transaction core number is: "<<(*i)->getTransactCoreNumber()<<std::endl;
-		  std::cout<<"time : "<<_cycleTime<<std::endl;
-		  std::cout << "CPU:calcSTL: html of CPU " << _name << ": " << (*i)->toString() << std::endl;
+		  //std::cout<<"get transaction core number is: "<<(*i)->getTransactCoreNumber()<<std::endl;
+		  //std::cout<<"time : "<<_cycleTime<<std::endl;
+		  //std::cout << "CPU:calcSTL: html of CPU " << _name << ": " << (*i)->toString() << std::endl;
 		  //if( (*i)->getTransactCoreNumber() == this->_cycleTime ){
 			TMLTransaction* aCurrTrans = *i;
 			unsigned int aBlanks = aCurrTrans->getStartTime() - aCurrTime;
diff --git a/simulators/c++2/src_simulator/arch/SingleCoreCPU.cpp b/simulators/c++2/src_simulator/arch/SingleCoreCPU.cpp
index 1051283fa3ff1b8a1d477aa5b49225452dc60e8f..9eb8cd517eddf5cd4e3d1e009902f9671cb8f7af 100644
--- a/simulators/c++2/src_simulator/arch/SingleCoreCPU.cpp
+++ b/simulators/c++2/src_simulator/arch/SingleCoreCPU.cpp
@@ -88,7 +88,7 @@ SingleCoreCPU::~SingleCoreCPU(){
 }
 
 TMLTransaction* SingleCoreCPU::getNextTransaction(){
-std::cout<<"getNextTransaction!!!!!"<<std::endl;
+  //std::cout<<"getNextTransaction!!!!!"<<std::endl;
 #ifdef BUS_ENABLED
   if (_masterNextTransaction==0 || _nextTransaction==0){
     return _nextTransaction;
@@ -120,23 +120,23 @@ void SingleCoreCPU::calcStartTimeLength(TMLTime iTimeSlice){
   std::cout << "CPU:calcSTL: scheduling decision of CPU " << _name << ": " << _nextTransaction->toString() << std::endl;
 #endif
 #ifdef BUS_ENABLED
-  std::cout << "CPU:calcSTL: scheduling decision of CPU " << _name << ": " << _nextTransaction->toString() << std::endl;
-  std::cout << "get channel " << std::endl;
+  //std::cout << "CPU:calcSTL: scheduling decision of CPU " << _name << ": " << _nextTransaction->toString() << std::endl;
+  //std::cout << "get channel " << std::endl;
   TMLChannel* aChannel=_nextTransaction->getCommand()->getChannel(0);
-  std::cout << "after get channel " << std::endl;
+  //std::cout << "after get channel " << std::endl;
   if (aChannel==0) {
     //std::cout << "no channel " << std::endl;
     _masterNextTransaction=0;
   } else {
-    std::cout << "get bus " << std::endl;
+    //std::cout << "get bus " << std::endl;
     _masterNextTransaction= getMasterForBus(aChannel->getFirstMaster(_nextTransaction));
-    std::cout << "after get first bus " << std::endl;
+    //std::cout << "after get first bus " << std::endl;
     if (_masterNextTransaction!=0){
-      std::cout << "before register transaction at bus " << _masterNextTransaction->toString() << std::endl;
+      //std::cout << "before register transaction at bus " << _masterNextTransaction->toString() << std::endl;
       _masterNextTransaction->registerTransaction(_nextTransaction);
-      std::cout << "Transaction registered at bus " << _masterNextTransaction->toString() << std::endl;
+      //std::cout << "Transaction registered at bus " << _masterNextTransaction->toString() << std::endl;
     } else {
-      std::cout << "                          NO MASTER NEXT TRANSACTION " << std::endl;
+      //std::cout << "                          NO MASTER NEXT TRANSACTION " << std::endl;
     }
   }
 #endif
@@ -144,7 +144,7 @@ void SingleCoreCPU::calcStartTimeLength(TMLTime iTimeSlice){
   TMLTime aStartTime = max(_endSchedule,_nextTransaction->getRunnableTime());
   TMLTime aReminder = aStartTime % _timePerCycle;
   if (aReminder!=0) aStartTime+=_timePerCycle - aReminder;
-  std::cout << "CPU: set start time in CPU=" << aStartTime << " Reminder=" << aReminder <<"\n";
+  //std::cout << "CPU: set start time in CPU=" << aStartTime << " Reminder=" << aReminder <<"\n";
 
   _nextTransaction->setStartTime(aStartTime);
 
@@ -174,7 +174,7 @@ void SingleCoreCPU::calcStartTimeLength(TMLTime iTimeSlice){
 }
 
 void SingleCoreCPU::truncateAndAddNextTransAt(TMLTime iTime){ 
-  std::cout<<"cpu truncatenextTransct"<<std::endl;
+  //std::cout<<"cpu truncatenextTransct"<<std::endl;
   //std::cout << "CPU:schedule BEGIN " << _name << "+++++++++++++++++++++++++++++++++\n";
   //return truncateNextTransAt(iTime);
   //not a problem if scheduling does not take place at time when transaction is actually truncated, tested
@@ -234,10 +234,10 @@ TMLTime SingleCoreCPU::truncateNextTransAt(TMLTime iTime){
 }
 
 bool SingleCoreCPU::addTransaction(TMLTransaction* iTransToBeAdded){
-std::cout<<"addTransaction"<<std::endl;
+  //std::cout<<"addTransaction"<<std::endl;
   bool aFinish;
   //TMLTransaction* aTransCopy=0;
-  std::cout << "*************** LOOKING for master of" << _nextTransaction->toString() << std::endl;
+  //std::cout << "*************** LOOKING for master of" << _nextTransaction->toString() << std::endl;
   if (_masterNextTransaction==0){
     aFinish=true;
 #ifdef DEBUG_CPU
@@ -251,31 +251,31 @@ std::cout<<"addTransaction"<<std::endl;
     //std::cout << "*************** LOOKING for master of" << _nextTransaction->toString() << std::endl;
     BusMaster* aFollowingMaster =_nextTransaction->getChannel()->getNextMaster(_nextTransaction);
     if (aFollowingMaster==0){
-      std::cout << "1\n";
+      //std::cout << "1\n";
       aFinish=true;
       //aTransCopy = new TMLTransaction(*_nextTransaction);
       //_nextTransaction = aTransCopy;
       BusMaster* aTempMaster = getMasterForBus(_nextTransaction->getChannel()->getFirstMaster(_nextTransaction));
-      std::cout << "2\n";
+      //std::cout << "2\n";
       Slave* aTempSlave= _nextTransaction->getChannel()->getNextSlave(_nextTransaction);
-      std::cout << "3\n";
+      //std::cout << "3\n";
       aTempMaster->addBusContention(_nextTransaction->getStartTime()-max(_endSchedule,_nextTransaction->getRunnableTime()));
       while (aTempMaster!=0){
-        std::cout << "3a\n";
+        //std::cout << "3a\n";
         aTempMaster->addTransaction(_nextTransaction);
-        std::cout << "3b\n";
+        //std::cout << "3b\n";
         //if (aTempSlave!=0) aTempSlave->addTransaction(_nextTransaction);
         if (aTempSlave!=0) aTempSlave->addTransaction(_nextTransaction);  //NEW
-        std::cout << "4\n";
+        //std::cout << "4\n";
         aTempMaster =_nextTransaction->getChannel()->getNextMaster(_nextTransaction);
-        std::cout << "5\n";
+        //std::cout << "5\n";
         aTempSlave= _nextTransaction->getChannel()->getNextSlave(_nextTransaction);
       }
-      std::cout << "6\n";
+      //std::cout << "6\n";
     } else {
-      std::cout << _name << " bus transaction next round" << std::endl;
+      //std::cout << _name << " bus transaction next round" << std::endl;
       _masterNextTransaction=aFollowingMaster;
-      std::cout << "7\n";
+      //std::cout << "7\n";
       _masterNextTransaction->registerTransaction(_nextTransaction);
       aFinish=false;
     }
@@ -311,7 +311,7 @@ std::cout<<"addTransaction"<<std::endl;
 
 void SingleCoreCPU::schedule(){
   //std::cout <<"Hello\n";
-  std::cout << "CPU:schedule BEGIN " << _name << "+++++++++++++++++++++++++++++++++\n";
+  //std::cout << "CPU:schedule BEGIN " << _name << "+++++++++++++++++++++++++++++++++\n";
   TMLTime aTimeSlice = _scheduler->schedule(_endSchedule);
   //_schedulingNeeded=false;  05/05/11
   //std::cout << "1\n";
@@ -334,7 +334,7 @@ void SingleCoreCPU::schedule(){
   }
   //std::cout << "5\n";
   if (_nextTransaction!=0 && aOldTransaction != _nextTransaction) calcStartTimeLength(aTimeSlice);
-  std::cout << "CPU:schedule END " << _name << "+++++++++++++++++++++++++++++++++\n";
+  //std::cout << "CPU:schedule END " << _name << "+++++++++++++++++++++++++++++++++\n";
 }
 
 //std::string SingleCoreCPU::toString() const{
@@ -542,7 +542,7 @@ void SingleCoreCPU::streamBenchmarks(std::ostream& s) const{
   s << TAG_CPUo << " id=\"" << _ID << "\" name=\"" << _name << "\">" << std::endl;
   if (_simulatedTime!=0) s << TAG_UTILo << (static_cast<float>(_busyCycles)/static_cast<float>(_simulatedTime)) << TAG_UTILc;
   s << TAG_ENERGYo << ( (_simulatedTime/_timePerCycle)*_static_consumPerCycle) + ((_busyCycles/_timePerCycle)*_dynamic_consumPerCycle) << TAG_ENERGYc;
-  std::cout<< "power consumption "<< ((_simulatedTime/_timePerCycle)*_static_consumPerCycle) + ((_busyCycles/_timePerCycle)*_dynamic_consumPerCycle)<< std::endl;
+  //std::cout<< "power consumption "<< ((_simulatedTime/_timePerCycle)*_static_consumPerCycle) + ((_busyCycles/_timePerCycle)*_dynamic_consumPerCycle)<< std::endl;
   for(BusMasterList::const_iterator i=_busMasterList.begin(); i != _busMasterList.end(); ++i) (*i)->streamBenchmarks(s);
 
   s << TAG_CPUc;
diff --git a/simulators/c++2/src_simulator/arch/WorkloadSource.h b/simulators/c++2/src_simulator/arch/WorkloadSource.h
index 9857e43c85851472f3c40a0184648a0251b73d31..185a914f4d1e68fc6c8df648a99b5b51a8746801 100644
--- a/simulators/c++2/src_simulator/arch/WorkloadSource.h
+++ b/simulators/c++2/src_simulator/arch/WorkloadSource.h
@@ -64,7 +64,7 @@ public:
 	WorkloadSource(Priority iPriority, WorkloadSource** aSourceArray, unsigned int iNbOfSources): _priority(iPriority), _srcArraySpecified(true){
 		for (unsigned int i=0;i<iNbOfSources;i++){
 			addWorkloadSource(aSourceArray[i]);
-			std::cout << "Workload source added " << aSourceArray[i]->toString() << "\n";
+			//std::cout << "Workload source added " << aSourceArray[i]->toString() << "\n";
 		}
 		delete[] aSourceArray;
 	}
diff --git a/simulators/c++2/src_simulator/sim/Simulator.cpp b/simulators/c++2/src_simulator/sim/Simulator.cpp
index c9cfadf7977e8fea96e2c527ca1e957149b679fa..201ddc0e1edd930c9324685036ab5e530d12fa97 100644
--- a/simulators/c++2/src_simulator/sim/Simulator.cpp
+++ b/simulators/c++2/src_simulator/sim/Simulator.cpp
@@ -443,7 +443,7 @@ std::cout<<"schedule2HTML--------------------------------------*****************
     //for(CPUList::const_iterator i=_simComp->getCPUIterator(false); i != _simComp->getCPUIterator(true); ++i){
     for(CPUList::const_iterator i=_simComp->getCPUList().begin(); i != _simComp->getCPUList().end(); ++i){
       for(unsigned int j = 0; j < (*i)->getAmoutOfCore(); j++) {
-        std::cout<<"core number is "<<(*i)->getAmoutOfCore()<<std::endl;
+        //std::cout<<"core number is "<<(*i)->getAmoutOfCore()<<std::endl;
 	(*i)->schedule2HTML(myfile);
        	(*i)->showPieChart(myfile);
 	(*i)->setCycleTime((*i)->getCycleTime()+1);
@@ -459,8 +459,8 @@ std::cout<<"schedule2HTML--------------------------------------*****************
       (*j)->setStartFlagHTML(true);
       for(TaskList::const_iterator i = (*j)->getTaskList().begin(); i != (*j)->getTaskList().end(); ++i){
       	(*j)->setHtmlCurrTask(*i);
-	std::cout<<"begin fpga html "<<(*j)->toShortString()<<std::endl;
-	std::cout<<"task is !!!!!"<<(*i)->toString()<<std::endl;
+	//std::cout<<"begin fpga html "<<(*j)->toShortString()<<std::endl;
+	//std::cout<<"task is !!!!!"<<(*i)->toString()<<std::endl;
 	(*j)->schedule2HTML(myfile);
 	(*j)->setStartFlagHTML(false);
       }
@@ -674,14 +674,17 @@ bool Simulator::simulate(TMLTransaction*& oLastTrans){
 #endif
   _simComp->setStopFlag(false,"");
   for(TaskList::const_iterator i=_simComp->getTaskList().begin(); i!=_simComp->getTaskList().end();i++){
+    //std::cout << "task preparation:" << (*i)->toString() << std::endl;
+    //if ((*i)->getCurrCommand()!=0) std::cout<<(*i)->getCurrCommand()->toString() << std::endl;
     if ((*i)->getCurrCommand()!=0) (*i)->getCurrCommand()->prepare(true);
+    //std::cout << "task preparation done:" << (*i)->toString() << std::endl;
   }
 #ifdef EBRDD_ENABLED
   for(EBRDDList::const_iterator i=_simComp->getEBRDDIterator(false); i!=_simComp->getEBRDDIterator(true);i++){
     if ((*i)->getCurrCommand()!=0) (*i)->getCurrCommand()->prepare();
   }
 #endif
-  std::cout<<"simulate"<<std::endl;
+  //std::cout<<"simulate"<<std::endl;
   for_each(_simComp->getCPUList().begin(), _simComp->getCPUList().end(),std::mem_fun(&CPU::schedule));
 
   for_each(_simComp->getFPGAList().begin(), _simComp->getFPGAList().end(),std::mem_fun(&FPGA::schedule));
@@ -693,15 +696,15 @@ bool Simulator::simulate(TMLTransaction*& oLastTrans){
 #endif
   while ( transLET!=0 && !_simComp->getStopFlag()){
     
-      std::cout<<"come in cpu"<<std::endl;
+    //std::cout<<"come in cpu"<<std::endl;
 #ifdef DEBUG_KERNEL
       std::cout << "kernel:simulate: scheduling decision: " <<  transLET->toString() << std::endl;
 #endif
 
 	commandLET=transLET->getCommand();
-	std::cout<<"device is "<<deviceLET->getName()<<std::endl;
+	//std::cout<<"device is "<<deviceLET->getName()<<std::endl;
         bool x = deviceLET->addTransaction(0);
-	std::cout<<"in simulator end addTransactin"<<std::endl;
+	//std::cout<<"in simulator end addTransactin"<<std::endl;
 #ifdef DEBUG_KERNEL
       std::cout << "kernel:simulate: AFTER add trans: " << x << std::endl;
 #endif
@@ -719,7 +722,7 @@ bool Simulator::simulate(TMLTransaction*& oLastTrans){
 	  depFPGA=depTask->getFPGA();
 	  
 	  if(depCPU){
-	    std::cout<<"lets start cpu"<<std::endl;
+	    //std::cout<<"lets start cpu"<<std::endl;
 	    if (depCPU!=deviceLET){
 #ifdef DEBUG_KERNEL
 	      std::cout << "kernel:simulate: Tasks running on different CPUs" << std::endl;
@@ -817,7 +820,7 @@ bool Simulator::simulate(TMLTransaction*& oLastTrans){
 #endif
       }
       oLastTrans=transLET;
-      std::cout<<"task is !!!!!"<<oLastTrans->toString()<<std::endl;
+      //std::cout<<"task is !!!!!"<<oLastTrans->toString()<<std::endl;
 	transLET=getTransLowestEndTime(deviceLET);	
     }
 
diff --git a/src/main/java/tmltranslator/TMLActivity.java b/src/main/java/tmltranslator/TMLActivity.java
index 03594e919a5a9ddb4f88ac548bfaf0e4f3a57b95..2c291a1fa8521488b66b8c507a9ba747938ab488 100755
--- a/src/main/java/tmltranslator/TMLActivity.java
+++ b/src/main/java/tmltranslator/TMLActivity.java
@@ -149,7 +149,7 @@ public class TMLActivity extends TMLElement {
         return found;
     }
 
-    private void replaceAllNext(TMLActivityElement _oldE, TMLActivityElement _newE) {
+    public void replaceAllNext(TMLActivityElement _oldE, TMLActivityElement _newE) {
         TMLActivityElement tmlae;
         for (int i = 0; i < elements.size(); i++) {
             tmlae = elements.elementAt(i);
diff --git a/src/main/java/tmltranslator/TMLActivityElement.java b/src/main/java/tmltranslator/TMLActivityElement.java
index a223aab70097113122d13aec1f2fadb77c10cc08..a0511572ad70fc96d572a2d6bf45e96f2e043b68 100755
--- a/src/main/java/tmltranslator/TMLActivityElement.java
+++ b/src/main/java/tmltranslator/TMLActivityElement.java
@@ -50,7 +50,7 @@ import java.util.Vector;
    * @version 1.0 23/11/2005
    * @author Ludovic APVRILLE
  */
-public abstract class TMLActivityElement extends TMLElement{
+public abstract class TMLActivityElement extends TMLElement {
     protected Vector<TMLActivityElement> nexts;
     public SecurityPattern securityPattern;
     private String value="";
diff --git a/src/main/java/tmltranslator/TMLChannel.java b/src/main/java/tmltranslator/TMLChannel.java
index 9fbfa817c0dfc703dae014d020969828dbdd01d6..d321d1793036006d85672899e9bf7c1b7a48ea58 100755
--- a/src/main/java/tmltranslator/TMLChannel.java
+++ b/src/main/java/tmltranslator/TMLChannel.java
@@ -84,7 +84,7 @@ public class TMLChannel extends TMLCommunicationElement {
     private String SP = " ";
     private int priority;
 
-    private int vc = -1;
+    private int vc = 0;
     
     public ArrayList<TMLTask> originalOriginTasks = new ArrayList<TMLTask>(); 
     public ArrayList<TMLTask> originalDestinationTasks = new ArrayList<TMLTask>(); 
@@ -191,6 +191,7 @@ public class TMLChannel extends TMLCommunicationElement {
     public int getNumberOfSamples() { return nbOfSamples;}
 
     public void setVC(int vc) {
+        TraceManager.addDev("Setting VC to " + vc + " for channel " + getName());
         this.vc = vc;
     }
 
@@ -517,9 +518,13 @@ public class TMLChannel extends TMLCommunicationElement {
         String s = TAB + "CHANNEL" + SP + name + CR;
         if (isBasicChannel()) {
             s += TAB2 + "Origin task: " + originTask.getName() + CR;
-            s += TAB2 + "Origin port: " + originPort.getName() + CR;
+            if (originPort != null) {
+                s += TAB2 + "Destination port: " + originPort.getName() + CR;
+            }
             s += TAB2 + "Destination task: " + destinationTask.getName() + CR;
-            s += TAB2 + "Destination port: " + destinationPort.getName() + CR;
+            if (destinationPort != null) {
+                s += TAB2 + "Destination port: " + destinationPort.getName() + CR;
+            }
         }
         if (isAForkChannel()) {
             s += TAB2 + "Origin task: " + originTasks.get(0).getName() + CR;
diff --git a/src/main/java/tmltranslator/TMLChoice.java b/src/main/java/tmltranslator/TMLChoice.java
index 9a2f7aa31caeb755effb7fcc1dc08faf3de9560e..465412eac9d8302add1931d00c42432ed068ac88 100755
--- a/src/main/java/tmltranslator/TMLChoice.java
+++ b/src/main/java/tmltranslator/TMLChoice.java
@@ -58,7 +58,14 @@ public class TMLChoice extends TMLActivityElement{
     }
 
     public void addGuard(String _g) {
-        guards.add(_g);
+        String g = _g.trim();
+        if(!(g.startsWith("["))) {
+            g = "[" + g;
+        }
+        if(!(g.endsWith("]"))) {
+            g = g + "]";
+        }
+        guards.add(g);
     }
 
     public int getNbGuard() {
diff --git a/src/main/java/tmltranslator/TMLError.java b/src/main/java/tmltranslator/TMLError.java
index e839315cca2f3190977b3dad040a71b9a9969383..50f7c42a2714647f65e21264fb7aa3f683546605 100755
--- a/src/main/java/tmltranslator/TMLError.java
+++ b/src/main/java/tmltranslator/TMLError.java
@@ -68,4 +68,22 @@ public class TMLError {
     public TMLError(int _type) {
         type = _type;
     }
+
+    public String toString() {
+        String ret = "";
+        ret += message + ".";
+        if (task != null) {
+            ret += " Task: " + task.getName();
+        }
+        if (element != null) {
+            ret += " Activity element: " + element.getName();
+        }
+        if (referenceObject != null) {
+            ret += " Reference: " + referenceObject.toString();
+        }
+
+        return ret;
+    }
+
+
 }
\ No newline at end of file
diff --git a/src/main/java/tmltranslator/TMLMapping.java b/src/main/java/tmltranslator/TMLMapping.java
index 9ed708160bb39b0a605a2b3c3bd854141357a497..a586ba0b187f46f669c1e6d2efc57b1c4aa7adfb 100755
--- a/src/main/java/tmltranslator/TMLMapping.java
+++ b/src/main/java/tmltranslator/TMLMapping.java
@@ -855,7 +855,7 @@ public class TMLMapping<E> {
                     TraceManager.addDev("\n\nFORKTASK is  mapped: " + task.getName());
                 }
             } else {
-                TraceManager.addDev("Non fork task found: " + task.getName());
+                //TraceManager.addDev("Non fork task found: " + task.getName());
             }
             if (task.getName().startsWith("JOINTASK_")) {
                 if (!isTaskMapped(task)) {
diff --git a/src/main/java/tmltranslator/TMLModeling.java b/src/main/java/tmltranslator/TMLModeling.java
index 59b987ddc942840c93979dff1253bd8d401d1d77..49a9a81230e9d7df01737e9ae6d34b628bf1ff71 100755
--- a/src/main/java/tmltranslator/TMLModeling.java
+++ b/src/main/java/tmltranslator/TMLModeling.java
@@ -697,6 +697,37 @@ public class TMLModeling<E> {
         return null;
     }
 
+
+    public List<TMLElement> getAllElementsWithName(String name) {
+        Vector<TMLElement> elts = new Vector<>();
+
+        for(TMLTask task: tasks) {
+            if (task.getName().compareTo(name) == 0) {
+                elts.add(task);
+            }
+        }
+
+        for(TMLChannel ch: channels) {
+            if (ch.getName().compareTo(name) == 0) {
+                elts.add(ch);
+            }
+        }
+
+        for(TMLEvent evt: events) {
+            if (evt.getName().compareTo(name) == 0) {
+                elts.add(evt);
+            }
+        }
+
+        for(TMLRequest req: requests) {
+            if (req.getName().compareTo(name) == 0) {
+                elts.add(req);
+            }
+        }
+
+        return elts;
+    }
+
     public List<TMLTask> getTasks() {
         return tasks;
     }
@@ -753,7 +784,7 @@ public class TMLModeling<E> {
                 list.add(ch);
             }
             for (TMLTask task: ch.getOriginTasks()){
-            	if (task ==t){
+            	if (task == t){
             		list.add(ch);
             	}
             }
diff --git a/src/main/java/tmltranslator/TMLSyntaxChecking.java b/src/main/java/tmltranslator/TMLSyntaxChecking.java
index 6d01fbb7b1dd4c49455234dcd870fd126bbb91f2..3f935dfef75c002f787cb4027d5f29d141e78695 100755
--- a/src/main/java/tmltranslator/TMLSyntaxChecking.java
+++ b/src/main/java/tmltranslator/TMLSyntaxChecking.java
@@ -48,10 +48,7 @@ import myutil.TraceManager;
 import tmltranslator.tomappingsystemc2.DiploSimulatorCodeGenerator;
 
 import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
+import java.util.*;
 
 
 /**
@@ -77,6 +74,8 @@ public class TMLSyntaxChecking {
     private final String TIME_UNIT_ERROR = "unknown time unit";
     private final String NO_NEXT_OPERATOR_ERROR = "No next operator";
     private final String SAME_PORT_NAME = "Two ports have the same name";
+    private final String WRONG_PARAMS = "The number of params is not compatible";
+    private final String DUPLICATE_NAMES = "Two elements have the same name";
 
     private final String TOO_MANY_MEMORIES = "Channel is mapped on more than one memory";
     private final String INVALID_CHANNEL_PATH = "Channel path is invalid";
@@ -117,6 +116,7 @@ public class TMLSyntaxChecking {
 
         TraceManager.addDev("Checking syntax of TML Mapping/ Modeling");
         if (!syntaxCheckForMappingOnly) {
+            checkDuplicateNames();
 
             checkReadAndWriteInChannelsEventsAndRequests();
 
@@ -207,6 +207,41 @@ public class TMLSyntaxChecking {
         }
     }
 
+
+    public void checkDuplicateNames() {
+        List<TMLElement> elts;
+
+        for(TMLTask task: tmlm.getTasks()) {
+            elts = tmlm.getAllElementsWithName(task.getName());
+            if (elts.size() > 1) {
+                addError(null, null, DUPLICATE_NAMES + ": invalid task name " + task.getName(), TMLError.ERROR_STRUCTURE);
+            }
+        }
+
+        for(TMLChannel ch: tmlm.getChannels()) {
+            elts = tmlm.getAllElementsWithName(ch.getName());
+            if (elts.size() > 1) {
+                addError(null, null, DUPLICATE_NAMES + ": invalid channel name " + ch.getName(), TMLError.ERROR_STRUCTURE);
+            }
+        }
+
+        for(TMLEvent evt: tmlm.getEvents()) {
+            elts = tmlm.getAllElementsWithName(evt.getName());
+            if (elts.size() > 1) {
+                addError(null, null, DUPLICATE_NAMES + ": invalid event name " + evt.getName(), TMLError.ERROR_STRUCTURE);
+            }
+        }
+
+        for(TMLRequest req: tmlm.getRequests()) {
+            elts = tmlm.getAllElementsWithName(req.getName());
+            if (elts.size() > 1) {
+                addError(null, null, DUPLICATE_NAMES + ": invalid request name " + req.getName(), TMLError.ERROR_STRUCTURE);
+            }
+        }
+
+
+    }
+
     //added by minh hiep
     public void checkAValidPortName() {
         List<TMLChannel> tmlChannels = tmlm.getChannels();
@@ -340,12 +375,16 @@ public class TMLSyntaxChecking {
                 }
 
                 if (elt instanceof TMLSendEvent) {
-
                     evt = ((TMLSendEvent) elt).getEvent();
-                    if (evt.isBasicEvent()) {
-                        //TraceManager.addDev("send evt= " + evt.getName() + " task=" + t.getName() + " origin=" + evt.getOriginTask().getName());
-                        if (evt.getOriginTask() != t) {
-                            addError(t, elt, evt.getName() + ": " + WRONG_ORIGIN_EVENT, TMLError.ERROR_BEHAVIOR);
+                    //TraceManager.addDev("In Task " + t.getName() + " = " + evt);
+                    if (evt == null) {
+                        addError(t, elt, "Null event in SendEvt of Task " + t.getName(), TMLError.ERROR_BEHAVIOR);
+                    } else {
+                        if (evt.isBasicEvent()) {
+                            //TraceManager.addDev("send evt= " + evt.getName() + " task=" + t.getName() + " origin=" + evt.getOriginTask().getName());
+                            if (evt.getOriginTask() != t) {
+                                addError(t, elt, evt.getName() + ": " + WRONG_ORIGIN_EVENT, TMLError.ERROR_BEHAVIOR);
+                            }
                         }
                     }
                 }
@@ -452,14 +491,24 @@ public class TMLSyntaxChecking {
                 } else if (elt instanceof TMLSendEvent) {
                     tmlase = (TMLSendEvent) elt;
                     evt = tmlase.getEvent();
-                    for (j = 0; j < tmlase.getNbOfParams(); j++) {
-                        action = tmlase.getParam(j);
-                        if ((action != null) && (action.length() > 0)) {
-                            type = evt.getType(j);
-                            if ((type == null) || (type.getType() == TMLType.NATURAL)) {
-                                parsing(t, elt, "actionnat", action);
-                            } else {
-                                parsing(t, elt, "actionbool", action);
+
+                    if (evt == null) {
+                        addError(t, elt, "Empty event in Sendevent of task " + t.getTaskName(), TMLError.ERROR_BEHAVIOR);
+                    } else if (tmlase.getNbOfParams() != evt.getNbOfParams()) {
+                        addError(t, elt, WRONG_PARAMS + " between event " + evt.getName() +
+                                " (nb:" + evt.getNbOfParams() +
+                                ") and send event (nb:" + tmlase.getNbOfParams() + ") in task " + t.getTaskName(), TMLError.ERROR_BEHAVIOR);
+                    } else {
+
+                        for (j = 0; j < tmlase.getNbOfParams(); j++) {
+                            action = tmlase.getParam(j);
+                            if ((action != null) && (action.length() > 0)) {
+                                type = evt.getType(j);
+                                if ((type == null) || (type.getType() == TMLType.NATURAL)) {
+                                    parsing(t, elt, "actionnat", action);
+                                } else {
+                                    parsing(t, elt, "actionbool", action);
+                                }
                             }
                         }
                     }
@@ -467,26 +516,35 @@ public class TMLSyntaxChecking {
                 } else if (elt instanceof TMLWaitEvent) {
                     tmlwe = (TMLWaitEvent) elt;
                     evt = tmlwe.getEvent();
-                    //TraceManager.addDev("Nb of params of wait event:" + tmlwe.getNbOfParams());
-                    for (j = 0; j < tmlwe.getNbOfParams(); j++) {
-                        action = tmlwe.getParam(j).trim();
-                        if ((action != null) && (action.length() > 0)) {
-                            if (!(Conversion.isId(action))) {
-                                addError(t, elt, SYNTAX_ERROR_VARIABLE_EXPECTED + " in expression " + action, TMLError.ERROR_BEHAVIOR);
-                            } else {
-                                // Declared variable?
-                                attr = t.getAttributeByName(action);
-                                if (attr == null) {
-                                    addError(t, elt, UNDECLARED_VARIABLE + ": " + action + " in expression " + action, TMLError.ERROR_BEHAVIOR);
-                                    TraceManager.addDev("1 In task: " + t.getName() + " extended name:" + t.getNameExtension());
+                    //TraceManager.addDev("Nb of params of wait event:" + tmlwe.getNbOfParams() + " task=" + t.getTaskName());
+
+
+                    if (tmlwe.getNbOfParams() != evt.getNbOfParams()) {
+                        addError(t, elt, WRONG_PARAMS + " between event " + evt.getName() +
+                                " (nb:" + evt.getNbOfParams() +
+                                ") and wait event (nb:" + tmlwe.getNbOfParams() + ") in task " + t.getTaskName(), TMLError.ERROR_BEHAVIOR);
+                    } else {
+
+                        for (j = 0; j < tmlwe.getNbOfParams(); j++) {
+                            action = tmlwe.getParam(j).trim();
+                            if ((action != null) && (action.length() > 0)) {
+                                if (!(Conversion.isId(action))) {
+                                    addError(t, elt, SYNTAX_ERROR_VARIABLE_EXPECTED + " in expression " + action, TMLError.ERROR_BEHAVIOR);
                                 } else {
-                                    //TraceManager.addDev("Nb of params:" + tmlwe.getEvent().getNbOfParams() + " j:" + j);
-                                    if (tmlwe.getEvent().getType(j).getType() == 0) {
-                                        TraceManager.addDev("0");
-                                    }
-                                    if (attr.getType().getType() != tmlwe.getEvent().getType(j).getType()) {
-                                        TraceManager.addDev("Type0:" + attr.getType().getType() + " type1:" + tmlwe.getEvent().getType(j).getType());
-                                        addError(t, elt, VARIABLE_ERROR + " :" + action + " in expression " + action, TMLError.ERROR_BEHAVIOR);
+                                    // Declared variable?
+                                    attr = t.getAttributeByName(action);
+                                    if (attr == null) {
+                                        addError(t, elt, UNDECLARED_VARIABLE + ": " + action + " in expression " + action, TMLError.ERROR_BEHAVIOR);
+                                        TraceManager.addDev("1 In task: " + t.getName() + " extended name:" + t.getNameExtension());
+                                    } else {
+                                        //TraceManager.addDev("Nb of params:" + tmlwe.getEvent().getNbOfParams() + " j:" + j);
+                                        if (tmlwe.getEvent().getType(j).getType() == 0) {
+                                            TraceManager.addDev("0");
+                                        }
+                                        if (attr.getType().getType() != tmlwe.getEvent().getType(j).getType()) {
+                                            TraceManager.addDev("Type0:" + attr.getType().getType() + " type1:" + tmlwe.getEvent().getType(j).getType());
+                                            addError(t, elt, VARIABLE_ERROR + " :" + action + " in expression " + action, TMLError.ERROR_BEHAVIOR);
+                                        }
                                     }
                                 }
                             }
@@ -740,12 +798,13 @@ public class TMLSyntaxChecking {
         // Then we find the corresponding CPUs
         for (TMLTask task : tasks) {
             //We collect all the CPUs
-            //TraceManager.addDev("Collecting all CPUs of task: " + task.getTaskName());
+            TraceManager.addDev("Collecting all CPUs of task: " + task.getTaskName());
             for (HwExecutionNode origin : mapping.getAllHwExecutionNodesOfTask(task)) {
                 // And then we check the paths between node and all the nodes of ch
                 for (HwCommunicationNode destination : mapping.getAllCommunicationNodesOfChannel(ch)) {
-                    //TraceManager.addDev("Computing path between " + origin + " and " + destination);
+                    TraceManager.addDev("Computing path between " + origin.getName() + " and " + destination.getName());
                     if (!mapping.checkPath(origin, destination)) {
+                        TraceManager.addDev("Checking checkPathToMemoryFromCPU: Adding error");
                         addError(null, null, INVALID_CHANNEL_PATH + ": " + ch.getName(), TMLError.ERROR_STRUCTURE);
                         return;
                     }
@@ -756,11 +815,13 @@ public class TMLSyntaxChecking {
     }
 
     private void checkPathToMemoryFromAllHwCommNode(TMLChannel ch) {
+        TraceManager.addDev("Checking checkPathToMemoryFromAllHwCommNode");
         HwMemory mem = mapping.getMemoryOfChannel(ch);
         if (mem != null) {
             for (HwCommunicationNode origin : mapping.getAllCommunicationNodesOfChannel(ch)) {
                 if (origin != mem) {
                     if (!mapping.checkPath(origin, mem)) {
+                        TraceManager.addDev("Checking checkPathToMemoryFromAllHwCommNode: Adding error");
                         addError(null, null, INVALID_CHANNEL_PATH + ": " + ch.getName(), TMLError.ERROR_STRUCTURE);
                         return;
                     }
diff --git a/src/main/java/tmltranslator/TMLTask.java b/src/main/java/tmltranslator/TMLTask.java
index bb9240e9a11e8fb18690106d801ce52762e82823..aed8f53460e78f0640902f589b9781867baef02b 100755
--- a/src/main/java/tmltranslator/TMLTask.java
+++ b/src/main/java/tmltranslator/TMLTask.java
@@ -113,6 +113,16 @@ public class TMLTask extends TMLElement {
         attributes.add(_tmla);
     }
 
+
+    public void addAttributeIfApplicable(TMLAttribute _tmla) {
+        for(TMLAttribute att: attributes) {
+            if (att.getName().compareTo(_tmla.getName()) == 0) {
+                return;
+            }
+        }
+        attributes.add(_tmla);
+    }
+
     public List<TMLAttribute> getAttributes() {
         return attributes;
     }
@@ -379,9 +389,9 @@ public class TMLTask extends TMLElement {
         writeTMLChannelsList.add(_ch);
     }
 
-    public List<TMLChannel> getTMLChannels() {
+    /*public List<TMLChannel> getTMLChannels() {
         return new ArrayList<TMLChannel>(channelsList);
-    }
+    }*/
 
     public List<TMLChannel> getReadTMLChannels() {
         return new ArrayList<TMLChannel>(readTMLChannelsList);
diff --git a/src/main/java/tmltranslator/TMLTextSpecification.java b/src/main/java/tmltranslator/TMLTextSpecification.java
index 299508698f43bbd7bf2d16e38470c19ca1e667c2..5a9ceb9ece52b2435600fa63c1e9d44725f74c02 100755
--- a/src/main/java/tmltranslator/TMLTextSpecification.java
+++ b/src/main/java/tmltranslator/TMLTextSpecification.java
@@ -353,6 +353,9 @@ public class TMLTextSpecification<E> {
         String sb = "";
         sb += "//Local variables" + CR;
 
+        //TraceManager.addDev("Making activity of task:" + task.getTaskName());
+
+
         for (TMLAttribute attr : task.getAttributes()) {
             sb += TMLType.getStringType(attr.getType().getType()) + SP + attr.getName();
             if ((attr.getInitialValue() != null) && (attr.getInitialValue().length() > 0)) {
diff --git a/src/main/java/tmltranslator/tomappingsystemc2/DiploSimulatorCodeGenerator.java b/src/main/java/tmltranslator/tomappingsystemc2/DiploSimulatorCodeGenerator.java
index d7cf9c87fbcb54d25fdaef7d71a51b4e31589cde..9503391ce5f079731be73462270fccbbdb918c75 100644
--- a/src/main/java/tmltranslator/tomappingsystemc2/DiploSimulatorCodeGenerator.java
+++ b/src/main/java/tmltranslator/tomappingsystemc2/DiploSimulatorCodeGenerator.java
@@ -439,6 +439,9 @@ public class DiploSimulatorCodeGenerator implements IDiploSimulatorCodeGenerator
                         param = "";
                 }
 
+                TraceManager.addDev("\nDetermining routing of " + channel.getName() + ":");
+                TraceManager.addDev(channel.toString());
+
                 String ret =  determineRouting(tmlmapping.getHwNodeOf(channel.getOriginTask()),
                         tmlmapping.getHwNodeOf(channel.getDestinationTask()), elem);
                 //TraceManager.addDev("------> Routing = " + ret);
@@ -654,6 +657,8 @@ public class DiploSimulatorCodeGenerator implements IDiploSimulatorCodeGenerator
             final List<TMLEvent> events = new ArrayList<TMLEvent>(tmlmodeling.getEvents(task));
             final List<TMLRequest> requests = new ArrayList<TMLRequest>(tmlmodeling.getRequests(task));
 
+            //TraceManager.addDev("Handling task=" + task.getTaskName());
+
             final MappedSystemCTask mst = new MappedSystemCTask(task, channels, events, requests, tmlmapping, mappedChannels, mappedOnCPU);
             tasks.add(mst);
 
@@ -724,11 +729,18 @@ public class DiploSimulatorCodeGenerator implements IDiploSimulatorCodeGenerator
         int masterCount = 0;
         boolean reverse = reverseIn;
 
+        String pathS = "";
+        for(HwCommunicationNode nodeS: path){
+            pathS += nodeS.getName() + " ";
+        }
+        //TraceManager.addDev("Path=" + pathS);
+
         if (reverseIn) {
             slaves.str += ",static_cast<Slave*>(0)";
         } else {
             //firstPart=startNode.getName() + "0";
             firstNode = startNode;
+            //TraceManager.addDev("1. First node=" + firstNode);
         }
 
         for (final HwCommunicationNode commElem : path) {
@@ -737,12 +749,14 @@ public class DiploSimulatorCodeGenerator implements IDiploSimulatorCodeGenerator
                 final String memoryInstName = namesGen.memoryInstanceName((HwMemory) commElem);
                 slaves.str += ",static_cast<Slave*>(" + memoryInstName + "),static_cast<Slave*>(" + memoryInstName + ")";
                 firstNode = null;
+                //TraceManager.addDev("2. First node=" + firstNode);
                 // firstPart = "";
             } else {
                 if (reverse) {
                     if (firstNode == null) {
                         //                    if ( firstPart.length()==0 ){
                         firstNode = commElem;
+                        //TraceManager.addDev("3. First node=" + firstNode);
                         //                        firstPart=commElem.getName();
                     } else {
                         masters.str += "," + namesGen.busMasterInstanceName(commElem, 0, (HwBus) firstNode);
@@ -750,12 +764,14 @@ public class DiploSimulatorCodeGenerator implements IDiploSimulatorCodeGenerator
                         masterCount++;
                         slaves.str += ",static_cast<Slave*>(" + namesGen.communicationNodeInstanceName(commElem, 0) + ")";
                         firstNode = null;
+                        //TraceManager.addDev("4. First node=" + firstNode);
                         //firstPart="";
                     }
                 } else {
                     if (firstNode == null) {
                         //                  if ( firstPart.length()==0 ){
                         firstNode = commElem;
+                        //TraceManager.addDev("5. First node=" + firstNode);
                         slaves.str += ",static_cast<Slave*>(" + namesGen.communicationNodeInstanceName(commElem, 0) + ")";
                         //                        firstPart = commElem.getName();
                         //                        slaves.str+= ",static_cast<Slave*>(" + firstPart + ")";
@@ -764,6 +780,7 @@ public class DiploSimulatorCodeGenerator implements IDiploSimulatorCodeGenerator
                         //                        masters.str+= "," + firstPart + "_" + commElem.getName() + "_Master";
                         masterCount++;
                         firstNode = null;
+                        //TraceManager.addDev("6. First node=" + firstNode);
                         //                        firstPart="";
                     }
                 }
@@ -771,6 +788,7 @@ public class DiploSimulatorCodeGenerator implements IDiploSimulatorCodeGenerator
         }
 
         if (reverse) {
+            //TraceManager.addDev("REVERSE. First node=" + firstNode);
             masters.str += "," + namesGen.busMasterInstanceName(destNode, 0, (HwBus) firstNode);
             //            masters.str+= "," + destNode.getName() + "0_" + firstPart + "_Master";
 
@@ -783,8 +801,19 @@ public class DiploSimulatorCodeGenerator implements IDiploSimulatorCodeGenerator
     }
 
     public String determineRouting(HwNode startNode, HwNode destNode, TMLElement commElemToRoute) {
+        /*if (startNode == null) {
+            TraceManager.addDev( "Null start node");
+        } else {
+            TraceManager.addDev( "Start node:" + startNode.getName());
+        }
 
-        /*TraceManager.addDev( "******** -------> ROUTING ROUTING ROUTING\nDetermine routing from " + startNode.getName() + " to " + destNode.getName
+        if (destNode == null) {
+            TraceManager.addDev( "Null destNode");
+        } else {
+            TraceManager.addDev( "destNode:" + destNode.getName());
+        }
+
+        TraceManager.addDev( "******** -------> ROUTING ROUTING ROUTING\nDetermine routing from " + startNode.getName() + " to " + destNode.getName
                 () );*/
         StrWrap masters = new StrWrap();
         StrWrap slaves = new StrWrap();
@@ -807,13 +836,16 @@ public class DiploSimulatorCodeGenerator implements IDiploSimulatorCodeGenerator
         HwMemory memory = getMemConnectedToBusChannelMapped(commNodes, null, commElemToRoute);
 
         if (memory == null) {
-            //TraceManager.addDev("no memories to map");
+            TraceManager.addDev("no memories to map");
             exploreBuses(0, commNodes, path, startNode, destNode, commElemToRoute);
         } else {
             final List<HwCommunicationNode> commNodes2 = new LinkedList<HwCommunicationNode>(commNodes);
 
+            //TraceManager.addDev("Explore bus from " + startNode.getName() + " to memory " + memory.getName());
+
+
             if (!exploreBuses(0, commNodes, path, startNode, memory, commElemToRoute)) {
-                //TraceManager.addDev("NO route to " + memory.getName() + "found!!!!!!!!!!!!!!!!!!!!!!!!!!");
+                TraceManager.addDev("NO route to " + memory.getName() + " found!!!!!!!!!!!!!!!!!!!!!!!!!!");
             }
 
             path.add(memory);
@@ -827,9 +859,9 @@ public class DiploSimulatorCodeGenerator implements IDiploSimulatorCodeGenerator
             hopNum = extractPath(path, masters, slaves, destNode, destNode, true) - hopNum;
         }
 
-        //TraceManager.addDev(commElemToRoute.getName() + " is mapped on:");
+        /*TraceManager.addDev(commElemToRoute.getName() + " is mapped on:");
 
-        /*for (HwCommunicationNode commElem : path) {
+        for (HwCommunicationNode commElem : path) {
             TraceManager.addDev(commElem.getName());
         }*/
 
diff --git a/src/main/java/tmltranslator/tomappingsystemc2/MappedSystemCTask.java b/src/main/java/tmltranslator/tomappingsystemc2/MappedSystemCTask.java
index 60e391a4fcf9315fb2745b85dad826234e624b04..847d25b3aa8d861a07604dc66a7e9b7b47dc34be 100644
--- a/src/main/java/tmltranslator/tomappingsystemc2/MappedSystemCTask.java
+++ b/src/main/java/tmltranslator/tomappingsystemc2/MappedSystemCTask.java
@@ -244,9 +244,11 @@ public class MappedSystemCTask {
             constSig = reference + "(ID iID, Priority iPriority, std::string iName, FPGA** iCPUs, unsigned int iNumOfCPUs" + CR;
         }
 
+        TraceManager.addDev("\n***** Task name:" + task.getName());
 
 
         for (TMLChannel ch : channels) {
+            TraceManager.addDev("Adding ch " + ch.getExtendedName());
             constSig += ", TMLChannel* " + ch.getExtendedName() + CR;
         }
         for (TMLEvent evt : events) {
diff --git a/src/main/java/tmltranslator/tomappingsystemc2/NamesGenerationHelper.java b/src/main/java/tmltranslator/tomappingsystemc2/NamesGenerationHelper.java
index 744b5262eeb4f8beaf1a24972a9f6cfe5799a224..b7e0855c0821e4c14ca2e22379edcaa973e2553a 100644
--- a/src/main/java/tmltranslator/tomappingsystemc2/NamesGenerationHelper.java
+++ b/src/main/java/tmltranslator/tomappingsystemc2/NamesGenerationHelper.java
@@ -39,6 +39,7 @@
 
 package tmltranslator.tomappingsystemc2;
 
+import myutil.TraceManager;
 import tmltranslator.*;
 
 import java.util.Arrays;
@@ -390,6 +391,18 @@ public class NamesGenerationHelper {
     String busMasterInstanceName(final HwNode element,
                                  final int indexCore,
                                  final HwBus linkBus) {
+        /*if (element == null) {
+            TraceManager.addDev("NULL Hw element");
+        } else {
+            TraceManager.addDev("Hw element=" + element.getName());
+        }
+
+        if (linkBus == null) {
+            TraceManager.addDev("NULL linkBus element");
+        } else {
+            TraceManager.addDev("linkBus element=" + linkBus.getName());
+        }*/
+
         return normalize(busMasterName(element, indexCore, linkBus));
     }
 
diff --git a/src/main/java/tmltranslator/tonetwork/Link.java b/src/main/java/tmltranslator/tonetwork/Link.java
index 3b5b2624489f346b03d3d2730bd89e386c923b44..9f402ea684f73f64b22fc188a7e999b84b13c06f 100644
--- a/src/main/java/tmltranslator/tonetwork/Link.java
+++ b/src/main/java/tmltranslator/tonetwork/Link.java
@@ -121,6 +121,7 @@ public class Link {
         packetOut.addParam(new TMLType(TMLType.NATURAL));
         packetOut.addParam(new TMLType(TMLType.NATURAL));
         packetOut.addParam(new TMLType(TMLType.NATURAL));
+        packetOut.addParam(new TMLType(TMLType.NATURAL));
         tmlm.addEvent(packetOut);
 
         chOutToIN = new TMLChannel("channelBetweenOUTToIN__" + getNaming(),
@@ -131,7 +132,7 @@ public class Link {
 
         feedbackPerVC = new TMLEvent[nbOfVCs];
         for(int i=0; i<nbOfVCs; i++) {
-            feedbackPerVC[i] = new TMLEvent("Feedback__" + getNaming(),
+            feedbackPerVC[i] = new TMLEvent("Feedback__" + getNaming() + "_" + i,
                     null, 8, true);
             tmlm.addEvent(feedbackPerVC[i]);
         }
diff --git a/src/main/java/tmltranslator/tonetwork/TMAP2Network.java b/src/main/java/tmltranslator/tonetwork/TMAP2Network.java
index d805b16f948a21c08b90b48276292878b81d8aac..6cbb7ce3571f010abdde47bc85df856c2a20945a 100644
--- a/src/main/java/tmltranslator/tonetwork/TMAP2Network.java
+++ b/src/main/java/tmltranslator/tonetwork/TMAP2Network.java
@@ -56,8 +56,7 @@ import java.util.List;
  */
 public class TMAP2Network<E>  {
 
-    private TMLModeling<?> tmlmodeling;
-    private TMLArchitecture tmlarchi;
+
     private TMLMapping<?> tmlmapping;
 
     private boolean debug;
@@ -75,6 +74,8 @@ public class TMAP2Network<E>  {
 
     public final static String[] PORT_NAME = {"North", "South", "West", "East", "Internal"};
 
+    private HashMap<TMLChannel, String> IDsOfChannels;
+
 
     public TMAP2Network(TMLMapping<?> _tmlmapping, int nocSize) {
         tmlmapping = _tmlmapping;
@@ -82,6 +83,14 @@ public class TMAP2Network<E>  {
         this.nocSize = nocSize;
     }
 
+    public String getChannelID(TMLChannel ch) {
+        return IDsOfChannels.get(ch);
+    }
+
+    public void putTMLChannelID(TMLChannel ch, String id) {
+        IDsOfChannels.put(ch, "" + id);
+    }
+
     public TMLMapping<?> getTMLMapping() {
         return tmlmapping;
     }
@@ -214,7 +223,8 @@ public class TMAP2Network<E>  {
         for(HwNode node: tmla.getHwNodes()) {
             if (node instanceof HwExecutionNode) {
                 nbOfHwExecutionNode ++;
-                newList.add(node);
+                //newList.add(node);
+
                 HwBus bus = new HwBus(node.getName() + "__bus");
                 HwMemory mem = new HwMemory(node.getName() + "__mem");
                 newList.add(bus);
@@ -229,6 +239,7 @@ public class TMAP2Network<E>  {
                 tmla.addHwLink(memToBus);
             }
         }
+
         for(HwNode node: newList) {
             tmla.addHwNode(node);
         }
@@ -307,8 +318,8 @@ public class TMAP2Network<E>  {
         }
 
         // Create routers around
-        tmlmodeling = tmlmapping.getTMLModeling();
-        tmlarchi = tmlmapping.getTMLArchitecture();
+        //tmlmodeling = tmlmapping.getTMLModeling();
+        //tmlarchi = tmlmapping.getTMLArchitecture();
 
         // *** Create links and update routers accordingly
         // For each router, I consider all routers that are around the considered one
@@ -321,7 +332,7 @@ public class TMAP2Network<E>  {
                         // There is a north router
                         // link to next
                         if (routers[i][j].playingTheRoleOfPrevious[k] == null) {
-                            Link to = new Link(tmlarchi, tmlmodeling, routers[i][j], routers[i-1][j], nbOfVCs);
+                            Link to = new Link(tmla, tmlm, routers[i][j], routers[i-1][j], nbOfVCs);
                             routers[i][j].playingTheRoleOfPrevious[k] = to;
                             routers[i-1][j].playingTheRoleOfNext[getFrom(k)] = to;
                         }
@@ -333,7 +344,7 @@ public class TMAP2Network<E>  {
                         // There is a south router
                         // link to next
                         if (routers[i][j].playingTheRoleOfPrevious[k] == null) {
-                            Link to = new Link(tmlarchi, tmlmodeling, routers[i][j], routers[i+1][j], nbOfVCs);
+                            Link to = new Link(tmla, tmlm, routers[i][j], routers[i+1][j], nbOfVCs);
                             routers[i][j].playingTheRoleOfPrevious[k] = to;
                             routers[i+1][j].playingTheRoleOfNext[getFrom(k)] = to;
                         }
@@ -344,7 +355,7 @@ public class TMAP2Network<E>  {
                         // There is an east router
                         // link to next
                         if (routers[i][j].playingTheRoleOfPrevious[k] == null) {
-                            Link to = new Link(tmlarchi, tmlmodeling, routers[i][j], routers[i][j+1], nbOfVCs);
+                            Link to = new Link(tmla, tmlm, routers[i][j], routers[i][j+1], nbOfVCs);
                             routers[i][j].playingTheRoleOfPrevious[k] = to;
                             routers[i][j+1].playingTheRoleOfNext[getFrom(k)] = to;
                         }
@@ -356,7 +367,7 @@ public class TMAP2Network<E>  {
                         // There is an east router
                         // link to next
                         if (routers[i][j].playingTheRoleOfPrevious[k] == null) {
-                            Link to = new Link(tmlarchi, tmlmodeling, routers[i][j], routers[i][j-1], nbOfVCs);
+                            Link to = new Link(tmla, tmlm, routers[i][j], routers[i][j-1], nbOfVCs);
                             routers[i][j].playingTheRoleOfPrevious[k] = to;
                             routers[i][j-1].playingTheRoleOfNext[getFrom(k)] = to;
                         }
@@ -369,6 +380,12 @@ public class TMAP2Network<E>  {
 
 
 
+        // Associate an id to all channels
+        int id = 0;
+        IDsOfChannels = new HashMap<>();
+        for(TMLChannel ch: tmlm.getChannels()) {
+            IDsOfChannels.put(ch, "" + id);
+        }
 
         // Make internal channels & events of routers
         for(i=0; i<nocSize; i++) {
@@ -388,8 +405,6 @@ public class TMAP2Network<E>  {
 
 
 
-
-
         // Integrate into the TMLMapping
         for(i=0; i<nocSize; i++) {
             for(j=0; j<nocSize; j++) {
@@ -419,24 +434,44 @@ public class TMAP2Network<E>  {
             }
         }
 
+        // Handling origin channels
+        for(i=0; i<nocSize; i++) {
+            for(j=0; j<nocSize; j++) {
+                routers[i][j].makeOriginChannels();
+            }
+        }
 
-
-        // Printing routers
+        // Handling destination channels
         for(i=0; i<nocSize; i++) {
             for(j=0; j<nocSize; j++) {
-                TraceManager.addDev(routers[i][j].toString() + "\n");
+                routers[i][j].makeDestinationChannels();
             }
         }
 
+        // Post processing of routers
+        for(i=0; i<nocSize; i++) {
+            for(j=0; j<nocSize; j++) {
+                routers[i][j].postProcessing();
+            }
+        }
 
+        // Removing useless channels i.e. channels routed by the router
+        // The ones in channelID
+        // We indeed assume all channels go to the NoC
+        for(TMLChannel ch: IDsOfChannels.keySet()) {
+            tmlm.removeChannel(ch);
+        }
 
 
-        // Connect channels to the NoC
-        // A bridge is put with the same position as the router as to allow classical paths not
-        // to use the router
+        // Printing routers
+        for(i=0; i<nocSize; i++) {
+            for(j=0; j<nocSize; j++) {
+                //TraceManager.addDev(routers[i][j].toString() + "\n");
+            }
+        }
 
 
-        return null; // all ok
+        return null; // That's all folks!
     }
 
 }
diff --git a/src/main/java/tmltranslator/tonetwork/TaskINForDispatch.java b/src/main/java/tmltranslator/tonetwork/TaskINForDispatch.java
index b992fa8215fc2fb1326b2e1b6efa060a889f7fff..bcd16f905f7aa515e7367358861d8e613065475b 100644
--- a/src/main/java/tmltranslator/tonetwork/TaskINForDispatch.java
+++ b/src/main/java/tmltranslator/tonetwork/TaskINForDispatch.java
@@ -64,8 +64,9 @@ public class TaskINForDispatch extends TMLTask {
 
         this.nbOfVCs = nbOfVCs;
 
-        inputEvent.setDestinationTask(this);
-        inputChannel.setDestinationTask(this);
+        //inputEvent.setDestinationTask(this);
+        //inputChannel.setDestinationTask(this);
+
         for(TMLEvent evt: outputEvents) {
             evt.setOriginTask(this);
         }
@@ -82,12 +83,15 @@ public class TaskINForDispatch extends TMLTask {
         this.addAttribute(vc);
         TMLAttribute eop = new TMLAttribute("eop", "eop", new TMLType(TMLType.NATURAL), "0");
         this.addAttribute(eop);
+        TMLAttribute chid = new TMLAttribute("chid", "chid", new TMLType(TMLType.NATURAL), "0");
+        this.addAttribute(chid);
 
         // Events and channels
         addTMLEvent(inputEvent);
         for(TMLEvent evt: outputEvents) {
             addTMLEvent(evt);
         }
+
         addReadTMLChannel(inputChannel);
         for(TMLChannel ch: outputChannels) {
             addWriteTMLChannel(ch);
@@ -108,11 +112,11 @@ public class TaskINForDispatch extends TMLTask {
         waitEvt.addParam("dst");
         waitEvt.addParam("vc");
         waitEvt.addParam("eop");
-        activity.addElement(waitEvt);
-        loop.addNext(waitEvt);
+        waitEvt.addParam("chid");
+        activity.addLinkElement(loop, waitEvt);
 
         TMLChoice choice = new TMLChoice("MainChoice", referenceObject);
-        activity.addElement(choice);
+        activity.addLinkElement(waitEvt, choice);
 
         for(int i=0; i<nbOfVCs; i++) {
             TMLSendEvent sendEvt = new TMLSendEvent("SendEvtToVC" + i, referenceObject);
@@ -121,6 +125,7 @@ public class TaskINForDispatch extends TMLTask {
             sendEvt.addParam("dst");
             sendEvt.addParam("vc");
             sendEvt.addParam("eop");
+            sendEvt.addParam("chid");
             activity.addElement(sendEvt);
             choice.addNext(sendEvt);
             choice.addGuard("vc == " + i);
diff --git a/src/main/java/tmltranslator/tonetwork/TaskINForVC.java b/src/main/java/tmltranslator/tonetwork/TaskINForVC.java
index 1ce233a3a49a403d4fc35e2a6a8961ab37d9205f..d5861a3f67b042a15aa7d8b1054b77417f27fb38 100644
--- a/src/main/java/tmltranslator/tonetwork/TaskINForVC.java
+++ b/src/main/java/tmltranslator/tonetwork/TaskINForVC.java
@@ -74,6 +74,8 @@ public class TaskINForVC extends TMLTask {
         this.addAttribute(vc);
         TMLAttribute eop = new TMLAttribute("eop", "eop", new TMLType(TMLType.NATURAL), "0");
         this.addAttribute(eop);
+        TMLAttribute chid = new TMLAttribute("chid", "chid", new TMLType(TMLType.NATURAL), "0");
+        this.addAttribute(chid);
         TMLAttribute feedbackDownstr = new TMLAttribute("feedbackDownstr", "feedbackDownstr", new TMLType(TMLType.NATURAL), "0");
         this.addAttribute(feedbackDownstr);
         TMLAttribute bufferSize = new TMLAttribute("bufferSize", "bufferSize", new TMLType(TMLType.NATURAL), "2");
@@ -144,15 +146,16 @@ public class TaskINForVC extends TMLTask {
         // Second activity after sequence
         TMLForLoop loop2 = new TMLForLoop("mainLoop", referenceObject);
         loop2.setInfinite(true);
-        activity.addElement(loop2);
-        seq.addNext(loop2);
+        activity.addLinkElement(seq, loop2);
 
-        TMLWaitEvent waitEvt = new TMLWaitEvent("PacketEvent", referenceObject);
+
+        TMLWaitEvent waitEvt = new TMLWaitEvent("PacketEventBeforeSecondSeq", referenceObject);
         waitEvt.setEvent(inPacketEvent);
         waitEvt.addParam("pktlen");
         waitEvt.addParam("dst");
         waitEvt.addParam("vc");
         waitEvt.addParam("eop");
+        waitEvt.addParam("chid");
         activity.addLinkElement(loop2, waitEvt);
 
         TMLSequence secondSeq = new TMLSequence("SecondSeq", referenceObject);
@@ -172,23 +175,38 @@ public class TaskINForVC extends TMLTask {
         activity.addLinkElement(computexd, firstRoutingChoice);
 
         TMLActionState requested3 = new TMLActionState("requested3", referenceObject);
-        requested3.setAction("requested_output = 3");
+        requested3.setAction("requestedOutput = 3");
         activity.addLinkElement(firstRoutingChoice, requested3);
-        firstRoutingChoice.addGuard("xd > x");
+        firstRoutingChoice.addGuard("xd>x");
         activity.addLinkElement(requested3, new TMLStopState("stopOfRequest3", referenceObject));
 
         TMLActionState requested2 = new TMLActionState("requested2", referenceObject);
-        requested2.setAction("requested_output = 2");
+        requested2.setAction("requestedOutput = 2");
         activity.addLinkElement(firstRoutingChoice, requested2);
-        firstRoutingChoice.addGuard("xd < x");
+        firstRoutingChoice.addGuard("xd<x");
         activity.addLinkElement(requested2, new TMLStopState("stopOfRequest2", referenceObject));
 
         TMLChoice secondRoutingChoice = new TMLChoice("secondRoutingChoice", referenceObject);
         activity.addLinkElement(firstRoutingChoice, secondRoutingChoice);
-        firstRoutingChoice.addGuard("xd == x");
+        firstRoutingChoice.addGuard("xd==x");
 
+        TMLActionState requested0 = new TMLActionState("requested0", referenceObject);
+        requested0.setAction("requestedOutput = 0");
+        activity.addLinkElement(secondRoutingChoice, requested0);
+        firstRoutingChoice.addGuard("yd<y");
+        activity.addLinkElement(requested0, new TMLStopState("stopOfRequest0", referenceObject));
 
+        TMLActionState requested4 = new TMLActionState("requested4", referenceObject);
+        requested4.setAction("requestedOutput = 4");
+        activity.addLinkElement(secondRoutingChoice, requested4);
+        firstRoutingChoice.addGuard("yd==y");
+        activity.addLinkElement(requested4, new TMLStopState("stopOfRequest4", referenceObject));
 
+        TMLActionState requested1 = new TMLActionState("requested1", referenceObject);
+        requested1.setAction("requestedOutput = 1");
+        activity.addLinkElement(secondRoutingChoice, requested1);
+        firstRoutingChoice.addGuard("yd<y");
+        activity.addLinkElement(requested1, new TMLStopState("stopOfRequest1", referenceObject));
 
 
 
@@ -215,6 +233,7 @@ public class TaskINForVC extends TMLTask {
             sendEvt.addParam("dst");
             sendEvt.addParam("vc");
             sendEvt.addParam("eop");
+            sendEvt.addParam("chid");
             activity.addLinkElement(packetLoop, sendEvt);
 
             waitEvt = new TMLWaitEvent("FeedbackDownEvent", referenceObject);
@@ -236,6 +255,7 @@ public class TaskINForVC extends TMLTask {
             waitEvt.addParam("dst");
             waitEvt.addParam("vc");
             waitEvt.addParam("eop");
+            waitEvt.addParam("chid");
             activity.addLinkElement(read, waitEvt);
 
             stop = new TMLStopState("StopStateInLoop", referenceObject);
@@ -248,6 +268,7 @@ public class TaskINForVC extends TMLTask {
             sendEvt.addParam("dst");
             sendEvt.addParam("vc");
             sendEvt.addParam("eop");
+            sendEvt.addParam("chid");
             activity.addLinkElement(loop, sendEvt);
 
             waitEvt = new TMLWaitEvent("FeedbackDownEventO", referenceObject);
@@ -264,7 +285,7 @@ public class TaskINForVC extends TMLTask {
             activity.addLinkElement(sendEvt, read);
 
             stop = new TMLStopState("StopStateOutLoop", referenceObject);
-            activity.addLinkElement(waitEvt, stop);
+            activity.addLinkElement(read, stop);
 
         }
 
diff --git a/src/main/java/tmltranslator/tonetwork/TaskMUXAppDispatch.java b/src/main/java/tmltranslator/tonetwork/TaskMUXAppDispatch.java
index 5a67f0699b8ff8a00808b7827c38b330c700e60f..2f719c1accc15585066bd783b481884f94ae1e27 100644
--- a/src/main/java/tmltranslator/tonetwork/TaskMUXAppDispatch.java
+++ b/src/main/java/tmltranslator/tonetwork/TaskMUXAppDispatch.java
@@ -42,7 +42,6 @@ package tmltranslator.tonetwork;
 import tmltranslator.*;
 
 import java.util.List;
-import java.util.Vector;
 
 
 /**
@@ -71,7 +70,7 @@ public class TaskMUXAppDispatch extends TMLTask {
         this.outputEvent = outputEvent;
 
 
-        for(TMLEvent evt: inputEvents) {
+        for (TMLEvent evt : inputEvents) {
             evt.setDestinationTask(this);
         }
         outputEvent.setOriginTask(this);
@@ -85,9 +84,11 @@ public class TaskMUXAppDispatch extends TMLTask {
         this.addAttribute(vc);
         TMLAttribute eop = new TMLAttribute("eop", "eop", new TMLType(TMLType.NATURAL), "0");
         this.addAttribute(eop);
+        TMLAttribute chid = new TMLAttribute("chid", "chid", new TMLType(TMLType.NATURAL), "0");
+        this.addAttribute(chid);
 
         // Events and channels
-        for(TMLEvent evt: inputEvents) {
+        for (TMLEvent evt : inputEvents) {
             addTMLEvent(evt);
         }
         addTMLEvent(outputEvent);
@@ -97,40 +98,50 @@ public class TaskMUXAppDispatch extends TMLTask {
         TMLStartState start = new TMLStartState("mainStart", referenceObject);
         activity.setFirst(start);
 
+        if (inputEvents.size() == 0) {
+            TMLStopState stopNoEvent = new TMLStopState("StopNoEvent", referenceObject);
+            activity.addLinkElement(start, stopNoEvent);
+            return;
+        }
+
         TMLForLoop loop = new TMLForLoop("mainLoop", referenceObject);
         loop.setInfinite(true);
         activity.addElement(loop);
         start.addNext(loop);
 
+
         TMLSelectEvt selectEvt = new TMLSelectEvt("selectEvent", referenceObject);
         activity.addElement(selectEvt);
         loop.addNext(selectEvt);
 
+
         // Branch for each app
 
-         for(int i=0; i< inputEvents.size(); i++) {
-             TMLWaitEvent waitEvt = new TMLWaitEvent("PacketEvent" + i, referenceObject);
+        for (int i = 0; i < inputEvents.size(); i++) {
+            TMLWaitEvent waitEvt = new TMLWaitEvent("PacketEvent" + i, referenceObject);
             waitEvt.setEvent(inputEvents.get(i));
             waitEvt.addParam("pktlen");
             waitEvt.addParam("dst");
             waitEvt.addParam("vc");
             waitEvt.addParam("eop");
+            waitEvt.addParam("chid");
             activity.addElement(waitEvt);
-             selectEvt.addNext(waitEvt);
-
-             TMLSendEvent sendEvt = new TMLSendEvent("SendEvtToNI" + i, referenceObject);
-             sendEvt.setEvent(outputEvent);
-             sendEvt.addParam("pktlen");
-             sendEvt.addParam("dst");
-             sendEvt.addParam("vc");
-             sendEvt.addParam("eop");
-             activity.addElement(sendEvt);
+            selectEvt.addNext(waitEvt);
+
+            TMLSendEvent sendEvt = new TMLSendEvent("SendEvtToNI" + i, referenceObject);
+            sendEvt.setEvent(outputEvent);
+            sendEvt.addParam("pktlen");
+            sendEvt.addParam("dst");
+            sendEvt.addParam("vc");
+            sendEvt.addParam("eop");
+            sendEvt.addParam("chid");
+            activity.addElement(sendEvt);
             waitEvt.addNext(sendEvt);
 
-             TMLStopState stopL = new TMLStopState("EndOfSelectForApp" + i, referenceObject);
-             activity.addElement(stopL);
-             sendEvt.addNext(stopL);
-         }
+            TMLStopState stopL = new TMLStopState("EndOfSelectForApp" + i, referenceObject);
+            activity.addElement(stopL);
+            sendEvt.addNext(stopL);
+        }
 
 
     }
diff --git a/src/main/java/tmltranslator/tonetwork/TaskNetworkInterface.java b/src/main/java/tmltranslator/tonetwork/TaskNetworkInterface.java
index c1dc504514f8251f66d23aaf8107938a98460ebe..b9031addee92e282d021667eebb0800e596a581d 100644
--- a/src/main/java/tmltranslator/tonetwork/TaskNetworkInterface.java
+++ b/src/main/java/tmltranslator/tonetwork/TaskNetworkInterface.java
@@ -111,6 +111,8 @@ public class TaskNetworkInterface extends TMLTask {
             this.addAttribute(dst);
             TMLAttribute vci = new TMLAttribute("vc"+i, "vc"+i, new TMLType(TMLType.NATURAL), ""+i);
             this.addAttribute(vci);
+            TMLAttribute chid = new TMLAttribute("chid"+i, "chid"+i, new TMLType(TMLType.NATURAL), ""+i);
+            this.addAttribute(chid);
         }
 
 
@@ -135,7 +137,7 @@ public class TaskNetworkInterface extends TMLTask {
         addElement(start, loop);
 
         TMLActionState state = new TMLActionState("LoopExitSetting", referenceObject);
-        state.setAction("loopexit = 2");
+        state.setAction("loopExit = 2");
         addElement(loop, state);
 
         TMLSequence mainSequence = new TMLSequence("mainSequence", referenceObject);
@@ -144,14 +146,14 @@ public class TaskNetworkInterface extends TMLTask {
         for(i=0; i<nbOfVCs; i++) {
             TMLChoice testOnLoopExit = null;
             if (i>0) {
-                //Test on loopexit
+                //Test on loopĂ‚ exit
                 testOnLoopExit = new TMLChoice("testOnLoopExit", referenceObject);
                 addElement(mainSequence, testOnLoopExit);
 
                 // Right branch
                 TMLStopState endOfLoopExit = new TMLStopState("endOfLoopExit", referenceObject);
                 addElement(testOnLoopExit, endOfLoopExit);
-                testOnLoopExit.addGuard("loopexit == 1");
+                testOnLoopExit.addGuard("loopExit == 1");
 
             } else {
                 testOnLoopExit = null;
@@ -164,7 +166,7 @@ public class TaskNetworkInterface extends TMLTask {
                 addElement(mainSequence, notifiedEvent);
             } else {
                 addElement(testOnLoopExit, notifiedEvent);
-                testOnLoopExit.addGuard("loopexit == 2");
+                testOnLoopExit.addGuard("loopExit == 2");
             }
 
             TMLChoice testingEvt = new TMLChoice("testingEvtVC", referenceObject);
@@ -192,11 +194,12 @@ public class TaskNetworkInterface extends TMLTask {
             waitingForStartPacket.addParam("dst" + i);
             waitingForStartPacket.addParam("vc");
             waitingForStartPacket.addParam("eop");
+            waitingForStartPacket.addParam("chid" + i);
             addElement(ispktChoice, waitingForStartPacket);
-            ispktChoice.addGuard("ispkt == 0");
+            ispktChoice.addGuard("ispkt" + i + " == 0");
 
             TMLActionState ispktSetting = new TMLActionState("ispktSetting", referenceObject);
-            ispktSetting.setAction("ispkt = 1");
+            ispktSetting.setAction("ispkt" + i + " = 1");
             addElement(waitingForStartPacket, ispktSetting);
 
             TMLActionState iSetting = new TMLActionState("iSetting", referenceObject);
@@ -208,9 +211,9 @@ public class TaskNetworkInterface extends TMLTask {
 
             // Right branch of intermediate seq
             TMLForLoop loopOfRightBranch = new TMLForLoop("LoopOfRightBranch", referenceObject);
-            loopOfRightBranch.setInit("loopexit = 0");
-            loopOfRightBranch.setCondition("loopexit < 1");
-            loopOfRightBranch.setIncrement("loopexit = loopexit");
+            loopOfRightBranch.setInit("loopExit = 0");
+            loopOfRightBranch.setCondition("loopExit < 1");
+            loopOfRightBranch.setIncrement("loopExit = loopExit");
             addElement(intermediateSeq, loopOfRightBranch);
 
             TMLNotifiedEvent feedbackNotified = new TMLNotifiedEvent("WaitingForFeedback", referenceObject);
@@ -228,7 +231,7 @@ public class TaskNetworkInterface extends TMLTask {
 
             // No feedback
             TMLActionState noFeedbackAction = new TMLActionState("noFeedbackAction", referenceObject);
-            noFeedbackAction.setAction("loopexit = 2");
+            noFeedbackAction.setAction("loopExit = 2");
             addElement(testOnFeedback, noFeedbackAction);
             testOnFeedback.addGuard("else");
 
@@ -261,11 +264,12 @@ public class TaskNetworkInterface extends TMLTask {
                 sendEvtpktin.addParam("dst" + i);
                 sendEvtpktin.addParam("vc" + i);
                 sendEvtpktin.addParam("0");
+                sendEvtpktin.addParam("chid"+i);
                 addElement(packetLengthChoice, sendEvtpktin);
                 packetLengthChoice.addGuard("i" + i + " < pktlen" + i + " - 1");
 
                 TMLActionState asOnI = new TMLActionState("ActionstateOnI", referenceObject);
-                asOnI.setAction("i" + i + " = i" + i + " 1");
+                asOnI.setAction("i" + i + " = i" + i + " + 1");
                 addElement(sendEvtpktin, asOnI);
 
                 TMLStopState endOfLB = new TMLStopState("EndOfLB", referenceObject);
@@ -273,7 +277,7 @@ public class TaskNetworkInterface extends TMLTask {
 
                 // Middle branch
                 TMLActionState loopExitMB = new TMLActionState("loopExitMB", referenceObject);
-                loopExitMB.setAction("loopexit = 1");
+                loopExitMB.setAction("loopExit = 1");
                 addElement(packetLengthChoice, loopExitMB);
                 packetLengthChoice.addGuard("i" + i + " == pktlen" + i);
 
@@ -292,24 +296,27 @@ public class TaskNetworkInterface extends TMLTask {
                 sendEvtpktinRB.addParam("dst" + i);
                 sendEvtpktinRB.addParam("vc" + i);
                 sendEvtpktinRB.addParam("1");
+                sendEvtpktinRB.addParam("chid"+i);
                 addElement(packetLengthChoice, sendEvtpktinRB);
                 packetLengthChoice.addGuard("i" + i + " == pktlen" + i + " - 1");
 
                 TMLActionState asOnIRB = new TMLActionState("asOnIRB", referenceObject);
-                asOnIRB.setAction("i" + i + " = i" + i + " 1");
+                asOnIRB.setAction("i" + i + " = i" + i + "+ 1");
                 addElement(sendEvtpktinRB, asOnIRB);
 
                 TMLStopState endOfRB = new TMLStopState("endOfRB", referenceObject);
                 addElement(asOnIRB, endOfRB);
+
             } else {
+                
                 TMLChoice packetLengthChoice1 = new TMLChoice("PacketLengthChoice1", referenceObject);
                 addElement(waitingForFeedback, packetLengthChoice1);
 
                 // Right branch
                 TMLActionState loopexitTo1= new TMLActionState("loopexitTo1", referenceObject);
-                loopexitTo1.setAction("loopexit = 1");
+                loopexitTo1.setAction("loopExit = 1");
                 addElement(packetLengthChoice1, loopexitTo1);
-                packetLengthChoice1.addGuard("i" + i + " = pktlen" + i);
+                packetLengthChoice1.addGuard("i" + i + " == pktlen" + i);
 
 
                 TMLActionState ispktResetAction = new TMLActionState("ispktResetAction", referenceObject);
@@ -334,11 +341,12 @@ public class TaskNetworkInterface extends TMLTask {
                 sendEvtpktin1.addParam("dst" + i);
                 sendEvtpktin1.addParam("vc" + i);
                 sendEvtpktin1.addParam("0");
+                sendEvtpktin1.addParam("chid"+i);
                 addElement(choiceLBSeq, sendEvtpktin1);
                 choiceLBSeq.addGuard("i" + i + " < pktlen" + i + " - 1");
 
                 TMLActionState asOnI1 = new TMLActionState("ActionstateOnI1", referenceObject);
-                asOnI1.setAction("i" + i + " = i" + i + " 1");
+                asOnI1.setAction("i" + i + " = i" + i + " + 1");
                 addElement(sendEvtpktin1, asOnI1);
 
                 TMLStopState endOfLB1 = new TMLStopState("endOfLB1", referenceObject);
@@ -350,11 +358,12 @@ public class TaskNetworkInterface extends TMLTask {
                 sendEvtpktinRB1.addParam("dst" + i);
                 sendEvtpktinRB1.addParam("vc" + i);
                 sendEvtpktinRB1.addParam("1");
+                sendEvtpktinRB1.addParam("chid"+i);
                 addElement(choiceLBSeq, sendEvtpktinRB1);
                 choiceLBSeq.addGuard("i" + i + " == pktlen" + i + " - 1");
 
                 TMLActionState asOnIRB1 = new TMLActionState("asOnIRB1", referenceObject);
-                asOnIRB1.setAction("i" + i + " = i" + i + " 1");
+                asOnIRB1.setAction("i" + i + " = i" + i + "+ 1");
                 addElement(sendEvtpktinRB1, asOnIRB1);
 
                 TMLStopState endOfRB1SEQ = new TMLStopState("endOfRB1SEQ", referenceObject);
@@ -363,21 +372,21 @@ public class TaskNetworkInterface extends TMLTask {
                 // Right branch of seq
                 TMLNotifiedEvent notifiedEventPrio = new TMLNotifiedEvent("notifiedEventPrio", referenceObject);
                 notifiedEventPrio.setEvent(inputEventsFromMUX.get(i-1));
-                notifiedEventPrio.setVariable("higher_prio");
+                notifiedEventPrio.setVariable("higherPrio");
                 addElement(seqLB, notifiedEventPrio);
 
                 TMLChoice testPrio = new TMLChoice("testPrio", referenceObject);
                 addElement(notifiedEventPrio, testPrio);
 
                 TMLActionState loopexitPrio= new TMLActionState("loopexitPrio", referenceObject);
-                loopexitPrio.setAction("loopexit = 1");
+                loopexitPrio.setAction("loopExit = 1");
                 addElement(testPrio, loopexitPrio);
-                testPrio.addGuard("higher_prio > 0");
+                testPrio.addGuard("higherPrio > 0");
 
                 addElement(loopexitPrio, new TMLStopState("EndOfHigherPrio", referenceObject));
 
                 addElement(testPrio, new TMLStopState("NoHigherPrio", referenceObject));
-                testPrio.addGuard("higher_prio == 0");
+                testPrio.addGuard("higherPrio == 0");
 
             }
 
diff --git a/src/main/java/tmltranslator/tonetwork/TaskNetworkInterfaceOUT.java b/src/main/java/tmltranslator/tonetwork/TaskNetworkInterfaceOUT.java
index 449388782e0c36c4c3bf1161b727a0f01a7631a7..5610985050f043b249e5bb8e2a53f037292d09e9 100644
--- a/src/main/java/tmltranslator/tonetwork/TaskNetworkInterfaceOUT.java
+++ b/src/main/java/tmltranslator/tonetwork/TaskNetworkInterfaceOUT.java
@@ -53,6 +53,7 @@ import java.util.Vector;
  */
 public class TaskNetworkInterfaceOUT extends TMLTask {
     protected int nbOfVCs;
+    private TMLChoice packetChoice;
 
     public TaskNetworkInterfaceOUT(String name, Object referenceToClass, Object referenceToActivityDiagram) {
         super(name, referenceToClass, referenceToActivityDiagram);
@@ -62,7 +63,7 @@ public class TaskNetworkInterfaceOUT extends TMLTask {
     // inputEvt, channels: one per task
     // outputChannel, output event: only one, common: this is a network interface, only one exit!
     public void generate(int nbOfVCs, Vector<TMLEvent> outputFeedbackEvents, TMLEvent packetOutFromOUT,
-                         TMLEvent packetAvailable, TMLChannel outputChannelFromOUT) {
+                        TMLChannel outputChannelFromOUT) {
         int i;
 
         this.nbOfVCs = nbOfVCs;
@@ -76,6 +77,8 @@ public class TaskNetworkInterfaceOUT extends TMLTask {
         this.addAttribute(vc);
         TMLAttribute eop = new TMLAttribute("eop", "eop", new TMLType(TMLType.NATURAL), "0");
         this.addAttribute(eop);
+        TMLAttribute chid = new TMLAttribute("chid", "chid", new TMLType(TMLType.NATURAL), "0");
+        this.addAttribute(chid);
         TMLAttribute memSpace = new TMLAttribute("memSpace", "memSpace", new TMLType(TMLType.NATURAL), "4096");
         this.addAttribute(memSpace);
 
@@ -85,7 +88,6 @@ public class TaskNetworkInterfaceOUT extends TMLTask {
             addTMLEvent(evt);
         }
         addTMLEvent(packetOutFromOUT);
-        addTMLEvent(packetAvailable);
 
         addReadTMLChannel(outputChannelFromOUT);
 
@@ -125,6 +127,7 @@ public class TaskNetworkInterfaceOUT extends TMLTask {
         waitingForPacketFromOUT.addParam("dst");
         waitingForPacketFromOUT.addParam("vc");
         waitingForPacketFromOUT.addParam("eop");
+        waitingForPacketFromOUT.addParam("chid");
         addElement(loop, waitingForPacketFromOUT);
 
         // Reading on channel
@@ -142,17 +145,15 @@ public class TaskNetworkInterfaceOUT extends TMLTask {
         addElement(internalSeq, testingEOP);
 
         // Left branch of choice: eop==1
-        TMLSendEvent sendEvtPktAvailable = new TMLSendEvent("sendEvtPktAvailable", referenceObject);
-        sendEvtPktAvailable.setEvent(packetAvailable);
-        sendEvtPktAvailable.addParam("pktlen");
-        sendEvtPktAvailable.addParam("dst");
-        sendEvtPktAvailable.addParam("vc");
-        sendEvtPktAvailable.addParam("eop");
-        addElement(testingEOP, sendEvtPktAvailable);
+        //New choice on all possible destination depending on chid
+        packetChoice = new TMLChoice("testingPacket", referenceObject);
+        addElement(testingEOP, packetChoice);
         testingEOP.addGuard("eop == 1");
 
-        TMLStopState stopOfLeftBranchOfChoice = new TMLStopState("stopOfLeftBranchOfChoice", referenceObject);
-        addElement(sendEvtPktAvailable, stopOfLeftBranchOfChoice);
+        TMLStopState stopInvalid = new TMLStopState("InvalidCHID", referenceObject);
+        addElement(packetChoice, stopInvalid);
+        packetChoice.addGuard("chid == (0-1)");
+
 
         // Right branch of choice
         TMLStopState stopOfRightBranchOfChoice = new TMLStopState("stopOfRightBranchOfChoice", referenceObject);
@@ -175,7 +176,37 @@ public class TaskNetworkInterfaceOUT extends TMLTask {
         }
 
 
+    }
+
+
+    public void postProcessing(Vector<TMLEvent> packetsAvailable, Vector<String> channelIDs) {
+        if (packetsAvailable.size() == 0) {
+            TMLStopState stopOfLeftBranchOfChoice = new TMLStopState("stopNoDestinationTask", referenceObject);
+            addElement(packetChoice, stopOfLeftBranchOfChoice);
+            return;
+        }
+
+
 
+        for (TMLEvent packetAvailable: packetsAvailable) {
+            addTMLEvent(packetAvailable);
+        }
+
+        int i = 0;
+        for(TMLEvent packetAvailable: packetsAvailable) {
+            TMLSendEvent sendEvtPktAvailable = new TMLSendEvent("sendEvtPktAvailable", referenceObject);
+            sendEvtPktAvailable.setEvent(packetAvailable);
+            sendEvtPktAvailable.addParam("pktlen");
+            sendEvtPktAvailable.addParam("dst");
+            sendEvtPktAvailable.addParam("vc");
+            sendEvtPktAvailable.addParam("eop");
+            sendEvtPktAvailable.addParam("chid");
+            addElement(packetChoice, sendEvtPktAvailable);
+            packetChoice.addGuard("chid == " + channelIDs.get(i));
+            TMLStopState stopOfLeftBranchOfChoice = new TMLStopState("stopOfLeftBranchOfChoice__" + channelIDs.get(i), referenceObject);
+            addElement(sendEvtPktAvailable, stopOfLeftBranchOfChoice);
+            i++;
+        }
 
     }
 
diff --git a/src/main/java/tmltranslator/tonetwork/TaskOUTForDispatch.java b/src/main/java/tmltranslator/tonetwork/TaskOUTForDispatch.java
index 35ec4ee506710dbb7208acd29caddfb2de654d14..ca7a0f5889af63bed0233992b1edd2c024b760fd 100644
--- a/src/main/java/tmltranslator/tonetwork/TaskOUTForDispatch.java
+++ b/src/main/java/tmltranslator/tonetwork/TaskOUTForDispatch.java
@@ -39,6 +39,7 @@
 
 package tmltranslator.tonetwork;
 
+import myutil.TraceManager;
 import tmltranslator.*;
 
 import java.util.Vector;
@@ -76,6 +77,8 @@ public class TaskOUTForDispatch extends TMLTask {
         this.addAttribute(vc);
         TMLAttribute eop = new TMLAttribute("eop", "eop", new TMLType(TMLType.NATURAL), "0");
         this.addAttribute(eop);
+        TMLAttribute chid = new TMLAttribute("chid", "chid", new TMLType(TMLType.NATURAL), "0");
+        this.addAttribute(chid);
         TMLAttribute nEvt = new TMLAttribute("nEvt", "nEvt", new TMLType(TMLType.NATURAL), "0");
         this.addAttribute(nEvt);
         TMLAttribute loopExit = new TMLAttribute("loopExit", "loopExit", new TMLType(TMLType.NATURAL), "0");
@@ -130,7 +133,7 @@ public class TaskOUTForDispatch extends TMLTask {
                 mainChoice.addGuard("nEvt > 0");
 
                 TMLNotifiedEvent notifiedFeedback = new TMLNotifiedEvent("FeedbackNotifiedEvt"+i, referenceObject);
-                notifiedFeedback.setEvent(outSelectEvents.get(i));
+                notifiedFeedback.setEvent(feedbackEvents.get(i));
                 notifiedFeedback.setVariable("feedback");
                 activity.addLinkElement(loopInside, notifiedFeedback);
 
@@ -138,17 +141,19 @@ public class TaskOUTForDispatch extends TMLTask {
                 activity.addLinkElement(notifiedFeedback, internalChoice);
 
                 // Left branch of internal choice
-                sendEvt = new TMLSendEvent("feedbackUpEvent", referenceObject);
+                sendEvt = new TMLSendEvent("SelectEvent", referenceObject);
                 sendEvt.setEvent(outSelectEvents.get(i));
                 activity.addLinkElement(internalChoice, sendEvt);
                 internalChoice.addGuard("feedback > 0");
 
                 waitEvt = new TMLWaitEvent("PacketEventInLoop", referenceObject);
+                //TraceManager.addDev("Nb Of params of " + inPacketEvents.get(i).getName() + " = " + inPacketEvents.get(i).getNbOfParams());
                 waitEvt.setEvent(inPacketEvents.get(i));
                 waitEvt.addParam("pktlen");
                 waitEvt.addParam("dst");
                 waitEvt.addParam("vc");
                 waitEvt.addParam("eop");
+                waitEvt.addParam("chid");
                 activity.addLinkElement(sendEvt, waitEvt);
 
                 TMLActionState reqOut = new TMLActionState("ExitLoop" + i, referenceObject);
@@ -161,6 +166,7 @@ public class TaskOUTForDispatch extends TMLTask {
                 sendEvt.addParam("dst");
                 sendEvt.addParam("vc");
                 sendEvt.addParam("eop");
+                sendEvt.addParam("chid");
                 activity.addLinkElement(reqOut, sendEvt);
 
                 TMLWriteChannel write = new TMLWriteChannel("WriteChannel" + i, referenceObject);
diff --git a/src/main/java/tmltranslator/tonetwork/TaskOUTForVC.java b/src/main/java/tmltranslator/tonetwork/TaskOUTForVC.java
index 090251369306ca347b202a1ffb8017f65775a897..da58b789f734c0fbcd8a6c67a5c41ad60cb5d5a0 100644
--- a/src/main/java/tmltranslator/tonetwork/TaskOUTForVC.java
+++ b/src/main/java/tmltranslator/tonetwork/TaskOUTForVC.java
@@ -75,6 +75,8 @@ public class TaskOUTForVC extends TMLTask {
         this.addAttribute(vc);
         TMLAttribute eop = new TMLAttribute("eop", "eop", new TMLType(TMLType.NATURAL), "0");
         this.addAttribute(eop);
+        TMLAttribute chid = new TMLAttribute("chid", "chid", new TMLType(TMLType.NATURAL), "0");
+        this.addAttribute(chid);
         TMLAttribute j = new TMLAttribute("j", "j", new TMLType(TMLType.NATURAL), "0");
         this.addAttribute(j);
 
@@ -105,6 +107,7 @@ public class TaskOUTForVC extends TMLTask {
             waitEvt.addParam("dst");
             waitEvt.addParam("vc");
             waitEvt.addParam("eop");
+            waitEvt.addParam("chid");
             activity.addLinkElement(select, waitEvt);
 
             // loop on packet size
@@ -121,6 +124,7 @@ public class TaskOUTForVC extends TMLTask {
             sendEvt.addParam("dst");
             sendEvt.addParam("vc");
             sendEvt.addParam("eop");
+            sendEvt.addParam("chid");
             activity.addLinkElement(packetLoop, sendEvt);
 
             waitEvt = new TMLWaitEvent("ReturnFromVC", referenceObject);
@@ -141,6 +145,7 @@ public class TaskOUTForVC extends TMLTask {
             waitEvt.addParam("dst");
             waitEvt.addParam("vc");
             waitEvt.addParam("eop");
+            waitEvt.addParam("chid");
             activity.addLinkElement(choice, waitEvt);
             choice.addGuard("eop == 0");
 
diff --git a/src/main/java/tmltranslator/tonetwork/TranslatedRouter.java b/src/main/java/tmltranslator/tonetwork/TranslatedRouter.java
index 573e03873831499da11916a2d018c9cb4a1e4077..31c12c293b3356e938e482525f18a41bcf50c87d 100644
--- a/src/main/java/tmltranslator/tonetwork/TranslatedRouter.java
+++ b/src/main/java/tmltranslator/tonetwork/TranslatedRouter.java
@@ -105,10 +105,10 @@ public class TranslatedRouter<E> {
 
 
     // Connection channels and events
-    private HashMap<TMLChannel, TMLEvent> mapOfAllOutputChannels;
+    private HashMap<TMLChannel, TMLEvent> mapOfAllOutputChannels; // Channels going to the NoC
+    private HashMap<TMLChannel, TMLEvent> mapOfAllInputChannels; // Channels getting out of the NoC
+    private Vector<TMLChannel> handledChannels;
 
-    // Hw
-    HwExecutionNode node;
 
     public TranslatedRouter(TMAP2Network<?> main, TMLMapping<?> tmlmap, HwNoC noc, List<TMLChannel> channelsViaNoc,
                             int nbOfVCs, int xPos, int yPos, HwExecutionNode myHwExecutionNode) {
@@ -125,6 +125,7 @@ public class TranslatedRouter<E> {
         playingTheRoleOfNext = new Link[NB_OF_PORTS];
 
         allTasks = new Vector<>();
+        handledChannels = new Vector<>();
     }
 
     public void setLinkFromPreviousRouter(int index, Link l) {
@@ -211,12 +212,20 @@ public class TranslatedRouter<E> {
         for (i = 0; i < nbOfVCs; i++) {
             // Now that we know all channels, we can generate the MUX tasks
             // We need one event par outputChannel
-            //HashMap<TMLChannel, TMLEvent> mapOfOutputChannels = new HashMap<>();
             Vector<TMLEvent> inputEventsOfMUX = new Vector<>();
             for (TMLChannel chan : outputChannels) {
+                //TraceManager.addDev("Output Channel:" + chan.getName() + " VC=" + chan.getVC());
                 if (chan.getVC() == i) {
-                    TMLEvent outputEventOfMux = new TMLEvent("EventMUXof" + chan.getName(), null, 8,
+                    TMLEvent outputEventOfMux = new TMLEvent("EventMUXof__" + chan.getName(), null, 8,
                             true);
+                    // PARAMS!!!!!
+                    outputEventOfMux.setOriginTask(chan.getOriginTask());
+                    outputEventOfMux.addParam(new TMLType(TMLType.NATURAL));
+                    outputEventOfMux.addParam(new TMLType(TMLType.NATURAL));
+                    outputEventOfMux.addParam(new TMLType(TMLType.NATURAL));
+                    outputEventOfMux.addParam(new TMLType(TMLType.NATURAL));
+                    outputEventOfMux.addParam(new TMLType(TMLType.NATURAL));
+
                     //mapOfOutputChannels.put(chan, outputEventOfMux);
                     mapOfAllOutputChannels.put(chan, outputEventOfMux);
                     inputEventsOfMUX.add(outputEventOfMux);
@@ -225,9 +234,14 @@ public class TranslatedRouter<E> {
             }
 
             // We also need an output event for MUX / NI_IN
-            TMLEvent eventForMUX_and_NI_IN = new TMLEvent("EventBetweenMUXandNI_IN_for_" + nameOfExecNode,
+            TMLEvent eventForMUX_and_NI_IN = new TMLEvent("EventBetweenMUXandNI_IN_for_" + nameOfExecNode + "_" + i,
                     null, 8, true);
             tmlm.addEvent(eventForMUX_and_NI_IN);
+            eventForMUX_and_NI_IN.addParam(new TMLType(TMLType.NATURAL));
+            eventForMUX_and_NI_IN.addParam(new TMLType(TMLType.NATURAL));
+            eventForMUX_and_NI_IN.addParam(new TMLType(TMLType.NATURAL));
+            eventForMUX_and_NI_IN.addParam(new TMLType(TMLType.NATURAL));
+            eventForMUX_and_NI_IN.addParam(new TMLType(TMLType.NATURAL));
 
             TaskMUXAppDispatch muxTask = new TaskMUXAppDispatch("MUXof" + nameOfExecNode + "_VC" + i, null, null);
             tmlm.addTask(muxTask);
@@ -274,7 +288,8 @@ public class TranslatedRouter<E> {
         dispatchIns = new HashMap<>();
         for (int portNb = 0; portNb < NB_OF_PORTS; portNb++) {
             if (playingTheRoleOfNext[portNb] != null) {
-                TaskINForDispatch inDispatch = new TaskINForDispatch("IN_" + nameOfExecNode + "_" + portNb, null,
+                TaskINForDispatch inDispatch = new TaskINForDispatch("IN_" + nameOfExecNode + "_" + portNb +
+                        "_x" + xPos + "_y" + yPos, null,
                         null);
                 tmlm.addTask(inDispatch);
                 Vector<TMLEvent> listOfOutEvents = new Vector<TMLEvent>();
@@ -299,8 +314,10 @@ public class TranslatedRouter<E> {
                     // We have to use events / channels coming from another router
                     TMLEvent toInEvt = playingTheRoleOfNext[portNb].packetOut;
                     toInEvt.setDestinationTask(inDispatch);
+                    //tmlm.addEvent(toInEvt);
                     TMLChannel toInCh = playingTheRoleOfNext[portNb].chOutToIN;
                     toInCh.setDestinationTask(inDispatch);
+                    tmlm.addChannel(toInCh);
 
                     inDispatch.generate(nbOfVCs, toInEvt, toInCh, listOfOutEvents,
                             listOfOutChannels);
@@ -446,7 +463,7 @@ public class TranslatedRouter<E> {
 
 
         //NetworkInterfaceOUT (1 per router)
-        TaskNetworkInterfaceOUT tniOut = new TaskNetworkInterfaceOUT("NI_OUT_" + nameOfExecNode, null,
+        tniOut = new TaskNetworkInterfaceOUT("NI_OUT_" + nameOfExecNode, null,
                 null);
         tmlm.addTask(tniOut);
         allTasks.add(tniOut);
@@ -463,24 +480,7 @@ public class TranslatedRouter<E> {
         TMLEvent pktoutFromOut = playingTheRoleOfPrevious[NB_OF_PORTS-1].packetOut;
         pktoutFromOut.setDestinationTask(tniOut);
 
-        TMLEvent packetOut = new TMLEvent("evtPktOutToAppFromOut__" + xPos + "_" + yPos,
-                null, 8, true);
-        packetOut.addParam(new TMLType(TMLType.NATURAL));
-        packetOut.addParam(new TMLType(TMLType.NATURAL));
-        packetOut.addParam(new TMLType(TMLType.NATURAL));
-        packetOut.addParam(new TMLType(TMLType.NATURAL));
-        tmlm.addEvent(packetOut);
-        packetOut.setOriginTask(tniOut);
-
-        tniOut.generate(nbOfVCs, feedbackPerVC, pktoutFromOut, packetOut, chOfOut);
-
-        // Fake task out
-        fto = new FakeTaskOut("FakeTaskOutOfRouter_" + xPos + "_" + yPos, null, null);
-        tmlm.addTask(fto);
-        allTasks.add(fto);
-        packetOut.setDestinationTask(fto);
-        fto.generate(packetOut);
-
+        tniOut.generate(nbOfVCs, feedbackPerVC, pktoutFromOut, chOfOut);
 
     }
 
@@ -504,6 +504,11 @@ public class TranslatedRouter<E> {
                     pktInEvtsVCs[i][j] = new TMLEvent("evt_pktin" + i + "_vc" + j + "_" + xPos + "_" + yPos,
                             null, 8, true);
                     tmlm.addEvent(pktInEvtsVCs[i][j]);
+                    pktInEvtsVCs[i][j].addParam(new TMLType(TMLType.NATURAL));
+                    pktInEvtsVCs[i][j].addParam(new TMLType(TMLType.NATURAL));
+                    pktInEvtsVCs[i][j].addParam(new TMLType(TMLType.NATURAL));
+                    pktInEvtsVCs[i][j].addParam(new TMLType(TMLType.NATURAL));
+                    pktInEvtsVCs[i][j].addParam(new TMLType(TMLType.NATURAL));
 
                     pktInChsVCs[i][j] = new TMLChannel("ch_pktin" + i + "_vc" + j + "_" + xPos + "_" + yPos,
                             null);
@@ -523,6 +528,11 @@ public class TranslatedRouter<E> {
                     for (int k = 0; k < TMAP2Network.DOMAIN + 1; k++) {
                         routeEvtVCs[i][j][k] = new TMLEvent("evtroute_" + i + "_vc" + j + "_" + k + "_" +
                                 xPos + "_" + yPos, null, 8, true);
+                        routeEvtVCs[i][j][k].addParam(new TMLType(TMLType.NATURAL));
+                        routeEvtVCs[i][j][k].addParam(new TMLType(TMLType.NATURAL));
+                        routeEvtVCs[i][j][k].addParam(new TMLType(TMLType.NATURAL));
+                        routeEvtVCs[i][j][k].addParam(new TMLType(TMLType.NATURAL));
+                        routeEvtVCs[i][j][k].addParam(new TMLType(TMLType.NATURAL));
                         tmlm.addEvent(routeEvtVCs[i][j][k]);
                         routeEvtVCsFeedback[i][j][k] = new TMLEvent("evtfeedback_" + i + "_vc" + j + "_" + k + "_" +
                                 xPos + "_" + yPos, null, 8, true);
@@ -541,6 +551,11 @@ public class TranslatedRouter<E> {
                 for (int j = 0; j < nbOfVCs; j++) {
                     evtOutVCs[i][j] = new TMLEvent("evt_out" + i + "_vc" + j + "_" + xPos + "_" + yPos,
                             null, 8, true);
+                    evtOutVCs[i][j].addParam(new TMLType(TMLType.NATURAL));
+                    evtOutVCs[i][j].addParam(new TMLType(TMLType.NATURAL));
+                    evtOutVCs[i][j].addParam(new TMLType(TMLType.NATURAL));
+                    evtOutVCs[i][j].addParam(new TMLType(TMLType.NATURAL));
+                    evtOutVCs[i][j].addParam(new TMLType(TMLType.NATURAL));
                     tmlm.addEvent(evtOutVCs[i][j]);
                     evtSelectVC[i][j] = new TMLEvent("evt_vcselect" + i + "_vc" + j + "_" + xPos + "_" + yPos,
                             null, 8, true);
@@ -562,7 +577,7 @@ public class TranslatedRouter<E> {
     }
 
     public String getPositionNaming() {
-        return "_" + xPos + "_" + yPos;
+        return "_x" + xPos + "_y" + yPos;
     }
 
     public String toString() {
@@ -595,8 +610,7 @@ public class TranslatedRouter<E> {
     }
 
 
-    // DANGER: also make the mapping of channels
-    // ALSO: initial, last tasks: connections
+
     public void makeHwArchitectureAndMapping(HwExecutionNode execNode, HwBus busToInternalDomain) {
         TMLArchitecture tmla = tmlmap.getTMLArchitecture();
 
@@ -607,17 +621,17 @@ public class TranslatedRouter<E> {
             TraceManager.addDev("NULL bus");
         }
 
-        HwBridge mainBridge = new HwBridge("BridgeIntennal" + getPositionNaming());
+        HwBridge mainBridge = new HwBridge("BridgeInternal_" + getPositionNaming());
         tmla.addHwNode(mainBridge);
         tmla.makeHwLink(busToInternalDomain, mainBridge);
 
 
         // NIIN bus
-        HwBus busNIIN = new HwBus("BusNetworkiInterfaceIN" + getPositionNaming());
+        HwBus busNIIN = new HwBus("BusNetworkInterfaceIN" + getPositionNaming());
         tmla.addHwNode(busNIIN);
 
         // For each VC, we create a bus and a cpu. The bus connects to the main bridge
-        for(i=0; i<nbOfVCs; i++) {
+        for (i = 0; i < nbOfVCs; i++) {
             HwCPU cpu = new HwCPU("CPUForMUX_VC" + i + getPositionNaming());
             tmla.addHwNode(cpu);
             tmlmap.addTaskToHwExecutionNode(muxTasks.get(i), cpu);
@@ -631,15 +645,16 @@ public class TranslatedRouter<E> {
 
         // Network interface IN common to all MUX VCs
         // Processor, mem, bus and bridge
-        HwCPU cpuNIIN = new HwCPU("CPUNetworkiInterfaceIN" + getPositionNaming());
+        HwCPU cpuNIIN = new HwCPU("CPUNetworkInterfaceIN" + getPositionNaming());
         tmla.addHwNode(cpuNIIN);
         tmlmap.addTaskToHwExecutionNode(tniIn, cpuNIIN);
 
-        HwMemory memNIIN = new HwMemory("MemNetworkiInterfaceIN" + getPositionNaming());
+        HwMemory memNIIN = new HwMemory("MemNetworkInterfaceIN" + getPositionNaming());
         tmla.addHwNode(memNIIN);
-        tmlmap.addCommToHwCommNode(playingTheRoleOfPrevious[NB_OF_PORTS-1].chOutToIN, memNIIN);
+        tmlmap.addCommToHwCommNode(playingTheRoleOfNext[NB_OF_PORTS - 1].chOutToIN, memNIIN);
 
-        HwBridge bridgeNIIN = new HwBridge("BridgeNetworkiInterfaceIN" + getPositionNaming());
+        HwBridge bridgeNIIN = new HwBridge("BridgeNetworkInterfaceIN" + getPositionNaming());
+        tmla.addHwNode(bridgeNIIN);
 
         tmla.makeHwLink(busNIIN, cpuNIIN);
         tmla.makeHwLink(busNIIN, memNIIN);
@@ -655,31 +670,32 @@ public class TranslatedRouter<E> {
                 tmlmap.addTaskToHwExecutionNode(dispatchIns.get(portNb), cpuIN);
 
                 // connection to the right bus
-                if (portNb < NB_OF_PORTS-1) {
+                if (portNb < NB_OF_PORTS - 1) {
                     // external
                     tmla.makeHwLink(playingTheRoleOfNext[portNb].busBetweenRouters, cpuIN);
-                    HwMemory memIN = new HwMemory("mem_IN"  + portNb + getPositionNaming());
+
+                    HwMemory memIN = new HwMemory("mem_IN" + portNb + getPositionNaming());
                     tmla.addHwNode(memIN);
                     tmla.makeHwLink(playingTheRoleOfNext[portNb].busBetweenRouters, memIN);
                     tmlmap.addCommToHwCommNode(playingTheRoleOfNext[portNb].chOutToIN, memIN);
 
                 } else {
                     // internal
-                    HwBus busInternalIN = new HwBus("BusInternalINternal" + getPositionNaming());
+                    HwBus busInternalIN = new HwBus("BusInternalIN" + getPositionNaming());
                     tmla.addHwNode((busInternalIN));
                     tmla.makeHwLink(busInternalIN, bridgeNIIN);
                     tmla.makeHwLink(busInternalIN, cpuIN);
                 }
 
                 // For each IN VC, we do the Hw Arch: bus, cpu, mem
-                for(i=0; i<nbOfVCs; i++) {
+                for (i = 0; i < nbOfVCs; i++) {
                     HwCPU cpuINVC = new HwCPU("cpuINVC_" + portNb + "_" + i + getPositionNaming());
                     tmla.addHwNode(cpuINVC);
                     tmlmap.addTaskToHwExecutionNode(dispatchInVCs[portNb][i], cpuINVC);
-                    HwMemory memINVC = new HwMemory("memINVC" + portNb + "_" + i+ getPositionNaming());
+                    HwMemory memINVC = new HwMemory("memINVC" + portNb + "_" + i + getPositionNaming());
                     tmla.addHwNode(memINVC);
                     tmlmap.addCommToHwCommNode(pktInChsVCs[portNb][i], memINVC);
-                    HwBus busINVC = new HwBus("busINVC" + portNb + "_" + i + getPositionNaming());
+                    HwBus busINVC = new HwBus("busINVC_p" + portNb + "_vc" + i + getPositionNaming());
                     tmla.addHwNode(busINVC);
                     tmla.makeHwLink(busINVC, cpuINVC);
                     tmla.makeHwLink(busINVC, memINVC);
@@ -688,36 +704,37 @@ public class TranslatedRouter<E> {
             }
         }
 
-        HwBridge bridgeNIOUT = new HwBridge("BridgeNetworkiInterfaceOUT" + getPositionNaming());
+        //HwBridge bridgeNIOUT = new HwBridge("BridgeNetworkiInterfaceOUT" + getPositionNaming());
         HwCPU outForExit = null;
 
         // OUTVC and OUT
         for (int portNb = 0; portNb < NB_OF_PORTS; portNb++) {
             if (playingTheRoleOfPrevious[portNb] != null) {
-                // We have an IN on that port. Connects on the bus of the correcponding link
+                // We have an IN on that port. Connects on the bus of the corresponding link
                 HwCPU cpuOUT = new HwCPU("cpuOUT_" + portNb + getPositionNaming());
                 tmla.addHwNode(cpuOUT);
                 tmlmap.addTaskToHwExecutionNode(dispatchOuts.get(portNb), cpuOUT);
 
                 // connection to the right bus
-                if (portNb < NB_OF_PORTS-1) {
+                if (portNb < NB_OF_PORTS - 1) {
                     // external
                     tmla.makeHwLink(playingTheRoleOfPrevious[portNb].busBetweenRouters, cpuOUT);
                 } else {
                     // internal
                     outForExit = cpuOUT;
-                    HwBus busInternalOUT = new HwBus("BusInternalOUT" + getPositionNaming());
-                    tmla.addHwNode((busInternalOUT));
-                    tmla.makeHwLink(busInternalOUT, bridgeNIOUT);
-                    tmla.makeHwLink(busInternalOUT, cpuOUT);
+                   // HwBus busInternalOUT = new HwBus("BusInternalOUT" + getPositionNaming());
+                    //tmla.addHwNode((busInternalOUT));
+
+                    //tmla.makeHwLink(busInternalOUT, bridgeNIOUT);
+                    //tmla.makeHwLink(busInternalOUT, cpuOUT);
                 }
 
                 // For each IN VC, we do the Hw Arch: bus, cpu, mem
-                for(i=0; i<nbOfVCs; i++) {
+                for (i = 0; i < nbOfVCs; i++) {
                     HwCPU cpuOUTVC = new HwCPU("cpuOUTVC_" + portNb + "_" + i + getPositionNaming());
                     tmla.addHwNode(cpuOUTVC);
                     tmlmap.addTaskToHwExecutionNode(dispatchOutVCs[portNb][i], cpuOUTVC);
-                    HwMemory memOUTVC = new HwMemory("memOUTVC" + portNb + "_" + i+ getPositionNaming());
+                    HwMemory memOUTVC = new HwMemory("memOUTVC" + portNb + "_" + i + getPositionNaming());
                     tmla.addHwNode(memOUTVC);
                     HwBus busOUTVC = new HwBus("busINVC" + portNb + "_" + i + getPositionNaming());
                     tmla.addHwNode(busOUTVC);
@@ -731,16 +748,17 @@ public class TranslatedRouter<E> {
         // Network interface out
         // Basically connects to the main bridge
 
-        // NIIN bus
-        HwBus busNIOUT = new HwBus("BusNetworkiInterfaceOUT" + getPositionNaming());
+        // NIOUT bus
+        HwBus busNIOUT = new HwBus("BusNetworkInterfaceOUT" + getPositionNaming());
         tmla.addHwNode(busNIOUT);
 
-        HwCPU cpuNIOUT = new HwCPU("CPUNetworkiInterfaceOUT" + getPositionNaming());
+        HwCPU cpuNIOUT = new HwCPU("CPUNetworkInterfaceOUT" + getPositionNaming());
         tmla.addHwNode(cpuNIOUT);
-        tmlmap.addTaskToHwExecutionNode(tniIn, cpuNIOUT);
+        tmlmap.addTaskToHwExecutionNode(tniOut, cpuNIOUT);
 
-        HwMemory memNIOUT = new HwMemory("MemNetworkiInterfaceOUT" + getPositionNaming());
+        HwMemory memNIOUT = new HwMemory("MemNetworkInterfaceOUT" + getPositionNaming());
         tmla.addHwNode(memNIOUT);
+        tmlmap.addCommToHwCommNode(playingTheRoleOfPrevious[NB_OF_PORTS-1].chOutToIN, memNIOUT);
 
         tmla.makeHwLink(busNIOUT, outForExit);
         tmla.makeHwLink(busNIOUT, cpuNIOUT);
@@ -754,8 +772,11 @@ public class TranslatedRouter<E> {
         tmla.makeHwLink(busOUTToMainBridge, mainBridge);
 
         // fake task on CPU
-        tmlmap.addTaskToHwExecutionNode(fto, node);
+        // tmlmap.addTaskToHwExecutionNode(fto, myHwExecutionNode);
+    }
 
+    public void makeOriginChannels() {
+        Vector<TMLChannel> newChannels = new Vector<>();
 
         // We now need to modify the corresponding input tasks
         // The channel is modified to NBRNBW
@@ -764,20 +785,196 @@ public class TranslatedRouter<E> {
 
         // For all channels whose origin task is mapped on the CPU of the router
 
+        for(TMLChannel ch: tmlmap.getTMLModeling().getChannels()) {
+            if (main.getChannelID(ch) != null) {
+                TMLTask t = ch.getOriginTask();
+                HwExecutionNode mappedOn = tmlmap.getHwNodeOf(t);
+                if (mappedOn == myHwExecutionNode) {
+                    TraceManager.addDev("Found HwNode of origin task " + t.getTaskName() + " for channel " + ch.getName());
+                    // We must rework the channel of the task.
+                    // The channel is modified to a NBRNBW with the same task has sender / receiver
+                    // The channel is mapped to the local mem
+                    // Once the sample has been sent, an event is sent to the input task of the router
+                    // For a receiver, the event is first waited for, and then the read in the new channel is performed
+
+                    TMLChannel newChannel = new TMLChannel(ch.getName() + "__origin", ch.getReferenceObject());
+                    newChannel.setType(TMLChannel.NBRNBW);
+                    newChannel.setOriginTask(t);
+                    newChannel.setDestinationTask(t);
+                    newChannel.setSize(ch.getSize());
+                    newChannel.setVC(ch.getVC());
+                    newChannels.add(newChannel);
+
+
+                    // Map modify channel to the right memory
+                    HwMemory mem = tmlmap.getTMLArchitecture().getHwMemoryByName(myHwExecutionNode.getName() + "__mem");
+                    if (mem != null) {
+                        TraceManager.addDev("Mapping channel " + ch.getName() + " on mem " + mem.getName());
+                        tmlmap.addCommToHwCommNode(newChannel, mem);
+                    }
+
+                    // Must now modify the source app
+                    TMLAttribute pktlen = new TMLAttribute("pktlen", "pktlen", new TMLType(TMLType.NATURAL), "0");
+                    t.addAttributeIfApplicable(pktlen);
+                    TMLAttribute dst = new TMLAttribute("dst", "dst", new TMLType(TMLType.NATURAL), "0");
+                    t.addAttributeIfApplicable(dst);
+                    TMLAttribute vc = new TMLAttribute("vc", "vc", new TMLType(TMLType.NATURAL), "0");
+                    t.addAttributeIfApplicable(vc);
+                    TMLAttribute eop = new TMLAttribute("eop", "eop", new TMLType(TMLType.NATURAL), "1");
+                    t.addAttributeIfApplicable(eop);
+                    TMLAttribute chid = new TMLAttribute("chid", "chid", new TMLType(TMLType.NATURAL),
+                            "" + main.getChannelID(ch));
+                    t.addAttributeIfApplicable(chid);
+
+                    TMLActivity activity = t.getActivityDiagram();
+                    Vector<TMLActivityElement> newElements = new Vector<>();
+                    TMLWriteChannel twc;
+                    for (TMLElement elt : activity.getElements()) {
+                        if (elt instanceof TMLWriteChannel) {
+                            twc = (TMLWriteChannel) elt;
+                            if (twc.getChannel(0) == ch) {
+                                TraceManager.addDev("Modifying write ch of task " + t.getTaskName());
+                                TMLSendEvent tse = new TMLSendEvent("EvtForSending__" + ch.getName(), ch.getReferenceObject());
+                                twc.replaceChannelWith(ch, newChannel);
+                                newElements.add(tse);
+                                tse.setEvent(mapOfAllOutputChannels.get(ch));
+                                tse.addParam("" + newChannel.getSize());
+                                tse.addParam("dst");
+                                tse.addParam("" + newChannel.getVC());
+                                tse.addParam("eop");
+                                tse.addParam(""+main.getChannelID(ch));
+                                tse.addNext(twc.getNextElement(0));
+                                twc.setNewNext(twc.getNextElement(0), tse);
+                            }
+                        }
+                    }
+                    for (TMLActivityElement newElt : newElements) {
+                        activity.addElement(newElt);
+                    }
+                }
+            }
+        }
+
+        for(TMLChannel ch: newChannels) {
+            tmlmap.getTMLModeling().addChannel(ch);
+        }
+
+    }
+
+    public void makeDestinationChannels() {
+
+        Vector<TMLChannel> newChannels = new Vector<>();
+        mapOfAllInputChannels = new HashMap<>();
+
+        TMLModeling tmlm = tmlmap.getTMLModeling();
+
+        Vector<TMLEvent> events = new Vector<>();
+        Vector<String> ids = new Vector<>();
 
         for(TMLChannel ch: tmlmap.getTMLModeling().getChannels()) {
-            TMLTask t = ch.getOriginTask();
-            HwExecutionNode mappedOn = tmlmap.getHwNodeOf(t);
-            if (mappedOn == myHwExecutionNode) {
-                TraceManager.addDev("Found HwNode of task " + t.getTaskName() + " for channel " + ch.getName());
-                // We must rework the channel of the task.
-                // The channel is modified to a NBRNBW with the same task has sender / receiver
-                // The channel is mapped to the local mem
-                // Once the sample has been sent, an event is sent to the input task of the router
-                // For a receiver, the event is first waited for, and then the read in the new channel is performed
+            if (main.getChannelID(ch) != null) {
+                TMLTask t = ch.getDestinationTask();
+                HwExecutionNode mappedOn = tmlmap.getHwNodeOf(t);
+                if (mappedOn == myHwExecutionNode) {
+                    TMLEvent packetOut = new TMLEvent("evtPktOutToAppFromOut__" + xPos + "_" + yPos,
+                            null, 8, true);
+                    packetOut.addParam(new TMLType(TMLType.NATURAL));
+                    packetOut.addParam(new TMLType(TMLType.NATURAL));
+                    packetOut.addParam(new TMLType(TMLType.NATURAL));
+                    packetOut.addParam(new TMLType(TMLType.NATURAL));
+                    packetOut.addParam(new TMLType(TMLType.NATURAL));
+                    tmlm.addEvent(packetOut);
+                    packetOut.setOriginTask(tniOut);
+                    packetOut.setDestinationTask(ch.getDestinationTask());
+                    events.add(packetOut);
+                    ids.add(main.getChannelID(ch));
+                    mapOfAllInputChannels.put(ch, packetOut);
+                }
             }
         }
 
+        tniOut.postProcessing(events, ids);
+
+        for(TMLChannel ch: tmlmap.getTMLModeling().getChannels()) {
+            if (main.getChannelID(ch) != null) {
+                TMLTask t = ch.getDestinationTask();
+                HwExecutionNode mappedOn = tmlmap.getHwNodeOf(t);
+                if (mappedOn == myHwExecutionNode) {
+                    TraceManager.addDev("Found HwNode of origin task " + t.getTaskName() + " for channel " + ch.getName());
+                    // We must rework the channel of the task.
+                    // The channel is modified to a NBRNBW with the same task has sender / receiver
+                    // The channel is mapped to the local mem
+                    // Once the sample has been sent, an event is sent to the input task of the router
+                    // For a receiver, the event is first waited for, and then the read in the new channel is performed
+
+                    TMLChannel newChannel = new TMLChannel(ch.getName() + "__destination", ch.getReferenceObject());
+                    newChannel.setType(TMLChannel.NBRNBW);
+                    newChannel.setOriginTask(t);
+                    newChannel.setDestinationTask(t);
+                    newChannel.setSize(ch.getSize());
+                    newChannel.setVC(ch.getVC());
+                    newChannels.add(newChannel);
+
+                    // Map modify channel to the right memory
+                    HwMemory mem = tmlmap.getTMLArchitecture().getHwMemoryByName(myHwExecutionNode.getName() + "__mem");
+                    if (mem != null) {
+                        TraceManager.addDev("Mapping channel " + ch.getName() + " on mem " + mem.getName());
+                        tmlmap.addCommToHwCommNode(newChannel, mem);
+                    }
+
+                    // Must now modify the source app
+                    TMLAttribute pktlen = new TMLAttribute("pktlen", "pktlen", new TMLType(TMLType.NATURAL), "0");
+                    t.addAttributeIfApplicable(pktlen);
+                    TMLAttribute dst = new TMLAttribute("dst", "dst", new TMLType(TMLType.NATURAL), "0");
+                    t.addAttributeIfApplicable(dst);
+                    TMLAttribute vc = new TMLAttribute("vc", "vc", new TMLType(TMLType.NATURAL), "0");
+                    t.addAttributeIfApplicable(vc);
+                    TMLAttribute eop = new TMLAttribute("eop", "eop", new TMLType(TMLType.NATURAL), "1");
+                    t.addAttributeIfApplicable(eop);
+                    TMLAttribute chid = new TMLAttribute("chid", "chid", new TMLType(TMLType.NATURAL),
+                            "" + main.getChannelID(ch));
+                    t.addAttributeIfApplicable(chid);
+
+                    TMLActivity activity = t.getActivityDiagram();
+                    Vector<TMLActivityElement> newElements = new Vector<>();
+                    TMLReadChannel trc;
+                    for (TMLElement elt : activity.getElements()) {
+                        if (elt instanceof TMLReadChannel) {
+                            trc = (TMLReadChannel) elt;
+                            if (trc.getChannel(0) == ch) {
+                                TraceManager.addDev("Modifying read ch of task " + t.getTaskName() + " for channel " + ch.getName());
+                                // TODO TODO
+                                trc.replaceChannelWith(ch, newChannel);
+                                TMLWaitEvent twe = new TMLWaitEvent("EvtForReceiving__" + ch.getName(), ch.getReferenceObject());
+                                newElements.add(twe);
+                                twe.setEvent(mapOfAllInputChannels.get(ch));
+                                twe.addParam("pktlen");
+                                twe.addParam("dst");
+                                twe.addParam("vc");
+                                twe.addParam("eop");
+                                twe.addParam("chid");
+                                activity.replaceAllNext(trc, twe);
+                                twe.addNext(trc);
+                            }
+                        }
+                    }
+                    for (TMLActivityElement newElt : newElements) {
+                        activity.addElement(newElt);
+                    }
+                }
+            }
+        }
+
+        for(TMLChannel ch: newChannels) {
+            tmlmap.getTMLModeling().addChannel(ch);
+        }
+
+
+
+    }
+
+
+    public void postProcessing() {
 
 
 
diff --git a/src/main/java/ui/GTMLModeling.java b/src/main/java/ui/GTMLModeling.java
index fde5a7fe9e9a1350e0b95b13f2ff411a11a49b0d..69243fa7adba93a1b55d218cb3161fba1d5655b3 100644
--- a/src/main/java/ui/GTMLModeling.java
+++ b/src/main/java/ui/GTMLModeling.java
@@ -817,7 +817,7 @@ public class GTMLModeling {
                             tmltt = new TMLType(request.getType(j).getType());
                             tmlattr = new TMLAttribute(attname, tmltt);
                             tmlattr.initialValue = tmlattr.getDefaultInitialValue();
-                            TraceManager.addDev("Adding " + tmlattr.getName() + " to " + task.getName() + "with value =" + tmlattr.initialValue);
+                            //TraceManager.addDev("Adding " + tmlattr.getName() + " to " + task.getName() + "with value =" + tmlattr.initialValue);
                             task.addAttribute(tmlattr);
                         }
                     }
@@ -909,6 +909,7 @@ public class GTMLModeling {
                                 channel.setMax(port1.getMax());
                                 channel.ports.add(port1);
                                 channel.ports.add(port2);
+                                TraceManager.addDev("Adding channel with port1 vc=" + port1.getVC());
                                 channel.setVC(port1.getVC());
                                 if (port1.isBlocking() && port2.isBlocking()) {
                                     channel.setType(TMLChannel.BRBW);
@@ -1522,7 +1523,7 @@ public class GTMLModeling {
                             tmltt = new TMLType(request.getType(j).getType());
                             tmlattr = new TMLAttribute(attname, tmltt);
                             tmlattr.initialValue = tmlattr.getDefaultInitialValue();
-                            //TraceManager.addDev("Adding " + tmlattr.getName() + " to " + tt1.getName() + "with value =" + tmlattr.initialValue);
+                            TraceManager.addDev("Adding " + tmlattr.getName() + " to " + tt1.getName() + "with value =" + tmlattr.initialValue);
                             tt1.addAttribute(tmlattr);
                         }
                     }
diff --git a/src/main/java/ui/GTURTLEModeling.java b/src/main/java/ui/GTURTLEModeling.java
index 5cf5b65b28b2563d1e59034af5bf1d244221be55..d1837a9b2bc5939919f94ec0de703ea60bde39f5 100644
--- a/src/main/java/ui/GTURTLEModeling.java
+++ b/src/main/java/ui/GTURTLEModeling.java
@@ -1537,6 +1537,11 @@ public class GTURTLEModeling {
         return map;
     }
 
+    @SuppressWarnings("unchecked")
+    public void setTMLMapping(TMLMapping tmap) {
+        this.tmap = tmap;
+    }
+
 
     public HashMap<String, HashSet<String>> getCPUTaskMap() {
         HashMap<String, HashSet<String>> cpuTaskMap = new HashMap<String, HashSet<String>>();
diff --git a/src/main/java/ui/tmlcompd/TMLCPrimitivePort.java b/src/main/java/ui/tmlcompd/TMLCPrimitivePort.java
index 1693ddfa2387b6f24fa5231073ea106c4634c181..675fdd0426628bcc59d8aaa99815283766505cdd 100755
--- a/src/main/java/ui/tmlcompd/TMLCPrimitivePort.java
+++ b/src/main/java/ui/tmlcompd/TMLCPrimitivePort.java
@@ -160,7 +160,7 @@ public abstract class TMLCPrimitivePort extends TGCScalableWithInternalComponent
     protected String associatedEvent = "VOID";
 
     // Network
-    protected int vc = -1;
+    protected int vc = 0;
 
 
     public int verification;
@@ -910,7 +910,7 @@ public abstract class TMLCPrimitivePort extends TGCScalableWithInternalComponent
                                 try {
                                     vc = Integer.decode(elt.getAttribute("vc"));
                                 } catch (Exception e) {
-                                    vc = -1;
+                                    vc = 0;
                                 }
 
                             }
diff --git a/src/main/java/ui/util/DefaultText.java b/src/main/java/ui/util/DefaultText.java
index 593d0f0e7ce9d9de0a3d788cdec5cc19b0e65bac..9ea4ea43fd8c1b68d776c690e8399e7807b428d4 100755
--- a/src/main/java/ui/util/DefaultText.java
+++ b/src/main/java/ui/util/DefaultText.java
@@ -50,8 +50,8 @@ package ui.util;
  */
 public class DefaultText {
 
-    public static String BUILD = "13048";
-    public static String DATE = "2019/05/27 03:02:13 CET";
+    public static String BUILD = "13056";
+    public static String DATE = "2019/06/04 03:02:18 CET";
 
     public static StringBuffer sbAbout = makeAbout();
 
diff --git a/src/main/java/ui/window/JDialogNoCManagement.java b/src/main/java/ui/window/JDialogNoCManagement.java
index aa18360f27bb2b406032bc9784e104dcfa2a0c53..e63014d131e9883c863bfc8cb7d00c37b832deee 100644
--- a/src/main/java/ui/window/JDialogNoCManagement.java
+++ b/src/main/java/ui/window/JDialogNoCManagement.java
@@ -330,11 +330,36 @@ public class JDialogNoCManagement extends JDialog implements ActionListener, Lis
         }
 
         outputText.append("\nNoC removed\n");
-        outputText.append("\nGenerating TML\n");
 
+        outputText.append("\nChecking syntax of the specification\n");
         TMLMapping<?> mapping = t2n.getTMLMapping();
+
+        mgui.gtm.setTMLMapping(mapping);
+        TMLSyntaxChecking tmlsc = new TMLSyntaxChecking(mapping);
+        mapping.forceMakeAutomata();
+        tmlsc.checkSyntax();
+
+        outputText.append("\n" + tmlsc.hasErrors() + " errors, " + tmlsc.hasWarnings() + "  warnings:\n");
+        if (tmlsc.hasErrors() > 0) {
+            for (TMLError err :tmlsc.getErrors()) {
+                outputText.append("Error:" + err.toString() + "\n");
+            }
+        }
+        if (tmlsc.hasWarnings() > 0) {
+            for (TMLError err :tmlsc.getWarnings()) {
+                outputText.append("Warning:" + err.toString() + "\n");
+            }
+        }
+
+
+        outputText.append("\nGenerating TML\n");
+
+
+
         TMLMappingTextSpecification ts = new TMLMappingTextSpecification<>("noNoc");
         ts.toTextFormat(mapping);
+
+
         String dir = SpecConfigTTool.TMLCodeDirectory;
         try {
             ts.saveFile(SpecConfigTTool.TMLCodeDirectory, "NoNoC");
@@ -346,6 +371,11 @@ public class JDialogNoCManagement extends JDialog implements ActionListener, Lis
 
         outputText.append("\nSpecification generated in " + dir + "\n");
 
+
+
+
+
+
         outputText.append("\nAll done\n");
 
         stopProcess();
diff --git a/src/main/java/ui/window/JDialogTMLCompositePort.java b/src/main/java/ui/window/JDialogTMLCompositePort.java
index eda89b9c892cd3cf53aa3054b1f35075e1982dc2..2c1d3198bade69e523a254967220936596a09f4b 100644
--- a/src/main/java/ui/window/JDialogTMLCompositePort.java
+++ b/src/main/java/ui/window/JDialogTMLCompositePort.java
@@ -578,7 +578,7 @@ public class JDialogTMLCompositePort extends JDialogBase implements ActionListen
         panel5.add(lossPercentageLabel, c5);
         c5.gridwidth = GridBagConstraints.REMAINDER; //end row
         vcText = new JTextField("" + vc);
-        panel5.add(lossPercentageText, c5);
+        panel5.add(vcText, c5);
 
 
 
@@ -844,7 +844,7 @@ public class JDialogTMLCompositePort extends JDialogBase implements ActionListen
         try {
             return Integer.decode(vcText.getText().trim());
         } catch (Exception e) {
-            return -1;
+            return 0;
         }
     }
 }