diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua
index 7db83860a1d43a8773f369ecf7b65a56c133b16e..a149de4d7b9c1ade0df252cb0cc4dd1f6df100e5 100644
--- a/game/modules/tome/class/Game.lua
+++ b/game/modules/tome/class/Game.lua
@@ -352,6 +352,8 @@ function _M:changeLevel(lev, zone, keep_old_lev, force_down)
 		if nz then zone = nz end
 	end
 
+	if self.zone and self.level then self.player:onLeaveLevel(self.zone, self.level) end
+
 	local old_lev = (self.level and not zone) and self.level.level or -1000
 	if keep_old_lev then old_lev = self.level.level end
 	if zone then
diff --git a/game/modules/tome/class/Player.lua b/game/modules/tome/class/Player.lua
index 1b16a19b8ad7b84e074166ac5ea4cb404dacbe8e..248857ad406142d7c1a2e54b63b575dd9e3d4293 100644
--- a/game/modules/tome/class/Player.lua
+++ b/game/modules/tome/class/Player.lua
@@ -110,6 +110,16 @@ function _M:onEnterLevel(zone, level)
 	end
 end
 
+function _M:onLeaveLevel(zone, level)
+	-- Fail past escort quests
+	local eid = "escort-duty-"..zone.short_name.."-"..level.level
+	if self.quests and self.quests[eid] then
+		local q = self.quests[eid]
+		q.abandoned = true
+		self:setQuestStatus(eid, q.FAILED)
+	end
+end
+
 function _M:move(x, y, force)
 	local moved = mod.class.Actor.move(self, x, y, force)
 	if moved then
diff --git a/game/modules/tome/data/quests/escort-duty.lua b/game/modules/tome/data/quests/escort-duty.lua
index 646450493573faea335730e2e624a857e315b4a4..a88bd8a4ece73e4aa2cb2a9f768d54e36cd6697f 100644
--- a/game/modules/tome/data/quests/escort-duty.lua
+++ b/game/modules/tome/data/quests/escort-duty.lua
@@ -258,6 +258,17 @@ desc = function(self, who)
 	return table.concat(desc, "\n")
 end
 
+on_status_change = function(self, who, status, sub)
+	if status == self.FAILED then
+		for uid, e in pairs(game.level.entities) do
+			if e.quest_id and e.quest_id == self.id then
+				e:disappear()
+				e:removed()
+			end
+		end
+	end
+end
+
 local function getPortalSpot(npc, dist, min_dist)
 	local astar = Astar.new(game.level.map, npc)
 	local poss = {}