diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 558c2802724b3f424af4878b5b5a6fb2b26cda72..05b56310f43a006ba68acee3f69c4e58b1c38841 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -50,6 +50,7 @@ configure_file(
 )
 
 set(common_SRCS
+	content_mapnode.cpp
 	auth.cpp
 	collision.cpp
 	nodemetadata.cpp
diff --git a/src/content_mapnode.cpp b/src/content_mapnode.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..1f1c8e30a5d2c6aa431d27ad7cc65211de922944
--- /dev/null
+++ b/src/content_mapnode.cpp
@@ -0,0 +1,351 @@
+/*
+Minetest-c55
+Copyright (C) 2010-2011 celeron55, Perttu Ahola <celeron55@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+// For g_settings
+#include "main.h"
+
+#include "content_mapnode.h"
+#include "mapnode.h"
+#include "nodemetadata.h"
+
+// TODO: Get rid of these and set up some attributes like toughness,
+//       fluffyness, and a funciton to calculate time and durability loss
+//       (and sound? and whatever else) from them
+void setStoneLikeDiggingProperties(DiggingPropertiesList &list, float toughness);
+void setDirtLikeDiggingProperties(DiggingPropertiesList &list, float toughness);
+void setWoodLikeDiggingProperties(DiggingPropertiesList &list, float toughness);
+
+void content_mapnode_init()
+{
+	// Read some settings
+	bool new_style_water = g_settings.getBool("new_style_water");
+	bool new_style_leaves = g_settings.getBool("new_style_leaves");
+
+	u8 i;
+	ContentFeatures *f = NULL;
+
+	i = CONTENT_STONE;
+	f = &content_features(i);
+	f->setAllTextures("stone.png");
+	f->setInventoryTextureCube("stone.png", "stone.png", "stone.png");
+	f->param_type = CPT_MINERAL;
+	f->is_ground_content = true;
+	f->dug_item = std::string("MaterialItem ")+itos(CONTENT_COBBLE)+" 1";
+	setStoneLikeDiggingProperties(f->digging_properties, 1.0);
+	
+	i = CONTENT_GRASS;
+	f = &content_features(i);
+	f->setAllTextures("mud.png^grass_side.png");
+	f->setTexture(0, "grass.png");
+	f->setTexture(1, "mud.png");
+	f->param_type = CPT_MINERAL;
+	f->is_ground_content = true;
+	f->dug_item = std::string("MaterialItem ")+itos(CONTENT_MUD)+" 1";
+	setDirtLikeDiggingProperties(f->digging_properties, 1.0);
+	
+	i = CONTENT_GRASS_FOOTSTEPS;
+	f = &content_features(i);
+	f->setAllTextures("mud.png^grass_side.png");
+	f->setTexture(0, "grass_footsteps.png");
+	f->setTexture(1, "mud.png");
+	f->param_type = CPT_MINERAL;
+	f->is_ground_content = true;
+	f->dug_item = std::string("MaterialItem ")+itos(CONTENT_MUD)+" 1";
+	setDirtLikeDiggingProperties(f->digging_properties, 1.0);
+	
+	i = CONTENT_MUD;
+	f = &content_features(i);
+	f->setAllTextures("mud.png");
+	f->setInventoryTextureCube("mud.png", "mud.png", "mud.png");
+	f->param_type = CPT_MINERAL;
+	f->is_ground_content = true;
+	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+	setDirtLikeDiggingProperties(f->digging_properties, 1.0);
+	
+	i = CONTENT_SAND;
+	f = &content_features(i);
+	f->setAllTextures("sand.png");
+	f->param_type = CPT_MINERAL;
+	f->is_ground_content = true;
+	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+	setDirtLikeDiggingProperties(f->digging_properties, 1.0);
+	
+	i = CONTENT_TREE;
+	f = &content_features(i);
+	f->setAllTextures("tree.png");
+	f->setTexture(0, "tree_top.png");
+	f->setTexture(1, "tree_top.png");
+	f->param_type = CPT_MINERAL;
+	f->is_ground_content = true;
+	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+	setWoodLikeDiggingProperties(f->digging_properties, 1.0);
+	
+	i = CONTENT_LEAVES;
+	f = &content_features(i);
+	f->light_propagates = true;
+	//f->param_type = CPT_MINERAL;
+	f->param_type = CPT_LIGHT;
+	f->is_ground_content = true;
+	if(new_style_leaves)
+	{
+		f->solidness = 0; // drawn separately, makes no faces
+		f->setInventoryTextureCube("leaves.png", "leaves.png", "leaves.png");
+	}
+	else
+	{
+		f->setAllTextures("[noalpha:leaves.png");
+	}
+	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+	setWoodLikeDiggingProperties(f->digging_properties, 0.15);
+
+	i = CONTENT_GLASS;
+	f = &content_features(i);
+	f->light_propagates = true;
+	f->param_type = CPT_LIGHT;
+	f->is_ground_content = true;
+	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+	f->solidness = 0; // drawn separately, makes no faces
+	f->setInventoryTextureCube("glass.png", "glass.png", "glass.png");
+	setWoodLikeDiggingProperties(f->digging_properties, 0.15);
+
+	i = CONTENT_FENCE;
+	f = &content_features(i);
+	f->light_propagates = true;
+	f->param_type = CPT_LIGHT;
+	f->is_ground_content = true;
+	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+	f->solidness = 0; // drawn separately, makes no faces
+	f->air_equivalent = true; // grass grows underneath
+	f->setInventoryTexture("item_fence.png");
+	setWoodLikeDiggingProperties(f->digging_properties, 0.75);
+
+	// Deprecated
+	i = CONTENT_COALSTONE;
+	f = &content_features(i);
+	//f->translate_to = new MapNode(CONTENT_STONE, MINERAL_COAL);
+	f->setAllTextures("stone.png^mineral_coal.png");
+	f->is_ground_content = true;
+	setStoneLikeDiggingProperties(f->digging_properties, 1.5);
+	
+	i = CONTENT_WOOD;
+	f = &content_features(i);
+	f->setAllTextures("wood.png");
+	f->is_ground_content = true;
+	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+	setWoodLikeDiggingProperties(f->digging_properties, 0.75);
+	
+	i = CONTENT_MESE;
+	f = &content_features(i);
+	f->setAllTextures("mese.png");
+	f->is_ground_content = true;
+	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+	setStoneLikeDiggingProperties(f->digging_properties, 0.5);
+	
+	i = CONTENT_CLOUD;
+	f = &content_features(i);
+	f->setAllTextures("cloud.png");
+	f->is_ground_content = true;
+	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+	
+	i = CONTENT_AIR;
+	f = &content_features(i);
+	f->param_type = CPT_LIGHT;
+	f->light_propagates = true;
+	f->sunlight_propagates = true;
+	f->solidness = 0;
+	f->walkable = false;
+	f->pointable = false;
+	f->diggable = false;
+	f->buildable_to = true;
+	f->air_equivalent = true;
+	
+	i = CONTENT_WATER;
+	f = &content_features(i);
+	f->setInventoryTextureCube("water.png", "water.png", "water.png");
+	f->param_type = CPT_LIGHT;
+	f->light_propagates = true;
+	f->solidness = 0; // Drawn separately, makes no faces
+	f->walkable = false;
+	f->pointable = false;
+	f->diggable = false;
+	f->buildable_to = true;
+	f->liquid_type = LIQUID_FLOWING;
+	f->liquid_alternative_flowing = CONTENT_WATER;
+	
+	i = CONTENT_WATERSOURCE;
+	f = &content_features(i);
+	f->setInventoryTexture("water.png");
+	if(new_style_water)
+	{
+		f->solidness = 0; // drawn separately, makes no faces
+	}
+	else // old style
+	{
+		f->solidness = 1;
+
+		TileSpec t;
+		if(g_texturesource)
+			t.texture = g_texturesource->getTexture("water.png");
+		
+		t.alpha = WATER_ALPHA;
+		t.material_type = MATERIAL_ALPHA_VERTEX;
+		t.material_flags &= ~MATERIAL_FLAG_BACKFACE_CULLING;
+		f->setAllTiles(t);
+	}
+	f->param_type = CPT_LIGHT;
+	f->light_propagates = true;
+	f->walkable = false;
+	f->pointable = false;
+	f->diggable = false;
+	f->buildable_to = true;
+	f->liquid_type = LIQUID_SOURCE;
+	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+	f->liquid_alternative_flowing = CONTENT_WATER;
+	
+	i = CONTENT_TORCH;
+	f = &content_features(i);
+	f->setInventoryTexture("torch_on_floor.png");
+	f->param_type = CPT_LIGHT;
+	f->light_propagates = true;
+	f->sunlight_propagates = true;
+	f->solidness = 0; // drawn separately, makes no faces
+	f->walkable = false;
+	f->wall_mounted = true;
+	f->air_equivalent = true;
+	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+	f->light_source = LIGHT_MAX;
+	f->digging_properties.set("", DiggingProperties(true, 0.0, 0));
+	
+	i = CONTENT_SIGN_WALL;
+	f = &content_features(i);
+	f->setInventoryTexture("sign_wall.png");
+	f->param_type = CPT_LIGHT;
+	f->light_propagates = true;
+	f->sunlight_propagates = true;
+	f->solidness = 0; // drawn separately, makes no faces
+	f->walkable = false;
+	f->wall_mounted = true;
+	f->air_equivalent = true;
+	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+	if(f->initial_metadata == NULL)
+		f->initial_metadata = new SignNodeMetadata("Some sign");
+	f->digging_properties.set("", DiggingProperties(true, 0.5, 0));
+	
+	i = CONTENT_CHEST;
+	f = &content_features(i);
+	f->param_type = CPT_FACEDIR_SIMPLE;
+	f->setAllTextures("chest_side.png");
+	f->setTexture(0, "chest_top.png");
+	f->setTexture(1, "chest_top.png");
+	f->setTexture(5, "chest_front.png"); // Z-
+	f->setInventoryTexture("chest_top.png");
+	//f->setInventoryTextureCube("chest_top.png", "chest_side.png", "chest_side.png");
+	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+	if(f->initial_metadata == NULL)
+		f->initial_metadata = new ChestNodeMetadata();
+	setWoodLikeDiggingProperties(f->digging_properties, 1.0);
+	
+	i = CONTENT_FURNACE;
+	f = &content_features(i);
+	f->param_type = CPT_FACEDIR_SIMPLE;
+	f->setAllTextures("furnace_side.png");
+	f->setTexture(5, "furnace_front.png"); // Z-
+	f->setInventoryTexture("furnace_front.png");
+	//f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+	f->dug_item = std::string("MaterialItem ")+itos(CONTENT_COBBLE)+" 6";
+	if(f->initial_metadata == NULL)
+		f->initial_metadata = new FurnaceNodeMetadata();
+	setStoneLikeDiggingProperties(f->digging_properties, 3.0);
+	
+	i = CONTENT_COBBLE;
+	f = &content_features(i);
+	f->setAllTextures("cobble.png");
+	f->setInventoryTextureCube("cobble.png", "cobble.png", "cobble.png");
+	f->param_type = CPT_NONE;
+	f->is_ground_content = true;
+	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+	setStoneLikeDiggingProperties(f->digging_properties, 1.0);
+	
+	i = CONTENT_STEEL;
+	f = &content_features(i);
+	f->setAllTextures("steel_block.png");
+	f->setInventoryTextureCube("steel_block.png", "steel_block.png",
+			"steel_block.png");
+	f->param_type = CPT_NONE;
+	f->is_ground_content = true;
+	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+	setStoneLikeDiggingProperties(f->digging_properties, 5.0);
+	
+	// NOTE: Remember to add frequently used stuff to the texture atlas in tile.cpp
+	
+
+	/*
+		Add MesePick to everything
+	*/
+	for(u16 i=0; i<256; i++)
+	{
+		content_features(i).digging_properties.set("MesePick",
+				DiggingProperties(true, 0.0, 65535./1337));
+	}
+
+}
+
+void setStoneLikeDiggingProperties(DiggingPropertiesList &list, float toughness)
+{
+	list.set("",
+			DiggingProperties(true, 15.0*toughness, 0));
+	
+	list.set("WPick",
+			DiggingProperties(true, 1.3*toughness, 65535./30.*toughness));
+	list.set("STPick",
+			DiggingProperties(true, 0.75*toughness, 65535./100.*toughness));
+	list.set("SteelPick",
+			DiggingProperties(true, 0.50*toughness, 65535./333.*toughness));
+
+	/*list.set("MesePick",
+			DiggingProperties(true, 0.0*toughness, 65535./20.*toughness));*/
+}
+
+void setDirtLikeDiggingProperties(DiggingPropertiesList &list, float toughness)
+{
+	list.set("",
+			DiggingProperties(true, 0.75*toughness, 0));
+	
+	list.set("WShovel",
+			DiggingProperties(true, 0.4*toughness, 65535./50.*toughness));
+	list.set("STShovel",
+			DiggingProperties(true, 0.2*toughness, 65535./150.*toughness));
+	list.set("SteelShovel",
+			DiggingProperties(true, 0.15*toughness, 65535./400.*toughness));
+}
+
+void setWoodLikeDiggingProperties(DiggingPropertiesList &list, float toughness)
+{
+	list.set("",
+			DiggingProperties(true, 3.0*toughness, 0));
+	
+	list.set("WAxe",
+			DiggingProperties(true, 1.5*toughness, 65535./30.*toughness));
+	list.set("STAxe",
+			DiggingProperties(true, 0.75*toughness, 65535./100.*toughness));
+	list.set("SteelAxe",
+			DiggingProperties(true, 0.5*toughness, 65535./333.*toughness));
+}
+
+
diff --git a/src/content_mapnode.h b/src/content_mapnode.h
new file mode 100644
index 0000000000000000000000000000000000000000..c511834e5f0c59f994edd4fc8bf314d353eafa55
--- /dev/null
+++ b/src/content_mapnode.h
@@ -0,0 +1,53 @@
+/*
+Minetest-c55
+Copyright (C) 2010-2011 celeron55, Perttu Ahola <celeron55@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#ifndef CONTENT_MAPNODE_HEADER
+#define CONTENT_MAPNODE_HEADER
+
+void content_mapnode_init();
+
+/*
+	Node content type IDs
+*/
+#define CONTENT_STONE 0
+#define CONTENT_GRASS 1
+#define CONTENT_WATER 2
+#define CONTENT_TORCH 3
+#define CONTENT_TREE 4
+#define CONTENT_LEAVES 5
+#define CONTENT_GRASS_FOOTSTEPS 6
+#define CONTENT_MESE 7
+#define CONTENT_MUD 8
+#define CONTENT_WATERSOURCE 9
+// Pretty much useless, clouds won't be drawn this way
+#define CONTENT_CLOUD 10
+#define CONTENT_COALSTONE 11
+#define CONTENT_WOOD 12
+#define CONTENT_SAND 13
+#define CONTENT_SIGN_WALL 14
+#define CONTENT_CHEST 15
+#define CONTENT_FURNACE 16
+//#define CONTENT_WORKBENCH 17
+#define CONTENT_COBBLE 18
+#define CONTENT_STEEL 19
+#define CONTENT_GLASS 20
+#define CONTENT_FENCE 21
+
+#endif
+
diff --git a/src/environment.cpp b/src/environment.cpp
index 798228802dd27300d7245e70d23bc0b006adb11e..8f8628305b1af90e453c2aa3def8fbe626172300 100644
--- a/src/environment.cpp
+++ b/src/environment.cpp
@@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "filesys.h"
 #include "porting.h"
 #include "collision.h"
