diff --git a/Pcie40Applications/main_pcie40_ul.c b/Pcie40Applications/main_pcie40_ul.c
index 41edc130d8d0ecbe9ac356b72647e816b53b2819..d2665fd537e0d8f0d7cbcf91d1beac2b10f3d327 100644
--- a/Pcie40Applications/main_pcie40_ul.c
+++ b/Pcie40Applications/main_pcie40_ul.c
@@ -39,7 +39,14 @@ const int CRC16_XMODEM_TABLE[] = {
   0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,
 } ;
 
-
+int print_data( unsigned int *data ){
+  int j = 0;
+     printf("Try -----------------------------------\n"); 
+     for ( j = 0 ; j < DMASIZE ; ++j ) { 
+       printf( "%.8x " , data[ j ] ) ; 
+       if( j % 8 == 7 ) printf("\n"); 
+     } 
+}
 
 int crc_calc( int * crc, unsigned int * data ){ 
   int byte1, byte2, byte3, byte4 ;
@@ -53,16 +60,16 @@ int crc_calc( int * crc, unsigned int * data ){
   *crc = ((((*crc))<<8)&0xff00) ^ CRC16_XMODEM_TABLE[((((*crc))>>8)&0xff)^byte1] ;
 }
 
-int decode_data_wUL( unsigned int * data , unsigned int * ce , int * crc , int * run , 
+int decode_data_wUL( unsigned int * data , unsigned int * ce , int * crc , int * prev_exp_run , 
 		     int * bad , int *evn , int * retry , int * pctime , int * putime , 
 		     int * nmissed ) { 
 
   int magic; 
-  int size, size_link;
-  int ix ;
+  int size, size_link, size_256;
+  int ix, new = 0;
 
   int offset; 
-  unsigned int exp_run, evenum, ctime, utime; 
+  unsigned int exp_run, evenum, ctime, utime, cur_pos = 0; 
 
   if( *ce < 0 || DMASIZE < *ce ){
     printf("Current positoin is out of DMASIZE %d. Exiting...\n", *ce );
@@ -72,7 +79,9 @@ int decode_data_wUL( unsigned int * data , unsigned int * ce , int * crc , int *
   *crc = 0 ;
   size = data[ ( *ce ) % DMASIZE ]  ;
   magic = data[ ( *ce + 1 ) % DMASIZE ] ;
+  exp_run = data[ ( *ce + 2 ) % DMASIZE ];
   evenum = data[ ( *ce + 3 ) % DMASIZE ];
+
   // Check a new event is available in the memory
   if( ( magic & 0xffff0000 ) != 0x7f7f0000 ){
     printf("Invalid magic number %.8x pos %d : ", magic, *ce );
@@ -80,34 +89,72 @@ int decode_data_wUL( unsigned int * data , unsigned int * ce , int * crc , int *
 	   data[ ( *ce ) % DMASIZE ], data[ ( *ce + 1 ) % DMASIZE ], data[ ( *ce + 2 ) % DMASIZE ], 
 	   data[ ( *ce + 3 ) % DMASIZE ], data[ ( *ce + 4 ) % DMASIZE ], data[ ( *ce + 5 ) % DMASIZE ],
 	   data[ ( *ce + 6 ) % DMASIZE ], data[ ( *ce + 7 ) % DMASIZE ] );
+
+    //    print_data(data);
     // search for next good event
     int j = 0 ; 
     for ( j = *ce ; j < *ce + DMASIZE ; ++j ) { 
-      if ( ( ( data[ j ] & 0xffff0000 ) == 0x7f7f0000 ) && 
+      if ( ( ( data[ j % DMASIZE ] & 0xffff0000 ) == 0x7f7f0000 ) && 
 	   ( ( data[ ( j + 2 ) % DMASIZE ]  > *evn ) ) ) {
 	size = data[ ( j - 1 ) % DMASIZE ] ;
 
+	exp_run = data[ ( j + 1 ) % DMASIZE ];
 	evenum = data[ ( j + 2 ) % DMASIZE ];
-	*ce = ( j - 1 ) % DMASIZE;
-	printf("New ! eve %.8d pos %d size %d : ", evenum, *ce, size);
-	printf("%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n",
-	       data[ ( *ce ) % DMASIZE ], data[ ( *ce + 1 ) % DMASIZE ], data[ ( *ce + 2 ) % DMASIZE ], 
-	       data[ ( *ce + 3 ) % DMASIZE ], data[ ( *ce + 4 ) % DMASIZE ], data[ ( *ce + 5 ) % DMASIZE ],
-	       data[ ( *ce + 6 ) % DMASIZE ], data[ ( *ce + 7 ) % DMASIZE ] );
+	cur_pos = ( j - 1 ) % DMASIZE;
+	printf("New ! eve %.8x pos %d size %d : ", evenum, j - 1, size);
+	new = 1;
+	printf("%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n",
+	       data[ ( j - 1 ) % DMASIZE ],data[ ( j  ) % DMASIZE ],
+	       data[ ( j + 1 ) % DMASIZE ], data[ ( j + 2 ) % DMASIZE ], 
+	       data[ ( j + 3 ) % DMASIZE ], data[ ( j + 4 ) % DMASIZE ], data[ ( j + 5 ) % DMASIZE ],
+	       data[ ( j + 6 ) % DMASIZE ], data[ ( j + 7 ) % DMASIZE ], data[ ( j + 8 ) % DMASIZE ]);
 	break ;
       } 
-      if( j == *ce + DMASIZE - 1 ) return 0;
+      if( j == *ce + DMASIZE - 1 ) return -1;
     }     
-  }else{
-    printf("Good! eve %.8d pos %d size %d\n", evenum, *ce, size);
   }
-  if( evenum - *evn != 1 ){
-    printf("Missing events cur %d pre %d\n", evenum, *evn );
+
+
+  printf("[INFO] Good! run %.8x prevrun %.8x eve %.8x pos %.8x size %.8x\n", exp_run, *prev_exp_run, evenum, *ce, size);
+
+  
+  if( size % 8 != 0 ){
+    size_256 = ( size/8 + 1 )*8;
+  } else { 
+    size_256 = size ;
   }
 
-  *evn = evenum;
+  if( exp_run == *prev_exp_run && evenum - *evn != 1 ){
+    printf("[WARNING] Missing events run cur %.8x pre %.8x eve cur %.8x pre %.8x\n", exp_run, *prev_exp_run, evenum, *evn );
+  }
 
-  return size;
+  if( exp_run < *prev_exp_run && *prev_exp_run < 0x1000000 ){
+    printf("[NOTICE] Reached prev. run data : run cur %.8x pre %.8x eve cur %.8x pre %.8x\n", exp_run, *prev_exp_run, evenum, *evn );
+    return -1;
+  }else if( exp_run > 0x1000000 ){
+    printf("[ERROR] Too large run num! run %.8x prevrun %.8x eve %.8x pos %.8x size %.8x\n", exp_run, *prev_exp_run, evenum, *ce, size);
+    if( new == 1 ){
+	printf("%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n",
+	       data[ ( cur_pos  ) % DMASIZE ],
+	       data[ ( cur_pos + 1 ) % DMASIZE ], data[ ( cur_pos + 2 ) % DMASIZE ], 
+	       data[ ( cur_pos + 3 ) % DMASIZE ], data[ ( cur_pos + 4 ) % DMASIZE ], data[ ( cur_pos + 5 ) % DMASIZE ],
+	       data[ ( cur_pos + 6 ) % DMASIZE ], data[ ( cur_pos + 7 ) % DMASIZE ], data[ ( cur_pos + 8 ) % DMASIZE ]);
+    }else{
+      printf("%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n",
+	   data[ ( *ce ) % DMASIZE ], data[ ( *ce + 1 ) % DMASIZE ], data[ ( *ce + 2 ) % DMASIZE ], 
+	   data[ ( *ce + 3 ) % DMASIZE ], data[ ( *ce + 4 ) % DMASIZE ], data[ ( *ce + 5 ) % DMASIZE ],
+	   data[ ( *ce + 6 ) % DMASIZE ], data[ ( *ce + 7 ) % DMASIZE ] );
+    }
+    return -1;
+  }else{
+    if( new == 1 ) *ce = cur_pos;
+    *ce = *ce + size_256;    
+    //    printf("new pos %d size %d\n", *ce, size_256);
+    *prev_exp_run = exp_run;
+    *evn = evenum;
+  }
+
+  return 0;
   
   if ( 0 == size ) return 0 ;
   
@@ -122,7 +169,7 @@ int decode_data_wUL( unsigned int * data , unsigned int * ce , int * crc , int *
   
   //  printf("exprun %.8x eve %d ce %d\n", exp_run, evenum , *ce );
   
-  if ( ( exp_run >> 8 ) != *run ) { // it may be that the old data is still in memory
+  if ( ( exp_run >> 8 ) != *prev_exp_run ) { // it may be that the old data is still in memory
     return 0 ; 
   }
 
@@ -227,7 +274,7 @@ int main(int argc ,char** argv) {
   FILE* fp; 
   char * ptr ;
   char * tmp ;
-  fp = popen( "ssh yamadas@ttd7 \"trigft -23 pulse 10 -1\"" , "r" ) ;
+  fp = popen( "ssh yamadas@ttd7 \"trigft -23 poisson 1000 -1\"" , "r" ) ;
   char buf[1000] ;
   char exp[] = "exp" ; 
   sleep( 2 ) ;
@@ -259,6 +306,7 @@ int main(int argc ,char** argv) {
   int retry ;
   int bad ;
   int evn ;
+  int ret = 0;
   evn = 0  ;
   bad = 0 ;
   retry = 0 ;
@@ -267,8 +315,9 @@ int main(int argc ,char** argv) {
   putime = 0 ;
 
   int i, j ;
-  int size, size_256, currentEventIndex, crc, nErr, nEvt, nRetry, nMissed ;
+  int size, size_256, currentEventIndex, prev_ce, crc, nErr, nEvt, nRetry, nMissed ;
   currentEventIndex = 0 ;
+  prev_ce = 0;
   nErr = 0 ;
   nEvt = 0 ;
   nRetry = 0 ;
@@ -277,9 +326,9 @@ int main(int argc ,char** argv) {
   clock_t begin = clock() ;
 
   //  for ( i = 0 ; i < 10000000 ; ++i ) { 
-  for ( i = 0 ; i < 10 ; ++i ) { 
+  for ( i = 0 ; i < 1000000 ; ++i ) { 
 
-    if ( ( nEvt % 1000 == 1 ) && ( size != 0 ) ) printf( "Event number %d\n", nEvt ) ;
+    //    if ( ( nEvt % 1000 == 1 ) && ( size != 0 ) ) printf( "Event number %d\n", nEvt ) ;
     if ( read_dma == 1 ) { 
       // set busy
       //res = ecs_write( 0 , 2 ,  0x000501A0 , 0x1 ) ;
@@ -292,44 +341,21 @@ int main(int argc ,char** argv) {
       read_dma = 1 ;
     } 
 
-     printf("Try %.8x -----------------------------------\n",i ); 
-     for ( j = 0 ; j < DMASIZE ; ++j ) { 
-       printf( "%.8x " , data[ j ] ) ; 
-       if( j % 8 == 7 ) printf("\n"); 
-     } 
 
 
     bad = 0 ;
-
-    printf("index %d data %.8x\n", currentEventIndex, data[ ( currentEventIndex + 1 ) % DMASIZE ] );
-    while( currentEventIndex < DMASIZE && 0 <= currentEventIndex ){ 
+    while( currentEventIndex < DMASIZE && currentEventIndex >= 0 ){
+      //      printf("index %d data %.8x\n", currentEventIndex, data[ ( currentEventIndex + 1 ) % DMASIZE ] );
       currentEventIndex = currentEventIndex % DMASIZE ; 
-      size = decode_data_wUL( data , &currentEventIndex , &crc , &run , &bad , &evn , &retry ,
-			      &pctime , &putime , &nMissed ) ;
-      if ( 0 == size ) { 
-	read_dma = 1 ;
-	continue ;
+      prev_ce = currentEventIndex;
+      if( decode_data_wUL( data , &currentEventIndex , &crc , &run , &bad , &evn , &retry , &pctime , &putime , &nMissed ) < 0 ){ 
+	sleep(1);
+	break;
       }
-      if ( retry != 0 ) nRetry++ ;
-      if ( size == -1 ) { 
-      nErr++ ;
-      read_dma = 1 ;
-      continue ; 
-    }
-    if ( bad == 1 ) nErr++ ;
-    //    evn++ ; 
-    
-    if( size % 8 != 0 ){
-      size_256 = ( size/8 + 1 )*8;
-    } else { 
-      size_256 = size ;
-    }
-
-    //    printf("cur %d sz %d\n", currentEventIndex, size_256 );
-    currentEventIndex = currentEventIndex + size_256;
-    nEvt++ ;  
     }
     currentEventIndex = currentEventIndex % DMASIZE ; 
+    printf("cnt %d pos %d run %.8x evn %.8x\n", nEvt, currentEventIndex, run, evn);
+    nEvt++;
     read_dma = 1 ;
     retry = 0 ;
   }