diff --git a/utils/green3D b/utils/green3D
index cc36382df2db967794d33a3b4afe6e4bb4e56e07..3513a0edb3c0096f4a53c9e3fa73a5474de53bf5 100755
Binary files a/utils/green3D and b/utils/green3D differ
diff --git a/utils/green3D.c b/utils/green3D.c
index 69daa8ea3552b7083eb3871d87ac1ee87694fe0a..b31d0c3ee81250acba4d2b471d6a795390f729e5 100644
--- a/utils/green3D.c
+++ b/utils/green3D.c
@@ -351,7 +351,7 @@ void xwgreen3D(float *data, int nt, int nx, int ny, float dt, float fmin, float
 	int    	iomin, iomax, iom, ix, iy, nfreq, i, sign, optn;
 	float  	df, deltom, om, k, r, x, y, invr, phi, phi2, cosphi;
 	float	*rwave, *rdata, cos2, scl, z, kp, ks, sclr;
-	complex	*cwave, *cdata, tmp, tmp2, sum;
+	complex	*cwave, *cdata, tmp, tmp2, ekr, sum;
     complex H02p, H12p, H02s, H12s, Gp, Gs;
 
 	optn	= optncr(nt);
@@ -391,8 +391,8 @@ void xwgreen3D(float *data, int nt, int nx, int ny, float dt, float fmin, float
 	}
 
 	if (p_vz == 0) {
-		if (far == 0 && dip == 1) {
-			if (verbose) vmess("near and far P field of dipole");
+		if (dip == 1) {
+			if (verbose) vmess("P field of dipole");
 			for (iy = 0; iy < ny; iy++) {
 				for (ix = 0; ix < nx; ix++) {
 					x      = xi[iy*nx+ix] - xsrc;
@@ -404,11 +404,14 @@ void xwgreen3D(float *data, int nt, int nx, int ny, float dt, float fmin, float
 					phi2   = SGN(x)*phi - (dipx*M_PI/180.0);
 					cosphi = 0.25*cos(phi2)*rho;
 					if (fabs(phi) < maxdip*M_PI/180.0) {
+						/* exp(-jkr) = cos(kr) - j*sin(kr) */
 						for (iom = iomin; iom <= iomax; iom++) {
 							om = iom*deltom;
 							k = om/c;
-							tmp.r = -k*cosphi*y1(k*r);
-							tmp.i = -k*cosphi*j1(k*r);
+							ekr.r = cos(k*r)/(r*r);
+							ekr.i = sin(-k*r)/(r*r);
+							tmp.r = cosphi*(ekr.r - k*r*ekr.i);
+							tmp.i = cosphi*(ekr.i + k*r*ekr.r);
 							cdata[iy*nx*nfreq+ix*nfreq+iom].r = tmp.r*cwave[iom].r - 
 											tmp.i*cwave[iom].i;
 							cdata[iy*nx*nfreq+ix*nfreq+iom].i = tmp.r*cwave[iom].i +
@@ -424,6 +427,7 @@ void xwgreen3D(float *data, int nt, int nx, int ny, float dt, float fmin, float
 				}
 			}
 		}
+/* There is no far-field definition 'needed' in 3D 
 		else if (far == 1 && dip == 1){
 			if (verbose) vmess("far P field of dipole");
 			for (iy = 0; iy < ny; iy++) {
@@ -458,8 +462,9 @@ void xwgreen3D(float *data, int nt, int nx, int ny, float dt, float fmin, float
 				}
 			}
 		}
-		else if (far == 0 && dip == 0){
-			if (verbose) vmess("near and far P field of monopole");
+*/
+		else if (dip == 0){
+			if (verbose) vmess("P field of monopole");
 			for (iy = 0; iy < ny; iy++) {
 				for (ix = 0; ix < nx; ix++) {
 					x = xi[iy*nx+ix] - xsrc;
@@ -473,8 +478,8 @@ void xwgreen3D(float *data, int nt, int nx, int ny, float dt, float fmin, float
 						for (iom = iomin; iom <= iomax; iom++) {
 							om = iom*deltom;
 							k  = om/c;
-							tmp.r = -scl*y0(k*r);
-							tmp.i = -scl*j0(k*r);
+							tmp.r = scl*cos(k*r)/(r);
+							tmp.i = scl*sin(-k*r)/(r);
 
 							cdata[iy*nx*nfreq+ix*nfreq+iom].r = tmp.r*cwave[iom].r - 
 											tmp.i*cwave[iom].i;
@@ -491,6 +496,7 @@ void xwgreen3D(float *data, int nt, int nx, int ny, float dt, float fmin, float
 				}
 			}
 		}
+/* There is no far-field definition 'needed' in 3D 
 		else if (far == 1 && dip == 0){
 			if (verbose) vmess("far P field of monopole");
 			for (iy = 0; iy < ny; iy++) {
@@ -524,11 +530,11 @@ void xwgreen3D(float *data, int nt, int nx, int ny, float dt, float fmin, float
 				}
 			}
 		}
+*/
 	}
 	else if (p_vz == 1) {
 		if (dip == 1) {
-	    	if (far == 0) {
-	    		if (verbose) vmess("near and far Vz field of dipole");
+	    		if (verbose) vmess("Vz field of dipole, this is not yet implemented");
 				for (iy = 0; iy < ny; iy++) {
 					for (ix = 0; ix < nx; ix++) {
 						x = xi[iy*nx+ix] - xsrc;
@@ -566,63 +572,29 @@ void xwgreen3D(float *data, int nt, int nx, int ny, float dt, float fmin, float
 						}
 					}
 				}
-	    	}
-	    	else {
-	    		if (verbose) vmess("far Vz field of dipole");
-				for (iy = 0; iy < ny; iy++) {
-					for (ix = 0; ix < nx; ix++) {
-						x = xi[iy*nx+ix] - xsrc;
-						y = yi[iy*nx+ix] - ysrc;
-						z = fabs(zi[iy*nx+ix] - zsrc);
-						r = sqrt(x*x + y*y + z*z);
-						invr   = -0.5/(c*sqrt(r));
-						if (r != 0) phi = acos(z/r);
-						else phi = M_PI/2;
-						phi2   = SGN(x)*phi - (dipx*M_PI/180.0);
-						cosphi = cos(phi2);
-						cos2 = cosphi*cosphi;
-						if (fabs(phi) < maxdip*M_PI/180.0) {
-							for (iom = iomin; iom <= iomax; iom++) {
-								om = iom*deltom;
-								k = om/c;
-								tmp.r = sqrt(k/(2.0*M_PI))*invr*cos2*cos(k*r-M_PI/4.0);
-								tmp.i = -sqrt(k/(2.0*M_PI))*invr*cos2*sin(k*r-M_PI/4.0);
-
-								cdata[iy*nx*nfreq+ix*nfreq+iom].r = tmp.r*cwave[iom].r -
-												tmp.i*cwave[iom].i;
-								cdata[iy*nx*nfreq+ix*nfreq+iom].i = tmp.r*cwave[iom].i +
-												tmp.i*cwave[iom].r;
-							}
-						}
-						else {
-							for (iom = iomin; iom <= iomax; iom++) {
-								cdata[iy*nx*nfreq+ix*nfreq+iom].r = 0.0;
-								cdata[iy*nx*nfreq+ix*nfreq+iom].i = 0.0;
-							}
-						}
-					}
-				}
-	    	}
 		}
 		else {
-	    	if (verbose) vmess("near and far Vz field of monopole");
+	    	if (verbose) vmess("Vz field of monopole");
 
 			for (iy = 0; iy < ny; iy++) {
 				for (ix = 0; ix < nx; ix++) {
-					x = xi[iy*nx+ix] - xsrc;
-					y = yi[iy*nx+ix] - ysrc;
-					z = fabs(zi[iy*nx+ix] - zsrc);
-					r = sqrt(x*x + y*y + z*z);
+					x      = xi[iy*nx+ix] - xsrc;
+					y      = yi[iy*nx+ix] - ysrc;
+					z      = fabs(zi[iy*nx+ix] - zsrc);
+					r      = sqrt(x*x + y*y + z*z);
 					if (r != 0) phi = acos(z/r);
 					else phi = M_PI/2;
 					phi2   = SGN(x)*phi - (dipx*M_PI/180.0);
-					cosphi = cos(phi2);
+					cosphi = 0.25*cos(phi2)/c;
 					if (fabs(phi) < maxdip*M_PI/180.0) {
+						/* exp(-jkr) = cos(kr) - j*sin(kr) */
 						for (iom = iomin; iom <= iomax; iom++) {
 							om = iom*deltom;
 							k = om/c;
-							tmp.i = -cosphi*y1(k*r)/(4.0*c);
-							tmp.r = cosphi*j1(k*r)/(4.0*c);
+							ekr.r = cos(k*r)/(r*r);
+							ekr.i = sin(-k*r)/(r*r);
+							tmp.r = cosphi*(ekr.r - k*r*ekr.i);
+							tmp.i = cosphi*(ekr.i + k*r*ekr.r);
 							cdata[iy*nx*nfreq+ix*nfreq+iom].r = tmp.r*cwave[iom].r - 
 											tmp.i*cwave[iom].i;
 							cdata[iy*nx*nfreq+ix*nfreq+iom].i = tmp.r*cwave[iom].i +