+#include "content_mapnode.h"
 
 
 Environment::Environment():
diff --git a/src/game.cpp b/src/game.cpp
index ef574c3486cfbf5cf8c84e16e886c52465657eb7..eef27c805ec6a1f39432e2a9e41252983b98e9de 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -32,6 +32,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "keycode.h"
 #include "farmesh.h"
 
+// TODO: Move content-aware stuff to separate file
+#include "content_mapnode.h"
+
 /*
 	Setting this to 1 enables a special camera mode that forces
 	the renderers to think that the camera statically points from
diff --git a/src/inventory.cpp b/src/inventory.cpp
index 47a8d4de90503ed9580bc2724094d08c792d171a..88453530e7a4b4689bc2d237268162b365d8e217 100644
--- a/src/inventory.cpp
+++ b/src/inventory.cpp
@@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include <sstream>
 #include "main.h"
 #include "serverobject.h"
+#include "content_mapnode.h"
 
 /*
 	InventoryItem
diff --git a/src/main.cpp b/src/main.cpp
index bb34a1a97ec4e40b5417134d4c590c35168ef805..ed3b322a4334bedd20330aeb79d571adaab34505 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -228,6 +228,12 @@ TODO: Map saving should be done by EmergeThread
 SUGG: Map unloading based on sector reference is not very good, it keeps
 	unnecessary stuff in memory. I guess. Investigate this.
 
+TODO: FIXME: Make furnaces handle long step() times better; now a 10-day
+	dtime for a bunch of furnaces will take ages
+
+TODO: When block is placed and it has param_type==CPT_FACEDIR_SIMPLE, set
+      the direction accordingly.
+
 Environment:
 ------------
 
@@ -1143,7 +1149,7 @@ int main(int argc, char *argv[])
 	fs::CreateDir(porting::path_userdata);
 	
 	// Init material properties table
-	initializeMaterialProperties();
+	//initializeMaterialProperties();
 
 	// Debug handler
 	BEGIN_DEBUG_EXCEPTION_HANDLER
@@ -1414,7 +1420,6 @@ int main(int argc, char *argv[])
 		Preload some textures and stuff
 	*/
 
