diff --git a/simulators/c++2/src_simulator/arch/FPGA.cpp b/simulators/c++2/src_simulator/arch/FPGA.cpp
index c3d12c6d68a2ef1e819a531e17e1f017f595d219..f175b43df763c98f04a8207188c506708575caa2 100644
--- a/simulators/c++2/src_simulator/arch/FPGA.cpp
+++ b/simulators/c++2/src_simulator/arch/FPGA.cpp
@@ -212,7 +212,7 @@ TMLTime FPGA::truncateNextTransAt(TMLTime iTime){
 std::cout<<"fpga truncateNextTransAt"<<std::endl;
   if (_masterNextTransaction==0){
     if (iTime <= _nextTransaction->getStartTime()) return 0;  //before: <=
-    float timeExec = _cyclesPerExeci;
+    unsigned int timeExec = _cyclesPerExeci;
      //std::cout << "CPU: EXECI or EXECC??" << "\n";
     if( (_nextTransaction->getCommand() != 0) && (_nextTransaction->getCommand()->getExecType() == 1) ) {
       //std::cout << "CPU: EXECC" << "\n";
@@ -285,7 +285,7 @@ std::cout<<"fpga addTransaction"<<std::endl;
           }
     }
     unsigned int _tempReconfigNumber = _reconfigNumber - _highestRank;
-    float timeExec = _cyclesPerExeci;
+    unsigned int timeExec = _cyclesPerExeci;
      //std::cout << "CPU: EXECI or EXECC??" << "\n";
     if( (_nextTransaction->getCommand() != 0) && (_nextTransaction->getCommand()->getExecType() == 1) ) {
       //std::cout << "CPU: EXECC" << "\n";
diff --git a/simulators/c++2/src_simulator/arch/MultiCoreCPU.cpp b/simulators/c++2/src_simulator/arch/MultiCoreCPU.cpp
index 50d040cd435280c08f4e4dff8cec4b529adf4e60..f15b0b7dbd07bd31df0b97f973ef31287128f988 100644
--- a/simulators/c++2/src_simulator/arch/MultiCoreCPU.cpp
+++ b/simulators/c++2/src_simulator/arch/MultiCoreCPU.cpp
@@ -46,6 +46,7 @@
 #include <Slave.h>
 #include <TMLChannel.h>
 #include <RRPrioScheduler.h>
+#include <math.h>
 
 
 MultiCoreCPU::MultiCoreCPU(ID iID, 
@@ -223,13 +224,9 @@ std::cout << "CPU:calcSTL: scheduling decision of CPU " << _name << ": " << _nex
     //calculate length of transaction
     //if (_nextTransaction->getOperationLength()!=-1){
     if (iTimeSlice!=0){
-      //_nextTransaction->setVirtualLength(max(min(_nextTransaction->getVirtualLength(), (TMLLength)(iTimeSlice / timeExec)), (TMLTime)1));
-      float nb_ExecF = iTimeSlice /timeExec; //must not be 0
-      TMLLength nb_ExecI = (TMLLength) nb_ExecF;
-      if(nb_ExecI<nb_ExecF) nb_ExecI++;
-      _nextTransaction->setVirtualLength(min(_nextTransaction->getVirtualLength(), nb_ExecI));
+      _nextTransaction->setVirtualLength(max(min(_nextTransaction->getVirtualLength(), (TMLLength)(ceil(iTimeSlice / timeExec))), (TMLTime)1));
     }
-    _nextTransaction->setLength(_nextTransaction->getVirtualLength() * timeExec);
+    _nextTransaction->setLength(ceil(_nextTransaction->getVirtualLength() * timeExec));
 
 #ifdef BUS_ENABLED
   }
@@ -256,7 +253,7 @@ void MultiCoreCPU::truncateAndAddNextTransAt(TMLTime iTime){
   //return truncateNextTransAt(iTime);
   //not a problem if scheduling does not take place at time when transaction is actually truncated, tested
   //std::cout << "CPU:truncateAndAddNextTransAt " << _name << "time: +++++++++++++++++++++" << iTime << "\n";
-  if(false){
+  if(true){
      if (_nextTransaction->getTransType()==NOCOMM_TRANS){
   	  TMLTime aTimeSlice = _scheduler->schedule(iTime);
   	  //_schedulingNeeded=false;  05/05/11
@@ -303,22 +300,14 @@ TMLTime MultiCoreCPU::truncateNextTransAt(TMLTime iTime){
 #endif
     }else{
       aNewDuration-=aStaticPenalty;
-      //_nextTransaction->setVirtualLength(max((TMLTime)(aNewDuration / timeExec),(TMLTime)1));
-      float nb_ExecF = aNewDuration /timeExec; //must not be 0
-      TMLLength nb_ExecI = (TMLLength) nb_ExecF;
-      if(nb_ExecI<nb_ExecF) nb_ExecI++;
-      _nextTransaction->setVirtualLength(max(nb_ExecI,(TMLTime)1));
-      _nextTransaction->setLength(_nextTransaction->getVirtualLength() * timeExec);
+      _nextTransaction->setVirtualLength(max((TMLTime)(ceil(aNewDuration / timeExec)),(TMLTime)1));
+      _nextTransaction->setLength(ceil(_nextTransaction->getVirtualLength() * timeExec));
     }
 #else
     if (iTime <= _nextTransaction->getStartTime()) return 0;  //before
     TMLTime aNewDuration = iTime - _nextTransaction->getStartTime();
-    //_nextTransaction->setVirtualLength(max((TMLTime)(aNewDuration / timeExec), (TMLTime)1));
-    float nb_ExecF = aNewDuration /timeExec; //must not be 0
-    TMLLength nb_ExecI = (TMLLength) nb_ExecF;
-    if(nb_ExecI<nb_ExecF) nb_ExecI++;
-    _nextTransaction->setVirtualLength(max(nb_ExecI,(TMLTime)1));
-    _nextTransaction->setLength(_nextTransaction->getVirtualLength() * timeExec);
+    _nextTransaction->setVirtualLength(max((TMLTime)(ceil(aNewDuration / timeExec)), (TMLTime)1));
+    _nextTransaction->setLength(ceil(_nextTransaction->getVirtualLength() * timeExec));
 #endif
 #ifdef DEBUG_CPU
     std::cout << "aNewDuration: " << aNewDuration << std::endl;
@@ -401,22 +390,14 @@ void MultiCoreCPU::truncateNextTrans(TMLTime iTime){ // called with _nextTransac
 #endif
              } else{
                aNewDuration-=aStaticPenalty;
-               //_nextTransaction->setVirtualLength(max((TMLTime)(aNewDuration / timeExec),(TMLTime)1));
-               float nb_ExecF = aNewDuration /timeExec; //must not be 0
-               TMLLength nb_ExecI = (TMLLength) nb_ExecF;
-               if(nb_ExecI<nb_ExecF) nb_ExecI++;
-               _nextTransaction->setVirtualLength(max(nb_ExecI,(TMLTime)1));
-               _nextTransaction->setLength(_nextTransaction->getVirtualLength() * timeExec);
+               _nextTransaction->setVirtualLength(max((TMLTime)(ceil(aNewDuration / timeExec)),(TMLTime)1));
+               _nextTransaction->setLength(ceil(_nextTransaction->getVirtualLength() * timeExec));
              }
 #else
              //if (iTime <= _nextTransaction->getStartTime()) return 0;  //before: <=
              TMLTime aNewDuration = iTime - _nextTransaction->getStartTime();
-             //_nextTransaction->setVirtualLength(max((TMLTime)(aNewDuration / timeExec), (TMLTime)1));
-             float nb_ExecF = aNewDuration /timeExec; //must not be 0
-             TMLLength nb_ExecI = (TMLLength) nb_ExecF;
-             if(nb_ExecI<nb_ExecF) nb_ExecI++;
-             _nextTransaction->setVirtualLength(max(nb_ExecI,(TMLTime)1));
-             _nextTransaction->setLength(_nextTransaction->getVirtualLength() * timeExec);
+             _nextTransaction->setVirtualLength(max((TMLTime)(ceil(aNewDuration / timeExec)), (TMLTime)1));
+             _nextTransaction->setLength(ceil(_nextTransaction->getVirtualLength() * timeExec));
 #endif
 #ifdef DEBUG_CPU
              std::cout << "aNewDuration: " << aNewDuration << std::endl;
diff --git a/simulators/c++2/src_simulator/arch/SingleCoreCPU.cpp b/simulators/c++2/src_simulator/arch/SingleCoreCPU.cpp
index ebfd5a29d44b30cfb10aa14400d9fc12ff519522..f43a14c3647ffa2ac8e8b5455dad09c78fef27b4 100644
--- a/simulators/c++2/src_simulator/arch/SingleCoreCPU.cpp
+++ b/simulators/c++2/src_simulator/arch/SingleCoreCPU.cpp
@@ -45,6 +45,7 @@
 #include <Bus.h>
 #include <Slave.h>
 #include <TMLChannel.h>
+#include <math.h>
 //#include <TransactionListener.h>
 
 
@@ -182,13 +183,9 @@ void SingleCoreCPU::calcStartTimeLength(TMLTime iTimeSlice){
     //calculate length of transaction
     //if (_nextTransaction->getOperationLength()!=-1){
     if (iTimeSlice!=0){
-      //_nextTransaction->setVirtualLength(max(min(_nextTransaction->getVirtualLength(), (TMLLength)(iTimeSlice / timeExec)), (TMLTime)1));
-      float nb_ExecF = iTimeSlice /timeExec; //must not be 0
-      TMLLength nb_ExecI = (TMLLength) nb_ExecF;
-      if(nb_ExecI<nb_ExecF) nb_ExecI++;
-      _nextTransaction->setVirtualLength(min(_nextTransaction->getVirtualLength(), nb_ExecI));
+      _nextTransaction->setVirtualLength(max(min(_nextTransaction->getVirtualLength(), (TMLLength)(ceil(iTimeSlice / timeExec))), (TMLTime)1));
     }
-    _nextTransaction->setLength(_nextTransaction->getVirtualLength() * timeExec);
+    _nextTransaction->setLength(ceil(_nextTransaction->getVirtualLength() * timeExec));
 
 #ifdef BUS_ENABLED
   }
@@ -218,7 +215,7 @@ void SingleCoreCPU::truncateAndAddNextTransAt(TMLTime iTime){
   //return truncateNextTransAt(iTime);
   //not a problem if scheduling does not take place at time when transaction is actually truncated, tested
   //std::cout << "CPU:truncateAndAddNextTransAt " << _name << "time: +++++++++++++++++++++" << iTime << "\n";
-  if(false){
+  if(true){
      if (_nextTransaction->getTransType()==NOCOMM_TRANS){
   	  TMLTime aTimeSlice = _scheduler->schedule(iTime);
   	  //_schedulingNeeded=false;  05/05/11
@@ -266,22 +263,14 @@ TMLTime SingleCoreCPU::truncateNextTransAt(TMLTime iTime){
 #endif
     } else{
       aNewDuration-=aStaticPenalty;
-      //_nextTransaction->setVirtualLength(max((TMLTime)(aNewDuration / timeExec),(TMLTime)1));
-      float nb_ExecF = aNewDuration /timeExec; //must not be 0
-      TMLLength nb_ExecI = (TMLLength) nb_ExecF;
-      if(nb_ExecI<nb_ExecF) nb_ExecI++;
-      _nextTransaction->setVirtualLength(max(nb_ExecI,(TMLTime)1));
-      _nextTransaction->setLength(_nextTransaction->getVirtualLength() * timeExec);
+      _nextTransaction->setVirtualLength(max((TMLTime)(ceil(aNewDuration / timeExec)),(TMLTime)1));
+      _nextTransaction->setLength(ceil(_nextTransaction->getVirtualLength() * timeExec));
     }
 #else
     if (iTime <= _nextTransaction->getStartTime()) return 0;  //before: <=
     TMLTime aNewDuration = iTime - _nextTransaction->getStartTime();
-    //_nextTransaction->setVirtualLength(max((TMLTime)(aNewDuration / timeExec), (TMLTime)1));
-    float nb_ExecF = aNewDuration /timeExec; //must not be 0
-    TMLLength nb_ExecI = (TMLLength) nb_ExecF;
-    if(nb_ExecI<nb_ExecF) nb_ExecI++;
-    _nextTransaction->setVirtualLength(max(nb_ExecI,(TMLTime)1));
-    _nextTransaction->setLength(_nextTransaction->getVirtualLength() * timeExec);
+    _nextTransaction->setVirtualLength(max((TMLTime)(ceil(aNewDuration / timeExec)), (TMLTime)1));
+    _nextTransaction->setLength(ceil(_nextTransaction->getVirtualLength() * timeExec));
 #endif
 #ifdef DEBUG_CPU
     std::cout << "aNewDuration: " << aNewDuration << std::endl;
@@ -364,22 +353,14 @@ void SingleCoreCPU::truncateNextTrans(TMLTime iTime){ // called with _nextTransa
 #endif
              } else{
                aNewDuration-=aStaticPenalty;
-               //_nextTransaction->setVirtualLength(max((TMLTime)(aNewDuration / timeExec),(TMLTime)1));
-               float nb_ExecF = aNewDuration /timeExec; //must not be 0
-               TMLLength nb_ExecI = (TMLLength) nb_ExecF;
-               if(nb_ExecI<nb_ExecF) nb_ExecI++;
-               _nextTransaction->setVirtualLength(max(nb_ExecI,(TMLTime)1));
-               _nextTransaction->setLength(_nextTransaction->getVirtualLength() * timeExec);
+               _nextTransaction->setVirtualLength(max((TMLTime)(ceil(aNewDuration / timeExec)),(TMLTime)1));
+               _nextTransaction->setLength(ceil(_nextTransaction->getVirtualLength() * timeExec));
              }
 #else
              //if (iTime <= _nextTransaction->getStartTime()) return 0;  //before: <=
              TMLTime aNewDuration = iTime - _nextTransaction->getStartTime();
-             //_nextTransaction->setVirtualLength(max((TMLTime)(aNewDuration / timeExec), (TMLTime)1));
-             float nb_ExecF = aNewDuration /timeExec; //must not be 0
-             TMLLength nb_ExecI = (TMLLength) nb_ExecF;
-             if(nb_ExecI<nb_ExecF) nb_ExecI++;
-             _nextTransaction->setVirtualLength(max(nb_ExecI,(TMLTime)1));
-             _nextTransaction->setLength(_nextTransaction->getVirtualLength() * timeExec);
+             _nextTransaction->setVirtualLength(max((TMLTime)(ceil(aNewDuration / timeExec)), (TMLTime)1));
+             _nextTransaction->setLength(ceil(_nextTransaction->getVirtualLength() * timeExec));
 #endif
 #ifdef DEBUG_CPU
              std::cout << "aNewDuration: " << aNewDuration << std::endl;