diff --git a/marchenko3D/marchenko3D.c b/marchenko3D/marchenko3D.c
index 0695d33765687efed7a1d0332828eb4dc76e22a0..4df7250c3e1234d1a7de392234f8d30b24150082 100644
--- a/marchenko3D/marchenko3D.c
+++ b/marchenko3D/marchenko3D.c
@@ -68,8 +68,7 @@ void synthesis3D(complex *Refl, complex *Fop, float *Top, float *iRN, long nx, l
     float dx, float dy, long ntfft, long nw, long nw_low, long nw_high,  long mode, long reci, long nshots, long nxsrc, long nysrc, 
     long *ixpos, long *iypos, long npos, double *tfft, long *isxcount, long *reci_xsrc,  long *reci_xrcv, float *ixmask, long verbose);
 
-
-long writeDataIter3D(char *file_iter, float *data, segy *hdrs, long n1, long n2, long n3, float d2, float f2, long n2out, long Nfoc, float *xsyn, float *ysyn, float *zsyn, long *ixpos, int *iypos, long npos, long iter);
+long writeDataIter3D(char *file_iter, float *data, segy *hdrs, long n1, long n2, long n3, long Nfoc, float *xsyn, float *ysyn, float *zsyn, long *ixpos, long *iypos, long npos, long t0shift, long iter);
 
 void imaging3D(float *Image, float *Gmin, float *f1plus, long nx, long ny, long nt, float dx, float dy, float dt, long Nfoc, long verbose);
 
@@ -162,8 +161,8 @@ int main (int argc, char **argv)
     long    size, n1, n2, n3, ntap, tap, dxi, dyi, ntraces, pad, *sx, *sy, *sz;
     long    nw, nw_low, nw_high, nfreq, *xnx, *xnxsyn;
     long    reci, countmin, mode, n2out, n3out, verbose, ntfft;
-    long    iter, niter, tracf, *muteW, *tsynW, ampest, plane_wave, compact;
-    long    hw, smooth, above, shift, *ixpos, *iypos, npos, ix, iy, nzim, nxim, nyim;
+    long    iter, niter, tracf, *muteW, *tsynW, ampest, plane_wave, t0shift;
+    long    hw, smooth, above, shift, *ixpos, *iypos, npos, ix, iy, nzim, nxim, nyim, compact;
     long    nshots_r, *isxcount, *reci_xsrc, *reci_xrcv;
     float   fmin, fmax, *tapersh, *tapersy, fxf, fyf, dxf, dyf, *xsrc, *ysrc, *xrcv, *yrcv, *zsyn, *zsrc, *xrcvsyn, *yrcvsyn;
     double  t0, t1, t2, t3, tsyn, tread, tfft, tcopy, energyNi, energyN0;
@@ -177,7 +176,7 @@ int main (int argc, char **argv)
     char    *file_tinv, *file_shot, *file_green, *file_iter, *file_imag, *file_homg, *file_ampscl;
     char    *file_f1plus, *file_f1min, *file_gmin, *file_gplus, *file_f2, *file_pmin, *file_inp;
     char    *file_ray, *file_amp, *file_wav;
-    segy    *hdrs_out, *hdrs_Nfoc;
+    segy    *hdrs_out, *hdrs_Nfoc, *hdrs_iter;
 
     initargs(argc, argv);
     requestdoc(1);
@@ -609,6 +608,28 @@ int main (int argc, char **argv)
             hdrs_out[k*n2+i].tracl  = k*n2+i+1;
         }
     }
+    if (file_iter != NULL) {
+        hdrs_iter = (segy *) calloc(npos,sizeof(segy));
+        if (hdrs_iter == NULL) verr("allocation for hdrs_iter");
+        for (i = 0; i < npos; i++) {
+            ix = ixpos[i]; 
+            iy = iypos[i]; 
+            hdrs_iter[i].ns     = n1;
+            hdrs_iter[i].trid   = 1;
+            hdrs_iter[i].dt     = dt*1000000;
+            hdrs_iter[i].f1     = f1;
+            hdrs_iter[i].f2     = f2;
+            hdrs_iter[i].d1     = d1;
+            hdrs_iter[i].d2     = d2;
+            hdrs_iter[i].trwf   = npos;
+            hdrs_iter[i].scalco = -1000;
+            hdrs_iter[i].gx     = NINT(1000*(f2+ix*d2));
+            hdrs_iter[i].gy     = NINT(1000*(f3+iy*d3));
+            hdrs_iter[i].scalel = -1000;
+            hdrs_iter[i].tracl  = i+1;
+	    }
+	}
+
     t1    = wallclock_time();
     tread = t1-t0;
 
@@ -646,11 +667,11 @@ int main (int argc, char **argv)
         t3 = wallclock_time();
         tsyn +=  t3 - t2;
 