-	init_content_inventory_texture_paths();
 	init_mapnode(); // Second call with g_texturesource set
 	init_mineral();
 
diff --git a/src/map.cpp b/src/map.cpp
index 9230d1c16c543b82734c237a64d6d27ec7e68291..515885d87ec70a7b6dbb62ef68ce7a7f20047d2d 100644
--- a/src/map.cpp
+++ b/src/map.cpp
@@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "mineral.h"
 #include "noise.h"
 #include "serverobject.h"
+#include "content_mapnode.h"
 
 /*
 	Map
diff --git a/src/mapblock.cpp b/src/mapblock.cpp
index 1ebdd6b0ddbf365e37b8df79175b0bd16d3a467b..70006a7183e1c73f834b2273fd01e8178bdf53b7 100644
--- a/src/mapblock.cpp
+++ b/src/mapblock.cpp
@@ -24,6 +24,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "light.h"
 #include <sstream>
 
+// TODO: Move content-aware mesh generation to a separate file
+#include "content_mapnode.h"
+
 #ifndef SERVER
 void MeshMakeData::fill(u32 daynight_ratio, MapBlock *block)
 {
diff --git a/src/mapnode.cpp b/src/mapnode.cpp
index 9a8a09a15bd4832e06d17aedbc40da233a25b077..3717bf0ab85f0f1910eaab373d42ea428dfe9064 100644
--- a/src/mapnode.cpp
+++ b/src/mapnode.cpp
@@ -25,6 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "mineral.h"
 // For g_settings
 #include "main.h"
+#include "content_mapnode.h"
 #include "nodemetadata.h"
 
 ContentFeatures::~ContentFeatures()
@@ -107,9 +108,9 @@ void init_mapnode()
 				"g_texturesource!=NULL"<<std::endl;
 	}
 
-	// Read some settings
+	/*// Read some settings
 	bool new_style_water = g_settings.getBool("new_style_water");
