diff --git a/game/engine/Entity.lua b/game/engine/Entity.lua
index c2e0418d5383380a3116e60c76b55474eae549f2..187bf033c228111e5b8cc860cfe4d8de25f10dc8 100644
--- a/game/engine/Entity.lua
+++ b/game/engine/Entity.lua
@@ -37,7 +37,7 @@ function _M:init(t, no_default)
 
 	for k, e in pairs(t) do
 		local ee = e
-		if type(e) == "table" then ee = table.clone(e, true) end
+		if type(e) == "table" and not e.__CLASSNAME then ee = table.clone(e, true) end
 		self[k] = ee
 	end
 
diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua
index 208918d29a4b8682110cc5af9e08c61b5d906414..9d217dc9614da6f262bddbcf2427939ab56a82cb 100644
--- a/game/modules/tome/data/damage_types.lua
+++ b/game/modules/tome/data/damage_types.lua
@@ -222,8 +222,10 @@ newDamageType{
 		local feat = game.level.map(x, y, Map.TERRAIN)
 		if feat then
 			if feat.dig then
-				game.level.map(x, y, Map.TERRAIN, game.zone.grid_list[feat.dig])
-				game.logSeen({x=x,y=y}, "%s turns into %s.", feat.name:capitalize(), game.zone.grid_list[feat.dig].name)
+				local newfeat_name = feat.dig
+				if type(feat.dig) == "function" then newfeat_name = feat.dig(self, x, y, feat) end
+				game.level.map(x, y, Map.TERRAIN, game.zone.grid_list[newfeat_name])
+				game.logSeen({x=x,y=y}, "%s turns into %s.", feat.name:capitalize(), game.zone.grid_list[newfeat_name].name)
 			end
 		end
 	end,
diff --git a/game/modules/tome/data/talents/spells/earth.lua b/game/modules/tome/data/talents/spells/earth.lua
index 5ee1e967d6463c6f8235e82de194e232a643bb0a..e21e2a29a5349d5af09a63d584b3d5913151627b 100644
--- a/game/modules/tome/data/talents/spells/earth.lua
+++ b/game/modules/tome/data/talents/spells/earth.lua
@@ -1,3 +1,5 @@
+local Object = require "engine.Object"
+
 newTalent{
 	name = "Stone Skin",
 	type = {"spell/earth", 1},
@@ -69,3 +71,62 @@ newTalent{
 		The damage will increase with the Magic stat]]):format(8 + self:combatSpellpower(0.15) * self:getTalentLevel(t))
 	end,
 }
+
+newTalent{
+	name = "Stone Wall",
+	type = {"spell/earth",4},
+	points = 5,
+	cooldown = 12,
+	mana = 70,
+	range = 20,
+	action = function(self, t)
+		local x, y = self.x, self.y
+		if self:getTalentLevel(t) >= 4 then
+--			local tg = {type="bolt", range=self:getTalentRange(t), nolock=true}
+--			local x, y = self:getTarget(tg)
+--			if not x or not y then return nil end
+--			for i = 1, self:getTalentLevelRaw(t) do
+--				self:project(tg, x, y, DamageType.DIG, 1)
+--			end
+		end
+
+		for i = -1, 1 do for j = -1, 1 do if game.level.map:isBound(x + i, y + j) then
+			if not game.level.map:checkAllEntities(x + i, y + j, "block_move") then
+				-- Ok some explanation, we make a new *OBJECT* because objects can have energy and act
+				-- it stores the current terrain in "old_feat" and restores it when it expires
+				-- We CAN set an object as a terrain because they are all entities
+
+				local e = Object.new{
+					old_feat = game.level.map(x + i, y + j, Map.TERRAIN),
+					name = "summoned wall", image = "terrain/granite_wall1.png",
+					display = '#', color_r=255, color_g=255, color_b=255,
+					always_remember = true,
+					block_move = true,
+					block_sight = true,
+					temporary = 2 + self:combatSpellpower(0.03) * self:getTalentLevel(t),
+					x = x + i, y = y + j,
+					canAct = function() return true end,
+					act = function(self)
+						self:useEnergy()
+						self.temporary = self.temporary - 1
+						if self.temporary <= 0 then
+						print("reseting", self.x, self.y, "to", self.old_feat, self.old_feat.name)
+							game.level.map(self.x, self.y, Map.TERRAIN, self.old_feat)
+							game:removeEntity(self)
+							game.level.map:redisplay()
+						end
+					end
+				}
+				game:addEntity(e)
+				print("setting", x+i, y+j, "to", game.level.map(x + i, y + j, Map.TERRAIN), game.level.map(x + i, y + j, Map.TERRAIN).name)
+				game.level.map(x + i, y + j, Map.TERRAIN, e)
+			end
+		end end end
+
+		return true
+	end,
+	require = { stat = { mag=34 } },
+	info = function(self, t)
+		return ([[Entombs yourself in a wall of stone for %d turns.]]):format(2 + self:combatSpellpower(0.03) * self:getTalentLevel(t))
+	end,
+}