diff --git a/fdelmodc3D/applySource3D.c b/fdelmodc3D/applySource3D.c
index 51c21f35b62421ced0b6d98d15da04dec6dee9de..74e88f32e5039c99875b56218f1213c3c9dc3c9e 100644
--- a/fdelmodc3D/applySource3D.c
+++ b/fdelmodc3D/applySource3D.c
@@ -77,7 +77,7 @@ long applySource3D(modPar mod, srcPar src, wavPar wav, bndPar bnd, long itime, l
 			}
 		}
 	}
-             
+       
 /*
 * for plane wave sources the sources are placed 
 * around the central shot position 
@@ -119,7 +119,6 @@ long applySource3D(modPar mod, srcPar src, wavPar wav, bndPar bnd, long itime, l
 		else { /* multi-wavelet sources */
 			src_ampl = src_nwav[isrc][id1]*(id2-time/dt) + src_nwav[isrc][id2]*(time/dt-id1);
 		}
-
 		if (src_ampl==0.0) continue;
 		if ( ((ix-ibndx)<0) || ((ix-ibndx)>mod.nx) ) continue; /* source outside grid */
         if ( ((iy-ibndy)<0) || ((iy-ibndy)>mod.ny) ) continue; /* source outside grid */
diff --git a/fdelmodc3D/defineSource3D.c b/fdelmodc3D/defineSource3D.c
index 64564a85f0a1ee34732594ebee698bb77b2d90e8..30e5192bd8fd4b6de1fc9b8ce1a3f3672d9ccf82 100644
--- a/fdelmodc3D/defineSource3D.c
+++ b/fdelmodc3D/defineSource3D.c
@@ -115,7 +115,7 @@ long defineSource3D(wavPar wav, srcPar src, modPar mod, recPar rec, float **src_
 		optnscale  = optn;
 		nfreqscale = optnscale/2 + 1;
 	}
-//	fprintf(stderr,"define S optn=%li ns=%li %e nt=%li %e\n", optn, wav.ns, wav.ds, optnscale, wav.dt);
+	// fprintf(stderr,"define S optn=%li ns=%li %e nt=%li %e\n", optn, wav.ns, wav.ds, optnscale, wav.dt);
 
     ctrace = (complex *)calloc(nfreqscale,sizeof(complex));
     trace = (float *)calloc(optnscale,sizeof(float));