-	bool new_style_leaves = g_settings.getBool("new_style_leaves");
+	bool new_style_leaves = g_settings.getBool("new_style_leaves");*/
 
 	/*
 		Initialize content feature table
@@ -131,247 +132,17 @@ void init_mapnode()
 	{
 		ContentFeatures *f = &g_content_features[i];
 		// Re-initialize
-		*f = ContentFeatures();
+		f->reset();
 
 		for(u16 j=0; j<6; j++)
 			f->tiles[j].material_type = initial_material_type;
 	}
-	
-	u8 i;
-	ContentFeatures *f = NULL;
-
-	i = CONTENT_STONE;
-	f = &g_content_features[i];
-	f->setAllTextures("stone.png");
-	f->setInventoryTextureCube("stone.png", "stone.png", "stone.png");
-	f->param_type = CPT_MINERAL;
-	f->is_ground_content = true;
-	f->dug_item = std::string("MaterialItem ")+itos(CONTENT_COBBLE)+" 1";
-	
-	i = CONTENT_GRASS;
-	f = &g_content_features[i];
-	f->setAllTextures("mud.png^grass_side.png");
-	f->setTexture(0, "grass.png");
-	f->setTexture(1, "mud.png");
-	f->param_type = CPT_MINERAL;
-	f->is_ground_content = true;
-	f->dug_item = std::string("MaterialItem ")+itos(CONTENT_MUD)+" 1";
-	
-	i = CONTENT_GRASS_FOOTSTEPS;
-	f = &g_content_features[i];
-	f->setAllTextures("mud.png^grass_side.png");
-	f->setTexture(0, "grass_footsteps.png");
-	f->setTexture(1, "mud.png");
-	f->param_type = CPT_MINERAL;
-	f->is_ground_content = true;
-	f->dug_item = std::string("MaterialItem ")+itos(CONTENT_MUD)+" 1";
-	
-	i = CONTENT_MUD;
-	f = &g_content_features[i];
-	f->setAllTextures("mud.png");
-	f->setInventoryTextureCube("mud.png", "mud.png", "mud.png");
-	f->param_type = CPT_MINERAL;
-	f->is_ground_content = true;
-	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
-	
-	i = CONTENT_SAND;
-	f = &g_content_features[i];
-	f->setAllTextures("sand.png");
-	f->param_type = CPT_MINERAL;
-	f->is_ground_content = true;
-	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
-	
-	i = CONTENT_TREE;
-	f = &g_content_features[i];
-	f->setAllTextures("tree.png");
-	f->setTexture(0, "tree_top.png");
-	f->setTexture(1, "tree_top.png");
-	f->param_type = CPT_MINERAL;
-	f->is_ground_content = true;
-	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
-	
-	i = CONTENT_LEAVES;
-	f = &g_content_features[i];
-	f->light_propagates = true;
-	//f->param_type = CPT_MINERAL;
-	f->param_type = CPT_LIGHT;
-	f->is_ground_content = true;
-	if(new_style_leaves)
-	{
-		f->solidness = 0; // drawn separately, makes no faces
-		f->setInventoryTextureCube("leaves.png", "leaves.png", "leaves.png");
-	}
-	else
-	{
-		f->setAllTextures("[noalpha:leaves.png");
-	}
-	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
-
-	i = CONTENT_GLASS;
-	f = &g_content_features[i];
-	f->light_propagates = true;
-	f->param_type = CPT_LIGHT;
-	f->is_ground_content = true;
-	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
-	f->solidness = 0; // drawn separately, makes no faces
-	f->setInventoryTextureCube("glass.png", "glass.png", "glass.png");
-
-	i = CONTENT_FENCE;
-	f = &g_content_features[i];
-	f->light_propagates = true;
-	f->param_type = CPT_LIGHT;
-	f->is_ground_content = true;
-	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
-	f->solidness = 0; // drawn separately, makes no faces
-	f->air_equivalent = true; // grass grows underneath
-	f->setInventoryTexture("item_fence.png");
-
-	// Deprecated
-	i = CONTENT_COALSTONE;
-	f = &g_content_features[i];
-	//f->translate_to = new MapNode(CONTENT_STONE, MINERAL_COAL);
-	f->setAllTextures("stone.png^mineral_coal.png");
-	f->is_ground_content = true;
-	
-	i = CONTENT_WOOD;
-	f = &g_content_features[i];
-	f->setAllTextures("wood.png");
-	f->is_ground_content = true;
-	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
-	
-	i = CONTENT_MESE;
-	f = &g_content_features[i];
-	f->setAllTextures("mese.png");
-	f->is_ground_content = true;
-	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
-	
-	i = CONTENT_CLOUD;
-	f = &g_content_features[i];
-	f->setAllTextures("cloud.png");
-	f->is_ground_content = true;
-	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
-	
-	i = CONTENT_AIR;
-	f = &g_content_features[i];
-	f->param_type = CPT_LIGHT;
-	f->light_propagates = true;
-	f->sunlight_propagates = true;
-	f->solidness = 0;
-	f->walkable = false;
-	f->pointable = false;
-	f->diggable = false;
-	f->buildable_to = true;
-	f->air_equivalent = true;
-	
-	i = CONTENT_WATER;
-	f = &g_content_features[i];
-	f->setInventoryTextureCube("water.png", "water.png", "water.png");
-	f->param_type = CPT_LIGHT;
-	f->light_propagates = true;
-	f->solidness = 0; // Drawn separately, makes no faces
-	f->walkable = false;
-	f->pointable = false;
-	f->diggable = false;
-	f->buildable_to = true;
-	f->liquid_type = LIQUID_FLOWING;
-	
-	i = CONTENT_WATERSOURCE;
-	f = &g_content_features[i];
-	f->setInventoryTexture("water.png");
-	if(new_style_water)
-	{
-		f->solidness = 0; // drawn separately, makes no faces
-	}
-	else // old style
-	{
-		f->solidness = 1;
 
-		TileSpec t;
-		if(g_texturesource)
-			t.texture = g_texturesource->getTexture("water.png");
-		
-		t.alpha = WATER_ALPHA;
-		t.material_type = MATERIAL_ALPHA_VERTEX;
-		t.material_flags &= ~MATERIAL_FLAG_BACKFACE_CULLING;
-		f->setAllTiles(t);
-	}
-	f->param_type = CPT_LIGHT;
-	f->light_propagates = true;
-	f->walkable = false;
-	f->pointable = false;
-	f->diggable = false;
-	f->buildable_to = true;
-	f->liquid_type = LIQUID_SOURCE;
-	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
-	
-	i = CONTENT_TORCH;
-	f = &g_content_features[i];
-	f->setInventoryTexture("torch_on_floor.png");
-	f->param_type = CPT_LIGHT;
-	f->light_propagates = true;
-	f->sunlight_propagates = true;
-	f->solidness = 0; // drawn separately, makes no faces
-	f->walkable = false;
-	f->wall_mounted = true;
-	f->air_equivalent = true;
-	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
-	
-	i = CONTENT_SIGN_WALL;
-	f = &g_content_features[i];
-	f->setInventoryTexture("sign_wall.png");
-	f->param_type = CPT_LIGHT;
-	f->light_propagates = true;
-	f->sunlight_propagates = true;
-	f->solidness = 0; // drawn separately, makes no faces
-	f->walkable = false;
-	f->wall_mounted = true;
-	f->air_equivalent = true;
-	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
-	if(f->initial_metadata == NULL)
-		f->initial_metadata = new SignNodeMetadata("Some sign");
-	
-	i = CONTENT_CHEST;
-	f = &g_content_features[i];
-	f->param_type = CPT_FACEDIR_SIMPLE;
-	f->setAllTextures("chest_side.png");
-	f->setTexture(0, "chest_top.png");
-	f->setTexture(1, "chest_top.png");
-	f->setTexture(5, "chest_front.png"); // Z-
-	f->setInventoryTexture("chest_top.png");
-	//f->setInventoryTextureCube("chest_top.png", "chest_side.png", "chest_side.png");
-	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
-	if(f->initial_metadata == NULL)
-		f->initial_metadata = new ChestNodeMetadata();
-	
-	i = CONTENT_FURNACE;
-	f = &g_content_features[i];
-	f->param_type = CPT_FACEDIR_SIMPLE;
-	f->setAllTextures("furnace_side.png");
-	f->setTexture(5, "furnace_front.png"); // Z-
-	f->setInventoryTexture("furnace_front.png");
-	//f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
-	f->dug_item = std::string("MaterialItem ")+itos(CONTENT_COBBLE)+" 6";
-	if(f->initial_metadata == NULL)
-		f->initial_metadata = new FurnaceNodeMetadata();
-	
-	i = CONTENT_COBBLE;
-	f = &g_content_features[i];
-	f->setAllTextures("cobble.png");
-	f->setInventoryTextureCube("cobble.png", "cobble.png", "cobble.png");
-	f->param_type = CPT_NONE;
-	f->is_ground_content = true;
-	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
-	
-	i = CONTENT_STEEL;
-	f = &g_content_features[i];
-	f->setAllTextures("steel_block.png");
-	f->setInventoryTextureCube("steel_block.png", "steel_block.png",
-			"steel_block.png");
-	f->param_type = CPT_NONE;
-	f->is_ground_content = true;
-	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+	/*
+		Initialize mapnode content
+	*/
+	content_mapnode_init();
 	
