diff --git a/src/client.cpp b/src/client.cpp
index 7e74cf36bbd1341069b633a1bfbe9bcec9a93dbf..c6319d5846e8ca1eb536620b87641d9c6eefa280 100644
--- a/src/client.cpp
+++ b/src/client.cpp
@@ -2781,6 +2781,10 @@ IShaderSource* Client::getShaderSource()
 {
 	return m_shsrc;
 }
+scene::ISceneManager* Client::getSceneManager()
+{
+	return m_device->getSceneManager();
+}
 u16 Client::allocateUnknownNodeId(const std::string &name)
 {
 	errorstream<<"Client::allocateUnknownNodeId(): "
diff --git a/src/client.h b/src/client.h
index e3b425a32d0d3bdf2c8b42dfa53ccb44ceebc88a..084f7be2c42f465ad298aabf71ccbf32f575623d 100644
--- a/src/client.h
+++ b/src/client.h
@@ -447,6 +447,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
 	virtual ICraftDefManager* getCraftDefManager();
 	virtual ITextureSource* getTextureSource();
 	virtual IShaderSource* getShaderSource();
+	virtual scene::ISceneManager* getSceneManager();
 	virtual u16 allocateUnknownNodeId(const std::string &name);
 	virtual ISoundManager* getSoundManager();
 	virtual MtEventManager* getEventManager();
diff --git a/src/content_mapblock.cpp b/src/content_mapblock.cpp
index 996db421b35e030cce74b432788a4f695acaacac..527086b89601ad4326b7b314cbbc6b36ebb2686a 100644
--- a/src/content_mapblock.cpp
+++ b/src/content_mapblock.cpp
@@ -1720,11 +1720,13 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
 			v3f pos = intToFloat(p, BS);
 			video::SColor c = MapBlock_LightColor(255, getInteriorLight(n, 1, nodedef), f.light_source);
 			u8 facedir = n.getFaceDir(nodedef);
-			for(u16 j = 0; j < f.mesh_ptr[facedir]->getMeshBufferCount(); j++) {
-				scene::IMeshBuffer *buf = f.mesh_ptr[facedir]->getMeshBuffer(j);
-				collector.append(getNodeTileN(n, p, j, data),
-					(video::S3DVertex *)buf->getVertices(), buf->getVertexCount(),
-					buf->getIndices(), buf->getIndexCount(), pos, c);
+			if (f.mesh_ptr[facedir]) {
+				for(u16 j = 0; j < f.mesh_ptr[facedir]->getMeshBufferCount(); j++) {
+					scene::IMeshBuffer *buf = f.mesh_ptr[facedir]->getMeshBuffer(j);
+					collector.append(getNodeTileN(n, p, j, data),
+						(video::S3DVertex *)buf->getVertices(), buf->getVertexCount(),
+						buf->getIndices(), buf->getIndexCount(), pos, c);
+				}
 			}
 		break;}
 		}
