diff --git a/src/r_things.c b/src/r_things.c
index 558ea280ef4981c09a9d340c9af405ec730a6e03..953952c56b57f8957061c312503ee783025a303f 100644
--- a/src/r_things.c
+++ b/src/r_things.c
@@ -1122,6 +1122,8 @@ static void R_ProjectDropShadow(mobj_t *thing, vissprite_t *vis, fixed_t tx, fix
 		}
 	}
 
+	if (abs(floorz-viewz)/tz > 4) return; // Prevent stretchy shadows and possible crashes
+
 	floordiff = abs(thing->z - floorz);
 
 	trans = floordiff / (100*FRACUNIT) + 3;
@@ -1173,7 +1175,7 @@ static void R_ProjectDropShadow(mobj_t *thing, vissprite_t *vis, fixed_t tx, fix
 	shadow->sector = vis->sector;
 	shadow->szt = (INT16)((centeryfrac - FixedMul(shadow->gzt - viewz, yscale))>>FRACBITS);
 	shadow->sz = (INT16)((centeryfrac - FixedMul(shadow->gz - viewz, yscale))>>FRACBITS);
-	shadow->cut = SC_ISSCALED; //check this
+	shadow->cut = SC_ISSCALED|SC_SHADOW; //check this
 
 
 	shadow->startfrac = 0;
@@ -2069,6 +2071,9 @@ static void R_SortVisSprites(vissprite_t* vsprsortedhead, UINT32 start, UINT32 e
 		if (!(ds->cut & SC_LINKDRAW))
 			continue;
 
+		if (ds->cut & SC_SHADOW)
+			continue;
+
 		// reuse dsfirst...
 		for (dsfirst = unsorted.prev; dsfirst != &unsorted; dsfirst = dsfirst->prev)
 		{
@@ -2076,6 +2081,10 @@ static void R_SortVisSprites(vissprite_t* vsprsortedhead, UINT32 start, UINT32 e
 			if (dsfirst->cut & SC_LINKDRAW)
 				continue;
 
+			// don't connect to your shadow!
+			if (dsfirst->cut & SC_SHADOW)
+				continue;
+
 			// don't connect if it's not the tracer
 			if (dsfirst->mobj != ds->mobj)
 				continue;
diff --git a/src/r_things.h b/src/r_things.h
index 1b74dd74eb302064e04546c66a68e7976ccf6a7a..a6ef92802301efa99c2961fe2829b0857eca1751 100644
--- a/src/r_things.h
+++ b/src/r_things.h
@@ -153,7 +153,8 @@ typedef enum
 	SC_LINKDRAW = 1<<3,
 	SC_FULLBRIGHT = 1<<4,
 	SC_VFLIP = 1<<5,
-	SC_ISSCALED = 1>>6,
+	SC_ISSCALED = 1<<6,
+	SC_SHADOW = 1<<7,
 	// masks
 	SC_CUTMASK = SC_TOP|SC_BOTTOM,
 	SC_FLAGMASK = ~SC_CUTMASK