-	// NOTE: Remember to add frequently used stuff to the texture atlas in tile.cpp
 }
 
 v3s16 facedir_rotate(u8 facedir, v3s16 dir)
@@ -459,16 +230,4 @@ u8 MapNode::getMineral()
 	return MINERAL_NONE;
 }
 
-// Pointers to c_str()s g_content_features[i].inventory_image_path
-//const char * g_content_inventory_texture_paths[USEFUL_CONTENT_COUNT] = {0};
-
-void init_content_inventory_texture_paths()
-{
-	dstream<<"DEPRECATED "<<__FUNCTION_NAME<<std::endl;
-	/*for(u16 i=0; i<USEFUL_CONTENT_COUNT; i++)
-	{
-		g_content_inventory_texture_paths[i] =
-				g_content_features[i].inventory_image_path.c_str();
-	}*/
-}
 
diff --git a/src/mapnode.h b/src/mapnode.h
index 57382aa2b9fe6bbd218dfbd5670791b8b7f053b8..aa3fa39608b4f1e88ccb99129b6376172c7ecca9 100644
--- a/src/mapnode.h
+++ b/src/mapnode.h
@@ -27,6 +27,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "exceptions.h"
 #include "serialization.h"
 #include "tile.h"
+#include "materials.h"
+
+/*
+	Naming scheme:
+	- Material = irrlicht's Material class
+	- Content = (u8) content of a node
+	- Tile = TileSpec at some side of a node of some content type
+*/
 
 /*
 	Initializes all kind of stuff in here.
@@ -42,13 +50,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 */
 void init_mapnode();
 
-// Initializes g_content_inventory_texture_paths
-void init_content_inventory_texture_paths();
-
-
-// NOTE: This is not used appropriately everywhere.
-#define MATERIALS_COUNT 256
-
 /*
 	Ignored node.
 
@@ -67,41 +68,6 @@ void init_content_inventory_texture_paths();
 */
 #define CONTENT_AIR 254
 
