diff --git a/src/client.cpp b/src/client.cpp
index d0e5cd405dee7a363ee86ed75dadbb41643baf07..d5abcd7debfd59ae5d11d69fd53110d7504322ca 100644
--- a/src/client.cpp
+++ b/src/client.cpp
@@ -224,6 +224,9 @@ Client::Client(
 		tsrc->buildMainAtlas(this);
 	else
 		infostream<<"Not building texture atlas."<<std::endl;
+	
+	// Update textures
+	m_nodedef->updateTextures(tsrc);
 
 	// NOTE: This should be done only after getting possible dynamic
 	// game definitions from the server, or at least shut down and
diff --git a/src/nodedef.cpp b/src/nodedef.cpp
index 74d825362e51093a9cbd3c2c4e6d9f16e7a16b85..7b723e958daa79425be4211d373c2bc82bad3671 100644
--- a/src/nodedef.cpp
+++ b/src/nodedef.cpp
@@ -164,6 +164,21 @@ class CNodeDefManager: public IWritableNodeDefManager
 		assert(c <= MAX_CONTENT);
 		return &m_content_features[c];
 	}
+	virtual void updateTextures(ITextureSource *tsrc)
+	{
+#ifndef SERVER
+		infostream<<"CNodeDefManager::updateTextures(): Updating "
+				<<"textures in node definitions"<<std::endl;
+		for(u16 i=0; i<=MAX_CONTENT; i++)
+		{
+			ContentFeatures *f = &m_content_features[i];
+			for(u16 j=0; j<6; j++)
+				tsrc->updateAP(f->tiles[j].texture);
+			if(f->special_atlas)
+				tsrc->updateAP(*(f->special_atlas));
+		}
+#endif
+	}
 private:
 	ContentFeatures m_content_features[MAX_CONTENT+1];
 };
diff --git a/src/nodedef.h b/src/nodedef.h
index dece63fcd90a7645bb26939ffab2af3153c501b3..5aba69c48824dd530fd8cc1cbe5e969c73a28ace 100644
--- a/src/nodedef.h
+++ b/src/nodedef.h
@@ -320,6 +320,12 @@ class IWritableNodeDefManager : public INodeDefManager
 	// Register node definition
 	virtual void set(content_t c, const ContentFeatures &def)=0;
 	virtual ContentFeatures* getModifiable(content_t c)=0;
+
+	/*
+		Update tile textures to latest return values of TextueSource.
+		Call after updating the texture atlas of a TextureSource.
+	*/
+	virtual void updateTextures(ITextureSource *tsrc)=0;
 };
 
 // If textures not actually available (server), tsrc can be NULL
diff --git a/src/tile.h b/src/tile.h
index ac4e790b43e86523e08f3589ae1eb9d412206241..105692c10bbf7f849602ce19fb3d3e4b6feb4415 100644
--- a/src/tile.h
+++ b/src/tile.h
@@ -138,6 +138,7 @@ class ITextureSource
 		{return AtlasPointer(0);}
 	virtual video::ITexture* getTextureRaw(const std::string &name)
 		{return NULL;}
+	virtual void updateAP(AtlasPointer &ap){};
 };
 
 class IWritableTextureSource : public ITextureSource
@@ -153,8 +154,8 @@ class IWritableTextureSource : public ITextureSource
 		{return AtlasPointer(0);}
 	virtual video::ITexture* getTextureRaw(const std::string &name)
 		{return NULL;}
+	virtual void updateAP(AtlasPointer &ap){};
 
-	virtual void updateAP(AtlasPointer &ap)=0;
 	virtual void buildMainAtlas(class IGameDef *gamedef)=0;
 	virtual void processQueue()=0;
 };