diff --git a/Source/Core/Controls/ImageBrowserItem.cs b/Source/Core/Controls/ImageBrowserItem.cs
index b805d0508146d518383d5c07b2489cdb2a986ad7..2bed6729f49944d34a9aee1fc4761c535c019b29 100755
--- a/Source/Core/Controls/ImageBrowserItem.cs
+++ b/Source/Core/Controls/ImageBrowserItem.cs
@@ -46,9 +46,9 @@ namespace CodeImp.DoomBuilder.Controls
         public ImageData Icon { get { return icon; } }
 		public ImageBrowserItemType ItemType { get { return itemtype; } }
 		public virtual bool IsPreviewLoaded { get { return icon.IsPreviewLoaded; } }
-		public bool ShowFullName { set { showfullname = value; } }
-		public virtual string TextureName { get { return (showfullname ? icon.Name : icon.ShortName); } }
-		public virtual int TextureNameWidth { get { return (showfullname ? namewidth : shortnamewidth); } }
+		public bool ShowFullName { set { showfullname = value; } get { return showfullname && (!(icon is PK3FileImage) || !((PK3FileImage)icon).IsBadForLongTextureNames); } }
+		public virtual string TextureName { get { return (ShowFullName ? icon.Name : icon.ShortName); } }
+		public virtual int TextureNameWidth { get { return (ShowFullName ? namewidth : shortnamewidth); } }
 		public string ToolTip { get { return tooltip; } }
 
 		#endregion
diff --git a/Source/Core/Data/DataManager.cs b/Source/Core/Data/DataManager.cs
index dc2086505077ff62a0013ec8951f0e83cf36740a..1271ab441e931c722088b609be4893d0709df557 100755
--- a/Source/Core/Data/DataManager.cs
+++ b/Source/Core/Data/DataManager.cs
@@ -181,6 +181,7 @@ namespace CodeImp.DoomBuilder.Data
 		public bool IsDisposed { get { return isdisposed; } }
 		public ImageData MissingTexture3D { get { return missingtexture3d; } }
 		public ImageData UnknownTexture3D { get { return unknowntexture3d; } }
+        public ImageData UnknownImage {  get { return unknownimage; } }
 		public ImageData Hourglass3D { get { return hourglass3d; } }
 		public ImageData Crosshair3D { get { return crosshair; } }
 		public ImageData CrosshairBusy3D { get { return crosshairbusy; } }
@@ -1338,11 +1339,21 @@ namespace CodeImp.DoomBuilder.Data
 			return GetFlatExists(Lump.MakeLongName(name)); //mxd
 		}
 
-		// This checks if a flat is known
-		public bool GetFlatExists(long longname)
-		{
-			return flats.ContainsKey(longname) || flatnamesshorttofull.ContainsKey(longname);
-		}
+        // This checks if a flat is known
+        public bool GetFlatExists(long longname)
+        {
+            // [ZZ] return nonexistent name for bad flats.
+            if (flats.ContainsKey(longname))
+            {
+                // [ZZ] long name is long. a doom flat with a long name is invalid.
+                ImageData id = flats[longname];
+                if (id is PK3FileImage && ((PK3FileImage)id).IsBadForLongTextureNames)
+                    return false;
+                return true;
+            }
+
+            return flatnamesshorttofull.ContainsKey(longname);
+        }
 		
 		// This returns an image by string
 		public ImageData GetFlatImage(string name)
@@ -1358,8 +1369,17 @@ namespace CodeImp.DoomBuilder.Data
 			// Does this flat exist?
 			if(flats.ContainsKey(longname) && (flats[longname] is TEXTURESImage || flats[longname] is HiResImage))
 				return flats[longname]; //TEXTURES and HiRes flats should still override regular ones...