-/*
-	Suggested materials:
-	- Gravel
-	- Sand
-	
-	New naming scheme:
-	- Material = irrlicht's Material class
-	- Content = (u8) content of a node
-	- Tile = (u16) Material ID at some side of a node
-*/
-
-#define CONTENT_STONE 0
-#define CONTENT_GRASS 1
-#define CONTENT_WATER 2
-#define CONTENT_TORCH 3
-#define CONTENT_TREE 4
-#define CONTENT_LEAVES 5
-#define CONTENT_GRASS_FOOTSTEPS 6
-#define CONTENT_MESE 7
-#define CONTENT_MUD 8
-#define CONTENT_WATERSOURCE 9
-// Pretty much useless, clouds won't be drawn this way
-#define CONTENT_CLOUD 10
-#define CONTENT_COALSTONE 11
-#define CONTENT_WOOD 12
-#define CONTENT_SAND 13
-#define CONTENT_SIGN_WALL 14
-#define CONTENT_CHEST 15
-#define CONTENT_FURNACE 16
-//#define CONTENT_WORKBENCH 17
-#define CONTENT_COBBLE 18
-#define CONTENT_STEEL 19
-#define CONTENT_GLASS 20
-#define CONTENT_FENCE 21
-
 /*
 	Content feature list
 */
@@ -173,10 +139,20 @@ struct ContentFeatures
 	
 	// Initial metadata is cloned from this
 	NodeMetadata *initial_metadata;
+	
+	// If the content is liquid, this is the flowing version of the liquid.
+	// If content is liquid, this is the same content.
+	u8 liquid_alternative_flowing;
+	
+	// Amount of light the node emits
+	u8 light_source;
+	
+	// Digging properties for different tools
+	DiggingPropertiesList digging_properties;
+	
+	// NOTE: Move relevant properties to here from elsewhere
 
-	//TODO: Move more properties here
-
-	ContentFeatures()
+	void reset()
 	{
 		translate_to = NULL;
 		param_type = CPT_NONE;
@@ -194,6 +170,14 @@ struct ContentFeatures
 		air_equivalent = false;
 		dug_item = "";
 		initial_metadata = NULL;
+		liquid_alternative_flowing = CONTENT_IGNORE;
+		light_source = 0;
+		digging_properties.clear();
+	}
+
+	ContentFeatures()
+	{
+		reset();
 	}
 
 	~ContentFeatures();
@@ -235,6 +219,11 @@ struct ContentFeatures
 */
 ContentFeatures & content_features(u8 i);
 
+
+/*
+	Here is a bunch of DEPRECATED functions.
+*/
+
 /*
 	If true, the material allows light propagation and brightness is stored
 	in param.
@@ -243,9 +232,7 @@ ContentFeatures & content_features(u8 i);
 inline bool light_propagates_content(u8 m)
 {
 	return content_features(m).light_propagates;
-	//return (m == CONTENT_AIR || m == CONTENT_TORCH || m == CONTENT_WATER || m == CONTENT_WATERSOURCE);
 }
-
 /*
 	If true, the material allows lossless sunlight propagation.
 	NOTE: It doesn't seem to go through torches regardlessly of this
@@ -254,9 +241,7 @@ inline bool light_propagates_content(u8 m)
 inline bool sunlight_propagates_content(u8 m)
 {
 	return content_features(m).sunlight_propagates;
-	//return (m == CONTENT_AIR || m == CONTENT_TORCH);
 }
-
 /*
 	On a node-node surface, the material of the node with higher solidness
 	is used for drawing.
@@ -268,83 +253,54 @@ inline bool sunlight_propagates_content(u8 m)
 inline u8 content_solidness(u8 m)
 {
 	return content_features(m).solidness;
-	/*// As of now, every pseudo node like torches are added to this
-	if(m == CONTENT_AIR || m == CONTENT_TORCH || m == CONTENT_WATER)
-		return 0;
-	if(m == CONTENT_WATER || m == CONTENT_WATERSOURCE)
-		return 1;
-	return 2;*/
 }
-
 // Objects collide with walkable contents
 // NOTE: Don't use, use "content_features(m).whatever" instead
 inline bool content_walkable(u8 m)
 {
 	return content_features(m).walkable;
-	//return (m != CONTENT_AIR && m != CONTENT_WATER && m != CONTENT_WATERSOURCE && m != CONTENT_TORCH);
 }
-
 // NOTE: Don't use, use "content_features(m).whatever" instead
 inline bool content_liquid(u8 m)
 {
 	return content_features(m).liquid_type != LIQUID_NONE;
-	//return (m == CONTENT_WATER || m == CONTENT_WATERSOURCE);
 }
-
 // NOTE: Don't use, use "content_features(m).whatever" instead
 inline bool content_flowing_liquid(u8 m)
 {
 	return content_features(m).liquid_type == LIQUID_FLOWING;
-	//return (m == CONTENT_WATER);
 }
-
 // NOTE: Don't use, use "content_features(m).whatever" instead
 inline bool content_liquid_source(u8 m)
 {
 	return content_features(m).liquid_type == LIQUID_SOURCE;
-	//return (m == CONTENT_WATERSOURCE);
 }
-
 // CONTENT_WATER || CONTENT_WATERSOURCE -> CONTENT_WATER
 // CONTENT_LAVA || CONTENT_LAVASOURCE -> CONTENT_LAVA
+// NOTE: Don't use, use "content_features(m).whatever" instead
 inline u8 make_liquid_flowing(u8 m)
 {
-	if(m == CONTENT_WATER || m == CONTENT_WATERSOURCE)
-		return CONTENT_WATER;
-	assert(0);
+	u8 c = content_features(m).liquid_alternative_flowing;
+	assert(c != CONTENT_IGNORE);
+	return c;
 }
-
 // Pointable contents can be pointed to in the map
 // NOTE: Don't use, use "content_features(m).whatever" instead
 inline bool content_pointable(u8 m)
 {
 	return content_features(m).pointable;
-	//return (m != CONTENT_AIR && m != CONTENT_WATER && m != CONTENT_WATERSOURCE);
 }
-
 // NOTE: Don't use, use "content_features(m).whatever" instead
 inline bool content_diggable(u8 m)
 {
 	return content_features(m).diggable;
-	//return (m != CONTENT_AIR && m != CONTENT_WATER && m != CONTENT_WATERSOURCE);
 }
-
 // NOTE: Don't use, use "content_features(m).whatever" instead
 inline bool content_buildable_to(u8 m)
 {
 	return content_features(m).buildable_to;
-	//return (m == CONTENT_AIR || m == CONTENT_WATER || m == CONTENT_WATERSOURCE);
 }
 