-/* ToDo
         if (file_iter != NULL) {
-            writeDataIter3D(file_iter, iRN, hdrs_out, ntfft, nxs, nys, d2, f2, n2out, n3out, Nfoc, xsyn,ysyn,  zsyn, ixpos, npos, iter);
+            t0shift=1;
+            writeDataIter3D(file_iter, iRN, hdrs_iter, ntfft, nxs, nys, Nfoc, xsyn, ysyn, zsyn, ixpos, iypos, npos, t0shift, iter);
         }
-*/ 
+
         /* N_k(x,t) = -N_(k-1)(x,-t) */
         /* p0^-(x,t) += iRN = (R * T_d^inv)(t) */
         for (l = 0; l < Nfoc; l++) {
diff --git a/marchenko3D/synthesis3D.c b/marchenko3D/synthesis3D.c
index 416542d19aaf4a4420fd9aa0b3eaafe7166d4bd0..41a66b0dfc787a2f1e24ec1044e6b5a5851507e0 100644
--- a/marchenko3D/synthesis3D.c
+++ b/marchenko3D/synthesis3D.c
@@ -168,10 +168,10 @@ long *ixpos, long *iypos, long npos, double *tfft, long *isxcount, long *reci_xs
 
 #ifdef _OPENMP
     npe   = (long)omp_get_max_threads();
-    /* parallelisation is over number of virtual source positions (Nfoc) */
-    if (npe > Nfoc) {
-        vmess("Number of OpenMP threads set to %li (was %li)", Nfoc, npe);
-        omp_set_num_threads((int)Nfoc);
+    /* parallelisation is over number of shot positions (nshots) */
+    if (npe > nshots) {
+        vmess("Number of OpenMP threads set to %li (was %li)", nshots, npe);
+        omp_set_num_threads((int)nshots);
     }
 #endif
 
@@ -226,27 +226,28 @@ long *ixpos, long *iypos, long npos, double *tfft, long *isxcount, long *reci_xs
     t1 = wallclock_time();
     *tfft += t1 - t0;
 
-/* Loop over total number of shots */
     if (reci == 0 || reci == 1) {
-        for (k=0; k<nshots; k++) {
-            if ((xsrc[k] < fxb) || (xsrc[k] > fxe) || (ysrc[k] < fyb) || (ysrc[k] > fye)) continue;
-            isrc = NINT((ysrc[k] - fysb)/dys)*nxs+NINT((xsrc[k] - fxsb)/dxs);
-            inx = xnx[k]; /* number of traces per shot */
 
 /*================ SYNTHESIS ================*/
 
 #pragma omp parallel default(none) \
- shared(iRN, dx, dy, npe, nw, verbose) \
+ shared(iRN, dx, dy, npe, nw, nshots, verbose) \
  shared(Refl, Nfoc, reci, xrcv, xsrc, yrcv, ysrc, xsyn, ysyn) \
  shared(fxsb, fxse, fysb, fyse, nxs, nys, nxys, dxs, dys) \
- shared(nx, ny, nxy, dysrc, dxsrc, inx, k, nfreq, nw_low, nw_high) \
- shared(Fop, size, nts, ntfft, scl, iyrcv, ixrcv, isrc) \
- private(l, ix, iy, j, m, i, sum, rtrace)
+ shared(nx, ny, nxy, dysrc, dxsrc, nfreq, nw_low, nw_high, xnx) \
+ shared(Fop, size, nts, ntfft, scl, iyrcv, ixrcv, fxb, fxe, fyb, fye) \
+ private(l, ix, iy, j, m, i, sum, rtrace, k, isrc, inx)
 { /* start of parallel region */
-            sum   = (complex *)malloc(nfreq*sizeof(complex));
-            rtrace = (float *)calloc(ntfft,sizeof(float));
+        sum   = (complex *)malloc(nfreq*sizeof(complex));
+        rtrace = (float *)calloc(ntfft,sizeof(float));
 
+/* Loop over total number of shots */
 #pragma omp for schedule(guided,1)
+        for (k=0; k<nshots; k++) {
+            if ((xsrc[k] < fxb) || (xsrc[k] > fxe) || (ysrc[k] < fyb) || (ysrc[k] > fye)) continue;
+            isrc = NINT((ysrc[k] - fysb)/dys)*nxs+NINT((xsrc[k] - fxsb)/dxs);
+            inx = xnx[k]; /* number of traces per shot */
+
             for (l = 0; l < Nfoc; l++) {
 		        /* compute integral over receiver positions */
                 /* multiply R with Fop and sum over nx */
@@ -269,19 +270,16 @@ long *ixpos, long *iypos, long npos, double *tfft, long *isxcount, long *reci_xs
                 for (j = 0; j < nts; j++) 
                     iRN[l*size+isrc*nts+j] += rtrace[j]*scl*dx*dy;
             
-            } /* end of parallel Nfoc loop */
-            free(sum);
-            free(rtrace);
+            } /* end of Nfoc loop */
 
-#ifdef _OPENMP
-#pragma omp single 
-            npe   = (long)omp_get_num_threads();
-#endif
-} /* end of parallel region */
+            if (verbose>4) vmess("*** Shot gather %li processed ***", k);
+
+        } /* end of parallel nshots (k) loop */
+        free(sum);
+        free(rtrace);
 
-        if (verbose>4) vmess("*** Shot gather %li processed ***", k);
+} /* end of parallel region */
 
-        } /* end of nshots (k) loop */
     }     /* end of if reci */
 
     t = wallclock_time() - t0;