diff --git a/fdelmodc3D/fdelmodc3D.c b/fdelmodc3D/fdelmodc3D.c
index c9b31306fde496f3f4a108de882f6016caeaa386..57901b8aba1c1be61ff7713173ae855a57f263ad 100644
--- a/fdelmodc3D/fdelmodc3D.c
+++ b/fdelmodc3D/fdelmodc3D.c
@@ -141,6 +141,7 @@ char *sdoc[] = {
 "                     - 3=dipole - + horizontal oriented",
 "   dip=0 ............. dip for double-couple source",
 "   strike=0 .......... strike for double-couple source",
+"   rake=0 ............ rake for double-couple source",
 "   xsrc=middle ....... x-position of (first) shot ",
 "   ysrc=middle ....... y-position of (first) shot ",
 "   zsrc=zmin ......... z-position of (first) shot ",
@@ -270,9 +271,14 @@ char *sdoc[] = {
 " NOTES: For viscoelastic media dispersion and stability are not always",
 " guaranteed by the calculated criteria, especially for Q values smaller than 13",
 "",
+"      Original fdelmodc by",
 "      Jan Thorbecke 2011",
 "      TU Delft",
 "      E-mail: janth@xs4all.nl ",
+"      3D extension by",
+"      Joeri Brackenhoff 2019",
+"      TU Delft",
+"      E-mail: jabrackenhoff@tudelft.nl ",
 "      2015  Contributions from Max Holicki",
 "",
 NULL};
diff --git a/marchenko3D/TWtransform.c b/marchenko3D/TWtransform.c
index 8895271e4a3884b8c1a8951ae9abe6725530dc21..12bcb7a790be00fb2e16d6c8eb7b4b64f759facc 100644
--- a/marchenko3D/TWtransform.c
+++ b/marchenko3D/TWtransform.c
@@ -28,21 +28,22 @@ char *sdoc[] = {
 " ",
 " TWtransform - Transform data from uncompressed time domain to compressed frequency domain",
 " ",
-" TWtransform file_T= file_W= [optional parameters]",
+" TWtransform file_in= file_out= [optional parameters]",
 " ",
 " Required parameters: ",
 " ",
-"   file_T= .................. File containing the uncompressed time domain data",
-"   file_W= .................. Output for the compressed frequency domain data",
+"   file_in= ................. File containing the uncompressed time domain data",
+"   file_out= ................ Output for the (compressed) frequency domain data",
 " ",
 " Optional parameters: ",
 " ",
-"   verbose=0 ................ silent option; >0 displays info",
+"   verbose=1 ................ silent option; >0 displays info",
 "   fmin=0 ................... minimum frequency in the output",
 "   fmax=70 .................. maximum frequency in the output",
 "   mode=1 ................... sign of the frequency transform",
-"   zfp=0 .................... compress the transformed data using zfp",
-"   tolerance=1e-3 ........... accuracy of the zfp compression",
+"   zfp=0 .................... (=1) compress the transformed data using zfp",
+"   tolerance=1e-3 ........... accuracy of the zfp compression,",
+"   smaller values give more accuracy to the compressed data but will decrease the compression rate",
 "   weight=2.0 ............... scaling of the reflection data",
 " ",
 " ",
@@ -63,7 +64,7 @@ int main (int argc, char **argv)
 	long	inx, iny, gy;
 	float   scl, *trace, dt, dx, dy, ft, fx, fy, fmin, fmax, *cdata, scale;
 	double	tolerance;
-    char    *file_T, *file_W;
+    char    *file_in, *file_out;
 	complex *ctrace;
 	zfptop	zfpt;
 	zfpmar  zfpm;
@@ -71,10 +72,10 @@ int main (int argc, char **argv)
     initargs(argc, argv);
     requestdoc(1);
 
-    if (!getparstring("file_T", &file_T)) file_T = "in.su";
-        if (file_T==NULL) verr("No file_in is given");
-    if (!getparstring("file_W", &file_W)) file_W = NULL;
-        if (file_W==NULL) verr("No file_W is given");
+    if (!getparstring("file_in", &file_in)) file_in = NULL;
+        if (file_in==NULL) verr("No file_in is given");
+    if (!getparstring("file_out", &file_out)) file_out = NULL;
+        if (file_out==NULL) verr("No file_out is given");
     if (!getparfloat("fmin", &fmin)) fmin = 0;
     if (!getparfloat("fmax", &fmax)) fmax = 70;
     if (!getpardouble("tolerance", &tolerance)) tolerance = 1e-3;
@@ -84,7 +85,7 @@ int main (int argc, char **argv)
     if (!getparlong("zfp", &zfp)) zfp = 0;
 
     nshots = 0;
-    ret = getFileInfo3D(file_T, &nt, &nx, &ny, &nshots, &dt, &dx, &dy, &ft, &fx, &fy, &scl, &ntraces);
+    ret = getFileInfo3D(file_in, &nt, &nx, &ny, &nshots, &dt, &dx, &dy, &ft, &fx, &fy, &scl, &ntraces);
 
     ntfft = loptncr(nt); 
     nfreq = ntfft/2+1;
@@ -97,19 +98,19 @@ int main (int argc, char **argv)
 
 	/* Reading first header  */
 
-	if (file_T == NULL) fp = stdin;
-	else fp = fopen( file_T, "r" );
+	if (file_in == NULL) fp = stdin;
+	else fp = fopen( file_in, "r" );
 	if ( fp == NULL ) {
-		fprintf(stderr,"input file %s has an error\n", file_T);
+		fprintf(stderr,"input file %s has an error\n", file_in);
 		perror("error in opening file: ");
 		fflush(stderr);
 		return -1;
 	}
 
-	if (file_W == NULL) fp_out = stdin;
-	else fp_out = fopen( file_W, "w+" );
+	if (file_out == NULL) fp_out = stdin;
+	else fp_out = fopen( file_out, "w+" );
 	if ( fp_out == NULL ) {
-		fprintf(stderr,"input file %s has an error\n", file_W);
+		fprintf(stderr,"input file %s has an error\n", file_out);
 		perror("error in opening file: ");
 		fflush(stderr);
 		return -1;
@@ -324,4 +325,4 @@ long zfpcompress(float* data, long nx, long ny, long nz, double tolerance, zfpma
     // fclose(file);
 
 	return 1;
-}
\ No newline at end of file
+}
diff --git a/marchenko3D/demo/README b/marchenko3D/demo/marchenko2D/README
similarity index 100%
rename from marchenko3D/demo/README
rename to marchenko3D/demo/marchenko2D/README
diff --git a/marchenko3D/demo/ScientificReports/NatureSnapshots.tex b/marchenko3D/demo/marchenko2D/ScientificReports/NatureSnapshots.tex
similarity index 100%
rename from marchenko3D/demo/ScientificReports/NatureSnapshots.tex
rename to marchenko3D/demo/marchenko2D/ScientificReports/NatureSnapshots.tex
diff --git a/marchenko3D/demo/ScientificReports/README b/marchenko3D/demo/marchenko2D/ScientificReports/README
similarity index 100%
rename from marchenko3D/demo/ScientificReports/README
rename to marchenko3D/demo/marchenko2D/ScientificReports/README
diff --git a/marchenko3D/demo/ScientificReports/back_injrate_planes.scr b/marchenko3D/demo/marchenko2D/ScientificReports/back_injrate_planes.scr
similarity index 100%
rename from marchenko3D/demo/ScientificReports/back_injrate_planes.scr
rename to marchenko3D/demo/marchenko2D/ScientificReports/back_injrate_planes.scr
diff --git a/marchenko3D/demo/ScientificReports/backpropf2.scr b/marchenko3D/demo/marchenko2D/ScientificReports/backpropf2.scr
similarity index 100%
rename from marchenko3D/demo/ScientificReports/backpropf2.scr
rename to marchenko3D/demo/marchenko2D/ScientificReports/backpropf2.scr
diff --git a/marchenko3D/demo/ScientificReports/check.scr b/marchenko3D/demo/marchenko2D/ScientificReports/check.scr
similarity index 100%
rename from marchenko3D/demo/ScientificReports/check.scr
rename to marchenko3D/demo/marchenko2D/ScientificReports/check.scr
diff --git a/marchenko3D/demo/ScientificReports/clean b/marchenko3D/demo/marchenko2D/ScientificReports/clean
similarity index 100%
rename from marchenko3D/demo/ScientificReports/clean
rename to marchenko3D/demo/marchenko2D/ScientificReports/clean
diff --git a/marchenko3D/demo/ScientificReports/direct.scr b/marchenko3D/demo/marchenko2D/ScientificReports/direct.scr
similarity index 100%
rename from marchenko3D/demo/ScientificReports/direct.scr
rename to marchenko3D/demo/marchenko2D/ScientificReports/direct.scr
diff --git a/marchenko3D/demo/ScientificReports/epsBack.scr b/marchenko3D/demo/marchenko2D/ScientificReports/epsBack.scr
similarity index 100%
rename from marchenko3D/demo/ScientificReports/epsBack.scr
rename to marchenko3D/demo/marchenko2D/ScientificReports/epsBack.scr
diff --git a/marchenko3D/demo/ScientificReports/initialFocus.scr b/marchenko3D/demo/marchenko2D/ScientificReports/initialFocus.scr
similarity index 100%
rename from marchenko3D/demo/ScientificReports/initialFocus.scr
rename to marchenko3D/demo/marchenko2D/ScientificReports/initialFocus.scr
diff --git a/marchenko3D/demo/ScientificReports/marchenko.scr b/marchenko3D/demo/marchenko2D/ScientificReports/marchenko.scr
similarity index 100%
rename from marchenko3D/demo/ScientificReports/marchenko.scr
rename to marchenko3D/demo/marchenko2D/ScientificReports/marchenko.scr
diff --git a/marchenko3D/demo/ScientificReports/model.scr b/marchenko3D/demo/marchenko2D/ScientificReports/model.scr
similarity index 100%
rename from marchenko3D/demo/ScientificReports/model.scr
rename to marchenko3D/demo/marchenko2D/ScientificReports/model.scr
diff --git a/marchenko3D/demo/ScientificReports/remove_direct.scr b/marchenko3D/demo/marchenko2D/ScientificReports/remove_direct.scr
similarity index 100%
rename from marchenko3D/demo/ScientificReports/remove_direct.scr
rename to marchenko3D/demo/marchenko2D/ScientificReports/remove_direct.scr
diff --git a/marchenko3D/demo/ScientificReports/shotslurm.scr b/marchenko3D/demo/marchenko2D/ScientificReports/shotslurm.scr
similarity index 100%
rename from marchenko3D/demo/ScientificReports/shotslurm.scr
rename to marchenko3D/demo/marchenko2D/ScientificReports/shotslurm.scr
diff --git a/marchenko3D/demo/WS15/MarchenkoWorkshop.pdf b/marchenko3D/demo/marchenko2D/WS15/MarchenkoWorkshop.pdf
similarity index 100%
rename from marchenko3D/demo/WS15/MarchenkoWorkshop.pdf
rename to marchenko3D/demo/marchenko2D/WS15/MarchenkoWorkshop.pdf
diff --git a/marchenko3D/demo/WS15/README.1 b/marchenko3D/demo/marchenko2D/WS15/README.1
similarity index 100%
rename from marchenko3D/demo/WS15/README.1
rename to marchenko3D/demo/marchenko2D/WS15/README.1
diff --git a/marchenko3D/demo/WS15/README.2 b/marchenko3D/demo/marchenko2D/WS15/README.2
similarity index 100%
rename from marchenko3D/demo/WS15/README.2
rename to marchenko3D/demo/marchenko2D/WS15/README.2
diff --git a/marchenko3D/demo/WS15/README.3 b/marchenko3D/demo/marchenko2D/WS15/README.3
similarity index 100%
rename from marchenko3D/demo/WS15/README.3
rename to marchenko3D/demo/marchenko2D/WS15/README.3
diff --git a/marchenko3D/demo/WS15/README.4 b/marchenko3D/demo/marchenko2D/WS15/README.4
similarity index 100%
rename from marchenko3D/demo/WS15/README.4
rename to marchenko3D/demo/marchenko2D/WS15/README.4
diff --git a/marchenko3D/demo/WS15/README.5 b/marchenko3D/demo/marchenko2D/WS15/README.5
similarity index 100%
rename from marchenko3D/demo/WS15/README.5
rename to marchenko3D/demo/marchenko2D/WS15/README.5
diff --git a/marchenko3D/demo/WS15/job.pbs b/marchenko3D/demo/marchenko2D/WS15/job.pbs
similarity index 100%
rename from marchenko3D/demo/WS15/job.pbs
rename to marchenko3D/demo/marchenko2D/WS15/job.pbs
diff --git a/marchenko3D/demo/WS15/setup.sh b/marchenko3D/demo/marchenko2D/WS15/setup.sh
similarity index 100%
rename from marchenko3D/demo/WS15/setup.sh
rename to marchenko3D/demo/marchenko2D/WS15/setup.sh
diff --git a/marchenko3D/demo/oneD/README b/marchenko3D/demo/marchenko2D/oneD/README
similarity index 100%
rename from marchenko3D/demo/oneD/README
rename to marchenko3D/demo/marchenko2D/oneD/README
diff --git a/marchenko3D/demo/oneD/backProp_f2sum_movie.scr b/marchenko3D/demo/marchenko2D/oneD/backProp_f2sum_movie.scr
similarity index 100%
rename from marchenko3D/demo/oneD/backProp_f2sum_movie.scr
rename to marchenko3D/demo/marchenko2D/oneD/backProp_f2sum_movie.scr
diff --git a/marchenko3D/demo/oneD/backpropf2.scr b/marchenko3D/demo/marchenko2D/oneD/backpropf2.scr
similarity index 100%
rename from marchenko3D/demo/oneD/backpropf2.scr
rename to marchenko3D/demo/marchenko2D/oneD/backpropf2.scr
diff --git a/marchenko3D/demo/oneD/clean b/marchenko3D/demo/marchenko2D/oneD/clean
similarity index 100%
rename from marchenko3D/demo/oneD/clean
rename to marchenko3D/demo/marchenko2D/oneD/clean
diff --git a/marchenko3D/demo/oneD/conv.gnp b/marchenko3D/demo/marchenko2D/oneD/conv.gnp
similarity index 100%
rename from marchenko3D/demo/oneD/conv.gnp
rename to marchenko3D/demo/marchenko2D/oneD/conv.gnp
diff --git a/marchenko3D/demo/oneD/conv.txt b/marchenko3D/demo/marchenko2D/oneD/conv.txt
similarity index 100%
rename from marchenko3D/demo/oneD/conv.txt
rename to marchenko3D/demo/marchenko2D/oneD/conv.txt
diff --git a/marchenko3D/demo/oneD/epsBackprop.scr b/marchenko3D/demo/marchenko2D/oneD/epsBackprop.scr
similarity index 100%
rename from marchenko3D/demo/oneD/epsBackprop.scr
rename to marchenko3D/demo/marchenko2D/oneD/epsBackprop.scr
diff --git a/marchenko3D/demo/oneD/epsCompare.scr b/marchenko3D/demo/marchenko2D/oneD/epsCompare.scr
similarity index 100%
rename from marchenko3D/demo/oneD/epsCompare.scr
rename to marchenko3D/demo/marchenko2D/oneD/epsCompare.scr
diff --git a/marchenko3D/demo/oneD/epsIterwithLabels.scr b/marchenko3D/demo/marchenko2D/oneD/epsIterwithLabels.scr
similarity index 100%
rename from marchenko3D/demo/oneD/epsIterwithLabels.scr
rename to marchenko3D/demo/marchenko2D/oneD/epsIterwithLabels.scr
diff --git a/marchenko3D/demo/oneD/epsMarchenkoIter.scr b/marchenko3D/demo/marchenko2D/oneD/epsMarchenkoIter.scr
similarity index 100%
rename from marchenko3D/demo/oneD/epsMarchenkoIter.scr
rename to marchenko3D/demo/marchenko2D/oneD/epsMarchenkoIter.scr
diff --git a/marchenko3D/demo/oneD/epsModel.scr b/marchenko3D/demo/marchenko2D/oneD/epsModel.scr
similarity index 100%
rename from marchenko3D/demo/oneD/epsModel.scr
rename to marchenko3D/demo/marchenko2D/oneD/epsModel.scr
diff --git a/marchenko3D/demo/oneD/figAppendix.scr b/marchenko3D/demo/marchenko2D/oneD/figAppendix.scr
similarity index 100%
rename from marchenko3D/demo/oneD/figAppendix.scr
rename to marchenko3D/demo/marchenko2D/oneD/figAppendix.scr
diff --git a/marchenko3D/demo/oneD/initialFocus.scr b/marchenko3D/demo/marchenko2D/oneD/initialFocus.scr
similarity index 100%
rename from marchenko3D/demo/oneD/initialFocus.scr
rename to marchenko3D/demo/marchenko2D/oneD/initialFocus.scr
diff --git a/marchenko3D/demo/oneD/initialFocus1300.scr b/marchenko3D/demo/marchenko2D/oneD/initialFocus1300.scr
similarity index 100%
rename from marchenko3D/demo/oneD/initialFocus1300.scr
rename to marchenko3D/demo/marchenko2D/oneD/initialFocus1300.scr
diff --git a/marchenko3D/demo/oneD/initialFocusPlane.scr b/marchenko3D/demo/marchenko2D/oneD/initialFocusPlane.scr
similarity index 100%
rename from marchenko3D/demo/oneD/initialFocusPlane.scr
rename to marchenko3D/demo/marchenko2D/oneD/initialFocusPlane.scr
diff --git a/marchenko3D/demo/oneD/iterations.scr b/marchenko3D/demo/marchenko2D/oneD/iterations.scr
similarity index 100%
rename from marchenko3D/demo/oneD/iterations.scr
rename to marchenko3D/demo/marchenko2D/oneD/iterations.scr
diff --git a/marchenko3D/demo/oneD/marchenko.scr b/marchenko3D/demo/marchenko2D/oneD/marchenko.scr
similarity index 100%
rename from marchenko3D/demo/oneD/marchenko.scr
rename to marchenko3D/demo/marchenko2D/oneD/marchenko.scr
diff --git a/marchenko3D/demo/oneD/marchenkoIter.scr b/marchenko3D/demo/marchenko2D/oneD/marchenkoIter.scr
similarity index 100%
rename from marchenko3D/demo/oneD/marchenkoIter.scr
rename to marchenko3D/demo/marchenko2D/oneD/marchenkoIter.scr
diff --git a/marchenko3D/demo/oneD/marchenkoPlane.scr b/marchenko3D/demo/marchenko2D/oneD/marchenkoPlane.scr
similarity index 100%
rename from marchenko3D/demo/oneD/marchenkoPlane.scr
rename to marchenko3D/demo/marchenko2D/oneD/marchenkoPlane.scr
diff --git a/marchenko3D/demo/oneD/marchenkodt.scr b/marchenko3D/demo/marchenko2D/oneD/marchenkodt.scr
similarity index 100%
rename from marchenko3D/demo/oneD/marchenkodt.scr
rename to marchenko3D/demo/marchenko2D/oneD/marchenkodt.scr
diff --git a/marchenko3D/demo/oneD/migr.scr b/marchenko3D/demo/marchenko2D/oneD/migr.scr
similarity index 100%
rename from marchenko3D/demo/oneD/migr.scr
rename to marchenko3D/demo/marchenko2D/oneD/migr.scr
diff --git a/marchenko3D/demo/oneD/model.scr b/marchenko3D/demo/marchenko2D/oneD/model.scr
similarity index 100%
rename from marchenko3D/demo/oneD/model.scr
rename to marchenko3D/demo/marchenko2D/oneD/model.scr
diff --git a/marchenko3D/demo/oneD/model2.scr b/marchenko3D/demo/marchenko2D/oneD/model2.scr
similarity index 100%
rename from marchenko3D/demo/oneD/model2.scr
rename to marchenko3D/demo/marchenko2D/oneD/model2.scr
diff --git a/marchenko3D/demo/oneD/p5all.scr b/marchenko3D/demo/marchenko2D/oneD/p5all.scr
similarity index 100%
rename from marchenko3D/demo/oneD/p5all.scr
rename to marchenko3D/demo/marchenko2D/oneD/p5all.scr
diff --git a/marchenko3D/demo/oneD/primaries.scr b/marchenko3D/demo/marchenko2D/oneD/primaries.scr
similarity index 100%
rename from marchenko3D/demo/oneD/primaries.scr
rename to marchenko3D/demo/marchenko2D/oneD/primaries.scr
diff --git a/marchenko3D/demo/oneD/primariesFrame.scr b/marchenko3D/demo/marchenko2D/oneD/primariesFrame.scr
similarity index 100%
rename from marchenko3D/demo/oneD/primariesFrame.scr
rename to marchenko3D/demo/marchenko2D/oneD/primariesFrame.scr
diff --git a/marchenko3D/demo/oneD/referenceShot.scr b/marchenko3D/demo/marchenko2D/oneD/referenceShot.scr
similarity index 100%
rename from marchenko3D/demo/oneD/referenceShot.scr
rename to marchenko3D/demo/marchenko2D/oneD/referenceShot.scr
diff --git a/marchenko3D/demo/test/test.scr b/marchenko3D/demo/marchenko2D/test/test.scr
similarity index 100%
rename from marchenko3D/demo/test/test.scr
rename to marchenko3D/demo/marchenko2D/test/test.scr
diff --git a/marchenko3D/demo/twoD/README b/marchenko3D/demo/marchenko2D/twoD/README
similarity index 100%
rename from marchenko3D/demo/twoD/README
rename to marchenko3D/demo/marchenko2D/twoD/README
diff --git a/marchenko3D/demo/twoD/backProp_makemovie.scr b/marchenko3D/demo/marchenko2D/twoD/backProp_makemovie.scr
similarity index 100%
rename from marchenko3D/demo/twoD/backProp_makemovie.scr
rename to marchenko3D/demo/marchenko2D/twoD/backProp_makemovie.scr
diff --git a/marchenko3D/demo/twoD/backpropf2.scr b/marchenko3D/demo/marchenko2D/twoD/backpropf2.scr
similarity index 100%
rename from marchenko3D/demo/twoD/backpropf2.scr
rename to marchenko3D/demo/marchenko2D/twoD/backpropf2.scr
diff --git a/marchenko3D/demo/twoD/check.scr b/marchenko3D/demo/marchenko2D/twoD/check.scr
similarity index 100%
rename from marchenko3D/demo/twoD/check.scr
rename to marchenko3D/demo/marchenko2D/twoD/check.scr
diff --git a/marchenko3D/demo/twoD/clean b/marchenko3D/demo/marchenko2D/twoD/clean
similarity index 100%
rename from marchenko3D/demo/twoD/clean
rename to marchenko3D/demo/marchenko2D/twoD/clean
diff --git a/marchenko3D/demo/twoD/direct.scr b/marchenko3D/demo/marchenko2D/twoD/direct.scr
similarity index 100%
rename from marchenko3D/demo/twoD/direct.scr
rename to marchenko3D/demo/marchenko2D/twoD/direct.scr
diff --git a/marchenko3D/demo/twoD/eps.scr b/marchenko3D/demo/marchenko2D/twoD/eps.scr
similarity index 100%
rename from marchenko3D/demo/twoD/eps.scr
rename to marchenko3D/demo/marchenko2D/twoD/eps.scr
diff --git a/marchenko3D/demo/twoD/epsPlane.scr b/marchenko3D/demo/marchenko2D/twoD/epsPlane.scr
similarity index 100%
rename from marchenko3D/demo/twoD/epsPlane.scr
rename to marchenko3D/demo/marchenko2D/twoD/epsPlane.scr
diff --git a/marchenko3D/demo/twoD/epsPrimaries.scr b/marchenko3D/demo/marchenko2D/twoD/epsPrimaries.scr
similarity index 100%
rename from marchenko3D/demo/twoD/epsPrimaries.scr
rename to marchenko3D/demo/marchenko2D/twoD/epsPrimaries.scr
diff --git a/marchenko3D/demo/twoD/homg_reference.scr b/marchenko3D/demo/marchenko2D/twoD/homg_reference.scr
similarity index 100%
rename from marchenko3D/demo/twoD/homg_reference.scr
rename to marchenko3D/demo/marchenko2D/twoD/homg_reference.scr
diff --git a/marchenko3D/demo/twoD/homgpng.scr b/marchenko3D/demo/marchenko2D/twoD/homgpng.scr
similarity index 100%
rename from marchenko3D/demo/twoD/homgpng.scr
rename to marchenko3D/demo/marchenko2D/twoD/homgpng.scr
diff --git a/marchenko3D/demo/twoD/homgview.scr b/marchenko3D/demo/marchenko2D/twoD/homgview.scr
similarity index 100%
rename from marchenko3D/demo/twoD/homgview.scr
rename to marchenko3D/demo/marchenko2D/twoD/homgview.scr
diff --git a/marchenko3D/demo/twoD/initialFocus.scr b/marchenko3D/demo/marchenko2D/twoD/initialFocus.scr
similarity index 100%
rename from marchenko3D/demo/twoD/initialFocus.scr
rename to marchenko3D/demo/marchenko2D/twoD/initialFocus.scr
diff --git a/marchenko3D/demo/twoD/initialFocus_pbs.scr b/marchenko3D/demo/marchenko2D/twoD/initialFocus_pbs.scr
similarity index 100%
rename from marchenko3D/demo/twoD/initialFocus_pbs.scr
rename to marchenko3D/demo/marchenko2D/twoD/initialFocus_pbs.scr
diff --git a/marchenko3D/demo/twoD/initialFocus_slurm.scr b/marchenko3D/demo/marchenko2D/twoD/initialFocus_slurm.scr
similarity index 100%
rename from marchenko3D/demo/twoD/initialFocus_slurm.scr
rename to marchenko3D/demo/marchenko2D/twoD/initialFocus_slurm.scr
diff --git a/marchenko3D/demo/twoD/initialPlane.scr b/marchenko3D/demo/marchenko2D/twoD/initialPlane.scr
similarity index 100%
rename from marchenko3D/demo/twoD/initialPlane.scr
rename to marchenko3D/demo/marchenko2D/twoD/initialPlane.scr
diff --git a/marchenko3D/demo/twoD/marchenko.scr b/marchenko3D/demo/marchenko2D/twoD/marchenko.scr
similarity index 100%
rename from marchenko3D/demo/twoD/marchenko.scr
rename to marchenko3D/demo/marchenko2D/twoD/marchenko.scr
diff --git a/marchenko3D/demo/twoD/marchenkoPlane.scr b/marchenko3D/demo/marchenko2D/twoD/marchenkoPlane.scr
similarity index 100%
rename from marchenko3D/demo/twoD/marchenkoPlane.scr
rename to marchenko3D/demo/marchenko2D/twoD/marchenkoPlane.scr
diff --git a/marchenko3D/demo/twoD/marchenko_ray.pbs b/marchenko3D/demo/marchenko2D/twoD/marchenko_ray.pbs
similarity index 100%
rename from marchenko3D/demo/twoD/marchenko_ray.pbs
rename to marchenko3D/demo/marchenko2D/twoD/marchenko_ray.pbs
diff --git a/marchenko3D/demo/twoD/marchenko_ray.scr b/marchenko3D/demo/marchenko2D/twoD/marchenko_ray.scr
similarity index 100%
rename from marchenko3D/demo/twoD/marchenko_ray.scr
rename to marchenko3D/demo/marchenko2D/twoD/marchenko_ray.scr
diff --git a/marchenko3D/demo/twoD/model.scr b/marchenko3D/demo/marchenko2D/twoD/model.scr
similarity index 100%
rename from marchenko3D/demo/twoD/model.scr
rename to marchenko3D/demo/marchenko2D/twoD/model.scr
diff --git a/marchenko3D/demo/twoD/primaries.scr b/marchenko3D/demo/marchenko2D/twoD/primaries.scr
similarity index 100%
rename from marchenko3D/demo/twoD/primaries.scr
rename to marchenko3D/demo/marchenko2D/twoD/primaries.scr
diff --git a/marchenko3D/demo/twoD/rayvsp.scr b/marchenko3D/demo/marchenko2D/twoD/rayvsp.scr
similarity index 100%
rename from marchenko3D/demo/twoD/rayvsp.scr
rename to marchenko3D/demo/marchenko2D/twoD/rayvsp.scr
diff --git a/marchenko3D/demo/twoD/referenceShot.scr b/marchenko3D/demo/marchenko2D/twoD/referenceShot.scr
similarity index 100%
rename from marchenko3D/demo/twoD/referenceShot.scr
rename to marchenko3D/demo/marchenko2D/twoD/referenceShot.scr
diff --git a/marchenko3D/demo/twoD/remove_direct.scr b/marchenko3D/demo/marchenko2D/twoD/remove_direct.scr
similarity index 100%
rename from marchenko3D/demo/twoD/remove_direct.scr
rename to marchenko3D/demo/marchenko2D/twoD/remove_direct.scr
diff --git a/marchenko3D/demo/twoD/shots_pbs.scr b/marchenko3D/demo/marchenko2D/twoD/shots_pbs.scr
similarity index 100%
rename from marchenko3D/demo/twoD/shots_pbs.scr
rename to marchenko3D/demo/marchenko2D/twoD/shots_pbs.scr
diff --git a/marchenko3D/demo/twoD/shots_slurm.scr b/marchenko3D/demo/marchenko2D/twoD/shots_slurm.scr
similarity index 100%
rename from marchenko3D/demo/twoD/shots_slurm.scr
rename to marchenko3D/demo/marchenko2D/twoD/shots_slurm.scr
diff --git a/marchenko3D/demo/marchenko3D/oneD/README b/marchenko3D/demo/marchenko3D/oneD/README
new file mode 100644
index 0000000000000000000000000000000000000000..52d17c72cb350b8b428f3c3944492402f14d5a17
--- /dev/null
+++ b/marchenko3D/demo/marchenko3D/oneD/README
@@ -0,0 +1,6 @@
+In this directory, you can run the 3D marchenko code.
+!!!!!!!!!!!!!!!!!!!!!!!!!!WARNING!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+Due to the size of the data, one requires around 256 GB of RAM. Keep this limitation in mind
+
+To avoid the need for large storage space on your directory, we reccomend using the ZFP compressed option. 
+This is the standard option included in the data. You can just execute execute.sh and everything will be done for you. It will take a considerable amount of time, depending on your machine.
diff --git a/marchenko3D/demo/marchenko3D/oneD/execute.sh b/marchenko3D/demo/marchenko3D/oneD/execute.sh
new file mode 100755
index 0000000000000000000000000000000000000000..f183f9e9dc334595fd842b125d6a07c7f710b8df
--- /dev/null
+++ b/marchenko3D/demo/marchenko3D/oneD/execute.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+./model.sh
+
+./shotmodel.sh
+
+./makeR.sh
+
+./farrmod.sh
+
+./fmute3D.sh
+
+./zfp.sh
+
+./marchenko3d.sh
diff --git a/marchenko3D/demo/marchenko3D/oneD/farrmod.sh b/marchenko3D/demo/marchenko3D/oneD/farrmod.sh
new file mode 100755
index 0000000000000000000000000000000000000000..4cfbf5211d87618c33e6987dff124e4250fc669b
--- /dev/null
+++ b/marchenko3D/demo/marchenko3D/oneD/farrmod.sh
@@ -0,0 +1,32 @@
+#!/bin/bash
+
+dt=0.001
+
+makewave fp=15 fmax=22 dt=${dt} file_out=wavefpmod.su nt=8192 t0=0.2 scale=1 scfft=0
+
+export OMP_NUM_THREADS=8
+
+#Model shot record in middle of model
+fdelmodc3D \
+    file_cp=cp3d.su ischeme=1 iorder=4 \
+    file_den=ro3d.su \
+    file_src=wavefpmod.su \
+    file_rcv=farrmod.su \
+    src_type=1 \
+    src_orient=1 \
+    src_injectionrate=1 \
+    rec_type_vz=0 \
+    rec_type_p=1 \
+    rec_int_vz=2 \
+    dtrcv=0.004 \
+    rec_delay=0.2 \
+    verbose=2 \
+    tmod=1.2 \
+    dxrcv=10.0 \
+    xrcv1=-1000 xrcv2=1000 \
+    dyrcv=10.0 \
+    yrcv1=-300 yrcv2=300 \
+    zrcv1=0 zrcv2=0 \
+    xsrc=0 ysrc=0 zsrc=900 \
+    ntaper=61 \
+    left=4 right=4 top=4 bottom=4 front=4 back=4 \
diff --git a/marchenko3D/demo/marchenko3D/oneD/fmute3D.sh b/marchenko3D/demo/marchenko3D/oneD/fmute3D.sh
new file mode 100755
index 0000000000000000000000000000000000000000..8b89c7354eaef93cff259c4df8e0240660626654
--- /dev/null
+++ b/marchenko3D/demo/marchenko3D/oneD/fmute3D.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+#Mute the coda from the modeled first arrival
+fmute3D file_mute=farrmod_rp.su file_shot=farrmod_rp.su file_out=farr.su above=2 shift=18 smooth=10 hw=5
diff --git a/marchenko3D/demo/marchenko3D/oneD/makeR.sh b/marchenko3D/demo/marchenko3D/oneD/makeR.sh
new file mode 100755
index 0000000000000000000000000000000000000000..e31cf348249a47faec8c10db9635619c0c2a7c69
--- /dev/null
+++ b/marchenko3D/demo/marchenko3D/oneD/makeR.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+#create the reflection data that was modeled in 1 1D medium
+makeR1D file_in=shotx10y10.su file_out=reflx10y10.su verbose=2 nxrcv=201 nyrcv=61 nxsrc=201 nysrc=61
+
diff --git a/marchenko3D/demo/marchenko3D/oneD/marchenko3d.sh b/marchenko3D/demo/marchenko3D/oneD/marchenko3d.sh
new file mode 100755
index 0000000000000000000000000000000000000000..68439928f64b33cb290aa83fdbebce4712b8c16f
--- /dev/null
+++ b/marchenko3D/demo/marchenko3D/oneD/marchenko3d.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+#Marchenko using time data
+#marchenko3D file_shot=reflx10y10.su verbose=2 \
+#    file_tinv=farr.su \
+#    niter=10 shift=15 smooth=10 hw=5 \
+#    file_green=green_timeshot.su file_file_f2=f2_timeshot.su
+
+#Marchenko using frequency data
+#marchenko3D file_shotw=reflx10y10_W.bin verbose=2 \
+#    file_tinv=farr.su \
+#    niter=10 shift=15 smooth=10 hw=5 \
+#    file_green=green_freqshot.su file_file_f2=f2_freqshot.su
+
+#Marchenko using zfp data
+marchenko3D file_shotzfp=reflx10y10_zfp.bin verbose=2 \
+    file_tinv=farr.su \
+    niter=10 shift=15 smooth=10 hw=5 \
+    file_green=green_zfpshot.su file_file_f2=f2_zfpshot.su
diff --git a/marchenko3D/demo/marchenko3D/oneD/model.sh b/marchenko3D/demo/marchenko3D/oneD/model.sh
new file mode 100755
index 0000000000000000000000000000000000000000..3725e0aff7c937946560dccc3f1a64d6720f4379
--- /dev/null
+++ b/marchenko3D/demo/marchenko3D/oneD/model.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+#adjust this PATH to where the code is installed
+export PATH=$HOME/src/OpenSource/bin:$PATH:
+
+dx=10
+ny=181
+dy=10000
+
+#define gridded model for FD computations
+makemod sizex=5000 sizez=1400 dx=$dx dz=$dx cp0=1800 ro0=1000 \
+        orig=-2500,0 file_base=model5.su verbose=2 \
+        intt=def x=-2500,2500 z=400,400 poly=0 cp=2300 ro=3000 \
+        intt=def x=-2500,2500 z=700,700 poly=0 cp=2000 ro=1100 \
+        intt=def x=-2500,2500 z=1100,1100 poly=0 cp=2500 ro=4000
+
+#define homogenoeus model to compute direct wave only
+makemod sizex=5000 sizez=300 dx=$dx dz=$dx cp0=1800 ro0=1000 \
+        orig=-2500,0 file_base=hom.su verbose=2
+
+rm cp3d.su
+rm ro3d.su
+rm cphom3d.su
+rm rohom3d.su
+
+for (( i=0; i<$ny; i++ ));do
+
+    (( ypos = -1*($ny-1)/2 + $i ))
+    (( yloc = $dy*$ypos ))
+    echo $yloc
+
+    sushw < model5_cp.su key=gy,scalel a=$yloc,-1000 >> cp3d.su
+    sushw < model5_ro.su key=gy,scalel a=$yloc,-1000 >> ro3d.su
+    sushw < hom_cp.su key=gy,scalel a=$yloc,-1000 >> cphom3d.su
+    sushw < hom_ro.su key=gy,scalel a=$yloc,-1000 >> rohom3d.su
+
+done
+
+
+
diff --git a/marchenko3D/demo/marchenko3D/oneD/shotmodel.sh b/marchenko3D/demo/marchenko3D/oneD/shotmodel.sh
new file mode 100755
index 0000000000000000000000000000000000000000..cd6c947964220e7a2bbfd5573a8d9adcae7eb9bc
--- /dev/null
+++ b/marchenko3D/demo/marchenko3D/oneD/shotmodel.sh
@@ -0,0 +1,62 @@
+#!/bin/bash
+
+dt=0.001
+
+#define wavelet for modeling R
+makewave w=fw fmin=0 flef=5 frig=25 fmax=30 dt=$dt file_out=wavefw.su nt=4096 t0=0.3 scale=0 scfft=1
+
+#Set the number of threads for parallel jobs. More is not always better
+export OMP_NUM_THREADS=8
+
+#Model shot record in middle of model
+fdelmodc3D \
+    file_cp=cp3d.su ischeme=1 iorder=4 \
+    file_den=ro3d.su \
+    file_src=wavefw.su \
+    file_rcv=shotx10y10.su \
+    src_type=7 \
+    src_orient=1 \
+    src_injectionrate=1 \
+    rec_type_vz=0 \
+    rec_type_p=1 \
+    rec_int_vz=2 \
+    dtrcv=0.004 \
+    rec_delay=0.3 \
+    verbose=2 \
+    tmod=4.392 \
+    dxrcv=10.0 \
+    xrcv1=-2000 xrcv2=2000 \
+    dyrcv=10.0 \
+    yrcv1=-600 yrcv2=600 \
+    zrcv1=0 zrcv2=0 \
+    xsrc=0 ysrc=0 zsrc=0 \
+    ntaper=41 \
+    left=4 right=4 top=4 bottom=4 front=4 back=4
+
+#Model direct wave only in middle of model
+fdelmodc3D \
+    file_cp=cphom3d.su ischeme=1 iorder=4 \
+    file_den=rohom3d.su \
+    file_src=wavefw.su \
+    file_rcv=shotx10y10hom.su \
+    src_type=7 \
+    src_orient=1 \
+    src_injectionrate=1 \
+    rec_type_vz=0 \
+    rec_type_p=1 \
+    rec_int_vz=2 \
+    dtrcv=0.004 \
+    rec_delay=0.3 \
+    verbose=2 \
+    tmod=4.392 \
+    dxrcv=10.0 \
+    xrcv1=-2000 xrcv2=2000 \
+    dyrcv=10.0 \
+    yrcv1=-600 yrcv2=600 \
+    zrcv1=0 zrcv2=0 \
+    xsrc=0 ysrc=0 zsrc=0 \
+    ntaper=41 \
+    left=4 right=4 top=4 bottom=4 front=4 back=4
+
+#subtract direct wave from full model shot record: this defines R
+sudiff shotx10y10_rp.su shotx10y10hom_rp.su > shotx10y10.su
diff --git a/marchenko3D/demo/marchenko3D/oneD/zfp.sh b/marchenko3D/demo/marchenko3D/oneD/zfp.sh
new file mode 100755
index 0000000000000000000000000000000000000000..45f436827b4c75bfecd7b5c535053002b2930443
--- /dev/null
+++ b/marchenko3D/demo/marchenko3D/oneD/zfp.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+# Pre-transform the data to the frequency domain
+#TWtransform file_in=reflx10y10.su file_out=reflx10y10_W.bin verbose=1 fmin=0 fmax=30 zfp=0 tolerance=1e-7
+
+# Pre-transform the data to the frequency domain and apply zfp compression
+TWtransform file_in=reflx10y10.su file_out=reflx10y10_zfp.bin verbose=1 fmin=0 fmax=30 zfp=1 tolerance=1e-7
+
+rm reflx10y10.su
diff --git a/marchenko3D/fmute3D.c b/marchenko3D/fmute3D.c
index 56152cf9098553d6db33077e67b9011624cb10d3..b8fea43b5865f93957d3506d7c5b8f94e50999b0 100644
--- a/marchenko3D/fmute3D.c
+++ b/marchenko3D/fmute3D.c
@@ -302,9 +302,11 @@ int main (int argc, char **argv)
 
         /* search forward in y-trace direction from maximum in file */
         for (i = iymax+1; i < ny1; i++) {
+            tstart = MAX(0, (maxval[(i-1)*nx1+ixmax]-hw));
+            tend   = MIN(nt1-1, (maxval[(i-1)*nx1+ixmax]+hw));
             tmax=0.0;
-            jmax = 0;
-            for (j = 0; j < nt1; j++) {
+            jmax = tstart;
+            for (j = tstart; j < tend; j++) {
                 lmax = fabs(tmpdata[i*nx1*nt1+ixmax*nt1+j]);
                 if (lmax > tmax) {
                     jmax = j;
@@ -347,9 +349,11 @@ int main (int argc, char **argv)
 
         /* search backward in y-trace direction from maximum in file */
         for (i = iymax-1; i >= 0; i--) {
+            tstart = MAX(0, (maxval[(i+1)*nx1+ixmax]-hw));
+            tend   = MIN(nt1-1, (maxval[(i+1)*nx1+ixmax]+hw));
             tmax=0.0;
-            jmax = 0;
-            for (j = 0; j < nt1; j++) {
+            jmax = tstart;
+            for (j = tstart; j < tend; j++) {
                 lmax = fabs(tmpdata[i*nx1*nt1+ixmax*nt1+j]);
                 if (lmax > tmax) {
                     jmax = j;
diff --git a/marchenko3D/homogeneousg3D.c b/marchenko3D/homogeneousg3D.c
index 5da29e05ba74f8b67185dba4bf7c9eedffbf70cc..6f3d0f7c7ad064236c2e194db84a1a187e0fad08 100644
--- a/marchenko3D/homogeneousg3D.c
+++ b/marchenko3D/homogeneousg3D.c
@@ -7,6 +7,25 @@
 #include <assert.h>
 #include <genfft.h>
 
+/*
+The schemes in this module use a variety of retrieval representations
+For more information about Green's function retrieval see:
+Brackenhoff, J., Thorbecke, J., & Wapenaar, K. (2019). 
+Virtual sources and receivers in the real Earth: Considerations for practical applications. 
+Journal of Geophysical Research: Solid Earth, 124, 11802– 11821. 
+https://doi.org/10.1029/2019JB018485 
+
+Brackenhoff, J., Thorbecke, J., and Wapenaar, K.: 
+Monitoring of induced distributed double-couple sources using Marchenko-based virtual receivers.
+Solid Earth, 10, 1301–1319, 
+https://doi.org/10.5194/se-10-1301-2019, 2019. 
+
+Wapenaar, K., Brackenhoff, J., Thorbecke, J. et al. 
+Virtual acoustics in inhomogeneous media with single-sided access. 
+Sci Rep 8, 2497 (2018). 
+https://doi.org/10.1038/s41598-018-20924-x
+*/
+
 #ifndef MAX
 #define MAX(x,y) ((x) > (y) ? (x) : (y))
 #endif
@@ -29,7 +48,6 @@ void convol2(float *data1, float *data2, float *con, long nrec, long nsam, float
 long readSnapData3D(char *filename, float *data, segy *hdrs, long nsnaps, long nx, long ny, long nz, long sx, long ex, long sy, long ey, long sz, long ez);
 long getFileInfo3D(char *filename, long *n1, long *n2, long *n3, long *ngath, float *d1, float *d2, float *d3, float *f1, float *f2, float *f3, float *sclsxgxsygy, long *nxm);
 
-//void kxwfilter(float *data, long nt, long nx, float dt, float dx, float fmin, float fmax, float angle, float cp, float perc);
 void timeDiff(float *data, long nsam, long nrec, float dt, float fmin, float fmax, long opt);
 void depthDiff(float *data, long nsam, long nrec, float dt, float dx, float fmin, float fmax, float c, long opt);
 
@@ -38,22 +56,19 @@ void homogeneousg3D(float *HomG, float *green, float *f2p, float *f1p, float *f1
 {
     char    *file_inp;
     long    i, j, k, l, ret, scheme, count=0, n_source;
-    long    is, kxwfilt, n1, n2, n3, ngath, ntraces, zsrc;
+    long    is, n1, n2, n3, ngath, ntraces, zsrc;
     float   d1, d2, d3, f1, f2, f3, scl;
-	float   *conv, fmin, fmax, alpha, cp, rho, perc;
+	float   *conv, fmin, fmax, cp, rho;
 	float   *greenjkz, *input, *inputjkz, *tmp1, *tmp2;
     double  t0, t2, tfft;
     segy    *hdr_inp;
 
     if (!getparstring("file_inp", &file_inp)) file_inp = NULL;
 	if (!getparlong("scheme", &scheme)) scheme = 0;
-	if (!getparlong("kxwfilt", &kxwfilt)) kxwfilt = 0;
 	if (!getparfloat("fmin", &fmin)) fmin = 0.0;
 	if (!getparfloat("fmax", &fmax)) fmax = 100.0;
-	if (!getparfloat("alpha", &alpha)) alpha = 65.0;
 	if (!getparfloat("cp", &cp)) cp = 1000.0;
 	if (!getparfloat("rho", &rho)) rho = 1000.0;
-	if (!getparfloat("perc", &perc)) perc = 0.15;
 
 	tfft = 0.0;
 	ret = 0;
@@ -70,6 +85,8 @@ void homogeneousg3D(float *HomG, float *green, float *f2p, float *f1p, float *f1
     if (NINT(d2*1000.0)!=NINT(dx*1000.0)) verr("dx sampling between input (%.3e) and retrieved (%.3e) is not equal",d2,dx);
     if (NINT(d3*1000.0)!=NINT(dy*1000.0)) verr("dy sampling between input (%.3e) and retrieved (%.3e) is not equal",d3,dy);
 
+    scl = dx*dy*dt;
+
     input   = (float *)calloc(n_source*nx*ny*nt,sizeof(float));
     hdr_inp = (segy *)calloc(n_source*nx*ny,sizeof(segy));
     readSnapData3D(file_inp, input, hdr_inp, n_source, nx, ny, nt, 0, nx, 0, ny, 0, nt);
@@ -86,7 +103,22 @@ void homogeneousg3D(float *HomG, float *green, float *f2p, float *f1p, float *f1
         sz[l] = hdr_inp[l*nx*ny].sdepth;
     }
 
-	if (scheme==1) { // Scale the Green's functions if the classical scheme is used
+    if (scheme==0) {
+		if (verbose) vmess("Marchenko Homogeneous Green's function retrieval with G source");
+	}
+    else if (scheme==1) {
+		if (verbose) vmess("Marchenko Homogeneous Green's function retrieval with f2 source");
+	}
+    else if (scheme==2) {
+		if (verbose) vmess("Marchenko Green's function retrieval with source depending on position");
+	}
+	else if (scheme==3) {
+		if (verbose) vmess("Marchenko Green's function retrieval with G source");
+	}
+    else if (scheme==4) {
+		if (verbose) vmess("Marchenko Green's function retrieval with f2 source");
+	}
+	else if (scheme==5) { // Scale the Green's functions if the classical scheme is used
 		if (verbose) vmess("Classical Homogeneous Green's function retrieval");
 		greenjkz	= (float *)calloc(Nfoc*nx*ny*nt,sizeof(float));
 		inputjkz	= (float *)calloc(n_source*nx*ny*nt,sizeof(float));
@@ -108,26 +140,14 @@ void homogeneousg3D(float *HomG, float *green, float *f2p, float *f1p, float *f1
             }
         }
 	}
-	else if (scheme==2) {
-		if (verbose) vmess("Marchenko Green's function retrieval with G source");
-	}
-    else if (scheme==6) {
-		if (verbose) vmess("Marchenko Green's function retrieval with f2 source");
-	}
-    else if (scheme==7) {
-		if (verbose) vmess("Marchenko Green's function retrieval with source depending on position");
-	}
-	else if (scheme==3) {
+	else if (scheme==6) {
 		if (verbose) vmess("Marchenko Homogeneous Green's function retrieval with multiple sources");
         if (verbose) vmess("Looping over %li source positions",n_source);
 	}
-    else if (scheme==4) {
+    else if (scheme==7) {
 		if (verbose) vmess("Back propagation with multiple sources");
         if (verbose) vmess("Looping over %li source positions",n_source);
 	}
-	else if (scheme==5) {
-		if (verbose) vmess("Marchenko Homogeneous Green's function retrieval with f2 source");
-	}
 	else if (scheme==8) { // 0=f1p 1=f1m
 		if (verbose) vmess("f1+ redatuming");
         if (n_source<2) verr("Not enough input for the homogeneous Green's function");
@@ -150,12 +170,11 @@ void homogeneousg3D(float *HomG, float *green, float *f2p, float *f1p, float *f1
 		if (verbose) vmess("2i IM(f1) redatuming");
 		inputjkz	= (float *)calloc(n_source*nx*ny*nt,sizeof(float));
         for (k = 0; k < ny; k++) {
+            depthDiff(&input[k*nx*nt]   , nt, nx, dt, dx, fmin, fmax, cp, 1);
             for (l = 0; l < nx*nt; l++) {
                 inputjkz[k*nx*nt+l] = input[k*nx*nt+l];
             }
             conjugate(&inputjkz[k*nx*nt], nt, nx, dt);
-            depthDiff(&inputjkz[k*nx*nt], nt, nx, dt, dx, fmin, fmax, cp, 1);
-            depthDiff(&input[k*nx*nt]   , nt, nx, dt, dx, fmin, fmax, cp, 1);
         }
 	}
 	else {
@@ -166,11 +185,11 @@ void homogeneousg3D(float *HomG, float *green, float *f2p, float *f1p, float *f1
   private(i,j,k,is,conv,tmp1,tmp2,zsrc) 
 {	
 	conv	= (float *)calloc(nx*nt,sizeof(float));
-	if (scheme==1) {
+	if (scheme==5) {
 		tmp1	= (float *)calloc(nx*nt,sizeof(float));
 		tmp2	= (float *)calloc(nx*nt,sizeof(float));
 	}
-	if (scheme==3 || scheme==8 || scheme==9 || scheme==10) tmp1 = (float *)calloc(nx*nt,sizeof(float));
+	if (scheme==6 || scheme==8 || scheme==9 || scheme==10) tmp1 = (float *)calloc(nx*nt,sizeof(float));
 
 #pragma omp for schedule(guided,1)
 	for (l = 0; l < Nfoc; l++) {
@@ -185,70 +204,77 @@ void homogeneousg3D(float *HomG, float *green, float *f2p, float *f1p, float *f1
                 depthDiff(&f2p[l*ny*nx*nt+k*nx*nt], nt, nx, dt, dx, fmin, fmax, cp, 1);
                 convol(&input[k*nx*nt], &f2p[l*ny*nx*nt+k*nx*nt], conv, nx, nt, dt, 0);
                 timeDiff(conv, nt, nx, dt, fmin, fmax, -3);
-                if (kxwfilt) {
-                    //kxwfilter(conv, nt, nx, dt, dx, fmin, fmax, alpha, cp, perc);
-                }
                 for (i=0; i<nx; i++) {
                     for (j=0; j<nt/2; j++) {
-                        HomG[(j+nt/2)*Nfoc+l] += conv[i*nt+j]/rho;
-                        HomG[j*Nfoc+l] += conv[i*nt+(j+nt/2)]/rho;
+                        HomG[(j+nt/2)*Nfoc+l] += scl*conv[i*nt+j]/rho;
+                        HomG[j*Nfoc+l] += scl*conv[i*nt+(j+nt/2)]/rho;
                     }
                 }
             }
 		}
-        else if (scheme==5) { //Marchenko representation with f2 source
+        else if (scheme==1) { //Marchenko representation with f2 source
             for (k = 0; k < ny; k++) {
                 depthDiff(&green[l*ny*nx*nt+k*nx*nt], nt, nx, dt, dx, fmin, fmax, cp, 1);
                 convol(&input[k*nx*nt], &green[l*ny*nx*nt+k*nx*nt], conv, nx, nt, dt, 0);
                 timeDiff(conv, nt, nx, dt, fmin, fmax, -3);
-                if (kxwfilt) {
-                    //kxwfilter(conv, nt, nx, dt, dx, fmin, fmax, alpha, cp, perc);
-                }
                 for (i=0; i<nx; i++) {
                     for (j=0; j<nt/2; j++) {
-                        HomG[(j+nt/2)*Nfoc+l] += conv[i*nt+j]/rho;
-                        HomG[j*Nfoc+l] += conv[i*nt+(j+nt/2)]/rho;
+                        HomG[(j+nt/2)*Nfoc+l] += scl*conv[i*nt+j]/rho;
+                        HomG[j*Nfoc+l] += scl*conv[i*nt+(j+nt/2)]/rho;
                     }
                 }
             }
 		}
-        else if (scheme==8) { // f1+ redatuming 0=f1p 1=f1m
+        else if (scheme==2) { //Marchenko representation without time-reversal using varying sources
             for (k = 0; k < ny; k++) {
-                convol2(&input[0*ny*nx*nt+k*nx*nt], &f1p[l*ny*nx*nt+k*nx*nt], conv, nx, nt, dt, fmin, fmax, 1);
-                convol2(&input[1*ny*nx*nt+k*nx*nt], &f1m[l*ny*nx*nt+k*nx*nt], tmp1, nx, nt, dt, fmin, fmax, 1);
-                for (i=0; i<nx; i++) {
-                    for (j=0; j<nt/2; j++) {
-                        HomG[(j+nt/2)*Nfoc+l]   -= 2.0*(conv[i*nt+j]        + tmp1[i*nt+j])/rho;
-                        HomG[j*Nfoc+l]          -= 2.0*(conv[i*nt+(j+nt/2)] + tmp1[i*nt+(j+nt/2)])/rho;
+                depthDiff(&f2p[l*ny*nx*nt+k*nx*nt], nt, nx, dt, dx, fmin, fmax, cp, 1);
+                depthDiff(&green[l*ny*nx*nt+k*nx*nt], nt, nx, dt, dx, fmin, fmax, cp, 1);
+                for (is=0; is<(n_source/2); is+=2) {
+                    zsrc = labs(hdr_inp[is].selev);
+                    if (zsrc > NINT(1000.0*zsyn[l])) {
+                        if (verbose > 1) vmess("Homogeneous Green's function at %li uses G source (zsrc=%li)",NINT(1000.0*zsyn[l]));
+                        convol(&input[is*ny*nx*nt+k*nx*nt], &f2p[l*ny*nx*nt+k*nx*nt], conv, nx, nt, dt, 0);
+                    }
+                    else {
+                        if (verbose > 1) vmess("Homogeneous Green's function at %li uses f2 source (zsrc=%li)",NINT(1000.0*zsyn[l]));
+                        convol(&input[(is+1)*ny*nx*nt+k*nx*nt], &green[l*ny*nx*nt+k*nx*nt], conv, nx, nt, dt, 0);
+                    }
+                    timeDiff(conv, nt, nx, dt, fmin, fmax, -1);
+                    for (i=0; i<nx; i++) {
+                        for (j=0; j<nt/2; j++) {
+                            HomG[(j+nt/2)*Nfoc+l] += 2.0*scl*conv[i*nt+j]/rho;
+                            HomG[j*Nfoc+l] += 2.0*scl*conv[i*nt+(j+nt/2)]/rho;
+                        }
                     }
                 }
             }
 		}
-        else if (scheme==9) { // f1- redatuming 0=f1p 1=f1m
+		else if (scheme==3) { //Marchenko representation without time-reversal G source
             for (k = 0; k < ny; k++) {
-                convol2(&input[0*ny*nx*nt+k*nx*nt], &f1m[l*ny*nx*nt+k*nx*nt], conv, nx, nt, dt, fmin, fmax, 1);
-                convol2(&input[1*ny*nx*nt+k*nx*nt], &f1p[l*ny*nx*nt+k*nx*nt], tmp1, nx, nt, dt, fmin, fmax, 1);
+                depthDiff(&f2p[l*ny*nx*nt+k*nx*nt], nt, nx, dt, dx, fmin, fmax, cp, 1);
+                convol2(&input[k*nx*nt], &f2p[l*ny*nx*nt+k*nx*nt], conv, nx, nt, dt, fmin, fmax, 1);
                 for (i=0; i<nx; i++) {
                     for (j=0; j<nt/2; j++) {
-                        HomG[(j+nt/2)*Nfoc+l]   += 2.0*(conv[i*nt+j]        + tmp1[i*nt+j])/rho;
-                        HomG[j*Nfoc+l]          += 2.0*(conv[i*nt+(j+nt/2)] + tmp1[i*nt+(j+nt/2)])/rho;
+                        HomG[(j+nt/2)*Nfoc+l] += 2.0*scl*conv[i*nt+j]/rho;
+                        HomG[j*Nfoc+l] += 2.0*scl*conv[i*nt+(j+nt/2)]/rho;
                     }
                 }
             }
 		}
-        else if (scheme==10) { // 2i IM(f1) redatuming
+		else if (scheme==4) { //Marchenko representation without time-reversal f2 source
             for (k = 0; k < ny; k++) {
-                convol2(&input[k*nx*nt]   , &f1m[l*ny*nx*nt+k*nx*nt], conv, nx, nt, dt, fmin, fmax, 2);
-                convol2(&inputjkz[k*nx*nt], &f1p[l*ny*nx*nt+k*nx*nt], tmp1, nx, nt, dt, fmin, fmax, 2);
+                depthDiff(&green[l*ny*nx*nt+k*nx*nt], nt, nx, dt, dx, fmin, fmax, cp, 1);
+                convol(&input[k*nx*nt], &green[l*ny*nx*nt+k*nx*nt], conv, nx, nt, dt, 0);
+                timeDiff(conv, nt, nx, dt, fmin, fmax, -1);
                 for (i=0; i<nx; i++) {
                     for (j=0; j<nt/2; j++) {
-                        HomG[(j+nt/2)*Nfoc+l]   += 4.0*(conv[i*nt+j]        - tmp1[i*nt+j])/rho;
-                        HomG[j*Nfoc+l]          += 4.0*(conv[i*nt+(j+nt/2)] - tmp1[i*nt+(j+nt/2)])/rho;
+                        HomG[(j+nt/2)*Nfoc+l] += 2.0*scl*conv[i*nt+j]/rho;
+                        HomG[j*Nfoc+l] += 2.0*scl*conv[i*nt+(j+nt/2)]/rho;
                     }
                 }
             }
 		}
-		else if (scheme==1) { //classical representation
+		else if (scheme==5) { //classical representation
             for (k = 0; k < ny; k++) {
                 convol(&greenjkz[l*ny*nx*nt+k*nx*nt], &input[k*nx*nt], tmp1, nx, nt, dt, 0);
                 convol(&green[l*ny*nx*nt+k*nx*nt], &inputjkz[k*nx*nt], tmp2, nx, nt, dt, 0);
@@ -260,108 +286,89 @@ void homogeneousg3D(float *HomG, float *green, float *f2p, float *f1p, float *f1
                 timeDiff(conv, nt, nx, dt, fmin, fmax, -1);
                 for (i=0; i<nx; i++) {
                     for (j=0; j<nt/2; j++) {
-                        HomG[(j+nt/2)*Nfoc+l] += conv[i*nt+j]/rho;
-                        HomG[j*Nfoc+l] += conv[i*nt+(j+nt/2)]/rho;
-                    }
-                }
-            }
-		}
-		else if (scheme==2) { //Marchenko representation without time-reversal G source
-            for (k = 0; k < ny; k++) {
-                depthDiff(&f2p[l*ny*nx*nt+k*nx*nt], nt, nx, dt, dx, fmin, fmax, cp, 1);
-                convol2(&input[k*nx*nt], &f2p[l*ny*nx*nt+k*nx*nt], conv, nx, nt, dt, fmin, fmax, 1);
-                for (i=0; i<nx; i++) {
-                    for (j=0; j<nt/2; j++) {
-                        HomG[(j+nt/2)*Nfoc+l] += 2.0*conv[i*nt+j]/rho;
-                        HomG[j*Nfoc+l] += 2.0*conv[i*nt+(j+nt/2)]/rho;
-                    }
-                }
-            }
-		}
-		else if (scheme==6) { //Marchenko representation without time-reversal f2 source
-            for (k = 0; k < ny; k++) {
-                depthDiff(&green[l*ny*nx*nt+k*nx*nt], nt, nx, dt, dx, fmin, fmax, cp, 1);
-                convol(&input[k*nx*nt], &green[l*ny*nx*nt+k*nx*nt], conv, nx, nt, dt, 0);
-                timeDiff(conv, nt, nx, dt, fmin, fmax, -1);
-                for (i=0; i<nx; i++) {
-                    for (j=0; j<nt/2; j++) {
-                        HomG[(j+nt/2)*Nfoc+l] += 2.0*conv[i*nt+j]/rho;
-                        HomG[j*Nfoc+l] += 2.0*conv[i*nt+(j+nt/2)]/rho;
+                        HomG[(j+nt/2)*Nfoc+l] += scl*conv[i*nt+j]/rho;
+                        HomG[j*Nfoc+l] += scl*conv[i*nt+(j+nt/2)]/rho;
                     }
                 }
             }
 		}
-        else if (scheme==7) { //Marchenko representation without time-reversal using varying sources
-            for (k = 0; k < ny; k++) {
-                depthDiff(&f2p[l*ny*nx*nt+k*nx*nt], nt, nx, dt, dx, fmin, fmax, cp, 1);
-                depthDiff(&green[l*ny*nx*nt+k*nx*nt], nt, nx, dt, dx, fmin, fmax, cp, 1);
-                for (is=0; is<(n_source/2); is+=2) {
-                    zsrc = labs(hdr_inp[is].selev);
-                    if (zsrc > NINT(1000.0*zsyn[l])) {
-                        if (verbose > 1) vmess("Homogeneous Green's function at %li uses G source (zsrc=%li)",NINT(1000.0*zsyn[l]));
-                        convol(&input[is*ny*nx*nt+k*nx*nt], &f2p[l*ny*nx*nt+k*nx*nt], conv, nx, nt, dt, 0);
-                    }
-                    else {
-                        if (verbose > 1) vmess("Homogeneous Green's function at %li uses f2 source (zsrc=%li)",NINT(1000.0*zsyn[l]));
-                        convol(&input[(is+1)*ny*nx*nt+k*nx*nt], &green[l*ny*nx*nt+k*nx*nt], conv, nx, nt, dt, 0);
-                    }
-                    timeDiff(conv, nt, nx, dt, fmin, fmax, -1);
-                    for (i=0; i<nx; i++) {
-                        for (j=0; j<nt/2; j++) {
-                            HomG[(j+nt/2)*Nfoc+l] += 2.0*conv[i*nt+j]/rho;
-                            HomG[j*Nfoc+l] += 2.0*conv[i*nt+(j+nt/2)]/rho;
-                        }
-                    }
-                }
-            }
-		}
-		else if (scheme==3) { //Marchenko representation with multiple shot gathers
+		else if (scheme==6) { //Marchenko representation with multiple shot gathers
             for (k = 0; k < ny; k++) {
                 depthDiff(&f2p[l*ny*nx*nt+k*nx*nt], nt, nx, dt, dx, fmin, fmax, cp, 1); 
                 for (is=0; is<n_source; is++) {
                     convol(&input[is*ny*nx*nt+k*nx*nt], &f2p[l*ny*nx*nt+k*nx*nt], conv, nx, nt, dt, 0);
                     timeDiff(conv, nt, nx, dt, fmin, fmax, -3);
-                    if (kxwfilt) {
-                        //kxwfilter(conv, nt, nx, dt, dx, fmin, fmax, alpha, cp, perc);
-                    }
                     for (i=0; i<nx; i++) {
                         for (j=0; j<nt/2; j++) {
-                            HomG[is*nt*Nfoc+(j+nt/2)*Nfoc+l] += conv[i*nt+j]/rho;
-                            HomG[is*nt*Nfoc+j*Nfoc+l] += conv[i*nt+(j+nt/2)]/rho;
+                            HomG[is*nt*Nfoc+(j+nt/2)*Nfoc+l] += scl*conv[i*nt+j]/rho;
+                            HomG[is*nt*Nfoc+j*Nfoc+l] += scl*conv[i*nt+(j+nt/2)]/rho;
                         }
                     }
                 }
             }
         }
-		else if (scheme==4) { //Marchenko representation with multiple shot gathers without time-reversal
+		else if (scheme==7) { //Marchenko representation with multiple shot gathers without time-reversal
             for (k = 0; k < ny; k++) {
                 depthDiff(&f2p[l*ny*nx*nt+k*nx*nt], nt, nx, dt, dx, fmin, fmax, cp, 1);
                 for (is=0; is<n_source; is++) {
                     convol(&input[is*ny*nx*nt+k*nx*nt], &f2p[l*ny*nx*nt+k*nx*nt], conv, nx, nt, dt, 0);
                     timeDiff(conv, nt, nx, dt, fmin, fmax, -1);
-                    if (kxwfilt) {
-                        //kxwfilter(conv, nt, nx, dt, dx, fmin, fmax, alpha, cp, perc);
-                    }
                     for (i=0; i<nx; i++) {
                         for (j=0; j<nt/2; j++) {
-                            HomG[is*nt*Nfoc+(j+nt/2)*Nfoc+l] += conv[i*nt+j]/rho;
-                            HomG[is*nt*Nfoc+j*Nfoc+l] += conv[i*nt+(j+nt/2)]/rho;
+                            HomG[is*nt*Nfoc+(j+nt/2)*Nfoc+l] += scl*conv[i*nt+j]/rho;
+                            HomG[is*nt*Nfoc+j*Nfoc+l] += scl*conv[i*nt+(j+nt/2)]/rho;
                         }
                     }
                 }
             }
         }
+        else if (scheme==8) { // f1+ redatuming 0=f1p 1=f1m
+            for (k = 0; k < ny; k++) {
+                convol2(&input[0*ny*nx*nt+k*nx*nt], &f1p[l*ny*nx*nt+k*nx*nt], conv, nx, nt, dt, fmin, fmax, 1);
+                convol2(&input[1*ny*nx*nt+k*nx*nt], &f1m[l*ny*nx*nt+k*nx*nt], tmp1, nx, nt, dt, fmin, fmax, 1);
+                for (i=0; i<nx; i++) {
+                    for (j=0; j<nt/2; j++) {
+                        HomG[(j+nt/2)*Nfoc+l]   -= 2.0*scl*(conv[i*nt+j]        + tmp1[i*nt+j])/rho;
+                        HomG[j*Nfoc+l]          -= 2.0*scl*(conv[i*nt+(j+nt/2)] + tmp1[i*nt+(j+nt/2)])/rho;
+                    }
+                }
+            }
+		}
+        else if (scheme==9) { // f1- redatuming 0=f1p 1=f1m
+            for (k = 0; k < ny; k++) {
+                convol2(&input[0*ny*nx*nt+k*nx*nt], &f1m[l*ny*nx*nt+k*nx*nt], conv, nx, nt, dt, fmin, fmax, 1);
+                convol2(&input[1*ny*nx*nt+k*nx*nt], &f1p[l*ny*nx*nt+k*nx*nt], tmp1, nx, nt, dt, fmin, fmax, 1);
+                for (i=0; i<nx; i++) {
+                    for (j=0; j<nt/2; j++) {
+                        HomG[(j+nt/2)*Nfoc+l]   += 2.0*scl*(conv[i*nt+j]        + tmp1[i*nt+j])/rho;
+                        HomG[j*Nfoc+l]          += 2.0*scl*(conv[i*nt+(j+nt/2)] + tmp1[i*nt+(j+nt/2)])/rho;
+                    }
+                }
+            }
+		}
+        else if (scheme==10) { // 2i IM(f1) redatuming
+            for (k = 0; k < ny; k++) {
+                convol2(&input[k*nx*nt]   , &f1m[l*ny*nx*nt+k*nx*nt], conv, nx, nt, dt, fmin, fmax, 2);
+                convol2(&inputjkz[k*nx*nt], &f1p[l*ny*nx*nt+k*nx*nt], tmp1, nx, nt, dt, fmin, fmax, 2);
+                for (i=0; i<nx; i++) {
+                    for (j=0; j<nt/2; j++) {
+                        HomG[(j+nt/2)*Nfoc+l]   += 4.0*scl*(conv[i*nt+j]        - tmp1[i*nt+j])/rho;
+                        HomG[j*Nfoc+l]          += 4.0*scl*(conv[i*nt+(j+nt/2)] - tmp1[i*nt+(j+nt/2)])/rho;
+                    }
+                }
+            }
+		}
         
 	}
     free(conv);
-	if (scheme==1) { 
+	if (scheme==5) { 
 		free(tmp1);
 		free(tmp2);
 	}
-	if (scheme==3) free(tmp1);
-    if (scheme==4) free(tmp1);
+	if (scheme==6) free(tmp1);
+    if (scheme==7) free(tmp1);
 }
-	if (scheme==1) {
+	if (scheme==5) {
 		free(input);
 		free(inputjkz);
         free(greenjkz);
diff --git a/marchenko3D/imaging3D.c b/marchenko3D/imaging3D.c
index 6245d6e07f7da9f3c88332cfef0ec63629941acd..f7bd20feef88067e6ac9840b6485b66a577daba0 100644
--- a/marchenko3D/imaging3D.c
+++ b/marchenko3D/imaging3D.c
@@ -7,6 +7,14 @@
 #include <assert.h>
 #include <genfft.h>
 
+/*
+The imaging is computed using the double-focusing method
+For more information about the double-focusing method see:
+Myrna Staring, Roberto Pereira, Huub Douma, Joost van der Neut, and Kees Wapenaar, (2018), 
+"Source-receiver Marchenko redatuming on field data using an adaptive double-focusing method," GEOPHYSICS 83: S579-S590.
+https://doi.org/10.1190/geo2017-0796.1
+*/
+
 double wallclock_time(void);
 
 void scl_data(float *data, long nsam, long nrec, float scl, float *datout, long nsamout);
diff --git a/marchenko3D/marchenko3D.c b/marchenko3D/marchenko3D.c
index fdfb59058a57b16ceec72fe586553d81078c0ab4..6581addd64a8d94ea68e0b29b24826fdf39d7841 100644
--- a/marchenko3D/marchenko3D.c
+++ b/marchenko3D/marchenko3D.c
@@ -95,9 +95,13 @@ char *sdoc[] = {
 " ",
 " Required parameters: ",
 " ",
+"   First arrival input options:",
 "   file_tinv= ............... direct arrival from focal point: G_d",
 "   file_ray= ................ direct arrival from raytimes",
-"   file_shot= ............... Reflection response: R",
+"   Shot data input options:",
+"   file_shot= ............... Reflection response (time data): R(t)",
+"   file_shotw= .............. Reflection response (frequency data): R(w)",
+"   file_shotzfp= ............ Reflection response (frequency compressed data): zfp[R(w)]",
 " ",
 " Optional parameters: ",
 " ",
@@ -112,32 +116,35 @@ char *sdoc[] = {
 " MUTE-WINDOW ",
 "   file_amp= ................ amplitudes for the raytime estimation",
 "   file_wav= ................ Wavelet applied to the raytime data",
-"   above=0 .................. mute above(1), around(0) or below(-1) the first travel times of file_tinv",
+"   above=0 .................. mute above(1), around(0) or below(-1) the travel times of the first arrival",
 "   shift=12 ................. number of points above(positive) / below(negative) travel time for mute",
 "   hw=8 ..................... window in time samples to look for maximum in next trace",
 "   smooth=5 ................. number of points to smooth mute with cosine window",
 "   plane_wave=0 ............. enable plane-wave illumination function"
-// angles to be implemented currently only angle=0 works.
-//"   src_angle=0 .............. angle of plane source array",
-//"   src_velo=1500 ............ velocity to use in src_angle definition",
 " REFLECTION RESPONSE CORRECTION ",
-"   scale=2 .................. scale factor of R for summation of Ni with G_d",
+"   scale=2 .................. scale factor of R for summation of Ni with G_d (only for time shot data)",
 "   pad=0 .................... amount of samples to pad the reflection series",
-"   reci=0 ................... 1; add receivers as shots 2; only use receivers as shot positions",
-"   countmin=0 ............... 0.3*nxrcv; minumum number of reciprocal traces for a contribution",
 " HOMOGENEOUS GREEN'S FUNCTION RETRIEVAL OPTIONS ",
+"   file_homg= ............... output file with homogeneous Green's function ",
+"   The homogeneous Green's function is computed if a filename is given",
 "   file_inp= ................ Input source function for the retrieval",
-"   scheme=0 ................. Scheme for homogeneous Green's function retrieval",
-"   .......................... scheme=0 Marchenko HomG retrieval with time-reversal",
-"   .......................... scheme=1 Classical retrieval scheme",
-"   .......................... scheme=2 Marchenko HomG retrieval without time-reversal",
-"   .......................... scheme=3 Back propagation with multiple sources",
-"   .......................... scheme=4 Marchenko HomG retrieval with multiple sources",
-"   kxwfilt=0 ................ Apply a dip filter before integration",
-"   alpha=65.0 ............... Alpha filter for the kxwfilter",
-"   perc=0.15 ................ Percentage for the kxwfilter",
+"   scheme=0 ................. Scheme for the retrieval",
+"   .......................... scheme=0 Marchenko homogeneous Green's function retrieval with G source",
+"   .......................... scheme=1 Marchenko homogeneous Green's function retrieval with f2 source",
+"   .......................... scheme=2 Marchenko Green's function retrieval with source depending on virtual receiver location",
+"   .......................... scheme=3 Marchenko Green's function retrieval with G source",
+"   .......................... scheme=4 Marchenko Green's function retrieval with f2 source",
+"   .......................... scheme=5 Classical homogeneous Green's function retrieval",
+"   .......................... scheme=6 Marchenko homogeneous Green's function retrieval with multiple G sources",
+"   .......................... scheme=7 Marchenko Green's function retrieval with multiple G sources",
+"   .......................... scheme=8 f1+ redatuming",
+"   .......................... scheme=9 f1- redatuming",
+"   .......................... scheme=10 2i IM(f1) redatuming",
 "   cp=1000.0 ................ Velocity of upper layer for certain operations",
 "   rho=1000.0 ............... Density of upper layer for certain operations",
+" IMAGING",
+"   file_imag= ............... output file with image ",
+"   The image is computed if a filename is given",
 " OUTPUT DEFINITION ",
 "   file_green= .............. output file with full Green function(s)",
 "   file_gplus= .............. output file with G+ ",
@@ -147,12 +154,10 @@ char *sdoc[] = {
 "   file_f2= ................. output file with f2 (=p+) ",
 "   file_pplus= .............. output file with p+ ",
 "   file_pmin= ............... output file with p- ",
-"   file_imag= ............... output file with image ",
-"   file_homg= ............... output file with homogeneous Green's function ",
 "   file_ampscl= ............. output file with estimated amplitudes ",
 "   file_iter= ............... output file with -Ni(-t) for each iteration",
 "   compact=0 ................ Write out homg and imag in compact format",
-"   .......................... WARNING! This write-out cannot be displayed with SU"
+"   .......................... WARNING! This write-out cannot be displayed with SU",
 "   verbose=0 ................ silent option; >0 displays info",
 " ",
 " ",
@@ -169,16 +174,16 @@ int main (int argc, char **argv)
     long    i, j, l, k, ret, nshots, nxshot, nyshot, Nfoc, nt, nx, ny, nts, nxs, nys, ngath;
     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    reci, mode, n2out, n3out, verbose, ntfft;
     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;
+    long    *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;
     float   d1, d2, d3, f1, f2, f3, fxsb, fxse, fysb, fyse, ft, fx, fy, *xsyn, *ysyn, dxsrc, dysrc;
     float   *green, *f2p, *pmin, *G_d, dt, dx, dy, dxs, dys, scl, mem;
     float   *f1plus, *f1min, *iRN, *Ni, *Nig, *trace, *Gmin, *Gplus, *HomG;
-    float   xmin, xmax, ymin, ymax, scale, tsq, Q, f0, *tmpdata;
+    float   scale, *tmpdata;
     float   *ixmask, *iymask, *ampscl, *Gd, *Image, dzim;
     float   grad2rad, p, src_angle, src_velo, *mutetest;
     complex *Refl, *Fop;
@@ -225,16 +230,13 @@ int main (int argc, char **argv)
     if (!getparfloat("fmax", &fmax)) fmax = 70.0;
     if (!getparlong("reci", &reci)) reci = 0;
     if (!getparfloat("scale", &scale)) scale = 2.0;
-    if (!getparfloat("tsq", &tsq)) tsq = 0.0;
-    if (!getparfloat("Q", &Q)) Q = 0.0;
-    if (!getparfloat("f0", &f0)) f0 = 0.0;
     if (!getparlong("tap", &tap)) tap = 0;
     if (!getparlong("ntap", &ntap)) ntap = 0;
     if (!getparlong("pad", &pad)) pad = 0;
     if (!getparlong("ampest", &ampest)) ampest = 0;
 
     if(!getparlong("niter", &niter)) niter = 10;
-    if(!getparlong("hw", &hw)) hw = 15;
+    if(!getparlong("hw", &hw)) hw = 8;
     if(!getparlong("smooth", &smooth)) smooth = 5;
     if(!getparlong("above", &above)) above = 0;
     if(!getparlong("shift", &shift)) shift=12;
@@ -305,7 +307,6 @@ int main (int argc, char **argv)
     nw_high = MIN((long)(fmax*ntfft*dt), nfreq-1);
     nw  = nw_high - nw_low + 1;
     scl   = 1.0/((float)ntfft);
-    if (!getparlong("countmin", &countmin)) countmin = 0.3*nx*ny;
     
 /*================ Allocating all data arrays ================*/
 
@@ -393,19 +394,6 @@ int main (int argc, char **argv)
         }
     }
 
-    // mutetest  = (float *)calloc(Nfoc*nys*nxs*ntfft,sizeof(float));
-    // for (i=0; i<Nfoc*nys*nxs*ntfft; i++) {
-    //     mutetest[i] = 1.0;
-    // }
-    // applyMute3D(mutetest, muteW, smooth, above, Nfoc, nxs, nys, nts, ixpos, iypos, npos, shift);
-
-    // fp_out = fopen( "mute.bin", "w+" );
-    // for (i=0; i<nx*ny; i++) {
-    //     fprintf(fp_out,"%.7f\n",mutetest[i]);
-    // }
-    // fclose(fp_out);
-
-
     /* define tapers to taper edges of acquisition */
     if (tap == 1 || tap == 3) {
         for (j = 0; j < ntap; j++)
@@ -768,6 +756,7 @@ int main (int argc, char **argv)
                         }
                     }
                 }
+                if (above==-2) applyMute3D(f1min, muteW, smooth, 0, Nfoc, nxs, nys, nts, ixpos, iypos, npos, shift);
             }
             else { /* plane wave scheme */
                 for (l = 0; l < Nfoc; l++) {
@@ -781,6 +770,7 @@ int main (int argc, char **argv)
                         }
                     }
                 }
+                if (above==-2) applyMute3D(f1min, muteW, smooth, 0, Nfoc, nxs, nys, nts, ixpos, iypos, npos, shift);
             }
         }
         else {/* odd iterations update: => f_1^+(t)  */
@@ -1063,7 +1053,7 @@ int main (int argc, char **argv)
             hdrs_Nfoc[0].sx      = sx[0];
             hdrs_Nfoc[0].sy      = sy[0];
             hdrs_Nfoc[0].sdepth  = sz[0];
-            hdrs_Nfoc[0].f1      = roundf(zsyn[0]*100.0)/1000.0;
+            hdrs_Nfoc[0].f1      = roundf(zsyn[0]*1000.0)/1000.0;
             hdrs_Nfoc[0].f2      = roundf(xsyn[0]*1000.0)/1000.0;
             hdrs_Nfoc[0].ungpow  = roundf(ysyn[0]*1000.0)/1000.0;
             hdrs_Nfoc[0].d1      = roundf(dzim*1000.0)/1000.0;
diff --git a/marchenko3D/readTinvData3D.c b/marchenko3D/readTinvData3D.c
index 572ed3dcd1c41dd62c2ad923e84681932acbfe4d..47a46b96742b6d55d5d5234c61ea081bb9664243 100644
--- a/marchenko3D/readTinvData3D.c
+++ b/marchenko3D/readTinvData3D.c
@@ -194,9 +194,11 @@ long readTinvData3D(char *filename, float *xrcv, float *yrcv, float *xsrc, float
 
         /* search forward in y-trace direction from maximum in file */
         for (i = iymax+1; i < ny1; i++) {
+            tstart = MAX(0, (maxval[isyn*nxy+(i-1)*nx+ixmax]-hw));
+            tend   = MIN(nt-1, (maxval[isyn*nxy+(i-1)*nx+ixmax]+hw));
             tmax=0.0;
-        	jmax = 0;
-            for(j = 0; j <= nt; j++) {
+        	jmax = tstart;
+            for(j = tstart; j <= tend; j++) {
                 lmax = fabs(tinv[ig+i*nx*ntfft+ixmax*ntfft+j]);
                 if (lmax > tmax) {
                     jmax = j;
@@ -239,9 +241,11 @@ long readTinvData3D(char *filename, float *xrcv, float *yrcv, float *xsrc, float
 
         /* search backward in y-trace direction from maximum in file */
         for (i = iymax-1; i >= 0; i--) {
+            tstart = MAX(0, (maxval[isyn*nxy+(i+1)*nx+ixmax]-hw));
+            tend   = MIN(nt-1, (maxval[isyn*nxy+(i+1)*nx+ixmax]+hw));
             tmax=0.0;
-        	jmax = 0;
-            for(j = 0; j <= nt; j++) {
+        	jmax = tstart;
+            for(j = tstart; j <= tend; j++) {
                 lmax = fabs(tinv[ig+i*nx*ntfft+ixmax*ntfft+j]);
                 if (lmax > tmax) {
                     jmax = j;
diff --git a/marchenko3D/synthesis3D.c b/marchenko3D/synthesis3D.c
index 41a66b0dfc787a2f1e24ec1044e6b5a5851507e0..70dab54944648a14c90ee6077f1c1828ba6f9d0c 100644
--- a/marchenko3D/synthesis3D.c
+++ b/marchenko3D/synthesis3D.c
@@ -143,10 +143,12 @@ long *ixpos, long *iypos, long npos, double *tfft, long *isxcount, long *reci_xs
     long     i, j, l, m, iw, ix, iy, k, isrc, il, ik, nxy, nxys;
     float   *rtrace, idxs, idys, fxb, fyb, fxe, fye;
     complex *sum, *ctrace;
-    long     npe;
+    long     npe, norm;
     static long first=1, *ixrcv, *iyrcv;
     static double t0, t1, t;
 
+    if (!getparlong("norm", &norm)) norm = 0;
+
     if (fxsb < 0) fxb = 1.001*fxsb;
     else          fxb = 0.999*fxsb;
     if (fysb < 0) fyb = 1.001*fysb;
@@ -164,7 +166,12 @@ long *ixpos, long *iypos, long npos, double *tfft, long *isxcount, long *reci_xs
     /* scale factor 1/N for backward FFT,
      * scale dt for correlation/convolution along time, 
      * scale dx*dy (or dxsrc*dysrc) for integration over receiver (or shot) coordinates */
-    scl   = 1.0*dt/((float)ntfft);
+    if (norm==0) { //pressure normalization
+        scl     = (1.0*dt*dx*dy)/((float)ntfft);
+    }
+    else { // flux normalization
+        scl     = 1.0/((float)ntfft);
+    }
 
 #ifdef _OPENMP
     npe   = (long)omp_get_max_threads();
@@ -268,7 +275,7 @@ long *ixpos, long *iypos, long npos, double *tfft, long *isxcount, long *reci_xs
 
                 /* place result at source position ixsrc; dx = receiver distance */
                 for (j = 0; j < nts; j++) 
-                    iRN[l*size+isrc*nts+j] += rtrace[j]*scl*dx*dy;
+                    iRN[l*size+isrc*nts+j] += rtrace[j]*scl;
             
             } /* end of Nfoc loop */
 
diff --git a/utils/getFileInfo3D.c b/utils/getFileInfo3D.c
index d914fc776ef8bba6003480715f7ad4893014f943..eef408c21a9af9892c1cceb9550e78fdd382144a 100644
--- a/utils/getFileInfo3D.c
+++ b/utils/getFileInfo3D.c
@@ -48,6 +48,10 @@ long getFileInfo3D(char *filename, long *n1, long *n2, long *n3, long *ngath, fl
 	if (ret<0) perror("fseeko");
     bytes = ftello( fp );
 
+    if (hdr.scalco < 0) scl = 1.0/fabs((float)hdr.scalco);
+    else if (hdr.scalco == 0) scl = 1.0;
+    else scl = hdr.scalco;
+
     *n1 = hdr.ns;
     if ( (hdr.trid == 1) && (hdr.dt != 0) ) {
         *d1 = ((float) hdr.dt)*1.e-6;
@@ -58,16 +62,12 @@ long getFileInfo3D(char *filename, long *n1, long *n2, long *n3, long *ngath, fl
         *f1 = hdr.f1;
     }
     *f2 = hdr.f2;
-    *f3 = hdr.gy;
+    *f3 = hdr.gy*scl;
 
     data_sz = sizeof(float)*(*n1);
     trace_sz = sizeof(float)*(*n1)+TRCBYTES;
     ntraces  = (long) (bytes/trace_sz);
 
-    if (hdr.scalco < 0) scl = 1.0/fabs((float)hdr.scalco);
-    else if (hdr.scalco == 0) scl = 1.0;
-    else scl = hdr.scalco;
-
 	*sclsxgxsygy = scl;
     /* check to find out number of traces in shot gather */
 
diff --git a/utils/makeR1D.c b/utils/makeR1D.c
index acfcaba5965794cc80322820594c7e284c64f23a..53cb1b4ed9a9a8aa517d13955fd918fd878f4869 100644
--- a/utils/makeR1D.c
+++ b/utils/makeR1D.c
@@ -147,7 +147,7 @@ int main (int argc, char **argv)
         nysrc = ((nyin+1)/2-1)/dysf+1;
         if (verbose) vmess("No nysrc given, setting it to maximum possibility (%li)",((nyin+1)/2-1)/dysf+1);
     }
-    else if (nysrc>(((nyin+1)/2-1)/dysf+1)) verr("nxsrc given (%li) is higher than the maximum (%li)",nysrc,((nyin+1)/2-1)/dysf+1);
+    else if (nysrc>(((nyin+1)/2-1)/dysf+1)) verr("nysrc given (%li) is higher than the maximum (%li)",nysrc,((nyin+1)/2-1)/dysf+1);
     if (nxrcv==-1) {
         nxrcv = ((nxin+1)/2-1)/dxrf+1;
         if (verbose) vmess("No nxrcv given, setting it to maximum possibility (%li)",((nxin+1)/2-1)/dxrf+1);
@@ -155,12 +155,12 @@ int main (int argc, char **argv)
     else if (nxrcv>(((nxin+1)/2-1)/dxrf+1)) verr("nxrcv given (%li) is higher than the maximum (%li)",nxrcv,((nxin+1)/2-1)/dxrf+1);
     if (nyrcv==-1) {
         nyrcv = ((nyin+1)/2-1)/dyrf+1;
-        if (verbose) vmess("No nysrc given, setting it to maximum possibility (%li)",((nyin+1)/2-1)/dyrf+1);
+        if (verbose) vmess("No nyrcv given, setting it to maximum possibility (%li)",((nyin+1)/2-1)/dyrf+1);
     }
-    else if (nyrcv>(((nyin+1)/2-1)/dyrf+1)) verr("nrcv given (%li) is higher than the maximum (%li)",nyrcv,((nyin+1)/2-1)/dyrf+1);
+    else if (nyrcv>(((nyin+1)/2-1)/dyrf+1)) verr("nyrcv given (%li) is higher than the maximum (%li)",nyrcv,((nyin+1)/2-1)/dyrf+1);
     t0out = t0in;
-    x0rcv = x0in+((nxrcv-1)/2)*dxrcv; x0src = x0in+((nxsrc-1)/2)*dxsrc;
-    y0rcv = y0in+((nyrcv-1)/2)*dyrcv; y0src = y0in+((nysrc-1)/2)*dysrc;
+    x0rcv = x0in+((nxin-1)/2)*dxin-((nxrcv-1)/2)*dxrcv; x0src = x0in+((nxin-1)/2)*dxin-((nxsrc-1)/2)*dxsrc;
+    y0rcv = y0in+((nyin-1)/2)*dyin-((nyrcv-1)/2)*dyrcv; y0src = y0in+((nyin-1)/2)*dyin-((nysrc-1)/2)*dysrc;
     x0out = MINL(x0rcv,x0src);
     y0out = MINL(y0rcv,y0src);
 	if (verbose) {