diff --git a/Source/Core/Controls/ImageBrowserControl.cs b/Source/Core/Controls/ImageBrowserControl.cs
index d3518521e8e21c349ead0dedb2f70366680089fe..8a561bbd404b1ee1dca3f6487c748ac14ea46220 100755
--- a/Source/Core/Controls/ImageBrowserControl.cs
+++ b/Source/Core/Controls/ImageBrowserControl.cs
@@ -474,7 +474,11 @@ namespace CodeImp.DoomBuilder.Controls
         //      C# not Java.
 		public void AddItem(ImageData image, string tooltip = "")
 		{
-			items.Add(new ImageBrowserItem(image, tooltip, uselongtexturenames));
+            // check if there are already items with this texturename.
+            // remove them.
+            ImageBrowserItem newItem = new ImageBrowserItem(image, tooltip, uselongtexturenames);
+            items.RemoveAll(item => item.TextureName == newItem.TextureName);
+			items.Add(newItem);
 		}
 
 		// This fills the list based on the objectname filter
@@ -596,18 +600,17 @@ namespace CodeImp.DoomBuilder.Controls
 		// This validates an item
 		private bool ValidateItem(ImageBrowserItem item, ImageBrowserItem previtem)
 		{
-			//mxd. Don't show duplicate items
-			if(previtem != null && item.TextureName == previtem.TextureName) return false; //mxd
-			
-			//mxd. mixMode: 0 = All, 1 = Textures, 2 = Flats, 3 = Based on BrowseFlats
-			if(!splitter.Panel2Collapsed) 
+            //mxd. mixMode: 0 = All, 1 = Textures, 2 = Flats, 3 = Based on BrowseFlats
+            //if (!splitter.Panel2Collapsed) 
 			{
-				if(texturetype == 1 && item.Icon.IsFlat) return false;
-				if(texturetype == 2 && !item.Icon.IsFlat) return false;
-				if(texturetype == 3 && (browseflats != item.Icon.IsFlat)) return false;
+                if (texturetype == 0 && previtem != null && item.TextureName == previtem.TextureName) return false;
+				if (texturetype == 1 && item.Icon.IsFlat) return false;
+				if (texturetype == 2 && !item.Icon.IsFlat) return false;
+				if (texturetype == 3 && (browseflats != item.Icon.IsFlat)) return false;
 			}
+            //else if (previtem != null && item.TextureName == previtem.TextureName) return false;
 
-			return item.TextureName.ToUpperInvariant().Contains(objectname.Text.ToUpperInvariant());
+            return item.TextureName.ToUpperInvariant().Contains(objectname.Text.ToUpperInvariant());
 		}
 
 		//mxd. This validates an item's texture size
diff --git a/Source/Core/Controls/ImageSelectorPanel.cs b/Source/Core/Controls/ImageSelectorPanel.cs
index 5d1ed1f1fac25b12b5e4b76e35128e12a182dcbd..0c89a61a49c02e4079d9d5a9aff6a658b37f1d22 100755
--- a/Source/Core/Controls/ImageSelectorPanel.cs
+++ b/Source/Core/Controls/ImageSelectorPanel.cs
@@ -46,9 +46,10 @@ namespace CodeImp.DoomBuilder.Controls
 
 		//mxd. Textures cache
 		private static Dictionary<int, Dictionary<long, Image>> texturecache = new Dictionary<int, Dictionary<long, Image>>(); // <imagesize, < texture longname, preview image>>
+        private static Dictionary<int, Dictionary<long, Image>> flatcache  = new Dictionary<int, Dictionary<long, Image>>(); // <imagesize, < texture longname, preview image>>
 
-		// Selection
-		private bool allowselection;
+        // Selection
+        private bool allowselection;
 		private bool allowmultipleselection;
 
 		#endregion
@@ -206,7 +207,7 @@ namespace CodeImp.DoomBuilder.Controls
 			selection.Clear();
 			this.items.AddRange(items);
 
-			OnSelectionChanged(selection);
+            OnSelectionChanged(selection);
 			UpdateRectangles();
 		}
 
@@ -654,13 +655,29 @@ namespace CodeImp.DoomBuilder.Controls
 
 		#region ================== Image Caching
 
+        // [ZZ] used during resource reload.
+        public static void ClearCachedPreviews()
+        {
+            foreach (Dictionary<long, Image> imgdict in texturecache.Values)
+                foreach (Image img in imgdict.Values)
+                    img.Dispose();
+            foreach (Dictionary<long, Image> imgdict in flatcache.Values)
+                foreach (Image img in imgdict.Values)
+                    img.Dispose();
+            texturecache.Clear();
+            flatcache.Clear();
+        }
+
 		private static Image GetPreview(ImageBrowserItem item, int imagesize)
 		{
 			if(!item.IsPreviewLoaded) return item.Icon.GetPreview();
-			if(!texturecache.ContainsKey(imagesize)) texturecache.Add(imagesize, new Dictionary<long, Image>());
+            Dictionary<int, Dictionary<long, Image>> cache = item.Icon.IsFlat ? flatcache : texturecache;
+
+			if(!cache.ContainsKey(imagesize)) cache.Add(imagesize, new Dictionary<long, Image>());
 
 			// Generate preview?
-			if(!texturecache[imagesize].ContainsKey(item.Icon.LongName))
+            // [ZZ] how does this work when texture images change?
+			if(!cache[imagesize].ContainsKey(item.Icon.LongName))
 			{
 				Image img = item.Icon.GetPreview();
 				
@@ -695,11 +712,11 @@ namespace CodeImp.DoomBuilder.Controls
 					g.DrawImage(img, new Rectangle(0, 0, previewwidth, previewheight));
 				}
 
-				texturecache[imagesize][item.Icon.LongName] = preview;
+                cache[imagesize][item.Icon.LongName] = preview;
 			}
 
 			// Get preview
-			return texturecache[imagesize][item.Icon.LongName];
+			return cache[imagesize][item.Icon.LongName];
 		}
 
 		#endregion
diff --git a/Source/Core/Data/DataManager.cs b/Source/Core/Data/DataManager.cs
index a237951f6bf518ffc4692ff2f7646136f24cb4e8..0eb854963cd34af88e4e08df2e4fc506d072bce7 100755
--- a/Source/Core/Data/DataManager.cs
+++ b/Source/Core/Data/DataManager.cs
@@ -39,6 +39,7 @@ using CodeImp.DoomBuilder.ZDoom;
 using SlimDX;
 using SlimDX.Direct3D9;
 using Matrix = SlimDX.Matrix;
+using CodeImp.DoomBuilder.Controls;
 
 #endregion
 
@@ -588,6 +589,9 @@ namespace CodeImp.DoomBuilder.Data
 
 			//mxd. Create skybox texture(s)
 			SetupSkybox();
+
+            // [ZZ] clear texture/flat cache in ImageSelectorPanel
+            ImageSelectorPanel.ClearCachedPreviews();
 			
 			// Start background loading
 			StartBackgroundLoader();