diff --git a/fdelmodc/Makefile b/fdelmodc/Makefile
index 63107542ecbf6f0cee54aff375244967c7d2a1ec..37f88801d8c6e93aee11b2f6825a91da971293a4 100644
--- a/fdelmodc/Makefile
+++ b/fdelmodc/Makefile
@@ -8,7 +8,7 @@ ALLINC  = -I.
 #LIBS    += -L$L -lgenfft -lm $(LIBSM)
 #OPTC = -g -Wall -fsignaling-nans -O0 -fopenmp
 #OPTC += -fopenmp -Waddress
-OPTC +=  -qopt-report=5
+#OPTC +=  -qopt-report=5 -g
 #OPTC := $(subst -O3 -ffast-math, -O1 -g ,$(OPTC))
 #PGI options for compiler feedback
 #OPTC += -Mprof=lines
diff --git a/fdelmodc/applySource.c b/fdelmodc/applySource.c
index 3aeb972c1404aaa91a8e9b3edf17685edea4e40a..934f16bc5a727526e2c2c1265445567df55a0b85 100644
--- a/fdelmodc/applySource.c
+++ b/fdelmodc/applySource.c
@@ -156,6 +156,10 @@ int applySource(modPar mod, srcPar src, wavPar wav, bndPar bnd, int itime, int i
 			/* stable implementation changes amplitude and more work is needed */
 			//vz[ix*n1+iz] = 0.5*(vz[ix*n1+iz-1]+vz[ix*n1+iz+1])+src_ampl*roz[ix*n1+iz]/(l2m[ix*n1+iz]);
 			//vz[ix*n1+iz] = 0.25*(vz[ix*n1+iz-2]+vz[ix*n1+iz-1]+vz[ix*n1+iz]+vz[ix*n1+iz+1])+src_ampl*roz[ix*n1+iz]/(l2m[ix*n1+iz]);
+        } 
+		else if (src.type == 10) {
+		    tzz[ix*n1+iz-1] -= src_ampl;
+		    tzz[ix*n1+iz+1] += src_ampl;
         } /* src.type */
 
         
diff --git a/fdelmodc/demo/modelOilGas.scr b/fdelmodc/demo/modelOilGas.scr
index 5fa26904388a3d67e07cc72a6bc7861d1b5bec16..6227c3739cffebeb4815b8ba8315ac5dd01980d2 100755
--- a/fdelmodc/demo/modelOilGas.scr
+++ b/fdelmodc/demo/modelOilGas.scr
@@ -16,19 +16,19 @@ makemod sizex=5000 sizez=2500 dx=$dx dz=$dx cp0=$cp ro0=$rho \
 
 makewave w=g1 fp=20 dt=$dt file_out=wave.su nt=4096 t0=0.1
 
-export OMP_NUM_THREADS=1
+export OMP_NUM_THREADS=4
 
 zsrc=1100
 zsrc=0
 
 which fdelmodc
 
-fdelmodc \
+../fdelmodc \
     file_cp=syncl_cp.su ischeme=1 iorder=4 \
     file_den=syncl_ro.su \
     file_src=wave.su \
     file_rcv=shot_fd.su \
-    src_type=7 \
+    src_type=1 \
 	src_orient=1 \
 	src_injectionrate=0 \
     rec_type_vz=1 \
@@ -37,13 +37,13 @@ fdelmodc \
     dtrcv=0.004 \
 	rec_delay=0.1 \
     verbose=2 \
-    tmod=2.01 \
+    tmod=0.01 \
     dxrcv=10.0 \
     xrcv1=-2250 xrcv2=2250 \
     zrcv1=0 zrcv2=0 \
     xsrc=0 zsrc=$zsrc \
 	file_snap=snapF_$zsrc \
-	tsnap1=0.1 tsnap2=2.0 dtsnap=0.05 dxsnap=$dx dzsnap=$dx \
+	tsnap1=0.1 tsnap2=0.0 dtsnap=0.05 dxsnap=$dx dzsnap=$dx \
     ntaper=101 \
 	snapwithbnd=1 \
     left=2 right=2 top=2 bottom=2
