diff --git a/src/tile.cpp b/src/tile.cpp
index 5f25e123bdd21556029e407cd81304a7e3cbee91..098a963a8fc430cdb2a60c8b0e6683e4b9304a70 100644
--- a/src/tile.cpp
+++ b/src/tile.cpp
@@ -440,6 +440,10 @@ class TextureSource : public IWritableTextureSource
 
 	// Queued texture fetches (to be processed by the main thread)
 	RequestQueue<std::string, u32, u8, u8> m_get_texture_queue;
+
+	// Textures that have been overwritten with other ones
+	// but can't be deleted because the ITexture* might still be used
+	std::list<video::ITexture*> m_texture_trash;
 };
 
 IWritableTextureSource* createTextureSource(IrrlichtDevice *device)
@@ -485,6 +489,16 @@ TextureSource::~TextureSource()
 	}
 	m_atlaspointer_cache.clear();
 
+	for (std::list<video::ITexture*>::iterator iter =
+			m_texture_trash.begin(); iter != m_texture_trash.end();
+			iter++)
+	{
+		video::ITexture *t = *iter;
+
+		//cleanup trashed texture
+		driver->removeTexture(t);
+	}
+
 	infostream << "~TextureSource() "<< textures_before << "/"
 			<< driver->getTextureCount() << std::endl;
 }
@@ -870,7 +884,7 @@ void TextureSource::rebuildImagesAndTextures()
 		sap->intsize = img->getDimension();
 
 		if (t_old != 0)
-			driver->removeTexture(t_old);
+			m_texture_trash.push_back(t_old);
 	}
 }