-			if(flatnamesshorttofull.ContainsKey(longname)) return flats[flatnamesshorttofull[longname]]; //mxd
-			if(flats.ContainsKey(longname)) return flats[longname];
+			if(flatnamesshorttofull.ContainsKey(longname))
+                return flats[flatnamesshorttofull[longname]]; //mxd
+            if (flats.ContainsKey(longname))
+            {
+                // [ZZ] long name is long. a doom flat with a long name is invalid.
+                ImageData id = flats[longname];
+                if (id is PK3FileImage && ((PK3FileImage)id).IsBadForLongTextureNames)
+                    return unknownimage;
+
+                return id;
+            }
 			
 			// Return null image
 			return unknownimage; //mxd
diff --git a/Source/Core/Data/PK3FileImage.cs b/Source/Core/Data/PK3FileImage.cs
index dcd18cb6257a0c5115bdbfbd89a0c73771e2d2d7..313962cbc29ef918b354bd30412e6fc7d0adfb87 100755
--- a/Source/Core/Data/PK3FileImage.cs
+++ b/Source/Core/Data/PK3FileImage.cs
@@ -31,7 +31,10 @@ namespace CodeImp.DoomBuilder.Data
 
 		private readonly PK3Reader datareader;
 		private readonly int probableformat;
-        private readonly string _c_filepathname;
+        private bool isBadForLongTextureNames = false;
+
+        // [ZZ]
+        public bool IsBadForLongTextureNames { get { return isBadForLongTextureNames; } }
 		
 		#endregion
 
@@ -42,7 +45,6 @@ namespace CodeImp.DoomBuilder.Data
 		{
 			// Initialize
 			this.datareader = datareader;
-            _c_filepathname = filepathname; // this is used to call SetName later
 			this.isFlat = asflat; //mxd
 
 			if(asflat)
@@ -71,12 +73,12 @@ namespace CodeImp.DoomBuilder.Data
         //mxd: filepathname is relative path to the image ("Textures\sometexture.png")
         protected override void SetName(string filepathname)
         {
-            SetName(filepathname, (probableformat == ImageDataFormat.DOOMFLAT) ? false : General.Map.Config.UseLongTextureNames);
+            SetName(filepathname, General.Map.Config.UseLongTextureNames);
         }
 
         private void SetName(string filepathname, bool longtexturenames) 
 		{
-			if(!longtexturenames || string.IsNullOrEmpty(Path.GetDirectoryName(filepathname))) 
+            if (!longtexturenames || string.IsNullOrEmpty(Path.GetDirectoryName(filepathname)))
 			{
 				this.name = Path.GetFileNameWithoutExtension(filepathname.ToUpperInvariant());
 				if(this.name.Length > DataManager.CLASIC_IMAGE_NAME_LENGTH)
@@ -116,7 +118,7 @@ namespace CodeImp.DoomBuilder.Data
 				if(bitmap != null) bitmap.Dispose(); bitmap = null;
 				MemoryStream filedata = datareader.LoadFile(filepathname); //mxd
 
-                bool isBadForLongTextureNames = false;
+                isBadForLongTextureNames = false;
 
                 if (filedata != null)
 				{
@@ -157,8 +159,6 @@ namespace CodeImp.DoomBuilder.Data
 					filedata.Dispose();
 				}
 
-                SetName(_c_filepathname, isBadForLongTextureNames ? false : General.Map.Config.UseLongTextureNames);
-
 				// Pass on to base
 				base.LocalLoadImage();
 			}
diff --git a/Source/Core/Map/Sector.cs b/Source/Core/Map/Sector.cs
index 09940677d9bf05441dbd9894a81b2f753da34b44..b70406796929c60a8d1277bcfc130084a1bb82e1 100755
--- a/Source/Core/Map/Sector.cs
+++ b/Source/Core/Map/Sector.cs
@@ -387,9 +387,9 @@ namespace CodeImp.DoomBuilder.Map
 					flatvertices[i].y = triangles.Vertices[i].y;
 					flatvertices[i].z = 1.0f;
 					flatvertices[i].c = brightint;
-					flatvertices[i].u = triangles.Vertices[i].x;
-					flatvertices[i].v = triangles.Vertices[i].y;
-				}
+                    flatvertices[i].u = flatvertices[i].x;
+                    flatvertices[i].v = flatvertices[i].y;
+                }
 
 				// Create bounding box
 				bbox = CreateBBox();
