diff --git a/src/p_maputl.c b/src/p_maputl.c
index 48dd54e8da8efbcebfc6183d9fa817698a2f54e8..a65d2fa763119d22c5b84af878b4068f9d1db088 100644
--- a/src/p_maputl.c
+++ b/src/p_maputl.c
@@ -17,6 +17,7 @@
 
 #include "p_local.h"
 #include "r_main.h"
+#include "r_data.h"
 #include "p_maputl.h"
 #include "p_polyobj.h"
 #include "z_zone.h"
@@ -520,6 +521,51 @@ void P_LineOpening(line_t *linedef)
 	{
 		fixed_t thingtop = tmthing->z + tmthing->height;
 
+		// Check for collision with front side's midtexture if Effect 4 is set
+		if (linedef->flags & ML_EFFECT4) {
+			side_t *side = &sides[linedef->sidenum[0]];
+			fixed_t textop, texbottom, texheight;
+			fixed_t texmid, delta1, delta2;
+
+			// Get the midtexture's height
+			texheight = textures[texturetranslation[side->midtexture]]->height << FRACBITS;
+
+			// Set texbottom and textop to the Z coordinates of the texture's boundaries
+#ifdef POLYOBJECTS
+			if (linedef->polyobj && (linedef->polyobj->flags & POF_TESTHEIGHT)) {
+				if (linedef->flags & ML_DONTPEGBOTTOM) {
+					texbottom = back->floorheight + side->rowoffset;
+					textop = texbottom + texheight*(side->repeatcnt+1);
+				} else {
+					textop = back->ceilingheight - side->rowoffset;
+					texbottom = textop - texheight*(side->repeatcnt+1);
+				}
+			} else
+#endif
+			{
+				if (linedef->flags & ML_DONTPEGBOTTOM) {
+					texbottom = openbottom + side->rowoffset;
+					textop = texbottom + texheight*(side->repeatcnt+1);
+				} else {
+					textop = opentop - side->rowoffset;
+					texbottom = textop - texheight*(side->repeatcnt+1);
+				}
+			}
+
+			texmid = texbottom+(textop-texbottom)/2;
+
+			delta1 = abs(tmthing->z - texmid);
+			delta2 = abs(thingtop - texmid);
+
+			if (delta1 > delta2) { // Below
+				if (opentop > texbottom)
+					opentop = texbottom;
+			} else { // Above
+				if (openbottom < textop)
+					openbottom = textop;
+			}
+		}
+
 		// Check for fake floors in the sector.
 		if (front->ffloors || back->ffloors
 #ifdef POLYOBJECTS