-/*
-	Returns true for contents that form the base ground that
-	follows the main heightmap
-*/
-/*inline bool is_ground_content(u8 m)
-{
-	return content_features(m).is_ground_content;
-}*/
-
 /*
 	Nodes make a face if contents differ and solidness differs.
 	Return value:
@@ -493,31 +449,25 @@ struct MapNode
 				&& param == other.param
 				&& param2 == other.param2);
 	}
-
+	
+	/*
+		These four are DEPRECATED I guess. -c55
+	*/
 	bool light_propagates()
 	{
 		return light_propagates_content(d);
 	}
-	
 	bool sunlight_propagates()
 	{
 		return sunlight_propagates_content(d);
 	}
-	
 	u8 solidness()
 	{
 		return content_solidness(d);
 	}
-
 	u8 light_source()
 	{
-		/*
-			Note that a block that isn't light_propagates() can be a light source.
-		*/
-		if(d == CONTENT_TORCH)
-			return LIGHT_MAX;
-		
-		return 0;
+		return content_features(d).light_source;
 	}
 
 	u8 getLightBanksWithSource()
@@ -537,11 +487,6 @@ struct MapNode
 		return (lightday&0x0f) | ((lightnight<<4)&0xf0);
 	}
 
-	void setLightBanks(u8 a_light)
-	{
-		param = a_light;
-	}
-
 	u8 getLight(enum LightBank bank)
 	{
 		// Select the brightest of [light source, propagated light]
@@ -606,13 +551,25 @@ struct MapNode
 	}
 	
 	// In mapnode.cpp
+	/*
+		Get tile of a face of the node.
+		dir: direction of face
+		Returns: TileSpec. Can contain miscellaneous texture coordinates,
+		         which must be obeyed so that the texture atlas can be used.
+	*/
 	TileSpec getTile(v3s16 dir);
-
+	
+	/*
+		Gets mineral content of node, if there is any.
+		MINERAL_NONE if doesn't contain or isn't able to contain mineral.
+	*/
 	u8 getMineral();
 
 	/*
 		These serialization functions are used when informing client
-		of a single node add
+		of a single node add.
+
+		NOTE: When loading a MapBlock, these are not used. Should they?
 	*/
 
 	static u32 serializedLength(u8 version)
diff --git a/src/materials.cpp b/src/materials.cpp
index 841f1d6552911733c146ea01a74a3e7a552c2504..e3a24b9e34f8d16d58b5da7396e70ceabf3472cc 100644
--- a/src/materials.cpp
+++ b/src/materials.cpp
@@ -1,112 +1,20 @@
 #include "materials.h"
+#include "mapnode.h"
 
-#define MATERIAL_PROPERTIES_COUNT 256
+// NOTE: DEPRECATED
 
-// These correspond to the CONTENT_* constants
-MaterialProperties g_material_properties[MATERIAL_PROPERTIES_COUNT];
-
-bool g_material_properties_initialized = false;
-
-void setStoneLikeDiggingProperties(u8 material, float toughness)
-{
-	g_material_properties[material].setDiggingProperties("",
-			DiggingProperties(true, 15.0*toughness, 0));
-	
-	g_material_properties[material].setDiggingProperties("WPick",
-			DiggingProperties(true, 1.3*toughness, 65535./30.*toughness));
-	g_material_properties[material].setDiggingProperties("STPick",
-			DiggingProperties(true, 0.75*toughness, 65535./100.*toughness));
-	g_material_properties[material].setDiggingProperties("SteelPick",
-			DiggingProperties(true, 0.50*toughness, 65535./333.*toughness));
-
-	/*g_material_properties[material].setDiggingProperties("MesePick",
-			DiggingProperties(true, 0.0*toughness, 65535./20.*toughness));*/
-}
-
-void setDirtLikeDiggingProperties(u8 material, float toughness)
-{
-	g_material_properties[material].setDiggingProperties("",
-			DiggingProperties(true, 0.75*toughness, 0));
-	
-	g_material_properties[material].setDiggingProperties("WShovel",
-			DiggingProperties(true, 0.4*toughness, 65535./50.*toughness));
-	g_material_properties[material].setDiggingProperties("STShovel",
-			DiggingProperties(true, 0.2*toughness, 65535./150.*toughness));
-	g_material_properties[material].setDiggingProperties("SteelShovel",
-			DiggingProperties(true, 0.15*toughness, 65535./400.*toughness));
-}
-
-void setWoodLikeDiggingProperties(u8 material, float toughness)
-{
-	g_material_properties[material].setDiggingProperties("",
-			DiggingProperties(true, 3.0*toughness, 0));
-	
-	g_material_properties[material].setDiggingProperties("WAxe",
-			DiggingProperties(true, 1.5*toughness, 65535./30.*toughness));
-	g_material_properties[material].setDiggingProperties("STAxe",
-			DiggingProperties(true, 0.75*toughness, 65535./100.*toughness));
-	g_material_properties[material].setDiggingProperties("SteelAxe",
-			DiggingProperties(true, 0.5*toughness, 65535./333.*toughness));
-}
-
-void initializeMaterialProperties()
-{
-	/*
-		Now, the g_material_properties array is already initialized
-		by the constructors to such that no digging is possible.
-
-		Add some digging properties to them.
-	*/
-
-	setStoneLikeDiggingProperties(CONTENT_STONE, 1.0);
-	setStoneLikeDiggingProperties(CONTENT_MESE, 0.5);
-	setStoneLikeDiggingProperties(CONTENT_COALSTONE, 1.5);
-	setStoneLikeDiggingProperties(CONTENT_FURNACE, 3.0);
-	setStoneLikeDiggingProperties(CONTENT_COBBLE, 1.0);
-	setStoneLikeDiggingProperties(CONTENT_STEEL, 5.0);
-
-	setDirtLikeDiggingProperties(CONTENT_MUD, 1.0);
-	setDirtLikeDiggingProperties(CONTENT_GRASS, 1.0);
-	setDirtLikeDiggingProperties(CONTENT_GRASS_FOOTSTEPS, 1.0);
-	setDirtLikeDiggingProperties(CONTENT_SAND, 1.0);
-	
-	setWoodLikeDiggingProperties(CONTENT_TREE, 1.0);
-	setWoodLikeDiggingProperties(CONTENT_LEAVES, 0.15);
-	setWoodLikeDiggingProperties(CONTENT_GLASS, 0.15);
-	setWoodLikeDiggingProperties(CONTENT_FENCE, 0.75);
-	setWoodLikeDiggingProperties(CONTENT_WOOD, 0.75);
-	setWoodLikeDiggingProperties(CONTENT_CHEST, 1.0);
-
-	g_material_properties[CONTENT_SIGN_WALL].setDiggingProperties("",
-			DiggingProperties(true, 0.5, 0));
-	g_material_properties[CONTENT_TORCH].setDiggingProperties("",
-			DiggingProperties(true, 0.0, 0));
-	
-	/*
-		Add MesePick to everything
-	*/
-	for(u16 i=0; i<MATERIAL_PROPERTIES_COUNT; i++)
-	{
-		g_material_properties[i].setDiggingProperties("MesePick",
-				DiggingProperties(true, 0.0, 65535./1337));
-	}
-
-	g_material_properties_initialized = true;
-}
-
-MaterialProperties * getMaterialProperties(u8 material)
+DiggingPropertiesList * getDiggingPropertiesList(u8 content)
 {
-	assert(g_material_properties_initialized);
-	return &g_material_properties[material];
+	return &content_features(content).digging_properties;
 }
 
