diff --git a/game/engine/DamageType.lua b/game/engine/DamageType.lua
index af074e0f0482fe498ded39f42b16eb002b0c9ddd..b88df71f8d090f3a9b85b94300ef1e30f165af1b 100644
--- a/game/engine/DamageType.lua
+++ b/game/engine/DamageType.lua
@@ -17,7 +17,7 @@ function _M:loadDefinition(file)
 	setfenv(f, setmetatable({
 		DamageType = _M,
 		Map = require("engine.Map"),
-		defaultProjector = function(fct) self.defaultProjector = fct end,
+		setDefaultProjector = function(fct) self.defaultProjector = fct end,
 		newDamageType = function(t) self:newDamageType(t) end,
 	}, {__index=_G}))
 	f()
diff --git a/game/engine/Map.lua b/game/engine/Map.lua
index f61807c6adf2ddd6584bedcb5fee41b7f6c15e32..5a91ecca7955c9ae4b3e5c1fec2f44674f07a559 100644
--- a/game/engine/Map.lua
+++ b/game/engine/Map.lua
@@ -289,8 +289,8 @@ function _M:apply(x, y)
 	if x < 0 or x >= self.w or y < 0 or y >= self.h then return end
 	if self.lites[x + y * self.w] then
 		self.seens[x + y * self.w] = true
-		self.remembers[x + y * self.w] = true
 		self._map:setSeen(x, y, true)
+		self.remembers[x + y * self.w] = true
 		self._map:setRemember(x, y, true)
 	end
 end
@@ -299,12 +299,12 @@ end
 -- Used by FOV code
 function _M:applyLite(x, y)
 	if x < 0 or x >= self.w or y < 0 or y >= self.h then return end
-	self.lites[x + y * self.w] = true
+	if self.lites[x + y * self.w] or self:checkAllEntities(x, y, "always_remember") then
+		self.remembers[x + y * self.w] = true
+		self._map:setRemember(x, y, true)
+	end
 	self.seens[x + y * self.w] = true
-	self.remembers[x + y * self.w] = true
 	self._map:setSeen(x, y, true)
-	self._map:setRemember(x, y, true)
-	self._map:setLite(x, y, true)
 end
 
 --- Check all entities of the grid for a property
diff --git a/game/engine/Tiles.lua b/game/engine/Tiles.lua
index 4796499044477a1e4684825f4340508ee077b6c6..53b8d6185e92b7131a9c7765988004e7ceae7064 100644
--- a/game/engine/Tiles.lua
+++ b/game/engine/Tiles.lua
@@ -50,7 +50,7 @@ function _M:get(char, fr, fg, fb, br, bg, bb, image, alpha)
 			if br < 0 then br = nil end
 			if bg < 0 then bg = nil end
 			if bb < 0 then bb = nil end
-			s = core.display.newTile(self.w, self.h, self.font, dochar, (self.w - w) / 2, (self.h - h) / 2, fr, fg, fb, br or 0, bg or 0, bb or 0, alpha)
+			s = core.display.newTile(self.w, self.h, self.font, dochar, (self.w - w) / 2, (self.h - h) / 2, fr, fg, fb, br or 0, bg or 0, bb or 0, alpha, self.use_images)
 --			s = core.display.drawStringNewSurface(self.font, char, fr, fg, fb)
 		end
 
diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index 4cbc048f0e164b581839b10a6fe27e82f660dc8b..8a0f363366b088928894a22dfae170b6a81cf7fc 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -109,6 +109,7 @@ function _M:move(x, y, force)
 	return moved
 end
 
+--- Blink through walls
 function _M:probabilityTravel(x, y)
 	local dirx, diry = x - self.x, y - self.y
 	local tx, ty = x, y
@@ -122,6 +123,15 @@ function _M:probabilityTravel(x, y)
 	return true
 end
 
+--- Reveals location surrounding the actor
+function _M:magicMap(radius)
+	for i = self.x - radius, self.x + radius do for j = self.y - radius, self.y + radius do
+		if game.level.map:isBound(i, j) and core.fov.distance(self.x, self.y, i, j) < radius then
+			game.level.map.remembers(i, j, true)
+		end
+	end end
+end
+
 function _M:tooltip()
 	return ("%s\n#00ffff#Level: %d\nExp: %d/%d\n#ff0000#HP: %d"):format(self.name, self.level, self.exp, self:getExpChart(self.level+1) or "---", self.life)
 end
diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua
index 2637fb28074ea2319df2aa072bd1254a09d6d8a3..be0e2c5e22ea8e6c63beb2cc3eeec998b0c4b288 100644
--- a/game/modules/tome/class/Game.lua
+++ b/game/modules/tome/class/Game.lua
@@ -388,9 +388,13 @@ function _M:setupCommands()
 				function(o, item)
 					local ret = o:use(self.player)
 					if ret and ret == "destroy" then
-						self.player:removeObject(self.player:getInven(self.player.INVEN_INVEN), item)
-						self.log("You have no more "..o:getName())
-						self.player:sortInven()
+						if o.multicharge and o.multicharge > 1 then
+							o.multicharge = o.multicharge - 1
+						else
+							self.player:removeObject(self.player:getInven(self.player.INVEN_INVEN), item)
+							self.log("You have no more "..o:getName())
+							self.player:sortInven()
+						end
 					end
 				end
 			)
diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua
index 8e8e607ad414835582c8f8914aa6bb8861201499..8822751e2cd773efe185ccf54083232bcb5724f8 100644
--- a/game/modules/tome/data/damage_types.lua
+++ b/game/modules/tome/data/damage_types.lua
@@ -1,5 +1,5 @@
 -- The basic stuff used to damage a grid
-defaultProjector(function(src, x, y, type, dam)
+setDefaultProjector(function(src, x, y, type, dam)
 	local target = game.level.map(x, y, Map.ACTOR)
 	if target then
 		-- Reduce damage with resistance
@@ -22,6 +22,17 @@ defaultProjector(function(src, x, y, type, dam)
 	end
 end)
 
+local function tryDestroy(who, inven, destroy_prop, proof_prop, msg)
+	for i = #inven, 1, -1 do
+		local o = inven[i]
+		print(who, inven, destroy_prop, proof_prop, msg, "::", i)
+		if o[destroy_prop] and rng.percent(o[destroy_prop]) and not o[proof_prop] then
+			game.logPlayer(who, msg, o:getName())
+			who:removeObject(inven, i)
+		end
+	end
+end
+
 newDamageType{
 	name = "physical", type = "PHYSICAL",
 }
@@ -33,18 +44,47 @@ newDamageType{
 -- The four elemental damges
 newDamageType{
 	name = "fire", type = "FIRE",
+	projector = function(src, x, y, type, dam)
+		DamageType.defaultProjector(src, x, y, type, dam)
+		local target = game.level.map(x, y, Map.ACTOR)
+		if target and not target:attr("fire_proof") then
+			tryDestroy(target, target:getInven("INVEN"), "fire_destroy", "fire_proof", "The burst of heat destroys your %s!")
+		end
+	end,
 }
 newDamageType{
 	name = "cold", type = "COLD",
+	projector = function(src, x, y, type, dam)
+		DamageType.defaultProjector(src, x, y, type, dam)
+		local target = game.level.map(x, y, Map.ACTOR)
+		if target and not target:attr("cold_proof") then
+			tryDestroy(target, target:getInven("INVEN"), "cold_destroy", "cold_proof", "The intense cold destroys your %s!")
+		end
+	end,
 }
 newDamageType{
 	name = "nature", type = "NATURE",
 }
 newDamageType{
 	name = "lightning", type = "LIGHTNING",
+	projector = function(src, x, y, type, dam)
+		DamageType.defaultProjector(src, x, y, type, dam)
+		local target = game.level.map(x, y, Map.ACTOR)
+		if target and not target:attr("elec_proof") then
+			tryDestroy(target, target:getInven("INVEN"), "elec_destroy", "elec_proof", "The burst of lightning destroys your %s!")
+		end
+	end,
 }
+-- Acid detroys potions
 newDamageType{
 	name = "acid", type = "ACID",
+	projector = function(src, x, y, type, dam)
+		DamageType.defaultProjector(src, x, y, type, dam)
+		local target = game.level.map(x, y, Map.ACTOR)
+		if target and not target:attr("acid_proof") then
+			tryDestroy(target, target:getInven("INVEN"), "acid_destroy", "acid_proof", "The splash of acid destroys your %s!")
+		end
+	end,
 }
 
 -- Light up the room
diff --git a/game/modules/tome/data/general/grids/basic.lua b/game/modules/tome/data/general/grids/basic.lua
index c4e09bca8905836f9887467f706039b4a88da360..aba80f915d53cba54ff7e49e26455772d08e5334 100644
--- a/game/modules/tome/data/general/grids/basic.lua
+++ b/game/modules/tome/data/general/grids/basic.lua
@@ -2,6 +2,7 @@ newEntity{
 	define_as = "UP_WILDERNESS",
 	name = "exit to the wilds",
 	display = '<', color_r=255, color_g=0, color_b=255,
+	always_remember = true,
 	change_level = 1,
 	change_zone = "wilderness",
 }
@@ -10,6 +11,7 @@ newEntity{
 	define_as = "UP",
 	name = "previous level",
 	display = '<', color_r=255, color_g=255, color_b=0,
+	always_remember = true,
 	change_level = -1,
 }
 
@@ -17,6 +19,7 @@ newEntity{
 	define_as = "DOWN",
 	name = "next level",
 	display = '>', color_r=255, color_g=255, color_b=0,
+	always_remember = true,
 	change_level = 1,
 }
 
@@ -30,6 +33,7 @@ newEntity{
 	define_as = "WALL",
 	name = "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,
 }
@@ -38,6 +42,7 @@ newEntity{
 	define_as = "DOOR",
 	name = "door", image = "terrain/granite_door1.png",
 	display = '+', color_r=238, color_g=154, color_b=77,
+	always_remember = true,
 	block_sight = true,
 	door_opened = "DOOR_OPEN",
 }
@@ -46,6 +51,7 @@ newEntity{
 	define_as = "DOOR_OPEN",
 	name = "open door", image = "terrain/granite_door1_open.png",
 	display = "'", color_r=238, color_g=154, color_b=77,
+	always_remember = true,
 	block_move = false,
 	block_sight = false,
 	door_closed = "DOOR",
@@ -67,6 +73,7 @@ newEntity{
 	define_as = "TREE",
 	name = "tree", image = "terrain/tree.png",
 	display = '#', color=colors.LIGHT_GREEN,
+	always_remember = true,
 	block_move = true,
 	block_sight = true,
 }
diff --git a/game/modules/tome/data/general/objects/egos/potions.lua b/game/modules/tome/data/general/objects/egos/potions.lua
new file mode 100644
index 0000000000000000000000000000000000000000..2d1dd0322ede7fcf541e3068511e5cfed8970ae1
--- /dev/null
+++ b/game/modules/tome/data/general/objects/egos/potions.lua
@@ -0,0 +1,15 @@
+newEntity{
+	name = "acid-proof ", prefix=true,
+	level_range = {1, 50},
+	rarity = 4,
+	cost = 0.5,
+	acid_proof = true,
+}
+
+newEntity{
+	name = "giant ", prefix=true,
+	level_range = {1, 50},
+	rarity = 5,
+	cost = 0.5,
+	multicharge = resolvers.mbonus(4, 2),
+}
diff --git a/game/modules/tome/data/general/objects/egos/scrolls.lua b/game/modules/tome/data/general/objects/egos/scrolls.lua
new file mode 100644
index 0000000000000000000000000000000000000000..cf5d87cc3c71d73c9aa0a4c97129ad234825c90e
--- /dev/null
+++ b/game/modules/tome/data/general/objects/egos/scrolls.lua
@@ -0,0 +1,7 @@
+newEntity{
+	name = "fire-proof ", prefix=true,
+	level_range = {1, 50},
+	rarity = 4,
+	cost = 0.5,
+	acid_proof = true,
+}
diff --git a/game/modules/tome/data/general/objects/objects.lua b/game/modules/tome/data/general/objects/objects.lua
index f0b9326166b6a9b140305e994f1a3ac69d4a6d96..7309971e4768c1766161d7776441ad8e82a026ce 100644
--- a/game/modules/tome/data/general/objects/objects.lua
+++ b/game/modules/tome/data/general/objects/objects.lua
@@ -1,5 +1,6 @@
 -- Usable stuff
 load("/data/general/objects/potions.lua")
+load("/data/general/objects/scrolls.lua")
 
 -- Jewelry stuff
 load("/data/general/objects/jewelry.lua")
diff --git a/game/modules/tome/data/general/objects/potions.lua b/game/modules/tome/data/general/objects/potions.lua
index 9824a4afdb6fcaae2e87c236605dbffbe8d9c69d..ad2670d63bb41c45f7e1059739735ee53c798225 100644
--- a/game/modules/tome/data/general/objects/potions.lua
+++ b/game/modules/tome/data/general/objects/potions.lua
@@ -4,7 +4,9 @@ newEntity{
 	display = "!", color=colors.WHITE, image="object/potion-0x0.png",
 	encumber = 0.2,
 	stacking = true,
+	acid_destroy = 20,
 	desc = [[Magical potions can have wildly different effects, from healing to killing you, beware! Most of them function better with a high Magic score]],
+	egos = "/data/general/objects/egos/potions.lua", egos_chance = resolvers.mbonus(10, 5),
 }
 
 -------------------------------------------------------
@@ -138,7 +140,7 @@ newEntity{ base = "BASE_POTION",
 	use_simple = { name="cures poison", use = function(self, who)
 		if who:hasEffect(who.EFF_POISONED) then
 			who:removeEffect(who.EFF_POISONED)
-			game.logSeen(who, "%s cures %s from poisoning!", self:getName():capitalize(), who.name)
+			game.logSeen(who, "%s cure %s from poisoning!", self:getName():capitalize(), who.name)
 			return "destroy", true
 		end
 		return "destroy", false
@@ -206,4 +208,3 @@ newEntity{ base = "BASE_POTION",
 		return "destroy", true
 	end}
 }
-
diff --git a/game/modules/tome/data/general/objects/scrolls.lua b/game/modules/tome/data/general/objects/scrolls.lua
new file mode 100644
index 0000000000000000000000000000000000000000..78ae66c791f9ff5e7391d4b5ed10fe64ecfc9b23
--- /dev/null
+++ b/game/modules/tome/data/general/objects/scrolls.lua
@@ -0,0 +1,89 @@
+newEntity{
+	define_as = "BASE_SCROLL",
+	type = "scroll", subtype="scroll",
+	display = "?", color=colors.WHITE, image="object/scroll-0x0.png",
+	encumber = 0.1,
+	stacking = true,
+	fire_destroy = 20,
+	desc = [[Magical scrolls can have wildly different effects! Most of them function better with a high Magic score]],
+	egos = "/data/general/objects/egos/scrolls.lua", egos_chance = resolvers.mbonus(10, 5),
+}
+
+newEntity{ base = "BASE_SCROLL",
+	name = "scroll of light",
+	level_range = {1, 40},
+	rarity = 3,
+	cost = 1,
+
+	use_simple = { name="light up the surrounding area", use = function(self, who)
+		self:project({type="ball", range=0, friendlyfire=false, radius=15}, self.x, self.y, DamageType.LIGHT, 1)
+		game.logSeen(who, "%s reads a %s!", who.name:capitalize(), self:getName())
+		return "destroy", true
+	end}
+}
+
+newEntity{ base = "BASE_SCROLL",
+	name = "scroll of phase door",
+	level_range = {1, 30},
+	rarity = 4,
+	cost = 3,
+
+	use_simple = { name="teleport you randomly over a short distance", use = function(self, who)
+		who:teleportRandom(x, y, 15)
+		game.logSeen(who, "%s reads a %s!", who.name:capitalize(), self:getName())
+		return "destroy", true
+	end}
+}
+
+newEntity{ base = "BASE_SCROLL",
+	name = "scroll of teleportation",
+	level_range = {10, 40},
+	rarity = 8,
+	cost = 4,
+
+	use_simple = { name="teleport you anywhere and the level, randomly", use = function(self, who)
+		who:teleportRandom(x, y, 200)
+		game.logSeen(who, "%s reads a %s!", who.name:capitalize(), self:getName())
+		return "destroy", true
+	end}
+}
+
+newEntity{ base = "BASE_SCROLL",
+	name = "scroll of recall",
+	level_range = {10, 50},
+	rarity = 8,
+	cost = 2,
+
+	use_simple = { name="recall to your base town.", use = function(self, who)
+		error("****************** IMPLEMENT SCROLL OF RECALL ****************")
+		who:recall()
+		game.logSeen(who, "%s reads a %s!", who.name:capitalize(), self:getName())
+		return "destroy", true
+	end}
+}
+
+newEntity{ base = "BASE_SCROLL",
+	name = "scroll of magic mapping",
+	level_range = {1, 50},
+	rarity = 5,
+	cost = 3,
+
+	use_simple = { name="map the area directly around you", use = function(self, who)
+		who:magicMap(20)
+		game.logSeen(who, "%s reads a %s!", who.name:capitalize(), self:getName())
+		return "destroy", true
+	end}
+}
+
+newEntity{ base = "BASE_SCROLL",
+	name = "scroll of enemies detection",
+	level_range = {15, 35},
+	rarity = 4,
+	cost = 5,
+
+	use_simple = { name="detect enemies within a certain range", use = function(self, who)
+		who:detect(game.level.map.ACTOR, 20)
+		game.logSeen(who, "%s reads a %s!", who.name:capitalize(), self:getName())
+		return "destroy", true
+	end}
+}
diff --git a/game/modules/tome/data/general/objects/world-artifacts.lua b/game/modules/tome/data/general/objects/world-artifacts.lua
index ca6a7bf6c273b266f79e18327b06162624b327f7..04d9ca15fb91273e69755a68c5a2f58610fd81bf 100644
--- a/game/modules/tome/data/general/objects/world-artifacts.lua
+++ b/game/modules/tome/data/general/objects/world-artifacts.lua
@@ -9,7 +9,7 @@ newEntity{
 	encumber = 6,
 	rarity = 100,
 	desc = [[This unique looking staff is carved with runes of destruction.]],
-	cost = 10000,
+	cost = 5000,
 
 	require = { stat = { mag=24 }, },
 	combat = {
diff --git a/game/modules/tome/data/talents/physical/2hweapon.lua b/game/modules/tome/data/talents/physical/2hweapon.lua
index af089e3b838e415250b3e243de82881a07d42fa8..c2993bc1e1760bc3a7cd4643ed6dd8ec7d092141 100644
--- a/game/modules/tome/data/talents/physical/2hweapon.lua
+++ b/game/modules/tome/data/talents/physical/2hweapon.lua
@@ -39,7 +39,7 @@ newTalent{
 	type = {"physical/2hweapon", 2},
 	points = 5,
 	cooldown = 30,
-	stamina = 15,
+	stamina = 30,
 	require = { stat = { str=22 }, },
 	action = function(self, t)
 		local weapon = self:getInven("MAINHAND")[1]
@@ -81,12 +81,13 @@ newTalent{
 		return true
 	end,
 	info = function(self)
-		return ([[Hits the target with your weapon, if the atatck hits, the target is stunned.]])
+		return ([[Tries to perform a killing blow, granting automatic critical hit. If the target ends up with low enough life it might be instantly killed.
+		At level 4 it drains all remaining stamina and uses it to increase the blow damage.]])
 	end,
 }
 
 newTalent{
-	name = "Death Danse",
+	name = "Death Dance",
 	type = {"physical/2hweapon", 3},
 	points = 5,
 	cooldown = 10,
@@ -95,7 +96,7 @@ newTalent{
 	action = function(self, t)
 		local weapon = self:getInven("MAINHAND")[1]
 		if not weapon or not weapon.twohanded then
-			game.logPlayer(self, "You cannot use Death Danse without a two handed weapon!")
+			game.logPlayer(self, "You cannot use Death Dance without a two handed weapon!")
 			return nil
 		end
 
diff --git a/game/modules/tome/data/talents/spells/fire.lua b/game/modules/tome/data/talents/spells/fire.lua
index e8f4b8b51685b38e62f56306b08f8fc9ffc1967d..d97844066c1c9ff77250da3e62063dcbc6598b54 100644
--- a/game/modules/tome/data/talents/spells/fire.lua
+++ b/game/modules/tome/data/talents/spells/fire.lua
@@ -12,13 +12,13 @@ newTalent{
 		local tg = {type="bolt", range=self:getTalentRange(t)}
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
-		self:project(tg, x, y, DamageType.FIREBURN, self:spellCrit(15 + self:combatSpellpower(0.4) * self:getTalentLevel(t)))
+		self:project(tg, x, y, DamageType.ACID, self:spellCrit(15 + self:combatSpellpower(0.8) * self:getTalentLevel(t)))
 		return true
 	end,
 	require = { stat = { mag=10 }, },
 	info = function(self, t)
 		return ([[Conjures up a bolt of fire setting the target ablaze and doing %0.2f fire damage over 3 turns.
-		The damage will increase with the Magic stat]]):format(15 + self:combatSpellpower(0.4) * self:getTalentLevel(t))
+		The damage will increase with the Magic stat]]):format(15 + self:combatSpellpower(0.8) * self:getTalentLevel(t))
 	end,
 }
 
diff --git a/game/modules/tome/data/zones/tower-amon-sul/zone.lua b/game/modules/tome/data/zones/tower-amon-sul/zone.lua
index b182ee1f151435c59434effcf6cef8bd1752fd93..a73f3476d6d76d32dac05aa08ea883b0b164cbfc 100644
--- a/game/modules/tome/data/zones/tower-amon-sul/zone.lua
+++ b/game/modules/tome/data/zones/tower-amon-sul/zone.lua
@@ -4,7 +4,7 @@ return {
 	level_scheme = "player",
 	max_level = 5,
 	width = 50, height = 50,
-	all_remembered = true,
+--	all_remembered = true,
 --	all_lited = true,
 --	persistant = true,
 	generator =  {