diff --git a/src/gamedef.h b/src/gamedef.h
index 6da288bad8879992475c30592ec6045f8a6440b0..b7830373b0ccd8c2e559dbfa673f394c4e4907f3 100644
--- a/src/gamedef.h
+++ b/src/gamedef.h
@@ -33,6 +33,7 @@ class MtEventManager;
 class IRollbackReportSink;
 namespace irr { namespace scene {
 	class IAnimatedMesh;
+	class ISceneManager;
 }}
 
 /*
@@ -63,6 +64,7 @@ class IGameDef
 	virtual MtEventManager* getEventManager()=0;
 	virtual scene::IAnimatedMesh* getMesh(const std::string &filename)
 	{ return NULL; }
+	virtual scene::ISceneManager* getSceneManager()=0;
 
 	// Only usable on the server, and NOT thread-safe. It is usable from the
 	// environment thread.
diff --git a/src/nodedef.cpp b/src/nodedef.cpp
index 2f95b68f9362f37b4302f4e9a83a35425f24fbe1..cf30d76b3f77a3e7683ca45bdb52957851da932a 100644
--- a/src/nodedef.cpp
+++ b/src/nodedef.cpp
@@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #ifndef SERVER
 #include "tile.h"
 #include "mesh.h"
+#include <IMeshManipulator.h>
 #endif
 #include "log.h"
 #include "settings.h"
@@ -171,12 +172,6 @@ ContentFeatures::ContentFeatures()
 
 ContentFeatures::~ContentFeatures()
 {
-#ifndef SERVER
-	for (u32 i = 0; i < 24; i++) {
-		if (mesh_ptr[i])
-			mesh_ptr[i]->drop();
-	}
-#endif
 }
 
 void ContentFeatures::reset()
@@ -446,6 +441,15 @@ CNodeDefManager::CNodeDefManager()
 
 CNodeDefManager::~CNodeDefManager()
 {
+#ifndef SERVER
+	for (u32 i = 0; i < m_content_features.size(); i++) {
+		ContentFeatures *f = &m_content_features[i];
+		for (u32 j = 0; j < 24; j++) {
+			if (f->mesh_ptr[j])
+				f->mesh_ptr[j]->drop();
+		}
+	}
+#endif
 }
 
 
@@ -695,6 +699,8 @@ void CNodeDefManager::updateTextures(IGameDef *gamedef)
 	
 	ITextureSource *tsrc = gamedef->tsrc();
 	IShaderSource *shdsrc = gamedef->getShaderSource();
+	scene::ISceneManager* smgr = gamedef->getSceneManager();
+	scene::IMeshManipulator* meshmanip = smgr->getMeshManipulator();
 
 	bool new_style_water           = g_settings->getBool("new_style_water");
 	bool new_style_leaves          = g_settings->getBool("new_style_leaves");
@@ -840,18 +846,23 @@ void CNodeDefManager::updateTextures(IGameDef *gamedef)
 		// Read the mesh and apply scale
 		if ((f->drawtype == NDT_MESH) && (f->mesh != "")) {
 			f->mesh_ptr[0] = gamedef->getMesh(f->mesh);
-			scaleMesh(f->mesh_ptr[0], v3f(f->visual_scale,f->visual_scale,f->visual_scale));
-			recalculateBoundingBox(f->mesh_ptr[0]);
+			if (f->mesh_ptr[0]){
+				v3f scale = v3f(1.0, 1.0, 1.0) * BS * f->visual_scale;
+				scaleMesh(f->mesh_ptr[0], scale);
+				recalculateBoundingBox(f->mesh_ptr[0]);
+			}
 		}
 
 		//Convert regular nodebox nodes to meshnodes
 		//Change the drawtype and apply scale
-		if ((f->drawtype == NDT_NODEBOX) && 
-				((f->node_box.type == NODEBOX_REGULAR) || (f->node_box.type == NODEBOX_FIXED)) &&
+		else if ((f->drawtype == NDT_NODEBOX) && 
+				((f->node_box.type == NODEBOX_REGULAR) ||
+				(f->node_box.type == NODEBOX_FIXED)) &&
 				(!f->node_box.fixed.empty())) {
 			f->drawtype = NDT_MESH;
 			f->mesh_ptr[0] = convertNodeboxNodeToMesh(f);
-			scaleMesh(f->mesh_ptr[0], v3f(f->visual_scale,f->visual_scale,f->visual_scale));
+			v3f scale = v3f(1.0, 1.0, 1.0) * f->visual_scale;
+			scaleMesh(f->mesh_ptr[0], scale);
 			recalculateBoundingBox(f->mesh_ptr[0]);
 		}
 
@@ -861,6 +872,7 @@ void CNodeDefManager::updateTextures(IGameDef *gamedef)
 				f->mesh_ptr[j] = cloneMesh(f->mesh_ptr[0]);
 				rotateMeshBy6dFacedir(f->mesh_ptr[j], j);
 				recalculateBoundingBox(f->mesh_ptr[j]);
+				meshmanip->recalculateNormals(f->mesh_ptr[j], false, false);
 			}
 		}
 	}
diff --git a/src/server.cpp b/src/server.cpp
index 6afe600ed052474b407a19d71b5d666fa9058ee1..d4d9816ddc125ca0be984463787d637991a3511b 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -4890,6 +4890,11 @@ IShaderSource* Server::getShaderSource()
 {
 	return NULL;
 }
+scene::ISceneManager* Server::getSceneManager()
+{
+	return NULL;
+}
+
 u16 Server::allocateUnknownNodeId(const std::string &name)
 {
 	return m_nodedef->allocateDummy(name);
diff --git a/src/server.h b/src/server.h
index cb0baceced8fd1358980192a9d8ae9b9cd2653e7..7233ffbe84894041e01cde081301253192795a56 100644
--- a/src/server.h
+++ b/src/server.h
@@ -290,7 +290,8 @@ class Server : public con::PeerHandler, public MapEventReceiver,
 	virtual ISoundManager* getSoundManager();
 	virtual MtEventManager* getEventManager();
 	virtual IRollbackReportSink* getRollbackReportSink();
-
+	virtual scene::ISceneManager* getSceneManager();
+	
 	IWritableItemDefManager* getWritableItemDefManager();
 	IWritableNodeDefManager* getWritableNodeDefManager();
 	IWritableCraftDefManager* getWritableCraftDefManager();