@@ -414,8 +414,8 @@ namespace CodeImp.DoomBuilder.Map
 		// This updates the floor surface
 		public void UpdateFloorSurface()
 		{
-			if(flatvertices == null) return;
-			
+            if (flatvertices == null) return;
+
 			// Create floor vertices
 			SurfaceUpdate updateinfo = new SurfaceUpdate(flatvertices.Length, true, false);
 			flatvertices.CopyTo(updateinfo.floorvertices, 0);
diff --git a/Source/Core/Properties/AssemblyInfo.cs b/Source/Core/Properties/AssemblyInfo.cs
index eee0211dd64af8e077e4e07b0bd25f6143badbb7..6882c535f9457f9c01135b27f2434b6126f7f464 100755
--- a/Source/Core/Properties/AssemblyInfo.cs
+++ b/Source/Core/Properties/AssemblyInfo.cs
@@ -30,6 +30,6 @@ using CodeImp.DoomBuilder;
 //      Build Number
 //      Revision
 //
-[assembly: AssemblyVersion("2.3.0.2959")]
+[assembly: AssemblyVersion("2.3.0.2962")]
 [assembly: NeutralResourcesLanguageAttribute("en")]
-[assembly: AssemblyHash("bb650fa")]
+[assembly: AssemblyHash("20c9466")]
diff --git a/Source/Core/Windows/MainForm.cs b/Source/Core/Windows/MainForm.cs
index 8dd607c36946e5ebcfb6fca0e10a20ef2ef4aa7e..8e114e6ea418f12b67e047b8d3981ceaf7e4df43 100755
--- a/Source/Core/Windows/MainForm.cs
+++ b/Source/Core/Windows/MainForm.cs
@@ -4104,7 +4104,7 @@ namespace CodeImp.DoomBuilder.Windows
 					if((General.Map != null) && (General.Map.Data != null))
 					{
 						ImageData img = General.Map.Data.GetFlatImage(imagename);
-						ImageDataLoaded(img);
+                        ImageDataLoaded(img);
 					}
 					break;
 
@@ -4206,11 +4206,11 @@ namespace CodeImp.DoomBuilder.Windows
 		// but only when first loaded or when dimensions were changed
 		internal void ImageDataLoaded(ImageData img)
 		{
-			// Image is used in the map?
-			if((img != null) && img.UsedInMap && !img.IsDisposed)
+            // Image is used in the map?
+            if ((img != null) && img.UsedInMap && !img.IsDisposed)
 			{
-				// Go for all setors
-				bool updated = false;
+                // Go for all setors
+                bool updated = false;
 				long imgshorthash = General.Map.Data.GetShortLongFlatName(img.LongName); //mxd. Part of long name support shennanigans
 
 				foreach(Sector s in General.Map.Map.Sectors)
@@ -4218,6 +4218,7 @@ namespace CodeImp.DoomBuilder.Windows
 					// Update floor buffer if needed
 					if(s.LongFloorTexture == img.LongName || s.LongFloorTexture == imgshorthash)
 					{
+                        General.ErrorLogger.Add(ErrorType.Warning, string.Format("updating floor of sector {0} for texture {1}", s.Index, img.Name));
 						s.UpdateFloorSurface();
 						updated = true;
 					}
@@ -4225,7 +4226,8 @@ namespace CodeImp.DoomBuilder.Windows
 					// Update ceiling buffer if needed
 					if(s.LongCeilTexture == img.LongName || s.LongCeilTexture == imgshorthash)
 					{
-						s.UpdateCeilingSurface();
+                        General.ErrorLogger.Add(ErrorType.Warning, string.Format("updating ceiling of sector {0} for texture {1}", s.Index, img.Name));
+                        s.UpdateCeilingSurface();
 						updated = true;
 					}
 				}
@@ -4233,7 +4235,7 @@ namespace CodeImp.DoomBuilder.Windows
 				// If we made updates, redraw the screen
 				if(updated) DelayedRedraw();
 			}
-		}
+        }
 
 		public void EnableProcessing()
 		{
diff --git a/Source/Core/Windows/TextureBrowserForm.cs b/Source/Core/Windows/TextureBrowserForm.cs
index 800d0ac7b280f1e974dfcc9c8be668eab4c936fa..dc407eded6676b2dd3b51d88e64ec284d5ae3997 100755
--- a/Source/Core/Windows/TextureBrowserForm.cs
+++ b/Source/Core/Windows/TextureBrowserForm.cs
@@ -58,6 +58,9 @@ namespace CodeImp.DoomBuilder.Windows
 
 			TreeNode item; //mxd
 			long longname = Lump.MakeLongName(selecttexture ?? "");
+            // [ZZ] check if this name is even ok.
+            if (General.Map.Data.GetFlatImage(longname) == General.Map.Data.UnknownImage)
+                longname = Lump.MakeLongName("");
 			longname = (browseflats ? General.Map.Data.GetFullLongFlatName(longname) : General.Map.Data.GetFullLongTextureName(longname)); //mxd
 			int count; //mxd
 			selectedset = null; //mxd
diff --git a/Source/Plugins/BuilderModes/General/BuilderPlug.cs b/Source/Plugins/BuilderModes/General/BuilderPlug.cs
index d69259e2000a5f0aef5cfff8dd015f3392f03e39..47a3dcaad86ed023b9e83ed58044388fdd03860f 100755
--- a/Source/Plugins/BuilderModes/General/BuilderPlug.cs
+++ b/Source/Plugins/BuilderModes/General/BuilderPlug.cs
@@ -331,7 +331,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 			if((img != null) && img.IsImageLoaded)
 			{
 				//mxd. Merged from GZDoomEditing plugin
-				if(General.Map.UDMF) 
+				if(false) 
 				{
 					// Fetch ZDoom fields
 					Vector2D offset = new Vector2D(s.Fields.GetValue("xpanningfloor", 0.0f),
@@ -374,6 +374,14 @@ namespace CodeImp.DoomBuilder.BuilderModes
 					}
 				}
 			}
+            else // [ZZ] proper fallback please.
+            {
+                for (int i = 0; i < vertices.Length; i++)
+                {
+                    vertices[i].u = vertices[i].u / 64;
+                    vertices[i].v = -vertices[i].v / 64;
+                }
+            }
 		}
 
 		// When ceiling surface geometry is created for classic modes
