diff --git a/polymer/build/src/engine.c b/polymer/build/src/engine.c
index a44a9d291..337d3faef 100644
--- a/polymer/build/src/engine.c
+++ b/polymer/build/src/engine.c
@@ -71,7 +71,7 @@ static unsigned long distrecip[65536];
 
 static long *lookups = NULL;
 static char lookupsalloctype = 255;
-long dommxoverlay = 1, beforedrawrooms = 1;
+long dommxoverlay = 1, beforedrawrooms = 1, indrawroomsandmasks = 0;
 
 static long oxdimen = -1, oviewingrange = -1, oxyaspect = -1;
 
@@ -5633,6 +5633,7 @@ void drawrooms(long daposx, long daposy, long daposz,
     short *shortptr1, *shortptr2;
 
     beforedrawrooms = 0;
+	indrawroomsandmasks = 1;
 
     globalposx = daposx; globalposy = daposy; globalposz = daposz;
     globalang = (daang&2047);
@@ -5678,7 +5679,7 @@ void drawrooms(long daposx, long daposy, long daposz,
     if (0)
     {
         polymer_drawrooms();
-        return;
+		return;
     }
 #endif
     //============================================================================= //POLYMOST BEGINS
@@ -6088,6 +6089,7 @@ killsprite:
     free(walldepths);
 #endif /* goodalpha */
 
+	indrawroomsandmasks = 0;
     enddrawing();   //}}}
 }
 
diff --git a/polymer/build/src/polymost.c b/polymer/build/src/polymost.c
index b04c76c66..66b314bc1 100644
--- a/polymer/build/src/polymost.c
+++ b/polymer/build/src/polymost.c
@@ -139,6 +139,11 @@ long glwidescreen = 0;
 long glprojectionhacks = 1;
 static GLuint polymosttext = 0;
 extern char nofog;
+
+// Those two globals control the drawing of fullbright tiles
+long fullbrightpass = 0;
+long shadeforfullbrightpass;
+
 #endif
 
 #if defined(USE_MSC_PRAGMAS)
@@ -303,7 +308,7 @@ typedef struct pthtyp_t
     short picnum;
     char palnum;
     char effects;
-    char flags;      // 1 = clamped (dameth&4), 2 = hightile, 4 = skybox face, 8 = hasalpha, 128 = invalidated
+    char flags;      // 1 = clamped (dameth&4), 2 = hightile, 4 = skybox face, 8 = hasalpha, 16 = hasfullbright, 128 = invalidated
     char skyface;
     hicreplctyp *hicr;
 
@@ -385,9 +390,10 @@ tryart:
                 (pth->flags & (1+2)) == ((dameth&4)>>2)
            )
         {
-            if (pth->flags & 128)
+            if ((pth->flags & 128) || (pth->flags & 16))
             {
-                pth->flags &= ~128;
+				if (pth->flags & 128)
+					pth->flags &= ~128;
                 if (gloadtile_art(dapicnum,dapalnum,dameth,pth,0)) return NULL; //reload tile (for animations)
             }
             return(pth);
@@ -747,7 +753,7 @@ int gloadtile_art (long dapic, long dapal, long dameth, pthtyp *pth, long doallo
 {
     coltype *pic, *wpptr;
     long j, x, y, x2, y2, xsiz, ysiz, dacol, tsizx, tsizy;
-    char hasalpha = 0;
+    char hasalpha = 0, hasfullbright = 0;
 
     tsizx = tilesizx[dapic];
     tsizy = tilesizy[dapic];
@@ -785,12 +791,35 @@ int gloadtile_art (long dapic, long dapal, long dameth, pthtyp *pth, long doallo
                 { wpptr->r = wpptr->g = wpptr->b = wpptr->a = 0; continue; }
                 if (x < tsizx) x2 = x; else x2 = x-tsizx;
                 dacol = (long)(*(unsigned char *)(waloff[dapic]+x2*tsizy+y2));
-                if (dacol == 255) {
-                    wpptr->a = 0; hasalpha = 1;
-                } else {
-                    wpptr->a = 255;
-                    dacol = (long)((unsigned char)palookup[dapal][dacol]);
-                }
+				if (!fullbrightpass)
+				{
+					if ((dacol > 239) && (dacol < 255)) { //fullbright colors
+						if (indrawroomsandmasks)
+						{
+							wpptr->a = 0; hasalpha = 1;
+						}
+						else
+						{
+							wpptr->a = 255;
+							dacol = (long)((unsigned char)palookup[dapal][dacol]);
+						}
+						hasfullbright = 1;
+					} else if (dacol == 255) {
+						wpptr->a = 0; hasalpha = 1;
+					} else {
+						wpptr->a = 255;
+						dacol = (long)((unsigned char)palookup[dapal][dacol]);
+					}
+				}
+				else
+				{
+					if ((dacol < 240) || (dacol == 255))  {
+						wpptr->a = 0; hasalpha = 1;
+					} else {
+						wpptr->a = 255; hasfullbright = 1;
+						dacol = (long)((unsigned char)palookup[dapal][dacol]);
+					}
+				}
                 if (gammabrightness) {
                     wpptr->r = curpalette[dacol].r;
                     wpptr->g = curpalette[dacol].g;
@@ -837,7 +866,7 @@ int gloadtile_art (long dapic, long dapal, long dameth, pthtyp *pth, long doallo
     pth->picnum = dapic;
     pth->palnum = dapal;
     pth->effects = 0;
-    pth->flags = ((dameth&4)>>2) | (hasalpha<<3);
+    pth->flags = ((dameth&4)>>2) | (hasalpha<<3) | (hasfullbright<<4);
     pth->hicr = NULL;
 
     return 0;
@@ -1557,6 +1586,15 @@ void drawpoly (double *dpx, double *dpy, long n, long method)
             }
             bglEnd();
         }
+		if ((pth->flags & 16) && (!fullbrightpass) && (indrawroomsandmasks)) // tile has fullbright colors ?
+		{
+			fullbrightpass = 1;
+			shadeforfullbrightpass = globalshade;
+			globalshade = 0;
+			drawpoly(dpx, dpy, n, method); // draw them afterwards, then. :)
+			globalshade = shadeforfullbrightpass;
+			fullbrightpass = 0;
+		}
         return;
     }
 #endif