diff --git a/fdelmodc/demo/modelOilGas.scr.ok b/fdelmodc/demo/modelOilGas.scr.ok
deleted file mode 100755
index 89907c0d5c8891a821c3b06d27cdbd1f25b94fdf..0000000000000000000000000000000000000000
--- a/fdelmodc/demo/modelOilGas.scr.ok
+++ /dev/null
@@ -1,95 +0,0 @@
-#!/bin/bash
-
-#export PATH=$HOME/bin:$HOME/src/OpenSource/utils:$PATH:
-
-cp=2000
-rho=2500
-dx=2.5
-dt=0.0005
-
-
-makemod sizex=5000 sizez=2500 dx=$dx dz=$dx cp0=$cp ro0=$rho \
-	orig=-2500,0 file_base=syncl.su \
-	intt=def x=-2500,0,2500 z=250,250,250 poly=0 cp=2300 ro=2000 \
-	intt=def x=-2500,-2000,-1000,-800,0,800,2500 z=650,650,700,750,900,750,600 poly=2 cp=2600 ro=2500 \
-	intt=def x=-2500,0,2500 z=1390,1390,1390 poly=0 cp=2000 ro=2000 
-
-makewave w=g1 fp=20 dt=$dt file_out=wave.su nt=4096 t0=0.1
-
-export OMP_NUM_THREADS=8
-
-zsrc=1100
-zsrc=0
-
-../fdelmodc \
-    file_cp=syncl_cp.su ischeme=1 iorder=4 \
-    file_den=syncl_ro.su \
-    file_src=wave.su \
-    file_rcv=shot_fd.su \
-    src_type=7 \
-	src_orient=1 \
-	src_injectionrate=0 \
-    rec_type_vz=1 \
-    rec_type_p=1 \
-    rec_int_vz=2 \
-    dtrcv=0.004 \
-	rec_delay=0.1 \
-    verbose=2 \
-    tmod=2.01 \
-    dxrcv=10.0 \
-    xrcv1=-2250 xrcv2=2250 \
-    zrcv1=0 zrcv2=0 \
-    xsrc=0 zsrc=$zsrc \
-	file_snap=snapF_$zsrc \
-	tsnap1=0.1 tsnap2=2.0 dtsnap=0.05 dxsnap=$dx dzsnap=$dx \
-    ntaper=101 \
-	snapwithbnd=1 \
-    left=2 right=2 top=2 bottom=2
-
-suxmovie < snapF_${zsrc}_svz.su loop=1 clip=1e-13
-
-exit
-
-makemod sizex=5000 sizez=2500 dx=$dx dz=$dx cp0=$cp ro0=$rho \
-	orig=-2500,0 file_base=hom.su 
-
-fdelmodc \
-    file_cp=hom_cp.su ischeme=1 iorder=4 \
-    file_den=hom_ro.su \
-    file_src=wave.su \
-    file_rcv=shot_hom_fd.su \
-    src_type=7 \
-	src_orient=1 \
-	src_injectionrate=1 \
-    rec_type_vz=1 \
-    rec_type_p=1 \
-    rec_int_vz=2 \
-    dtrcv=0.004 \
-	rec_delay=0.1 \
-    verbose=2 \
-    tmod=4.195 \
-    dxrcv=10.0 \
-    xrcv1=-2250 xrcv2=2250 \
-    zrcv1=0 zrcv2=0 \
-    xsrc=0 zsrc=0 \
-    ntaper=250 \
-    left=4 right=4 top=1 bottom=4 
-
-cp=2000
-rho=1000
-dx=10
-
-makemod sizex=5000 sizez=2500 dx=$dx dz=2.5 cp0=$cp ro0=$rho \
-	orig=-2500,0 file_base=syncl_migr.su \
-	intt=def x=-2500,0,2500 z=250,250,250 poly=0 cp=2300 ro=5000 \
-	intt=def x=-2500,-2000,-1000,-800,0,800,2500 z=650,650,700,750,900,750,600 poly=2 cp=2600 ro=1000 \
-	intt=def x=-2500,0,2500 z=1390,1390,1390 poly=0 cp=2000 ro=5000 
-
-sudiff shot_fd_rvz.su shot_hom_fd_rvz.su > diff_rvz.su
-
-makewave fp=20 dt=0.004 file_out=wavedt.su nt=1024 t0=0.0
-
-migr file_shot=diff_rvz.su file_src=wavedt.su file_vel=syncl_migr_cp.su nshots=1 \
-    file_image=migr0.su verbose=3 imc=0
-    
-
diff --git a/fdelmodc/fdelmodc.c b/fdelmodc/fdelmodc.c
index f780b78fadff0c9c9a1937dc45663e2df6a2739a..6f6242a26899474661f8ce1ddb8249b0bea4b364 100644
--- a/fdelmodc/fdelmodc.c
+++ b/fdelmodc/fdelmodc.c
@@ -127,7 +127,7 @@ char *sdoc[] = {
 "   verbose=0 ......... silent mode; =1: display info",
 " ",
 " SHOT AND GENERAL SOURCE DEFINITION:",
-"   src_type=1 ........ 1=P 2=Txz 3=Tzz 4=Txx 5=S-pot 6=Fx 7=Fz 8=P-pot 9=double-couple",
+"   src_type=1 ........ 1=P 2=Txz 3=Tzz 4=Txx 5=S-pot 6=Fx 7=Fz 8=P-pot 9=double-couple 10=Fz by P",
 "   src_orient=1 ...... orientation of the source",
 "                     - 1=monopole",
 "                     - 2=dipole +/- vertical oriented",
@@ -749,6 +749,23 @@ shared (shot, bnd, mod, src, wav, rec, ixsrc, izsrc, it, src_nwav, verbose)
 		free(p);
 		free(q);
 	}
+	if (bnd.ntap) {
+		free(bnd.tapx);
+		free(bnd.tapz);
+		free(bnd.tapxz);
+	}
+	free(bnd.surface);
+	free(shot.x);
+	free(shot.z);
+    free(src.x);
+	free(src.z);
+	free(src.tbeg);
+	free(src.tend);
+    free(rec.x);
+    free(rec.z);
+    free(rec.xr);
+    free(rec.zr);
+    if(wav.nsamp!=NULL) free(wav.nsamp);
 
 #ifdef MPI  
     MPI_Finalize();
