diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua
index 86911b867de1cf38f4f9edbf4823e2e24d023f5c..51383b02d81ace7594230f72df00b470677100ca 100644
--- a/game/modules/tome/class/Game.lua
+++ b/game/modules/tome/class/Game.lua
@@ -603,7 +603,6 @@ function _M:setupCommands()
 				self.player.esp.all = 1
 				self.player.esp.range = 50
 				self.player.inc_damage.all = 100000
-				self.player:grantQuest("escort-duty")
 			end
 		end,
 		[{"_f","ctrl"}] = function()
@@ -633,8 +632,9 @@ function _M:setupCommands()
 		end,
 		[{"_g","ctrl"}] = function()
 			if config.settings.tome.cheat then
-				self:changeLevel(1, "town-minas-tirith")
-				self.player:grantQuest("east-portal")
+				self:changeLevel(1, "tannen-tower")
+--				self:changeLevel(1, "town-minas-tirith")
+--				self.player:grantQuest("east-portal")
 			end
 		end,
 	}
diff --git a/game/modules/tome/data/chats/east-portal-end.lua b/game/modules/tome/data/chats/east-portal-end.lua
new file mode 100644
index 0000000000000000000000000000000000000000..c160c7120aba7fd494c799df774dfb57fcb960da
--- /dev/null
+++ b/game/modules/tome/data/chats/east-portal-end.lua
@@ -0,0 +1,31 @@
+-- ToME - Tales of Middle-Earth
+-- Copyright (C) 2009, 2010 Nicolas Casalini
+--
+-- 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 3 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, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+newChat{ id="welcome",
+	text = [[#LIGHT_GREEN#*As you step out of the portal you notice a human standing there, he wears a robe.*#WHITE#
+Well met @playername@!
+I am Meranas, Herald of Angolwen, I have come here at the request of King Eldarion who got worried about not seeing you coming back.
+It has been some time we watched Tannen, and you revealed his true nature - and stopped him. For this we are grateful, and I think we can pay you back.
+We have studied his portal research and if you give me the components I will create the portal for you, here and now!]],
+	answers = {
+		{"Yes Tannen was not exactly friendly. I thank you for your help, here are the components. [hand him the diamon and the athame]", action=function(npc, player) who:hasQuest("east-portal"):create_portal(npc, player) end},
+	}
+}
+
+return "welcome"
diff --git a/game/modules/tome/data/chats/tannen.lua b/game/modules/tome/data/chats/tannen.lua
index 65edc6619021de210b5a1e105192f78900888e0b..5ecd9ac2bb3d6366bb342cfa1737a8fb8450098c 100644
--- a/game/modules/tome/data/chats/tannen.lua
+++ b/game/modules/tome/data/chats/tannen.lua
@@ -149,7 +149,7 @@ newChat{ id="no_orb_loan3",
 }
 
 newChat{ id="orb_loan",
-	text = [[Fear not. Return in a few days, and I'll have everything prepared. Oh, take this #LIGHT_GREEN#*He hands you a key*#WHITE#. It opens the ruins of Orthanc, which the Mystics of Gondor sealed many years ago. If you happen to find a text in the ruins entitled "Inverted and Reverted Probabilistic Fields," return with it and your odds of surviving our portal attempt will go up drastically.]],
+	text = [[Fear not. Return in a few days, and I'll have everything prepared. Oh, take this #LIGHT_GREEN#*He hands you a key*#WHITE#. It opens the ruins of Orthanc, which the Mystics of Gondor sealed many years ago. If you happen to find a text in the ruins entitled "Inverted and Reverted Probabilistic Fields", return with it and your odds of surviving our portal attempt will go up drastically.]],
 	answers = {
 		{"Thank you, and farewell.", action=function(npc, player) player:hasQuest("east-portal"):open_orthanc(player) end},
 	}
diff --git a/game/modules/tome/data/maps/zones/tannen-tower-1.lua b/game/modules/tome/data/maps/zones/tannen-tower-1.lua
new file mode 100644
index 0000000000000000000000000000000000000000..7d1f5ccc24c420855220a02708835638d9aa3c19
--- /dev/null
+++ b/game/modules/tome/data/maps/zones/tannen-tower-1.lua
@@ -0,0 +1,56 @@
+-- ToME - Tales of Middle-Earth
+-- Copyright (C) 2009, 2010 Nicolas Casalini
+--
+-- 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 3 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, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+-- defineTile section
+defineTile("g", "FLOOR", nil, "DROLEM")
+defineTile("X", "HARDWALL")
+defineTile("=", "SKY")
+defineTile("p", "FLOOR", nil, "TANNEN")
+defineTile(">", "DOWN")
+defineTile(".", "FLOOR")
+
+-- addSpot section
+
+-- ASCII map section
+return [[
+=========================
+==========XXXXX==========
+=======...........=======
+=====X.............X=====
+====XX.............XX====
+===XX...............XX===
+===...................===
+==.....................==
+==...p.................==
+==.....................==
+=X.....................X=
+=X.....................X=
+=X.........g...........X=
+=X.....................X=
+=X.....................X=
+==.....................==
+==.....................==
+==.....................==
+===...................===
+===XX...............XX===
+====XX.............XX====
+=====X.............X=====
+=======...........=======
+==========XXXXX==========
+=========================]]
diff --git a/game/modules/tome/data/maps/zones/tannen-tower-2.lua b/game/modules/tome/data/maps/zones/tannen-tower-2.lua
new file mode 100644
index 0000000000000000000000000000000000000000..36ba9e81018fe490c4bb81041fe89cce1ced40a1
--- /dev/null
+++ b/game/modules/tome/data/maps/zones/tannen-tower-2.lua
@@ -0,0 +1,58 @@
+-- ToME - Tales of Middle-Earth
+-- Copyright (C) 2009, 2010 Nicolas Casalini
+--
+-- 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 3 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, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+startx = 19
+starty = 4
+
+-- defineTile section
+defineTile("X", "HARDWALL")
+defineTile("+", "DOOR")
+defineTile("<", "UP")
+defineTile(">", "DOWN")
+defineTile(".", "FLOOR")
+
+-- addSpot section
+
+-- ASCII map section
+return [[
+XXXXXXXXXXXXXXXXXXXXXXXXX
+XXXXXXXXXX.....XXXXXXXXXX
+XXXXXXX....XXX....XXXXXXX
+XXXXX...XXXXXXXXX...XXXXX
+XXXX..XXX...X...XXX>.XXXX
+XXX..XX.....X.....XX..XXX
+XXX.XX......+......XX.XXX
+XX..X.......X.......X..XX
+XX.XX.......X.......XX.XX
+XX.X.......XXX.......X.XX
+X..X......+X.XX......X..X
+X.XX.....XX...XX.....XX.X
+X.XXXXXXXX..<..XXX+XXXX.X
+X.XX.....XX...XX.....XX.X
+X..X......XX.XX......X..X
+XX.X.......XXX.......X.XX
+XX.XX.......X.......XX.XX
+XX..+.......X.......X..XX
+XXX.XX......+......XX.XXX
+XXX..XX.....X.....XX..XXX
+XXXX..XXX...X...XXX..XXXX
+XXXXX...XXXXXXXXX...XXXXX
+XXXXXXX....XXX....XXXXXXX
+XXXXXXXXXX.....XXXXXXXXXX
+XXXXXXXXXXXXXXXXXXXXXXXXX]]
diff --git a/game/modules/tome/data/maps/zones/tannen-tower-3.lua b/game/modules/tome/data/maps/zones/tannen-tower-3.lua
index f5104deb3fc5fb7c6ac452e3fa9d409fd16fbd79..b0058ed5983ef85e8440184ccb5cb7671ad3b906 100644
--- a/game/modules/tome/data/maps/zones/tannen-tower-3.lua
+++ b/game/modules/tome/data/maps/zones/tannen-tower-3.lua
@@ -17,72 +17,42 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
-startx = 5
+startx = 19
 starty = 14
 
 -- defineTile section
-defineTile("U", "LAVA_FLOOR", nil, {random_filter={type="demon"}})
-defineTile('"', "OLD_FLOOR", nil, {random_filter={name="greater multi-hued wyrm",add_levels=12}})
-defineTile("#", "OLD_WALL")
-defineTile("E", "GRASS", nil, {random_filter={type="elemental"}})
-defineTile("$", "FLOOR", nil, {random_filter={type="undead", subtype="giant"}})
 defineTile("X", "HARDWALL")
-defineTile("~", "LAVA_FLOOR")
-defineTile("*", "SEALED_DOOR")
-defineTile("+", "DOOR")
+defineTile("~", "DEEP_WATER")
 defineTile("<", "UP")
-defineTile(",", "GRASS")
+defineTile(">", "DOWN")
 defineTile(".", "FLOOR")
-defineTile(" ", "OLD_FLOOR")
-defineTile("!", "WALL")
-defineTile("T", "TREE")
 
-addData{post_process = function(level)
-	level.nb_to_open = 0
-	level.open_doors = function()
-		local doors = {{11,12},{12,11},{13,12},{12,13}}
-		local g = game.zone:makeEntityByName(game.level, "terrain", "SEALED_DOOR_CRACKED")
-		for i, d in ipairs(doors) do game.zone:addEntity(game.level, g, "terrain", d[1], d[2]) end
-		game.logPlayer(game.player, "#VIOLET#There is a loud crack coming from the center of the level.")
-	end
-
-	-- Need to kill them all
-	for uid, a in pairs(level.entities) do
-		if a.faction and game.player:reactionToward(a) < 0 then
-			level.nb_to_open = level.nb_to_open + 1
-			a.old_on_die = a.on_die
-			a.on_die = function(self, who)
-				game.level.nb_to_open = game.level.nb_to_open - 1
-				if game.level.nb_to_open <= 0 then game.level.open_doors() end
-			end
-		end
-	end
-end}
+-- addSpot section
 
 -- ASCII map section
 return [[
 XXXXXXXXXXXXXXXXXXXXXXXXX
-XXXXXXXXXX.+.+.XXXXXXXXXX
-XXXXXXX....X+X....XXXXXXX
-XXXXX...X+XX.XXXX...XXXXX
-XXXX..XX# #X.X!~XXX..XXXX
-XXX..XXX# #X.XU!~!+X..XXX
-XXX.XX### #X.X!~!U!+X.XXX
-XX..X##   #X.X~!U!~!X..XX
-XX.XX#    #X.X!~!~!UXX.XX
-XX.XX#  " #X.XU!~!U!~X.XX
-X..XX######X.X!U!~!~!X..X
-X+XXXXXXXXXX*XXXXXXXXXX+X
-X.+........*<*........+.X
-X+XXXXXXXXXX*XXX+XXXXXX+X
-X..XX......X.XX,,,XXXX..X
-XX.XX......X.XEE,EEXXX.XX
-XX.XX......X.XEETEEXXX.XX
-XX..X....$$X.XEE,EEXX..XX
-XXX.XXXXXX+X.XX,,,XXX.XXX
-XXX..XX.$..X.XXXXXXX..XXX
-XXXX..X+XXXX.XXXXXX..XXXX
-XXXXX...XXXX.XXXX...XXXXX
-XXXXXXX....X+X....XXXXXXX
-XXXXXXXXXX.+.+.XXXXXXXXXX
+XXXXXXXXXX~~~~~XXXXXXXXXX
+XXXXXXX~~~.XXX~~~~XXXXXXX
+XXXXX~~~XXXXXXXXX~~~XXXXX
+XXXX~~XXXXXXXXXXXXX<~XXXX
+XXX~~XXXXXXXXXXXXXXX~~XXX
+XXX~XX~~~~~~~~~~~~~XX~XXX
+XX~~XX~XXXXXXXXXXX~XX~~XX
+XX~XXX~X~~.~~~~~~X.XXX~XX
+XX~XXX~X~XXXXXXX~X~XXX~XX
+X~~XXX~X~X~~~~~X~X~XXX~~X
+X~XXXX~X~X~XXX~X~X~XXXX~X
+X~XXXX~X~X~~>X~X~X~XXXX~X
+X~XXXX~X~XXXXX~X~X~XXXX~X
+X~~XXX.X~~~~~~~X~X~XXX~~X
+XX~XXX~XXXXXXXXX~X~XXX~XX
+XX.XXX~~~~~~~~~~~X~XXX~XX
+XX~~XXXXXXXXXXXXXX~XX~.XX
+XXX~~~~~~~~~~~.~~~~XX~XXX
+XXX~~XXXXXXXXXXXXXXX~~XXX
+XXXX~~XXXXXXXXXXXXX~~XXXX
+XXXXX~~~XXXXXXXXX~~~XXXXX
+XXXXXXX~~~.XXX~~~~XXXXXXX
+XXXXXXXXXX~~~~~XXXXXXXXXX
 XXXXXXXXXXXXXXXXXXXXXXXXX]]
diff --git a/game/modules/tome/data/quests/east-portal.lua b/game/modules/tome/data/quests/east-portal.lua
index 7c90b9f1cead2ffaeb1a3b5548b0a12729276da5..b0b31e029cf9786e99cfa0b9b7c1719ab9f2cba9 100644
--- a/game/modules/tome/data/quests/east-portal.lua
+++ b/game/modules/tome/data/quests/east-portal.lua
@@ -56,7 +56,17 @@ desc = function(self, who)
 	return table.concat(desc, "\n")
 end
 
+on_status_change = function(self, who, status, sub)
+	if sub then
+		if self:isCompleted("orb-back") and self:isCompleted("diamon-back") and self:isCompleted("athame-back") then
+			self:tannen_exit(who)
+		end
+	end
+end
+
 create_portal = function(self, npc, player)
+	self:remove_materials(player)
+
 	-- Farportal
 	local g = mod.class.Grid.new{
 		name = "Farportal: Gates of Morning",
@@ -80,10 +90,10 @@ This one seems to go near the Gates of Morning in the Far East.]],
 	}
 	g:resolve() g:resolve(nil, true)
 
-	game.zone:addEntity(game.level, g, "terrain", 20, 36)
-	game.level.map:particleEmitter(20, 36, 3, "farportal_lightning")
-	game.level.map:particleEmitter(20, 36, 3, "farportal_lightning")
-	game.level.map:particleEmitter(20, 36, 3, "farportal_lightning")
+	game.zone:addEntity(game.level, g, "terrain", 13, 43)
+	game.level.map:particleEmitter(13, 43, 3, "farportal_lightning")
+	game.level.map:particleEmitter(13, 43, 3, "farportal_lightning")
+	game.level.map:particleEmitter(13, 43, 3, "farportal_lightning")
 
 	player:setQuestStatus(self.id, engine.Quest.DONE)
 	world:gainAchievement("EAST_PORTAL", game.player)
@@ -149,3 +159,33 @@ tannen_tower = function(self, player)
 	game:changeLevel(4, "tannen-tower")
 	player:setQuestStatus(self.id, engine.Quest.COMPLETED, "trapped")
 end
+
+tannen_exit = function(self, player)
+	require("engine.ui.Dialog"):simplePopup("Back and there again", "A portal appears in the center of the tower!")
+	local g = game.zone:makeEntityByName(game.level, "terrain", "PORTAL_BACK")
+	game.zone:addEntity(game.level, g, "terrain", 12, 12)
+end
+
+back_to_minas_tirith = function(self)
+	-- TP minas tirith
+	game:changeLevel(1, "town-minas-tirith")
+	-- Move to the portal spot
+	game.player:move(12, 43, true)
+	-- Remove tannen
+	game.level.map(10, 16, engine.Map.TERRAIN, game.level.map(10, 15, engine.Map.TERRAIN))
+
+	-- Add the mage
+	local g = mod.class.NPC.new{
+		name="Meranas, Herald of Angolwen",
+		type="humanoid", subtype="human", faction="angolwen",
+		display='@', color=colors.RED,
+	}
+	g:resolve() g:resolve(nil, true)
+	game.zone:addEntity(game.level, g, "actor", 12, 42)
+	game.level.map:particleEmitter(12, 42, 1, "teleport")
+
+	local Chat = require("engine.Chat")
+	local chat = Chat.new("east-portal-end", g, game.player)
+	chat:invoke()
+	game.logPlayer(who, "#VIOLET#You enter the swirling portal and in the blink of an eye you are back to Minas Tirith.")
+end
diff --git a/game/modules/tome/data/talents/spells/explosives.lua b/game/modules/tome/data/talents/spells/explosives.lua
index c6ec7d12e2f83bdf5e2aec454724c06f0c01dfc9..fc408943019c65302bb4c44fb0c7d813714cd87e 100644
--- a/game/modules/tome/data/talents/spells/explosives.lua
+++ b/game/modules/tome/data/talents/spells/explosives.lua
@@ -58,7 +58,10 @@ newTalent{
 
 		local dam, damtype, particle = t.computeDamage(self, t, ammo)
 		local prot = self:getTalentLevelRaw(self.T_ALCHEMIST_PROTECTION) * 0.2
-		local golem = game.level:hasEntity(self.alchemy_golem) and self.alchemy_golem or nil
+		local golem
+		if self.alchemy_golem then
+			golem = game.level:hasEntity(self.alchemy_golem) and self.alchemy_golem or nil
+		end
 		local dam_done = 0
 
 		local grids = self:project(tg, x, y, function(tx, ty)
@@ -190,7 +193,10 @@ newTalent{
 
 		local dam, damtype, particle = t.computeDamage(self, t, ammo)
 		local prot = self:getTalentLevelRaw(self.T_ALCHEMIST_PROTECTION) * 0.2
-		local golem = game.level:hasEntity(self.alchemy_golem) and self.alchemy_golem or nil
+		local golem
+		if self.alchemy_golem then
+			golem = game.level:hasEntity(self.alchemy_golem) and self.alchemy_golem or nil
+		end
 		local dam_done = 0
 
 		local tmp = {}
diff --git a/game/modules/tome/data/talents/spells/fire-alchemy.lua b/game/modules/tome/data/talents/spells/fire-alchemy.lua
index ea7a4669856ad4e45328abddc1c923957af65f4f..02fd1c6c668ef2b4aaf8f9d629f542e6ed05b3b6 100644
--- a/game/modules/tome/data/talents/spells/fire-alchemy.lua
+++ b/game/modules/tome/data/talents/spells/fire-alchemy.lua
@@ -135,7 +135,7 @@ newTalent{
 	sustain_mana = 250,
 	points = 5,
 	range = 1,
-	proj_speed = 1.3,
+	proj_speed = 2.4,
 	range = 12,
 	do_fire = function(self, t)
 		if self:getMana() <= 0 then
diff --git a/game/modules/tome/data/zones/paths-of-the-dead/zone.lua b/game/modules/tome/data/zones/paths-of-the-dead/zone.lua
index 1f1842fc3d0836beef36c502e09382d12420c64e..67422682f119c783139f9d8dce923ad2a2cd30b2 100644
--- a/game/modules/tome/data/zones/paths-of-the-dead/zone.lua
+++ b/game/modules/tome/data/zones/paths-of-the-dead/zone.lua
@@ -23,7 +23,7 @@ return {
 	level_scheme = "player",
 	max_level = 8,
 	decay = {300, 800},
-	actor_adjust_level = function(zone, level, e) return 1 + zone.max_level - (zone.base_level + e:getRankLevelAdjust() + level.level-1 + rng.range(-1,2)) end,
+	actor_adjust_level = function(zone, level, e) return zone.base_level + e:getRankLevelAdjust() + (zone.max_level - level.level) + rng.range(-1,2) end,
 	level_adjust_level = function(zone, level) return zone.base_level + (zone.max_level - level.level) end,
 	width = 50, height = 50,
 --	all_remembered = true,
diff --git a/game/modules/tome/data/zones/tannen-tower/grids.lua b/game/modules/tome/data/zones/tannen-tower/grids.lua
index f8265c65d62f7c9052b00b5651612d37d4e60a51..941796b8efc9ec70560a1d2f432c5189e5ed1667 100644
--- a/game/modules/tome/data/zones/tannen-tower/grids.lua
+++ b/game/modules/tome/data/zones/tannen-tower/grids.lua
@@ -21,6 +21,7 @@ load("/data/general/grids/basic.lua")
 load("/data/general/grids/forest.lua")
 load("/data/general/grids/water.lua")
 load("/data/general/grids/lava.lua")
+load("/data/general/grids/mountain.lua")
 
 newEntity{
 	define_as = "SEALED_DOOR",
@@ -39,3 +40,23 @@ newEntity{
 	notice = true,
 	always_remember = true,
 }
+
+newEntity{
+	define_as = "PORTAL_BACK",
+	name = "Portal to Minas Tirith",
+	display = '&', color_r=255, color_g=0, color_b=220, back_color=colors.VIOLET,
+	notice = true,
+	always_remember = true,
+	show_tooltip = true,
+	desc = [[This portal seems to be connected with Minas Tirith, you could probably use it to go back.]],
+
+	on_move = function(self, x, y, who)
+		if who == game.player then
+			require("engine.ui.Dialog"):yesnoPopup("Back and there again", "Enter the portal back to Minas Tirith?", function(ret)
+				if not ret then
+					game.player:hasQuest("east-portal"):back_to_minas_tirith()
+				end
+			end, "Stay", "Enter")
+		end
+	end,
+}
diff --git a/game/modules/tome/data/zones/tannen-tower/npcs.lua b/game/modules/tome/data/zones/tannen-tower/npcs.lua
index c9959d54bdee6a5d79e2b8fccada3af06ed021e4..527aa4dcde8332ec9d4526f420a3a626a5d00b45 100644
--- a/game/modules/tome/data/zones/tannen-tower/npcs.lua
+++ b/game/modules/tome/data/zones/tannen-tower/npcs.lua
@@ -23,65 +23,123 @@ load("/data/general/npcs/ghost.lua", rarity(4))
 load("/data/general/npcs/bone-giant.lua", rarity(3))
 load("/data/general/npcs/faeros.lua", rarity(4))
 load("/data/general/npcs/gwelgoroth.lua", rarity(4))
+load("/data/general/npcs/aquatic_critter.lua", function(e) if e.rarity then e.aquatic_rarity, e.rarity = e.rarity, nil end end)
+load("/data/general/npcs/aquatic_demon.lua", function(e) if e.rarity then e.aquatic_rarity, e.rarity = e.rarity, nil end end)
 
 load("/data/general/npcs/all.lua", rarity(4, 35))
 
 local Talents = require("engine.interface.ActorTalents")
 
-newEntity{ define_as = "SHADE_OF_SARUMAN",
-	type = "undead", subtype = "ghost", unique = true,
-	name = "The Shade of Saruman",
-	display = "G", color=colors.VIOLET,
-	desc = [[Everybody though Saruman dead and his spirit destroyed, but it seems he still lingers in his old place of power.]],
-	level_range = {38, nil}, exp_worth = 3,
-	max_life = 250, life_rating = 22, fixed_rating = true,
+newEntity{ define_as = "TANNEN",
+	type = "humanoid", subtype = "human", unique = true,
+	name = "Tannen",
+	display = "p", color=colors.VIOLET,
+	desc = [[The traitor has been revealed, and he does not intend to let you escape to tell the tale.]],
+	level_range = {35, nil}, exp_worth = 2,
+	max_life = 250, life_rating = 16, fixed_rating = true,
+	max_mana = 850, mana_regen = 40,
+	mana_regen = 15,
 	rank = 4,
-	size_category = 3,
+	size_category = 2,
 	infravision = 20,
-	stats = { str=1, dex=14, cun=34, mag=25, con=10 },
+	stats = { str=10, dex=12, cun=14, mag=25, con=16 },
+	movement_speed = 1.4,
 
-	combat_def = 40, combat_armor = 30,
+	instakill_immune = 1,
+	blind_immune = 1,
 
-	undead = 1,
-	no_breath = 1,
-	stone_immune = 1,
-	confusion_immune = 1,
-	fear_immune = 1,
-	teleport_immune = 0.5,
-	disease_immune = 1,
-	poison_immune = 1,
-	stun_immune = 1,
+	body = { INVEN = 10, MAINHAND=1, OFFHAND=1, BODY=1, QUIVER=1, },
+	equipment = resolvers.equip{
+		{type="weapon", subtype="staff", ego_chance=100, autoreq=true},
+		{type="armor", subtype="cloth", ego_chance=100, autoreq=true},
+	},
+	resolvers.drops{chance=100, nb=4, {ego_chance=100} },
+	resolvers.drops{chance=100, nb=1, {defined="ORB_MANY_WAYS2"} },
+	resolvers.drops{chance=100, nb=1, {defined="ATHAME_WEST2"} },
+
+	resists = { [DamageType.ACID] = 100, },
+
+	resolvers.talents{
+		[Talents.T_THROW_BOMB]=4,
+		[Talents.T_CHANNEL_STAFF]=5,
+		[Talents.T_STAFF_MASTERY]=5,
+		[Talents.T_ALCHEMIST_PROTECTION]=5,
+		[Talents.T_SHOCKWAVE_BOMB]=4,
+		[Talents.T_HEAT]=4,
+		[Talents.T_BODY_OF_FIRE]=3,
+		[Talents.T_ACID_INFUSION]=5,
+		[Talents.T_STONE_TOUCH]=3,
+	},
+
+	resolvers.generic(function(self)
+		-- Make and wield some alchemist gems
+		local t = self:getTalentFromId(self.T_CREATE_ALCHEMIST_GEMS)
+		local gem = t.make_gem(self, t, "GEM_BLOODSTONE")
+		self:wearObject(gem, true, false)
+	end),
+
+	autolevel = "dexmage",
+	ai = "dumb_talented_simple", ai_state = {ai_target="target_player_radius", sense_radius=400, talent_in=1, ai_move="move_astar" },
+
+	on_die = function(self, who)
+		game.player:resolveSource():setQuestStatus("east-portal", engine.Quest.COMPLETED, "tannen-dead")
+	end,
+}
+
+newEntity{ define_as = "DROLEM",
+	type = "construct", subtype = "golem",
+	display = 'g', color=colors.GREEN,
+	desc = [[This is Tannen's construct, a #{bold}#HUGE#{normal}# golem in the rough shape of a dragon.
+It is so huge that it blocks sight beyond it.]],
+	level_range = {35, nil}, exp_worth=2,
+	max_life = 600, life_rating = 13, fixed_rating = true,
+
+	-- Special, the golem is HUGE and blocks LOS
+	block_sight = true,
+
+	combat = { dam=10, atk=10, apr=0, dammod={str=1} },
+
+	resists = { [DamageType.ACID] = 100, },
+
+	body = { INVEN = 50, MAINHAND=1, OFFHAND=1, BODY=1, HEAD=1, },
+	instakill_immune = 1,
 	blind_immune = 1,
-	see_invisible = 80,
+	infravision = 20,
+	see_invisible = 100,
+	rank = 4,
+	size_category = 5,
 	move_others=true,
 
-	can_pass = {pass_wall=70},
-	resists = {all = 25, [DamageType.COLD] = 100, [DamageType.ACID] = 100},
+	resolvers.talents{
+		[Talents.T_MASSIVE_ARMOUR_TRAINING]=5,
+		[Talents.T_HEAVY_ARMOUR_TRAINING]=5,
+		[Talents.T_WEAPON_COMBAT]=7,
+		[Talents.T_POISON_BREATH]=6,
+		[Talents.T_WEAPONS_MASTERY]=11,
+	},
+	resolvers.drops{chance=100, nb=1, {defined="RESONATING_DIAMOND_WEST2"} },
 
-	body = { INVEN = 10, MAINHAND=1, OFFHAND=1, },
 	resolvers.equip{
-		{type="weapon", subtype="staff", defined="SARUMAN_TOP_HALF", autoreq=true},
-		{type="weapon", subtype="staff", defined="SARUMAN_BOTTOM_HALF", autoreq=true},
+		{type="weapon", subtype="greatsword", ego_chance=100, autoreq=true},
+		{type="armor", subtype="massive", ego_chance=100, autoreq=true},
+		{type="armor", subtype="head", ego_chance=100, autoreq=true},
 	},
-	resolvers.drops{chance=100, nb=2, {type="wand"} },
 
-	resolvers.talents{
-		[Talents.T_ICE_SHARDS]=5,
-		[Talents.T_FREEZE]=5,
-		[Talents.T_TIDAL_WAVE]=5,
-		[Talents.T_ICE_STORM]=5,
-		[Talents.T_UTTERCOLD]=8,
-		[Talents.T_FROZEN_GROUND]=5,
-		[Talents.T_SHATTER]=5,
-		[Talents.T_CORROSIVE_VAPOUR]=5,
-		[Talents.T_CURSE_OF_IMPOTENCE]=5,
-		[Talents.T_VIRULENT_DISEASE]=5,
-	},
+	autolevel = "warrior",
+	ai = "dumb_talented_simple", ai_state = { ai_target="target_player_radius", sense_radius=400, talent_in=4, },
+	energy = { mod=1 },
+	stats = { str=14, dex=12, mag=10, wil=67, con=12 },
 
-	autolevel = "caster",
-	ai = "dumb_talented_simple", ai_state = { talent_in=1, ai_move="move_astar" },
+	open_door = true,
+	blind_immune = 1,
+	fear_immune = 1,
+	poison_immune = 1,
+	disease_immune = 1,
+	stone_immune = 1,
+	see_invisible = 30,
+	no_breath = 1,
 
 	on_die = function(self, who)
-		require("engine.ui.Dialog"):simpleLongPopup("Back and there again", 'As the shade dissipates you see no sign of the text entitled "Inverted and Reverted Probabilistic Fields". You should go back to Tannen.', 400)
+		game.player:resolveSource():setQuestStatus("east-portal", engine.Quest.COMPLETED, "drolem-dead")
 	end,
 }
diff --git a/game/modules/tome/data/zones/tannen-tower/objects.lua b/game/modules/tome/data/zones/tannen-tower/objects.lua
index 2c2edd1398893e07753c65235259b28c30b802c9..a34e44e0cfdc549f8a0e247fcae7610db6267403 100644
--- a/game/modules/tome/data/zones/tannen-tower/objects.lua
+++ b/game/modules/tome/data/zones/tannen-tower/objects.lua
@@ -21,43 +21,81 @@ load("/data/general/objects/objects.lua")
 
 local Stats = require "engine.interface.ActorStats"
 
-newEntity{ base = "BASE_STAFF",
-	define_as = "SARUMAN_TOP_HALF", rarity=false,
-	slot_forbid = false,
-	twohanded = false,
-	name = "Saruman's Staff Top Half", unique=true,
-	desc = [[The top part of Saruman's broken staff.]],
-	require = { stat = { mag=35 }, },
-	cost = 500,
-	combat = {
-		dam = 35,
-		apr = 0,
-		physcrit = 1.5,
-		dammod = {mag=1.0},
-	},
-	wielder = {
-		combat_spellpower = 25,
-		combat_spellcrit = 5,
-		combat_mentalresist = 8,
-		inc_stats = { [Stats.STAT_WIL] = 5, },
-	},
+newEntity{ base = "BASE_GEM",
+	define_as = "RESONATING_DIAMOND_WEST2",
+	name = "Resonating Diamond", color=colors.VIOLET, quest=true, unique="Resonating Diamond West2", identified=true,
+
+	on_drop = function(self, who)
+		if who == game.player then
+			game.logPlayer(who, "You cannot bring yourself to drop the %s", self:getName())
+			return true
+		end
+	end,
+	on_pickup = function(self, who)
+		if who == game.player then
+			game.player:resolveSource():setQuestStatus("east-portal", engine.Quest.COMPLETED, "diamon-back")
+		end
+	end,
+}
+
+newEntity{ define_as = "ATHAME_WEST2",
+	quest=true, unique="Blood-Runed Athame West2", identified=true,
+	type = "misc", subtype="misc",
+	unided_name = "athame",
+	name = "Blood-Runed Athame",
+	level_range = {50, 50},
+	display = "|", color=colors.VIOLET,
+	encumber = 1,
+	desc = [[An athame, covered in blood runes. It radiates power.]],
+
+	on_drop = function(self, who)
+		if who == game.player then
+			game.logPlayer(who, "You cannot bring yourself to drop the %s", self:getName())
+			return true
+		end
+	end,
+	on_pickup = function(self, who)
+		if who == game.player then
+			game.player:resolveSource():setQuestStatus("east-portal", engine.Quest.COMPLETED, "athame-back")
+		end
+	end,
 }
 
-newEntity{ base = "BASE_STAFF",
-	slot = "OFFHAND", slot_forbid = false,
-	twohanded = false, add_name=false,
-	define_as = "SARUMAN_BOTTOM_HALF", rarity=false,
-	name = "Saruman's Staff Bottom Half", unique=true,
-	desc = [[The bottom part of Saruman's broken staff.]],
-	require = { stat = { mag=35 }, },
-	cost = 500,
-	wielder = {
-		inc_stats = { [Stats.STAT_MAG] = 4, },
-		max_mana = 50,
-		combat_mentalresist = 8,
-		inc_damage={
-			[DamageType.COLD] = 20,
-			[DamageType.ACID] = 20,
-		},
+-- The orb of many ways, allows usage of Farportals
+newEntity{ define_as = "ORB_MANY_WAYS2",
+	unique = "Orb of Many Ways2", quest=true,
+	type = "jewelry", subtype="orb",
+	unided_name = "swirling orb",
+	name = "Orb of Many Ways",
+	level_range = {30, 30},
+	display = "*", color=colors.VIOLET, image = "object/pearl.png",
+	encumber = 1,
+	desc = [[The orb projects images of distance places, some that seem to not be of this world, switching rapidly.
+If used near a portal it could probably activate it.]],
+
+	max_power = 30, power_regen = 1,
+	use_power = { name = "activate a portal", power = 10,
+		use = function(self, who)
+			self:identify(true)
+			local g = game.level.map(who.x, who.y, game.level.map.TERRAIN)
+			if g and g.orb_portal then
+				world:gainAchievement("SLIDERS", who:resolveSource())
+				who:useOrbPortal(g.orb_portal)
+			else
+				game.logPlayer(who, "There is no portal to activate here.")
+			end
+		end
 	},
+
+	on_drop = function(self, who)
+		if who == game.player then
+			game.logPlayer(who, "You cannot bring yourself to drop the %s", self:getName())
+			return true
+		end
+	end,
+	on_pickup = function(self, who)
+		if who == game.player then
+			game.player:resolveSource():setQuestStatus("east-portal", engine.Quest.COMPLETED, "orb-back")
+		end
+	end,
 }
diff --git a/game/modules/tome/data/zones/tannen-tower/zone.lua b/game/modules/tome/data/zones/tannen-tower/zone.lua
index 7d78a89069cac641c3129e87f83250d2527dd408..31b6a36c1eedb70f9f01548fb3388b01ad48a0a8 100644
--- a/game/modules/tome/data/zones/tannen-tower/zone.lua
+++ b/game/modules/tome/data/zones/tannen-tower/zone.lua
@@ -23,7 +23,7 @@ return {
 	level_scheme = "player",
 	max_level = 4,
 	decay = {300, 800},
-	actor_adjust_level = function(zone, level, e) return 1 + zone.max_level - (zone.base_level + e:getRankLevelAdjust() + level.level-1 + rng.range(-1,2)) end,
+	actor_adjust_level = function(zone, level, e) return zone.base_level + e:getRankLevelAdjust() + (zone.max_level - level.level) + rng.range(-1,2) end,
 	level_adjust_level = function(zone, level) return zone.base_level + (zone.max_level - level.level) end,
 	width = 25, height = 25,
 	all_remembered = true,
@@ -57,8 +57,8 @@ return {
 	levels =
 	{
 		[1] = { generator = { map = { map = "zones/tannen-tower-1" }, }, },
-		[2] = { generator = { map = { map = "zones/tannen-tower-2" }, }, },
-		[3] = { generator = { map = { map = "zones/tannen-tower-3" }, }, },
+		[2] = { generator = { map = { map = "zones/tannen-tower-2" }, actor = { nb_npc = {22, 22}, }, trap = { nb_trap = {6, 6} }, }, },
+		[3] = { generator = { map = { map = "zones/tannen-tower-3" }, actor = { nb_npc = {22, 22}, filters={{special_rarity="aquatic_rarity"}} }, trap = { nb_trap = {6, 6} }, }, },
 		[4] = { generator = { map = { map = "zones/tannen-tower-4" }, }, },
 	},
 }