@@ -426,7 +434,15 @@ namespace CodeImp.DoomBuilder.BuilderModes
 					}
 				}
 			}
-		}
+            else // [ZZ] proper fallback please.
+            {
+                for (int i = 0; i < vertices.Length; i++)
+                {
+                    vertices[i].u = vertices[i].u / 64;
+                    vertices[i].v = -vertices[i].v / 64;
+                }
+            }
+        }
 
 		// When the editing mode changes
 		public override bool OnModeChange(EditMode oldmode, EditMode newmode)
diff --git a/Source/Plugins/BuilderModes/Properties/AssemblyInfo.cs b/Source/Plugins/BuilderModes/Properties/AssemblyInfo.cs
index 41a4b35822cf47872b12d65145bbe5e5a354ff91..c860c50d7f460cb8c83e09a40cb868369cef034b 100755
--- a/Source/Plugins/BuilderModes/Properties/AssemblyInfo.cs
+++ b/Source/Plugins/BuilderModes/Properties/AssemblyInfo.cs
@@ -29,5 +29,5 @@ using System.Resources;
 //      Build Number
 //      Revision
 //
-[assembly: AssemblyVersion("2.3.0.2959")]
+[assembly: AssemblyVersion("2.3.0.2962")]
 [assembly: NeutralResourcesLanguageAttribute("en")]