diff --git a/fdelmodc/getParameters.c b/fdelmodc/getParameters.c
index d882ba97c05a56c85c4314bc10ba87480ddcdb25..a316a1f53635357c73247199b83486bd47b12810 100644
--- a/fdelmodc/getParameters.c
+++ b/fdelmodc/getParameters.c
@@ -173,7 +173,6 @@ int getParameters(modPar *mod, recPar *rec, snaPar *sna, wavPar *wav, srcPar *sr
 	/* check if receiver delays is defined; option inactive: add delay time to total modeling time */
 	if (!getparfloat("rec_delay",&rdelay)) rdelay=0.0;
 	rec->delay=NINT(rdelay/mod->dt);
-//	mod->tmod += rdelay;
 	mod->nt = NINT(mod->tmod/mod->dt);
 	dt = mod->dt;
 
@@ -925,6 +924,9 @@ int getParameters(modPar *mod, recPar *rec, snaPar *sna, wavPar *wav, srcPar *sr
 			wav->nst = nsamp; /* put total number of samples in nst part */
 		}
 	}
+    if (src->type==7) { /* set also src_injectionrate=1  */
+        src->injectionrate=1;
+    }
 
 	if (src->multiwav) {
 		if (wav->nx != nsrc) {
@@ -956,6 +958,8 @@ int getParameters(modPar *mod, recPar *rec, snaPar *sna, wavPar *wav, srcPar *sr
 			case 6 : fprintf(stderr,"Fx "); break;
 			case 7 : fprintf(stderr,"Fz "); break;
 			case 8 : fprintf(stderr,"P-potential"); break;
+			case 9 : fprintf(stderr,"double-couple"); break;
+			case 10 : fprintf(stderr,"Fz on P grid with +/-"); break;
 		}
 		fprintf(stderr,"\n");
 		if (wav->random) vmess("Wavelet has a random signature with fmax=%.2f", wav->fmax);
@@ -1110,7 +1114,7 @@ int getParameters(modPar *mod, recPar *rec, snaPar *sna, wavPar *wav, srcPar *sr
 	rec->skipdt=NINT(dtrcv/dt);
 	dtrcv = mod->dt*rec->skipdt;
 	if (!getparfloat("rec_delay",&rdelay)) rdelay=0.0;
-	if (!getparint("rec_ntsam",&rec->nt)) rec->nt=NINT((mod->tmod-rdelay)/dtrcv)+1;
+	if (!getparint("rec_ntsam",&rec->nt)) rec->nt=(int)round((mod->tmod-rdelay+0.01*mod->dt)/dtrcv)+1;
 	if (!getparint("rec_int_p",&rec->int_p)) rec->int_p=0;
 	if (!getparint("rec_int_vx",&rec->int_vx)) rec->int_vx=0;
 	if (!getparint("rec_int_vz",&rec->int_vz)) rec->int_vz=0;
@@ -1118,7 +1122,7 @@ int getParameters(modPar *mod, recPar *rec, snaPar *sna, wavPar *wav, srcPar *sr
 	if (!getparint("scale",&rec->scale)) rec->scale=0;
 	if (!getparfloat("dxspread",&dxspread)) dxspread=0;
 	if (!getparfloat("dzspread",&dzspread)) dzspread=0;
-	rec->nt=MIN(rec->nt, NINT((mod->tmod-rdelay)/dtrcv)+1);
+	rec->nt=MIN(rec->nt, NINT((mod->tmod-rdelay+0.01*mod->dt)/dtrcv)+1);
 
 /* allocation of receiver arrays is done in recvPar */
 /*
diff --git a/marchenko/demo/oneD/primaries.scr b/marchenko/demo/oneD/primaries.scr
index 4cff40073965795e47d7403239829ad0349c7754..94b37e1ca0081efa4b5b1581d24b6e444478d768 100755
--- a/marchenko/demo/oneD/primaries.scr
+++ b/marchenko/demo/oneD/primaries.scr
@@ -1,8 +1,9 @@
 #!/bin/bash -x
 #SBATCH -J marchenko_primaries
-#SBATCH --cpus-per-task=8
+#SBATCH --cpus-per-task=20
 #SBATCH --ntasks=1
-#SBATCH --time=0:15:00
+##SBATCH --time=1:29:00
+#SBATCH -p max2h
 
 # Generate the model and Reflection data
 #modelpm.scr 
@@ -10,7 +11,7 @@
 #cd $SLURM_SUBMIT_DIR
 
 export PATH=$HOME/src/OpenSource/bin:$PATH:
-export OMP_NUM_THREADS=8
+export OMP_NUM_THREADS=20
 
 #shot record to remove internal multiples
 R=shotsdx5_rp.su
@@ -20,7 +21,7 @@ makewave fp=20 dt=0.004 file_out=wave.su nt=2048 t0=0.0 scale=0 scfft=1
 
 ../../marchenko_primaries file_shot=$R ishot=$select file_src=wave.su \
 	nshots=901 verbose=2 istart=40 iend=500 fmax=90 pad=1024 \
-	niter=31 smooth=10 niterec=2 niterskip=50 shift=20 file_rr=pred_rr.su T=0 file_update=update.su
+	niter=31 shift=20 smooth=10 niterec=2 niterskip=50 file_rr=pred_rr.su T=0 file_update=update.su
 
 exit;
 
diff --git a/marchenko/demo/oneD/primariesPlane.scr b/marchenko/demo/oneD/primariesPlane.scr
index 5146bb4c3b2266c918cdb027781223d24045cc29..94fe87958e2e20a687b2b4c6c6b2af0e50a74f85 100755
--- a/marchenko/demo/oneD/primariesPlane.scr
+++ b/marchenko/demo/oneD/primariesPlane.scr
@@ -2,7 +2,7 @@
 #SBATCH -J marchenko_primaries
 #SBATCH --cpus-per-task=10
 #SBATCH --ntasks=1
-#SBATCH --time=2:40:00
+#SBATCH --time=0:30:00
 
 
 #cd $SLURM_SUBMIT_DIR
@@ -10,12 +10,9 @@
 export PATH=$HOME/src/OpenSource/bin:$PATH:
 export OMP_NUM_THREADS=10
 
-#shot record to remove internal multiples
-select=451
-
 makewave fp=20 dt=0.004 file_out=wave.su nt=1024 t0=0.0 scale=0 scfft=1
 
-../../marchenko_primaries file_shot=shotsdx5_rp.su plane_wave=1 file_src=wave.su src_angle=10.0 \
-	nshots=901 verbose=2 istart=40 iend=1000 fmax=90 pad=1024 \
-	niter=20 smooth=10 niterskip=60 niterec=2 shift=20 file_rr=plane2_10_rr.su T=0
+../../marchenko_primaries1 file_shot=shotsdx5_rp.su plane_wave=1 file_src=wave.su src_angle=10.0 \
+	nshots=901 verbose=4 istart=40 iend=500 fmax=90 pad=1024 \
+	niter=30 smooth=10 niterskip=60 niterec=2 shift=20 file_rr=plane1_10_rr.su T=0
 
diff --git a/marchenko/marchenko_primaries.c b/marchenko/marchenko_primaries.c
index 16c7dc0fc54a7fd05168b931f98324ad2b77e29c..6c572a4111c8bfe0bbe6a0c88afcfd4febd2fcb3 100644
--- a/marchenko/marchenko_primaries.c
+++ b/marchenko/marchenko_primaries.c
@@ -18,6 +18,7 @@ void omp_set_num_threads(int num_threads);
 #define MIN(x,y) ((x) < (y) ? (x) : (y))
 #endif
 #define NINT(x) ((int)((x)>0.0?(x)+0.5:(x)-0.5))
+#define ISODD(n) ((n) & 01)
 
 #ifndef COMPLEX
 typedef struct _complexStruct { /* complex number */
@@ -37,9 +38,7 @@ int writeData(FILE *fp, float *data, segy *hdrs, int n1, int n2);
 int disp_fileinfo(char *file, int n1, int n2, float f1, float f2, float d1, float d2, segy *hdrs);
 double wallclock_time(void);
 
-void synthesisp(complex *Refl, complex *Fop, float *Top, float *RNi, int nx, int nt, int nxs, int nts, float dt, float *xsyn, int
-Nfoc, float *xrcv, float *xsrc, int *xnx, float fxse, float fxsb, float dxs, float dxsrc, float dx, int ntfft, int
-nw, int nw_low, int nw_high,  int mode, int reci, int nshots, int *ixpos, int npos, double *tfft, int *isxcount, int
+void synthesisp(complex *Refl, complex *Fop, float *Top, float *RNi, int nx, int nt, int nxs, int nts, float dt, float *xsyn, int Nfoc, float *xrcv, float *xsrc, int *xnx, float fxse, float fxsb, float dxs, float dxsrc, float dx, int ntfft, int nw, int nw_low, int nw_high,  int mode, int reci, int nshots, int *ixpos, int npos, double *tfft, int *isxcount, int
 *reci_xsrc,  int *reci_xrcv, float *ixmask, int verbose);
 
 void synthesisPositions(int nx, int nt, int nxs, int nts, float dt, float *xsyn, int Nfoc, float *xrcv, float *xsrc, int *xnx, float fxse, float fxsb, float dxs, float dxsrc, float dx, int nshots, int *ixpos, int *npos, int *isxcount, int countmin, int reci, int verbose);
@@ -109,7 +108,7 @@ NULL};
 int main (int argc, char **argv)
 {
     FILE    *fp_out, *fp_rr, *fp_w, *fp_up;
-	size_t  nread, sizea, size;
+	size_t  nread, size;
     int     i, j, k, l, ret, nshots, Nfoc, nt, nx, nts, nxs, ngath, nacq;
     int     n1, n2, ntap, tap, di, ntraces, tr;
     int     nw, nw_low, nw_high, nfreq, *xnx, *xnxsyn;
@@ -119,7 +118,7 @@ int main (int argc, char **argv)
     int     smooth, *ixpos, *ixp, npos, ix, ixrcv, m, pad, T, isms, isme, perc;
     int     nshots_r, *isxcount, *reci_xsrc, *reci_xrcv, shift, plane_wave;
     float   fmin, fmax, tom, deltom, *tapersh, *tapersy, fxf, dxf, *xsrc, *xrcv, *zsyn, *zsrc, *xrcvsyn;
-    double  t0, t1, t2, t3, t4, ttime, t5, tsyn, tread, tfft, tcopy, tii;
+    double  t0, t1, t2, t3, t4, t5, ttime, tsyn, tread, tfft, tcopy, tii;
 	double  energyMi, *energyM0;
     float   tt0, d1, d2, f1, f2, fxsb, fxse, ft, fx, *xsyn, dxsrc;
     float   *M0, *DD, *RR, *SRC, dt, dx, dxs, scl, mem, scltap;
@@ -171,8 +170,9 @@ int main (int argc, char **argv)
     if(!getparint("ishot", &ishot)) ishot=300;
     if(!getparint("plane_wave", &plane_wave)) plane_wave=0;
     if(!getparfloat("src_angle", &src_angle)) src_angle = 0.0;
-    if (!getparfloat("src_velo",&src_velo)) src_velo=1500.;
-    if (!getparfloat("t0",&tt0)) tt0=0.1;
+    if(!getparfloat("src_velo",&src_velo)) src_velo=1500.;
+    if(!getparfloat("t0",&tt0)) tt0=0.1;
+	if( (niterskip>1) && ISODD(niter) ) niter++;
 
     if (T>0) {
 		T=-1;
@@ -421,15 +421,13 @@ int main (int argc, char **argv)
     /* use ishot from Refl, complex-conjugate(time reverse), scale with -1 and convolve with wavelet */
     if (file_tinv == NULL) {
         if (verbose) vmess("Selecting M0 from Refl of %s", file_shot);
-        nts = ntfft;
-		//nxs = xnx[ishot];
-
-        scl   = 1.0/((float)2.0*ntfft);
+        nts    = ntfft;
+        scl    = 1.0/((float)2.0*ntfft);
         rtrace = (float *)calloc(ntfft,sizeof(float));
         ctrace = (complex *)calloc(nfreq+1,sizeof(complex));
 
         for (i = 0; i < xnx[ishot]; i++) {
-			ixrcv = NINT((xrcv[ishot*nx+i]-fxsb)/dxs);
+            ixrcv = NINT((xrcv[ishot*nx+i]-fxsb)/dxs);
             for (j = nw_low, m = 0; j <= nw_high; j++, m++) {
                 ctrace[j].r =  Refl[ishot*nw*nx+m*nx+i].r*cwave[j].r + Refl[ishot*nw*nx+m*nx+i].i*cwave[j].i;
                 ctrace[j].i = -Refl[ishot*nw*nx+m*nx+i].i*cwave[j].r + Refl[ishot*nw*nx+m*nx+i].r*cwave[j].i;;
@@ -437,13 +435,8 @@ int main (int argc, char **argv)
             /* transfrom result back to time domain */
             cr1fft(ctrace, rtrace, ntfft, 1);
             for (j = 0; j < nts; j++) {
-                DD[0*nxs*nts+ixrcv*nts+j] = -1.0*scl*rtrace[j];
+                DD[0*nxs*nts+ixrcv*nts+j] = scl*rtrace[j];
             }
-		    /* remove taper at edges for selected shot record */
-    	    //if (tap == 2 || tap == 3) scltap= scl/tapersh[i];
-            //for (j = 0; j < nts; j++) {
-            //    DD[0*nxs*nts+i*nts+j] = -1.0*scltap*rtrace[j];
-            //}
         }
 		/* set timereversal for searching First Break */
 		/* for experimenting with non flat truncation windows */
@@ -456,14 +449,14 @@ int main (int argc, char **argv)
 
 		/* construct plane wave (time reversed and multiplied with -1) from all shot records */
 		if (plane_wave==1) {
-			nxs = nshots;
-        	for (l=0; l<nxs; l++) {
+        	for (l=0; l<nshots; l++) {
 				ix = ixpos[l];
 				memset(ctrace, 0, sizeof(complex)*(nfreq+1));
             	for (j = nw_low, m = 0; j <= nw_high; j++, m++) {
-            		tom = j*deltom*twplane[ix];
 					csum.r=0.0; csum.i=0.0;
         			for (i = 0; i < xnx[l]; i++) {
+						// ToDo for general acquisitons use ix at receiver position */
+            			tom = j*deltom*twplane[i];
             			csum.r += Refl[l*nw*nx+m*nx+i].r*cos(-tom) - Refl[l*nw*nx+m*nx+i].i*sin(-tom);
             			csum.i += Refl[l*nw*nx+m*nx+i].i*cos(-tom) + Refl[l*nw*nx+m*nx+i].r*sin(-tom);
             		}
@@ -474,11 +467,11 @@ int main (int argc, char **argv)
             	/* transfrom result back to time domain */
             	cr1fft(ctrace, rtrace, ntfft, 1);
             	for (j = 0; j < nts; j++) {
-               		DD[0*nxs*nts+ix*nts+j] = -1.0*scl*rtrace[j];
+               		DD[0*nxs*nts+ix*nts+j] = 1.0*scl*rtrace[j];
         		}
 				/* compute Source wavelet for plane-wave imaging */
             	for (j = nw_low, m = 0; j <= nw_high; j++, m++) {
-            		tom = j*deltom*twplane[ix];
+            		tom = j*deltom*twplane[l];
             		csum.r = cos(-tom);
             		csum.i = sin(-tom);
                 	/* Optional add wavelet to SRC-field */
@@ -499,17 +492,14 @@ int main (int argc, char **argv)
         xsyn[0] = xsrc[ishot];
         zsyn[0] = zsrc[ishot];
         xnxsyn[0] = xnx[ishot];
-        /* find minimum and maximum postions in header values */
-/*
         fxse = fxsb = xrcv[0];
+        /* check consistency of header values */
         for (l=0; l<nshots; l++) {
             for (i = 0; i < nx; i++) {
                 fxsb = MIN(xrcv[l*nx+i],fxsb);
                 fxse = MAX(xrcv[l*nx+i],fxse);
             }
         }
-*/
-/* not needed xmin and xmax are the same */
         dxf = dx;
         dxs = dx;
     }
@@ -630,22 +620,22 @@ int main (int argc, char **argv)
     perc=(iend-istart)/100;if(!perc)perc=1;
 
     if (plane_wave) {
-		writeDataIter("SRCplane.su", SRC, hdrs_out, ntfft, nxs, d2, f2, n2out, Nfoc, xsyn, zsyn, ixp, nxs, 0, NINT(src_angle));
+		writeDataIter("SRCplane.su", SRC, hdrs_out, ntfft, nxs, d2, f2, n2out, Nfoc, xsyn, zsyn, ixp, npos, 0, NINT(src_angle));
 	}
-	/* make DD causal again and undo the -1 multiplication */
+	/* make DD causal again */
     for (l=0; l<npos; l++) {
 		ix = ixpos[l];
         j=0;
-        SRC[l*nts+j] = -1.0*DD[ix*nts+j];
+        SRC[l*nts+j] = DD[ix*nts+j];
         for (j = 1; j < nts; j++) {
-            SRC[l*nts+j] = -1.0*DD[ix*nts+nts-j];
+            SRC[l*nts+j] = DD[ix*nts+nts-j];
         }
     }
     if (plane_wave) {
-	writeDataIter("DDplane.su", SRC, hdrs_out, ntfft, nxs, d2, f2, n2out, Nfoc, xsyn, zsyn, ixp, nxs, 0, NINT(src_angle));
-	}
-	else {
-	writeDataIter("DDshot.su", SRC, hdrs_out, ntfft, nxs, d2, f2, n2out, Nfoc, xsyn, zsyn, ixp, nxs, 0, ishot);
+		writeDataIter("DDplane.su", SRC, hdrs_out, ntfft, nxs, d2, f2, n2out, Nfoc, xsyn, zsyn, ixp, nxs, 0, NINT(src_angle));
+    }
+    else {
+        writeDataIter("DDshot.su", SRC, hdrs_out, ntfft, nxs, d2, f2, n2out, Nfoc, xsyn, zsyn, ixp, nxs, 0, ishot+1);
 	}
 	free(SRC);
 
@@ -666,31 +656,27 @@ int main (int argc, char **argv)
             for (l = 0; l < Nfoc; l++) {
                 for (i = 0; i < npos; i++) {
                     ix = ixpos[i];
-					iw = NINT((ii*dt+twplane[ix])/dt);
+                    iw = NINT((ii*dt+twplane[i])/dt);
                     for (j = 0; j < nts; j++) {
-                        M0[l*nxs*nts+i*nts+j] = DD[l*nxs*nts+ix*nts+j];
+                        M0[l*nxs*nts+i*nts+j] = -DD[l*nxs*nts+ix*nts+j];
                     }
-					/* apply mute window for samples above nts-ii */
+                    /* apply mute window for samples above nts-ii */
                     for (j = 0; j < MIN(nts, nts-iw+isms); j++) {
                         M0[l*nxs*nts+i*nts+j] = 0.0;
                     }
                     for (j = nts-iw+isms, k=1; j < MIN(nts, nts-iw+isme); j++, k++) {
-						//fprintf(stderr,"j=%d smooth-k=%d taper=%f\n",j,smooth-k,costaper[smooth-k]);
                         M0[l*nxs*nts+i*nts+j] *= costaper[smooth-k];
                     }
                 }
                 for (i = 0; i < npos; i++) {
                     ix = ixpos[i];
                     j = 0;
-                    k1min[l*nxs*nts+i*nts+j] = -DD[l*nxs*nts+ix*nts+j];
+                    k1min[l*nxs*nts+i*nts+j] = DD[l*nxs*nts+ix*nts+j];
                     for (j = 1; j < nts; j++) {
-                       k1min[l*nxs*nts+i*nts+j] = -DD[l*nxs*nts+ix*nts+nts-j];
+                       k1min[l*nxs*nts+i*nts+j] = DD[l*nxs*nts+ix*nts+nts-j];
                     }
 			    }
 			}
-        	if (file_iter != NULL) {
-           	    writeDataIter("M0.su", M0, hdrs_out, ntfft, nacq, d2, f2, n2out, Nfoc, xsyn, zsyn, ixp, npos, 0, 1000*ii);
-			}
 		}
 		else { /* use k1min from previous iteration as starting point and do niterec iterations */
 			niterrun=niterec;
@@ -698,14 +684,13 @@ int main (int argc, char **argv)
 			if (verbose>1) vmess("Doing %d iterations using previous result at time-sample %d",niterrun,ii);
             for (l = 0; l < Nfoc; l++) {
                 for (i = 0; i < npos; i++) {
-					j=0;
                     ix = ixpos[i];
 					iw = NINT((ii*dt+twplane[ix])/dt);
-					//iw = ii;
-                    M0[l*nxs*nts+i*nts+j] = -DD[l*nxs*nts+ix*nts] - k1min[l*nxs*nts+i*nts+j];
+                    M0[l*nxs*nts+i*nts+j] = DD[l*nxs*nts+ix*nts] - k1min[l*nxs*nts+i*nts+j];
                     for (j = 1; j < nts; j++) {
-                        M0[l*nxs*nts+i*nts+j] = -DD[l*nxs*nts+ix*nts+nts-j] - k1min[l*nxs*nts+i*nts+nts-j];
+                        M0[l*nxs*nts+i*nts+j] = DD[l*nxs*nts+ix*nts+nts-j] - k1min[l*nxs*nts+i*nts+nts-j];
                     }
+
 					/* apply mute window for samples above nts-ii */
                     for (j = 0; j < MIN(nts,nts-iw+isms); j++) {
                         M0[l*nxs*nts+i*nts+j] = 0.0;
@@ -716,6 +701,10 @@ int main (int argc, char **argv)
                 }
             }
         }
+        if (file_iter != NULL) {
+       	    writeDataIter("M0.su", M0, hdrs_out, ntfft, nxs, d2, f2, n2out, Nfoc, xsyn, zsyn, ixp, npos, 0, 1000*ii);
+        }
+
 /*================ initialization ================*/
 
         memcpy(Mi, M0, Nfoc*nxs*ntfft*sizeof(float));
@@ -739,15 +728,25 @@ int main (int argc, char **argv)
 
 			if (verbose >=2) {
                 for (l = 0; l < Nfoc; l++) {
-			        energyMi = 0.0;
-                    for (i = 0; i < npos; i++) {
-                    	ix = ixpos[i];
-                        for (j = 0; j < nts; j++) {
-                            energyMi += RMi[l*nacq*nts+ix*nts+j]*RMi[l*nacq*nts+ix*nts+j];
-					    }
-                    }
-            		if (iter % 2 == 0) { 
-                    	if (iter==0) energyM0[l] = energyMi;
+                    if (iter % 2 == 0) {
+			            energyMi = 0.0;
+                        for (i = 0; i < npos; i++) {
+						    ix = ixpos[i];
+						    if (recur==0) {
+                                for (j = 0; j < nts; j++) {
+                                    energyMi += RMi[l*nacq*nts+ix*nts+j]*RMi[l*nacq*nts+ix*nts+j];
+					            }
+						    }
+						    else {
+					            mem = RMi[l*nacq*nts+ix*nts+nts-1]+DD[l*nacq*nts+ix*nts];		
+                                energyMi += mem*mem;
+                                for (j = 1; j < nts; j++) {
+					                mem = RMi[l*nacq*nts+ix*nts+nts-j]+DD[l*nacq*nts+ix*nts+j];		
+                                    energyMi += mem*mem;
+					            }
+						    }
+                        }
+                        if ( (iter==0) && (recur==0) ) energyM0[l] = energyMi;
                         vmess(" - ii %d: Mi at iteration %d has energy %e; relative to M0 %e", ii, iter, sqrt(energyMi), sqrt(energyMi/energyM0[l]));
                    }
                 }
@@ -761,9 +760,9 @@ int main (int argc, char **argv)
                 for (i = 0; i < npos; i++) {
                     j = 0;
                     ix = ixpos[i];
-                    Mi[l*nxs*nts+i*nts+j]    = -RMi[l*nacq*nts+ix*nts+j];
+                    Mi[l*nxs*nts+i*nts+j] = RMi[l*nacq*nts+ix*nts+j];
                     for (j = 1; j < nts; j++) {
-                        Mi[l*nxs*nts+i*nts+j]    = -RMi[l*nacq*nts+ix*nts+nts-j];
+                        Mi[l*nxs*nts+i*nts+j] = RMi[l*nacq*nts+ix*nts+nts-j];
                     }
                 }
             }
@@ -774,7 +773,6 @@ int main (int argc, char **argv)
                     for (i = 0; i < npos; i++) {
 						ix = ixpos[i];
 						iw = NINT((ii*dt+twplane[ix])/dt);
-						//iw = ii;
 						/* apply mute window for samples after ii */
                         for (j = MAX(0,iw-isme); j < nts; j++) {
                             Mi[l*nxs*nts+i*nts+j] = 0.0;
@@ -795,9 +793,9 @@ int main (int argc, char **argv)
                         }
                     }
                 }
-        		if (file_iter != NULL) {
-            		writeDataIter("v1plus.su", v1plus, hdrs_out, ntfft, nxs, d2, f2, n2out, Nfoc, xsyn, zsyn, ixp, npos, 0, 1000*ii+iter+1);
-				}
+                if (file_iter != NULL) {
+                    writeDataIter("v1plus.su", v1plus, hdrs_out, ntfft, nxs, d2, f2, n2out, Nfoc, xsyn, zsyn, ixp, npos, 0, 1000*ii+iter+1);
+                }
             }
             else {/* odd iterations, convolution => k_1^-(t)  */
                 for (l = 0; l < Nfoc; l++) {
@@ -805,19 +803,24 @@ int main (int argc, char **argv)
                     	ix = ixpos[i];
 						if (recur==1) { /* use k1min from previous iteration */
                             for (j = 0; j < nts; j++) {
-                                Mi[l*nxs*nts+i*nts+j] += DD[l*nxs*nts+ix*nts+j];
+                                Mi[l*nxs*nts+i*nts+j] += -DD[l*nxs*nts+ix*nts+j];
 						    }
                             j = 0;
                             k1min[l*nxs*nts+i*nts+j] = -Mi[l*nxs*nts+i*nts+j];
                             for (j = 1; j < nts; j++) {
                                 k1min[l*nxs*nts+i*nts+j] = -Mi[l*nxs*nts+i*nts+nts-j];
                             }
+                            //j = 0;
+                            //k1min[l*nxs*nts+i*nts+j] -= Mi[l*nxs*nts+i*nts+j];
+                            //for (j = 1; j < nts; j++) {
+                            //    k1min[l*nxs*nts+i*nts+j] -= Mi[l*nxs*nts+i*nts+nts-j];
+                            //}
         		        	if (file_update != NULL) {
 								j=0;
-                            	Mup[l*nxs*nts+i*nts+j] += k1min[l*nxs*nts+i*nts+j]+DD[l*nxs*nts+ix*nts+j];
-                            	for (j = 1; j < nts; j++) {
-                                	Mup[l*nxs*nts+i*nts+j] += k1min[l*nxs*nts+i*nts+j]+DD[l*nxs*nts+ix*nts+nts-j];
-                            	}
+                                Mup[l*nxs*nts+i*nts+j] += DD[l*nxs*nts+ix*nts+j] - k1min[l*nxs*nts+i*nts+j];
+                                for (j = 1; j < nts; j++) {
+                                    Mup[l*nxs*nts+i*nts+j] += DD[l*nxs*nts+ix*nts+nts-j] - k1min[l*nxs*nts+i*nts+j];
+                                }
 							}
 						}
 						else {
@@ -828,24 +831,14 @@ int main (int argc, char **argv)
                             }
         		        	if (file_update != NULL) {
 								j=0;
-                            	Mup[l*nxs*nts+i*nts+j] -= Mi[l*nxs*nts+i*nts+j];
+                            	Mup[l*nxs*nts+i*nts+j] += Mi[l*nxs*nts+i*nts+j];
                             	for (j = 1; j < nts; j++) {
-                                	Mup[l*nxs*nts+i*nts+j] -= Mi[l*nxs*nts+i*nts+nts-j];
+                                	Mup[l*nxs*nts+i*nts+j] += Mi[l*nxs*nts+i*nts+nts-j];
                             	}
 							}
 					    }
-						/* apply mute window for delta function at t=0
-						iw = NINT((twplane[ix])/dt);
-                        for (j = nts-shift+smooth+iw; j < nts; j++) {
-                            Mi[l*nxs*nts+i*nts+j] = 0.0;
-                        }
-                        for (j = nts-shift+iw, k=0; j < MIN(nts, nts-shift+smooth+iw); j++, k++) {
-                            Mi[l*nxs*nts+i*nts+j] *= costaper[k];
-                        }
-						*/
 					    /* apply mute window for samples above nts-ii */
 						iw = NINT((ii*dt+twplane[ix])/dt);
-						//iw = ii;
                         for (j = 0; j < MIN(nts,nts-iw+isms); j++) {
                             Mi[l*nxs*nts+i*nts+j] = 0.0;
                         }
@@ -858,6 +851,7 @@ int main (int argc, char **argv)
             		writeDataIter("k1min.su", k1min, hdrs_out, ntfft, nxs, d2, f2, n2out, Nfoc, xsyn, zsyn, ixp, npos, 0, 1000*ii+iter+1);
 				}
             } /* end else (iter) branch */
+
         	if (file_iter != NULL) {
                 writeDataIter("Mi.su", Mi, hdrs_out, ntfft, nxs, d2, f2, n2out, Nfoc, xsyn, zsyn, ixp, npos, 0, 1000*ii+iter+1);
 			}
@@ -962,5 +956,3 @@ int main (int argc, char **argv)
 
     exit(0);
 }
-
-