diff --git a/src/tile.cpp b/src/tile.cpp
index 310630b84a842a98b2e2802fe792ad8908eb1f76..c9a36918a3d46d941e1086f37f5fa8fcb3fd1899 100644
--- a/src/tile.cpp
+++ b/src/tile.cpp
@@ -164,16 +164,13 @@ struct TextureInfo
 {
 	std::string name;
 	video::ITexture *texture;
-	video::IImage *img; // The source image
 
 	TextureInfo(
 			const std::string &name_,
-			video::ITexture *texture_=NULL,
-			video::IImage *img_=NULL
+			video::ITexture *texture_=NULL
 		):
 		name(name_),
-		texture(texture_),
-		img(img_)
+		texture(texture_)
 	{
 	}
 };
@@ -460,10 +457,6 @@ TextureSource::~TextureSource()
 		//cleanup texture
 		if (iter->texture)
 			driver->removeTexture(iter->texture);
-
-		//cleanup source image
-		if (iter->img)
-			iter->img->drop();
 	}
 	m_textureinfo_cache.clear();
 
@@ -666,23 +659,17 @@ u32 TextureSource::getTextureIdDirect(const std::string &name)
 
 		TextureInfo *ti = &m_textureinfo_cache[base_image_id];
 
-		if(ti->img == NULL)
+		if(ti->texture == NULL)
 		{
-			infostream<<"getTextureIdDirect(): WARNING: NULL image in "
+			infostream<<"getTextureIdDirect(): WARNING: NULL Texture in "
 					<<"cache: \""<<base_image_name<<"\""
 					<<std::endl;
 		}
 		else
 		{
-			core::dimension2d<u32> dim = ti->img->getDimension();
-
-			baseimg = driver->createImage(video::ECF_A8R8G8B8, dim);
+			core::dimension2d<u32> dim = ti->texture->getSize();
 
-			ti->img->copyTo(
-					baseimg, // target
-					v2s32(0,0), // position in target
-					core::rect<s32>(v2s32(0,0), dim) // from
-			);
+			baseimg = driver->createImage(ti->texture,v2s32(0,0), dim);
 
 			/*infostream<<"getTextureIdDirect(): Loaded \""
 					<<base_image_name<<"\" from image cache"
@@ -717,6 +704,7 @@ u32 TextureSource::getTextureIdDirect(const std::string &name)
 	{
 		// Create texture from resulting image
 		t = driver->addTexture(name.c_str(), baseimg);
+		baseimg->drop();
 	}
 
 	/*
@@ -726,7 +714,7 @@ u32 TextureSource::getTextureIdDirect(const std::string &name)
 	JMutexAutoLock lock(m_textureinfo_cache_mutex);
 
 	u32 id = m_textureinfo_cache.size();
-	TextureInfo ti(name, t, baseimg);
+	TextureInfo ti(name, t);
 	m_textureinfo_cache.push_back(ti);
 	m_name_to_id[name] = id;
 
@@ -809,12 +797,13 @@ void TextureSource::rebuildImagesAndTextures()
 		video::IImage *img = generateImageFromScratch(ti->name);
 		// Create texture from resulting image
 		video::ITexture *t = NULL;
-		if(img)
+		if(img) {
 			t = driver->addTexture(ti->name.c_str(), img);
+			img->drop();
+		}
 		video::ITexture *t_old = ti->texture;
 		// Replace texture
 		ti->texture = t;
-		ti->img = img;
 
 		if (t_old != 0)
 			m_texture_trash.push_back(t_old);
@@ -975,7 +964,7 @@ bool TextureSource::generateImage(std::string part_of_name, video::IImage *& bas
 
 		if (image == NULL) {
 			if (part_of_name != "") {
-				if (part_of_name.find("_normal.png") == std::string::npos){			
+				if (part_of_name.find("_normal.png") == std::string::npos){
 					errorstream<<"generateImage(): Could not load image \""
 						<<part_of_name<<"\""<<" while building texture"<<std::endl;
 					errorstream<<"generateImage(): Creating a dummy"