diff --git a/smi/src/rt_def.h b/smi/src/rt_def.h
index d71f23c3ed830c3d69aab3b049e0ee85090aefaa..2b39eaf1ca62328cc93275767ccc704d1a46ead8 100644
--- a/smi/src/rt_def.h
+++ b/smi/src/rt_def.h
@@ -95,6 +95,7 @@ typedef volatile struct {
 
         taskStateStruct taskState[MAX_NUMBER_OF_TASK_STATES];  
         taskStateSysVarStruct taskStateSysVar[MAX_NUMBER_OF_TASK_STATES];  
+        controlFlagsStruct controlFlags[MAX_NUMBER_OF_TASK_STATES];  
 
         unsigned int smiLock;        
         int intTest;
diff --git a/smi/src/smi.c b/smi/src/smi.c
index e7867c9802d2c326fe00b23c6e39a24b9c0761d9..a2e0c45aad47b21e151bc5eb482dbf1f0093a6b5 100644
--- a/smi/src/smi.c
+++ b/smi/src/smi.c
@@ -247,7 +247,8 @@ if (t2-t1>maxGettime) maxGettime=t2-t1;
 */
         __sync_fetch_and_and(&(shm->smiLock),0);
 //rt_printf("in=%d ",  __sync_fetch_and_add(&(shm->smiLock),0));        
-
+/*
+t1=GETTIME;
 	for (i=0;i<shm->numberOfTaskStates;i++) {
 	 if (__sync_fetch_and_add(&(shm->taskStateSysVar[i].copy),0)) {
 	  int j;
@@ -259,7 +260,8 @@ if (t2-t1>maxGettime) maxGettime=t2-t1;
           __sync_fetch_and_and(&(shm->taskStateSysVar[i].copy),0);
 	 }
         }
-
+t2=GETTIME;        rt_printf("%lld ",(t2-t1)/1000);
+*/
   shm->numberOfCurrentLeafStates=0;
 
   for (i=0;i<2*MAX_NUMBER_OF_CONCURRENT_STATES;i++) {
@@ -306,12 +308,23 @@ if (t2-t1>maxGettime) maxGettime=t2-t1;
           currentTaskStateFlags[shm->numberOfCurrentLeafStates]|=TASK_TIMEOUT;
         if ((shm->taskStateSysVar[atomicStateVariables[i].taskStateVar].flags&TASK_BUSY)!=0)
           currentTaskStateFlags[shm->numberOfCurrentLeafStates]|=TASK_BUSY;
-// the following three lines were commented -> ?
+        if (__sync_fetch_and_and(&(shm->taskStateSysVar[atomicStateVariables[i].taskStateVar].exit),0)==ATOMIC_UNLOCKED) {  
+//rt_printf("bbbb->%d ",__sync_fetch_and_add(&(shm->taskStateSysVar[atomicStateVariables[i].taskStateVar].exit),0));
+           shm->taskStateSysVar[atomicStateVariables[i].taskStateVar].flags|=TASK_EXIT;           
+           for (j=0;j<MAX_NUMBER_OF_CONTROL_FLAGS_PER_STATE;j++) {
+             shm->taskState[atomicStateVariables[i].taskStateVar].outputControlFlag[j]
+             =shm->controlFlags[atomicStateVariables[i].taskStateVar].outputControlFlag[j];                 
+             shm->taskState[atomicStateVariables[i].taskStateVar].inputControlFlag[j]
+             =shm->controlFlags[atomicStateVariables[i].taskStateVar].inputControlFlag[j];                   
+           }
+        }
         if ((shm->taskStateSysVar[atomicStateVariables[i].taskStateVar].flags&TASK_EXIT)!=0)
-          currentTaskStateFlags[shm->numberOfCurrentLeafStates]|=TASK_EXIT;          
+           currentTaskStateFlags[shm->numberOfCurrentLeafStates]|=TASK_EXIT;          
         else 
         if (atomicStateVariables[i].exit==1)
           currentTaskStateFlags[shm->numberOfCurrentLeafStates]|=TASK_EXIT;
+if (shm->taskStateSysVar[atomicStateVariables[i].taskStateVar].nrt==0 ||
+__sync_fetch_and_and(&(shm->taskStateSysVar[atomicStateVariables[i].taskStateVar].exit),1)==ATOMIC_UNLOCKED)
         for (j=0;j<MAX_NUMBER_OF_CONTROL_FLAGS_PER_STATE;j++) {
           if (shm->taskState[atomicStateVariables[i].taskStateVar].outputControlFlag[j]==1) {
            currentTaskStateFlags[shm->numberOfCurrentLeafStates]|=(1<<(j+8));
diff --git a/smi/src/smi_def.h b/smi/src/smi_def.h
index 379830d6c0647c30b6ffcd28c2dfc7adf42105ba..08e7519401aceb24262b5806c0a661c84c2de66c 100644
--- a/smi/src/smi_def.h
+++ b/smi/src/smi_def.h
@@ -57,6 +57,12 @@ typedef volatile struct {
   int outputControlFlag[MAX_NUMBER_OF_CONTROL_FLAGS_PER_STATE]; 
 } taskStateStruct;
 
+typedef volatile struct { 
+  signed char inputControlFlag[MAX_NUMBER_OF_CONTROL_FLAGS_PER_STATE];
+  signed char outputControlFlag[MAX_NUMBER_OF_CONTROL_FLAGS_PER_STATE]; 
+} controlFlagsStruct;
+
+
 #define TASK_TIMEOUT	0x10
 typedef volatile struct { 
 #define TASK_EXEC	0x01
@@ -64,8 +70,8 @@ typedef volatile struct {
 #define TASK_ACTIVE	0x04
 #define TASK_BUSY	0x08
 #define TASK_SMI	0x20
-  unsigned int copy;
-  signed char outputControlFlagTmp[MAX_NUMBER_OF_CONTROL_FLAGS_PER_STATE];   
+  int exit;
+//  signed char outputControlFlagTmp[MAX_NUMBER_OF_CONTROL_FLAGS_PER_STATE];   
   int flags;  
   taskIDType taskID;
   processType process;
diff --git a/smi/src/smi_nrt.c b/smi/src/smi_nrt.c
index 92820bf162947609ff828adee6b6f8a4bacafe35..b8728f5d4cd9d2fa0756a181204ce6f28525890f 100644
--- a/smi/src/smi_nrt.c
+++ b/smi/src/smi_nrt.c
@@ -195,6 +195,7 @@ printf("new format\n");
           } else shm->taskStateSysVar[shm->esmStateTransfer.taskStateVar].dataPort[i]=NA;
         }
         shm->taskStateSysVar[shm->esmStateTransfer.taskStateVar].flags=0;        
+        shm->taskStateSysVar[shm->esmStateTransfer.taskStateVar].exit=0;                
     
         if (index+1>=numberBufferSize) {
           error=12;
diff --git a/smi/src/taskdisp_nrt.c b/smi/src/taskdisp_nrt.c
index 9a2b2eb4d3a533356e3f9a69bf8ffb252699a7d9..a626575a8718b34352449028dafbc261d6f7fe5b 100644
--- a/smi/src/taskdisp_nrt.c
+++ b/smi/src/taskdisp_nrt.c
@@ -216,7 +216,36 @@ usleep(10000);
              usleep(STD_SLEEP);	                           
             } else smiLock=1;
            } 
-	  
+
+//	   if ((shm->taskStateSysVar[i].flags&TASK_EXEC)!=0) 
+	   if ((taskStateSysVarTmp.flags&TASK_EXEC)!=0)
+           {
+//	    execTask(&shm->taskState[i],&shm->taskStateSysVar[i],shm->taskStateSysVar[i].taskID);
+	    execTask(&taskStateTmp,&taskStateSysVarTmp,taskStateSysVarTmp.taskID);
+/*
+            memcpy((unsigned char*)&(shm->taskState[i]),	     
+	     (unsigned char*)&taskStateTmp,
+              sizeof(taskStateStruct));	  
+*/
+            for (j=0;j<MAX_NUMBER_OF_CONTROL_FLAGS_PER_STATE;j++) {
+             shm->controlFlags[i].outputControlFlag[j]=taskStateTmp.outputControlFlag[j];      
+             shm->controlFlags[i].inputControlFlag[j]=taskStateTmp.inputControlFlag[j];      
+            }
+
+//            shm->taskStateSysVar[i].flags|=TASK_EXIT;
+//            __sync_fetch_and_and(&(shm->taskStateSysVar[i].flags),TASK_EXIT);          
+            __sync_fetch_and_nand(&(shm->taskStateSysVar[i].exit),0);          
+//printf("aaaaaa->%d",__sync_fetch_and_add(&(shm->taskStateSysVar[i].exit),0));          
+            
+            numberOfSMIIterations=__sync_fetch_and_add(&(shm->numberOfSMIIterations),0);	    
+	    while (numberOfSMIIterations==__sync_fetch_and_add(&(shm->numberOfSMIIterations),0) && shm->run!=0) 	    
+	    {
+		usleep(STD_SLEEP);	   
+	    }	 
+            __sync_fetch_and_and(&(shm->taskStateSysVar[i].exit),0);          	    
+	   }
+
+if (0) {	  
 	   if ((taskStateSysVarTmp.flags&TASK_EXEC)!=0
 /*	    && ((shm->taskStateSysVar[i].oneShot==0
 	      || (shm->taskStateSysVar[i].flags&TASK_EXIT)==0
@@ -238,11 +267,13 @@ usleep(10000);
 //if (n==0 && shm->taskStateSysVar[i].taskID==27 && shm->taskState[i].stateID==72) printf("-----------------\n");
 //	    shm->taskStateSysVar[i].flags&=~(TASK_ACTIVE);
 //	    shm->taskStateSysVar[i].flags&=~(TASK_EXEC);	    
+/*
             for (j=0;j<MAX_NUMBER_OF_CONTROL_FLAGS_PER_STATE;j++) {
              shm->taskStateSysVar[i].outputControlFlagTmp[j]=
               taskStateTmp.outputControlFlag[j];      
             }
-            __sync_fetch_and_nand(&(shm->taskStateSysVar[i].copy),0);          
+*/
+//            __sync_fetch_and_nand(&(shm->taskStateSysVar[i].copy),0);          
 
 //	    shm->taskStateSysVar[i].flags|=TASK_EXIT;
 //	    shm->t3=shm->reftime;
@@ -257,6 +288,7 @@ usleep(10000);
 		usleep(STD_SLEEP);	   
 	    }	 
 	   }
+}	   
 	  }
 	 }
 	 if (shm->run==0) break;