diff --git a/game/modules/tome/class/FortressPC.lua b/game/modules/tome/class/FortressPC.lua
index 2cf7a035b836573f690844aff1a3e7442c0f9387..d2e520123aed00ccf6e219925764e4ca41182c99 100644
--- a/game/modules/tome/class/FortressPC.lua
+++ b/game/modules/tome/class/FortressPC.lua
@@ -31,6 +31,7 @@ function _M:init(t, no_default)
 
 	self.name = "Yiilkgur, the Sher'Tul Fortress"
 	self.is_fortress = true
+	self.no_worldmap_encounter = true
 	self.allow_talents_worldmap = true
 	self.faction = game:getPlayer(true).faction
 	self.no_inventory_access = true
@@ -226,15 +227,23 @@ function _M:moveEngineMove(x, y, force)
 	return true
 end
 
+function _M:takeControl(from)
+	game.party:addMember(self, {temporary_level=1, control="full"})
+	game.party:setPlayer(self, true)
+	game.level.map:remove(from.x, from.y, engine.Map.ACTOR)
+end
+
 --- Checks if something bumps in us
 -- If it happens the method attack is called on the target with the attacker as parameter.
 -- Do not touch!
 function _M:block_move(x, y, e, act)
 	if act and e == game.player then
 		Dialog:yesnoPopup(self.name, "Do you wish to teleport to the fortress?", function(ret) if ret then
-			game.party:addMember(self, {temporary_level=1, control="full"})
-			game.party:setPlayer(self, true)
-			game.level.map:remove(e.x, e.y, engine.Map.ACTOR)
+			if not game.zone.wilderness then
+				Dialog:simplePopup(self.name, "The teleport fizzles!")
+				return
+			end
+			self:takeControl(e)
 		end end)
 	end
 	return false
diff --git a/game/modules/tome/data/chats/shertul-fortress-command-orb.lua b/game/modules/tome/data/chats/shertul-fortress-command-orb.lua
index 379baac6629ee17233812299c88016bfa0a8b504..8d96ec292771cb0ace3551de35874fd612fb7a6c 100644
--- a/game/modules/tome/data/chats/shertul-fortress-command-orb.lua
+++ b/game/modules/tome/data/chats/shertul-fortress-command-orb.lua
@@ -28,7 +28,7 @@ newChat{ id="welcome",
 #{italic}#"Rokzan krilt copru."#{normal}#]] or [[#WHITE#*#{italic}#"Insert control rod."#{normal}#]]),
 	answers = {
 		{"[Examine the orb]", jump="examine", cond=has_rod},
---		{"[Fly the fortress]", action=function(npc, player) player:hasQuest("shertul-fortress"):fly() end},
+		{"[Fly the fortress -- #LIGHT_RED#FOR TESTING ONLY#LAST#]", action=function(npc, player) player:hasQuest("shertul-fortress"):fly() end, cond=function() return config.settings.cheat end},
 		{"[Begin the Lichform ceremory]", cond=function(npc, player) local q = player:hasQuest("lichform") return q and q:check_lichform(player) end, action=function(npc, player) player:setQuestStatus("lichform", engine.Quest.COMPLETED) end},
 		{"[Leave the orb alone]"},
 	}
diff --git a/game/modules/tome/data/quests/shertul-fortress.lua b/game/modules/tome/data/quests/shertul-fortress.lua
index e6b41b0036bb037e57463fd4a053251e4a655830..70d18ba1a7ee47d1505feac007d8332f0c12794c 100644
--- a/game/modules/tome/data/quests/shertul-fortress.lua
+++ b/game/modules/tome/data/quests/shertul-fortress.lua
@@ -177,15 +177,33 @@ upgrade_transmo_gems = function(self)
 end
 
 fly = function(self)
-	game.player:learnLore("shertul-fortress-takeoff")
-
-	local f = require("mod.class.FortressPC").new{}
-	game:changeLevel(1, "wilderness", {direct_switch=true})
-	game.party:addMember(f, {temporary_level=1, control="full"})
-	f.x = game.player.x
-	f.y = game.player.y
-	game.party:setPlayer(f, true)
-	game.level:addEntity(f)
-	game.level.map:remove(f.x, f.y, engine.Map.ACTOR)
-	f:move(f.x, f.y, true)
+	if self:isStatus(self.COMPLETED, "flying") then
+		game:changeLevel(1, "wilderness", {direct_switch=true})
+
+		local f = nil
+		for uid, e in pairs(game.level.entities) do
+			if e.is_fortress then f = e break end
+		end
+
+		if not f then
+			game.log("The fortress is not found!")
+			return
+		end
+
+		f:takeControl(game.player)
+	else
+		game.player:learnLore("shertul-fortress-takeoff")
+
+		local f = require("mod.class.FortressPC").new{}
+		game:changeLevel(1, "wilderness", {direct_switch=true})
+		game.party:addMember(f, {temporary_level=1, control="full"})
+		f.x = game.player.x
+		f.y = game.player.y
+		game.party:setPlayer(f, true)
+		game.level:addEntity(f)
+		game.level.map:remove(f.x, f.y, engine.Map.ACTOR)
+		f:move(f.x, f.y, true)
+
+		game.player:setQuestStatus("shertul-fortress", self.COMPLETED, "flying")
+	end
 end
diff --git a/game/modules/tome/data/talents/misc/misc.lua b/game/modules/tome/data/talents/misc/misc.lua
index 728fd4c2b0568144bfd3abd2e511b37a1127f4b0..bc0e90aa66ba122bcc3017812ee924b01da285f4 100644
--- a/game/modules/tome/data/talents/misc/misc.lua
+++ b/game/modules/tome/data/talents/misc/misc.lua
@@ -314,6 +314,7 @@ newTalent{
 	no_npc_use = true,
 	no_unlearn_last = true,
 	action = function(self, t)
+		if game.level.map:checkAllEntities(self.x, self.y, "block_move") then game.log("You can not teleport there.") return true end
 		game.party:removeMember(self, true)
 		game.party:findSuitablePlayer()
 		game.player:move(self.x, self.y, true)
diff --git a/game/modules/tome/data/wda/eyal.lua b/game/modules/tome/data/wda/eyal.lua
index cdab817734b0c2ad562ee2d9ac89b44ef9f9054a..798eb4352fd3c238dbff294a94a35d2a112c3ceb 100644
--- a/game/modules/tome/data/wda/eyal.lua
+++ b/game/modules/tome/data/wda/eyal.lua
@@ -97,7 +97,7 @@ elseif zone == "Far East" then
 
 	-- Spawn random encounters
 	local g = game.level.map(game.player.x, game.player.y, Map.TERRAIN)
-	if g and g.can_encounter then
+	if g and g.can_encounter and not game.player.no_worldmap_encounter then
 		local type = encounter_chance(game.player)
 		if type then
 			game.level:setEntitiesList("fareast_encounters_rng", game.zone:computeRarities("fareast_encounters_rng", game.level:getEntitiesList("fareast_encounters"), game.level, nil))