-DiggingProperties getDiggingProperties(u8 material, const std::string &tool)
+DiggingProperties getDiggingProperties(u8 content, const std::string &tool)
 {
-	MaterialProperties *mprop = getMaterialProperties(material);
+	DiggingPropertiesList *mprop = getDiggingPropertiesList(content);
 	if(mprop == NULL)
 		// Not diggable
 		return DiggingProperties();
 	
-	return mprop->getDiggingProperties(tool);
+	return mprop->get(tool);
 }
 
diff --git a/src/materials.h b/src/materials.h
index 4221497536885028b6c55215d7d4bb7bde029525..272116d8310209836a764e32701c5ff40bc04d2b 100644
--- a/src/materials.h
+++ b/src/materials.h
@@ -25,7 +25,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 */
 
 #include "common_irrlicht.h"
-#include "inventory.h"
 #include <string>
 
 struct DiggingProperties
@@ -49,20 +48,26 @@ struct DiggingProperties
 	u16 wear;
 };
 
-class MaterialProperties
+/*
+	This is a DEPRECATED way of determining mining characteristics.
+	TODO: Get rid of this and set up some attributes like toughness,
+	      fluffyness, and a funciton to calculate time and durability loss
+	      (and sound? and whatever else) from them
+*/
+class DiggingPropertiesList
 {
 public:
-	MaterialProperties()
+	DiggingPropertiesList()
 	{
 	}
 
-	void setDiggingProperties(const std::string toolname,
+	void set(const std::string toolname,
 			const DiggingProperties &prop)
 	{
 		m_digging_properties[toolname] = prop;
 	}
 
-	DiggingProperties getDiggingProperties(const std::string toolname)
+	DiggingProperties get(const std::string toolname)
 	{
 		core::map<std::string, DiggingProperties>::Node *n;
 		n = m_digging_properties.find(toolname);
@@ -80,16 +85,17 @@ class MaterialProperties
 		return n->getValue();
 	}
 
+	void clear()
+	{
+		m_digging_properties.clear();
+	}
+
 private:
 	// toolname="": default properties (digging by hand)
 	// Key is toolname
 	core::map<std::string, DiggingProperties> m_digging_properties;
 };
 
-void initializeMaterialProperties();
-
-// Material correspond to the CONTENT_* constants
-MaterialProperties * getMaterialProperties(u8 material);
 // For getting the default properties, set tool=""
 DiggingProperties getDiggingProperties(u8 material, const std::string &tool);
 
diff --git a/src/nodemetadata.cpp b/src/nodemetadata.cpp
index 6822173cb39771b65ee5685c4c1f6353c03e8d02..1fc4c93a1ada2a2d52eb7c8f194f131cfd01cd4b 100644
--- a/src/nodemetadata.cpp
+++ b/src/nodemetadata.cpp
@@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "exceptions.h"
 #include "inventory.h"
 #include <sstream>
+#include "content_mapnode.h"
 
 /*
 	NodeMetadata
diff --git a/src/server.cpp b/src/server.cpp
index 16ad80c00ce822dab8903064c80896d8cf48fe04..70448fbf6ff1962a9a70b6e61159358d7af78e33 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -31,6 +31,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "config.h"
 #include "servercommand.h"
 #include "filesys.h"
+#include "content_mapnode.h"
 
 #define BLOCK_EMERGE_FLAG_FROMDISK (1<<0)
 
diff --git a/src/servermain.cpp b/src/servermain.cpp
index 907d0d2db56a77cc7d06bf3af6d83d3733d00a92..6eb45ea22a647def391a456f077f986c1a56bfdd 100644
--- a/src/servermain.cpp
+++ b/src/servermain.cpp
@@ -152,7 +152,7 @@ int main(int argc, char *argv[])
 	DSTACK(__FUNCTION_NAME);
 
 	// Init material properties table
-	initializeMaterialProperties();
+	//initializeMaterialProperties();
 
 	// Debug handler
 	BEGIN_DEBUG_EXCEPTION_HANDLER
diff --git a/src/test.cpp b/src/test.cpp
index 07ef772eff7755c2b74de152bea0091520b1d30a..38497136d9dd22a290fac35e449d0e6815e16372 100644
--- a/src/test.cpp
+++ b/src/test.cpp
@@ -30,6 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "voxel.h"
 #include <sstream>
 #include "porting.h"
+#include "content_mapnode.h"
 
 /*
 	Asserts that the exception occurs
diff --git a/src/voxel.cpp b/src/voxel.cpp
index f60b641f1af7954e3d9fd9cdab1c555d562ab946..5938f9016d7e202d161cc9c5d722c2870e9cf4ad 100644
--- a/src/voxel.cpp
+++ b/src/voxel.cpp
@@ -19,10 +19,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include "voxel.h"
 #include "map.h"
-
-// For TimeTaker
-#include "utility.h"
+#include "utility.h" // For TimeTaker
 #include "gettime.h"
+#include "content_mapnode.h"
 
 /*
 	Debug stuff