@@ -290,4 +288,4 @@ long *ixpos, long *iypos, long npos, double *tfft, long *isxcount, long *reci_xs
     }
 
     return;
-}
\ No newline at end of file
+}
diff --git a/marchenko3D/writeDataIter3D.c b/marchenko3D/writeDataIter3D.c
index 0820e4301e3b7a851fe7353e2f8003341a59539a..fbaecdb2f4d71bb67a5982bae554c5aee5078955 100644
--- a/marchenko3D/writeDataIter3D.c
+++ b/marchenko3D/writeDataIter3D.c
@@ -16,55 +16,53 @@
 
 void name_ext(char *filename, char *extension);
 
-long writeDataIter3D(char *file_iter, float *data, segy *hdrs, long n1, long n2, long n3, float d2, float f2, long Nfoc, float *xsyn, float *ysyn, float *zsyn, long *ixpos, int *iypos, long npos, long t0shift, long iter)
+long writeDataIter3D(char *file_iter, float *data, segy *hdrs, long n1, long n2, long n3, long Nfoc, float *xsyn, float *ysyn, float *zsyn, long *ixpos, long *iypos, long npos, long t0shift, long iter)
 {
 	FILE *fp_iter;
 	size_t nwrite;
-	int i, l, j, k, iy, ret, tracf, size, ix;
+	int i, l, j, ret, tracf, size, ix, iy;
     char number[16], filename[1024];
 	float *trace;
 
     trace  = (float *)malloc(n1*sizeof(float));
 	strcpy(filename, file_iter);
-	sprintf(number,"_%03d",(iter+1));
+	sprintf(number,"_%03d",(iter));
 	name_ext(filename, number);
 	fp_iter = fopen(filename, "w+");
 	if (fp_iter==NULL) verr("error on creating output file %s", filename);
-	tracf=1;
 	size=n1*n2*n3;
+	tracf=1;
 	for (l = 0; l < Nfoc; l++) {
-    for (k = 0; k < n3; k++) {
-        for (i = 0; i < n2; i++) {
+        for (i = 0; i < npos; i++) {
             ix = ixpos[i]; /* select proper position */
-			hdrs[k*n2+i].fldr   = l+1; 
-            hdrs[k*n2+i].sx     = NINT(xsyn[l]*1000);
-            hdrs[k*n2+i].sy     = NINT(ysyn[l]*1000);
-			hdrs[k*n2+i].offset = (long)NINT((f2+i*d2) - xsyn[l]);
-			hdrs[k*n2+i].tracf = tracf++;
-			hdrs[k*n2+i].selev  = NINT(zsyn[l]*1000);
-			hdrs[k*n2+i].sdepth = NINT(-zsyn[l]*1000);
-
+            iy = iypos[i]; 
+            hdrs[i].fldr   = l+1; 
+            hdrs[i].sx     = NINT(xsyn[l]*1000);
+            hdrs[i].sy     = NINT(ysyn[l]*1000);
+            hdrs[i].tracf  = tracf++;
+            hdrs[i].selev  = NINT(zsyn[l]*1000);
+            hdrs[i].sdepth = NINT(-zsyn[l]*1000);
+   
             if (t0shift) {
-            /* rotate to get t=0 in the middle */
-            hdrs[k*n2+i].f1     = -n1*0.5*hdrs[k*n2+i].d1;
-
-            for (j = 0; j < n1/2; j++) {
-                trace[n1/2+j] = data[l*size+iy*n2*n2+ix*n1+j];
-            }
-            for (j = n1/2; j < n1; j++) {
-                trace[j-n1/2] = data[l*size+iy*n2*n2+ix*n1+j];
+                /* rotate to get t=0 in the middle */
+                hdrs[i].f1     = -n1*0.5*hdrs[i].d1;
+    
+                for (j = 0; j < n1/2; j++) {
+                    trace[n1/2+j] = data[l*size+iy*n2*n1+ix*n1+j];
+                }
+                for (j = n1/2; j < n1; j++) {
+                    trace[j-n1/2] = data[l*size+iy*n2*n1+ix*n1+j];
+                }
             }
-			}
             else {
                 hdrs[i].f1     = 0.0;
-                memcpy(&trace[0],&data[l*size+iy*n2*n2+ix*n1],n1*sizeof(float));
+                memcpy(&trace[0],&data[l*size+iy*n2*n1+ix*n1],n1*sizeof(float));
             }
-			nwrite = fwrite(&hdrs[k*n2+i], 1, TRCBYTES, fp_iter);
-			assert(nwrite == TRCBYTES);
-			nwrite = fwrite(trace, sizeof(float), n1, fp_iter);
-			assert (nwrite == n1);
-		}
-	}
+            nwrite = fwrite(&hdrs[i], 1, TRCBYTES, fp_iter);
+            assert(nwrite == TRCBYTES);
+            nwrite = fwrite(trace, sizeof(float), n1, fp_iter);
+            assert (nwrite == n1);
+        }
 	}
 	ret = fclose(fp_iter);
 	if (ret < 0 ) verr("error on writing output file.");