diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index 6756c19ce197e10cc99949b9480452a7fbe09fa5..30ac1b3c6c1407eff5e93ffbe614ca98dfde1052 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -1802,10 +1802,11 @@ function _M:onTakeHit(value, src)
 			self.summoner:incFeedback(feedback_gain)
 		end
 		-- Trigger backlash retribution damage
-		if self:knowTalent(self.T_BACKLASH) and not src.no_backlash_loops then
+		if self:knowTalent(self.T_BACKLASH) and not src.no_backlash_loops  and not src.turn_procs.backlash then
 			if src.y and src.x and not src.dead then
 				local t = self:getTalentFromId(self.T_BACKLASH)
 				t.doBacklash(self, src, feedback_gain, t)
+				src.turn_procs.backlash = true
 			end
 		end
 	end
diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua
index 7b91c001ae96e2a93aa6821af4928e5247eaeb06..15f96a60eddd943706668ffc382c397a26c8d078 100644
--- a/game/modules/tome/class/Game.lua
+++ b/game/modules/tome/class/Game.lua
@@ -1344,7 +1344,8 @@ do return end
 				if self.zone.no_autoexplore or self.level.no_autoexplore then
 					self.log("You may not auto-explore this level.")
 				elseif #seen > 0 then
-					self.log("You may not auto-explore with enemies in sight!")
+					local dir = game.level.map:compassDirection(seen[1].x - self.player.x, seen[1].y - self.player.y)
+					self.log("You may not auto-explore with enemies in sight (%s to the %s%s)!", seen[1].actor.name, dir, self.level.map:isOnScreen(seen[1].x, seen[1].y) and "" or " - offscreen")
 					for _, node in ipairs(seen) do
 						node.actor:addParticles(engine.Particles.new("notice_enemy", 1))
 					end
diff --git a/game/modules/tome/class/Player.lua b/game/modules/tome/class/Player.lua
index b3276b894b4b7aad36de124d53bba2ec569be896..a719620fb312959e46f5efae40af4a753f645d78 100644
--- a/game/modules/tome/class/Player.lua
+++ b/game/modules/tome/class/Player.lua
@@ -593,7 +593,8 @@ end
 function _M:suffocate(value, src, death_msg)
 	local dead, affected = mod.class.Actor.suffocate(self, value, src, death_msg)
 	if affected and value > 0 and self.runStop then
-		self:runStop("suffocating")
+		-- only stop autoexplore when air is less than 75% of max.
+		if self.air < 0.75 * self.max_air then self:runStop("suffocating") end
 		self:restStop("suffocating")
 	end
 	return dead, affected
@@ -719,7 +720,8 @@ function _M:restCheck()
 		for _, node in ipairs(spotted) do
 			node.actor:addParticles(engine.Particles.new("notice_enemy", 1))
 		end
-		return false, ("hostile spotted (%s%s)"):format(spotted[1].actor.name, game.level.map:isOnScreen(spotted[1].x, spotted[1].y) and "" or " - offscreen")
+		local dir = game.level.map:compassDirection(spotted[1].x - self.x, spotted[1].y - self.y)
+		return false, ("hostile spotted to the %s (%s%s)"):format(dir, spotted[1].actor.name, game.level.map:isOnScreen(spotted[1].x, spotted[1].y) and "" or " - offscreen")
 	end
 
 	-- Resting improves regen
@@ -801,9 +803,12 @@ end
 -- 'ignore_memory' is only used when checking for paths around traps.  This ensures we don't remember items "obj_seen" that we aren't supposed to
 function _M:runCheck(ignore_memory)
 	local spotted = spotHostiles(self)
-	if #spotted > 0 then return false, ("hostile spotted (%s%s)"):format(spotted[1].actor.name, game.level.map:isOnScreen(spotted[1].x, spotted[1].y) and "" or " - offscreen") end
+	if #spotted > 0 then
+		local dir = game.level.map:compassDirection(spotted[1].x - self.x, spotted[1].y - self.y)
+		return false, ("hostile spotted to the %s (%s%s)"):format(dir, spotted[1].actor.name, game.level.map:isOnScreen(spotted[1].x, spotted[1].y) and "" or " - offscreen")
+	end
 
-	if self.air_regen < 0 then return false, "losing breath!" end
+	if self.air_regen < 0 and self.air < 0.75 * self.max_air then return false, "losing breath!" end
 
 	-- Notice any noticeable terrain
 	local noticed = false
@@ -812,15 +817,22 @@ function _M:runCheck(ignore_memory)
 		if what == "self" and not game.level.map.attrs(x, y, "obj_seen") then
 			local obj = game.level.map:getObject(x, y, 1)
 			if obj then
-				noticed = "object seen"
 				if not ignore_memory then game.level.map.attrs(x, y, "obj_seen", true) end
-				return
+				noticed = "object seen"
+				return false, noticed
 			end
 		end
 
-		-- Only notice interesting terrains, but allow auto-explore and A* to take us to the exit.  Auto-explore can also take us through "safe" doors
 		local grid = game.level.map(x, y, Map.TERRAIN)
-		if grid and grid.notice and not (self.running and self.running.path and (game.level.map.attrs(x, y, "noticed")
+		if grid and grid.special and not grid.autoexplore_ignore and not game.level.map.attrs(x, y, "autoexplore_ignore") and self.running and self.running.path then
+			game.level.map.attrs(x, y, "autoexplore_ignore", true)
+			noticed = "something interesting"
+			return false, noticed
+		end
+
+		-- Only notice interesting terrains, but allow auto-explore and A* to take us to the exit.  Auto-explore can also take us through "safe" doors
+		if grid and grid.notice and not (grid.special and self.running and self.running.explore and not grid.block_move and (grid.autoexplore_ignore or game.level.map.attrs(x, y, "autoexplore_ignore")))
+			and not (self.running and self.running.path and (game.level.map.attrs(x, y, "noticed")
 				or (what ~= self and (self.running.explore and grid.door_opened                     -- safe door
 				or #self.running.path == self.running.cnt and (self.running.explore == "exit"       -- auto-explore onto exit
 				or not self.running.explore and grid.change_level))                                 -- A* onto exit
@@ -829,23 +841,26 @@ function _M:runCheck(ignore_memory)
 				or self.running.cnt < 3 and grid.orb_portal and                                     -- path from portal
 				game.level.map:checkEntity(self.running.path[1].x, self.running.path[1].y, Map.TERRAIN, "orb_portal"))))
 		then
-			if self.running and self.running.explore and self.running.path and self.running.explore ~= "unseen" and self.running.cnt == #self.running.path + 1 then
+			if grid and grid.special then
+				game.level.map.attrs(x, y, "autoexplore_ignore", true)
+				noticed = "something interesting"
+			elseif self.running and self.running.explore and self.running.path and self.running.explore ~= "unseen" and self.running.cnt == #self.running.path + 1 then
 				noticed = "at " .. self.running.explore
 			else
 				noticed = "interesting terrain"
 			end
 			-- let's only remember and ignore standard interesting terrain
-			if not ignore_memory and (grid.change_level or grid.orb_portal) then game.level.map.attrs(x, y, "noticed", true) end
-			return
+			if not ignore_memory and (grid.change_level or grid.orb_portal or grid.escort_portal) then game.level.map.attrs(x, y, "noticed", true) end
+			return false, noticed
 		end
-		if grid and grid.type and grid.type == "store" then noticed = "store entrance spotted"; return end
+		if grid and grid.type and grid.type == "store" then noticed = "store entrance spotted" ; return false, noticed end
 
 		-- Only notice interesting characters
 		local actor = game.level.map(x, y, Map.ACTOR)
-		if actor and actor.can_talk then noticed = "interesting character"; return end
+		if actor and actor.can_talk then noticed = "interesting character" ; return false, noticed end
 
 		-- We let the engine take care of traps, but we should still notice "trap" stores.
-		if game.level.map:checkAllEntities(x, y, "store") then noticed = "store entrance spotted"; return end
+		if game.level.map:checkAllEntities(x, y, "store") then noticed = "store entrance spotted" ; return false, noticed end
 	end)
 	if noticed then return false, noticed end
 
@@ -1307,8 +1322,11 @@ function _M:useOrbPortal(portal)
 	if portal.special then portal:special(self) return end
 
 	local spotted = spotHostiles(self)
-	if #spotted > 0 then game.logPlayer(self, "You can not use the Orb with foes in sight.") return end
-
+	if #spotted > 0 then
+		local dir = game.level.map:compassDirection(spotted[1].x - self.x, spotted[1].y - self.y)
+		game.logPlayer(self, "You can not use the Orb with foes in sight (%s to the %s%s)", spotted[1].actor.name, dir, game.level.map:isOnScreen(spotted[1].x, spotted[1].y) and "" or " - offscreen")
+		return
+	end
 	if portal.on_preuse then portal:on_preuse(self) end
 
 	if portal.nothing then -- nothing
diff --git a/game/modules/tome/class/interface/PlayerExplore.lua b/game/modules/tome/class/interface/PlayerExplore.lua
index 863365deb69bc0a9be7c0402ac600cfd40ed9cbb..f7d810f0bfb951633cbeea69487db88853ae350b 100644
--- a/game/modules/tome/class/interface/PlayerExplore.lua
+++ b/game/modules/tome/class/interface/PlayerExplore.lua
@@ -1833,6 +1833,7 @@ function _M:autoExplore()
 	local unseen_tiles = {}
 	local unseen_singlets = {}
 	local unseen_items = {}
+	local unseen_special = {}
 	local unseen_doors = {}
 	local exits = {}
 	local portals = {}
@@ -1846,6 +1847,7 @@ function _M:autoExplore()
 	local running = true
 	local minval = 999999999999999
 	local minval_items = 999999999999999
+	local minval_special = 999999999999999
 	local minval_portals = 999999999999999
 	local val, _, anode, tile_list
 
@@ -1853,6 +1855,18 @@ function _M:autoExplore()
 	local extra_iters = 5     -- number of extra iterations to do after we found an item or unseen tile
 	local singlet_greed = 4   -- number of additional moves we're willing to do to explore a single unseen tile
 	local item_greed = 5      -- number of additional moves we're willing to do to visit an unseen item rather than an unseen tile
+	local special_greed = 5   -- number of additional moves we're willing to do to visit a special tile rather than an unseen tile
+
+	-- we only run to a vault or locked door once, but if we are next to it, then we should try to open it if appropriate
+	local c = toSingle(self.x, self.y)
+	for _, node in ipairs(listAdjacentNodes(c)) do
+		local ax, ay = node[0], node[1]
+		local terrain = game.level.map(ax, ay, Map.TERRAIN)
+		if terrain and game.level.map.attrs(ax, ay, "autoexplore_ignore") and (terrain.door_player_check or terrain.door_player_stop) then
+			unseen_doors[#unseen_doors + 1] = toSingle(ax, ay)
+			door_values[toSingle(ax, ay)] = 1
+		end
+	end
 
 	-- Create a distance map array via flood-fill to locate unseen tiles, unvisited items, closed doors, and exits
 	while running do
@@ -1967,9 +1981,15 @@ function _M:autoExplore()
 								current_tiles_next[#current_tiles_next + 1] = node
 							end
 						end
+						-- go to special terrain unless it should be ignored
+						if terrain.special and not terrain.autoexplore_ignore and not game.level.map.attrs(x, y, "autoexplore_ignore") then
+							unseen_special[#unseen_special + 1] = c
+							values[c] = move_cost
+							if move_cost < minval_special then
+								minval_special = move_cost
+							end
 						-- only go to objects we haven't walked over yet
-						local obj = game.level.map:getObject(x, y, 1)
-						if obj and not game.level.map.attrs(x, y, "obj_seen") then
+						elseif game.level.map:getObject(x, y, 1) and not game.level.map.attrs(x, y, "obj_seen") then
 							unseen_items[#unseen_items + 1] = c
 							values[c] = move_cost
 							if move_cost < minval_items then
@@ -1985,12 +2005,12 @@ function _M:autoExplore()
 									break
 								end
 							end
-							if is_unexplored then
+							if is_unexplored and not game.level.map.attrs(x, y, "autoexplore_ignore") then
 								unseen_doors[#unseen_doors + 1] = c
 								if not door_values[c] or door_values[c] > move_cost then
 									door_values[c] = move_cost
 								end
-							else -- door is safe to move through
+							elseif not is_unexplored then -- door is safe to move through
 								node[3] = move_cost + 1
 								safe_doors[c] = true
 								if is_slow then
@@ -2028,7 +2048,7 @@ function _M:autoExplore()
 			end
 		end
 		-- Continue the loop if we haven't found any destination tiles or if lower cost paths to the destination tiles may exist
-		running = #unseen_tiles == 0 and #unseen_items == 0
+		running = #unseen_tiles == 0 and #unseen_items == 0 and #unseen_special == 0
 		for _, c in ipairs(unseen_tiles) do
 			if values[c] > iter then
 				running = true
@@ -2050,7 +2070,7 @@ function _M:autoExplore()
 		end
 
 		-- if we need to continue running but have no more tiles to iterate over, propagate from "slow_tiles" such as traps
-		if #current_tiles_next == 0 and #slow_tiles > 0 and #unseen_tiles == 0 and #unseen_items == 0 then
+		if #current_tiles_next == 0 and #slow_tiles > 0 and #unseen_tiles == 0 and #unseen_items == 0 and #unseen_special == 0 then
 			running = true
 			current_tiles = slow_tiles
 			for _, node in ipairs(slow_tiles) do
@@ -2071,7 +2091,7 @@ function _M:autoExplore()
 
 	-- Negligible time is spent below
 	-- Choose target
-	if #unseen_tiles > 0 or #unseen_items > 0 or #unseen_doors > 0 or #exits > 0 or #portals > 0 then
+	if #unseen_tiles > 0 or #unseen_items > 0 or #unseen_special > 0 or #unseen_doors > 0 or #exits > 0 or #portals > 0 then
 		local target_type
 		local choices = {}
 		local distances = {}
@@ -2103,7 +2123,22 @@ function _M:autoExplore()
 				end
 			end
 		end
-		-- go to closest items first
+		-- go to closest special terrain first
+		if #choices == 0 and minval_special <= minval + special_greed then
+			for _, c in ipairs(unseen_special) do
+				if values[c] == minval_special then
+					target_type = "special"
+					choices[#choices + 1] = c
+					local x, y = toDouble(c)
+					local dist = core.fov.distance(self.x, self.y, x, y, true)
+					distances[c] = dist
+					if dist < mindist then
+						mindist = dist
+					end
+				end
+			end
+		end
+		-- go to closest items next
 		if #choices == 0 and minval_items <= minval + item_greed then
 			for _, c in ipairs(unseen_items) do
 				if values[c] == minval_items then
@@ -2399,23 +2434,32 @@ function _M:autoExplore()
 				if self.running and self.running.explore then
 					-- take care of a couple fringe cases
 					-- don't open adjacent or target doors if we've already been running
+					local x, y = path[1].x, path[1].y
+					local terrain = game.level.map(x, y, Map.TERRAIN)
 					if target_type == "door" then
 						if #path == 1 then
 							self:runStop("at door")
+							if terrain and (terrain.door_player_check or terrain.door_player_stop) then game.level.map.attrs(x, y, "autoexplore_ignore", true) end
 							return false
 						else
 							path[#path] = nil
 						end
 					end
+					-- don't bump into special terrain if we've already been running
+					if target_type == "special" then
+						if #path == 1 then
+							self:runStop("something interesting")
+							game.level.map.attrs(x, y, "autoexplore_ignore", true)
+							return false
+						end
+					end
 
 					-- don't run into adjacent interesting terrain if we've already been running
-					local x, y = path[1].x, path[1].y
-					local terrain = game.level.map(x, y, Map.TERRAIN)
 					if terrain.notice and (target_type ~= "exit" and target_type ~= "portal" or #path ~= 1) then
 						if safe_doors[toSingle(x, y)] and not self.running.busy then
 							self.running.busy = { type = "opening door", do_move = true, no_energy = true }
 						elseif not game.level.map.attrs(x, y, "noticed") then
-							if terrain.change_level or terrain.orb_portal then game.level.map.attrs(x, y, "noticed", true) end
+							if terrain.change_level or terrain.orb_portal or terrain.escort_portal then game.level.map.attrs(x, y, "noticed", true) end
 							self:runStop("interesting terrain")
 							return false
 						end
@@ -2432,10 +2476,22 @@ function _M:autoExplore()
 					-- end hack!
 					checkAmbush(self)
 				else
-					-- another fringe case: if we target an item in an adjacent wall that we've probably already targeted, then mark it as seen and find a new target
-					if #path == 1 and target_type == "object" and game.level.map:checkEntity(target_x, target_y, Map.TERRAIN, "block_move", self, nil, true) then
-						game.level.map.attrs(target_x, target_y, "obj_seen", true)
-						return self:autoExplore()
+					if #path == 1 then
+						-- another fringe case: if we target an item in an adjacent wall that we've probably already targeted, then mark it as seen and find a new target
+						if target_type == "object" and game.level.map:checkEntity(target_x, target_y, Map.TERRAIN, "block_move", self, nil, true) then
+							game.level.map.attrs(target_x, target_y, "obj_seen", true)
+							return self:autoExplore()
+						end
+						-- similar deal for adjacent "special" terrain
+						if target_type == "special" then
+							game.level.map.attrs(target_x, target_y, "autoexplore_ignore", true)
+							return self:autoExplore()
+						end
+						local x, y = path[1].x, path[1].y
+						local terrain = game.level.map(x, y, Map.TERRAIN)
+						if target_type == "door" and terrain and (terrain.door_player_check or terrain.door_player_stop) then
+							game.level.map.attrs(x, y, "autoexplore_ignore", true)
+						end
 					end
 					-- don't open non-adjacent target doors
 					if target_type == "door" and #path > 1 then path[#path] = nil end
@@ -2512,6 +2568,17 @@ function _M:checkAutoExplore()
 		if self.running.explore == "unseen" or self.running.explore == "object" and not obj then
 			return self:autoExplore()
 		else
+			--only go to locked vault doors once
+			if self.running.explore == "door" then
+				local c = toSingle(tx, ty)
+				for _, anode in ipairs(listAdjacentNodes(c)) do
+					local ax, ay = anode[0], anode[1]
+					local aterrain = game.level.map(ax, ay, Map.TERRAIN)
+					if aterrain and (aterrain.door_player_check or aterrain.door_player_stop) then
+						game.level.map.attrs(ax, ay, "autoexplore_ignore", true)
+					end
+				end
+			end
 			self:runStop("at " .. self.running.explore)
 			return false
 		end
@@ -2521,7 +2588,7 @@ function _M:checkAutoExplore()
 	if game.level.map.has_seens(cx, cy) and game.level.map:checkEntity(cx, cy, Map.TERRAIN, "block_move", self, nil, true) then
 	-- game.level.map:checkAllEntities(cx, cy, "block_move", self) then
 		if terrain.notice then
-			if terrain.change_level or terrain.orb_portal then game.level.map.attrs(cx, cy, "noticed", true) end
+			if terrain.change_level or terrain.orb_portal or terrain.escort_portal then game.level.map.attrs(cx, cy, "noticed", true) end
 			self:runStop("interesting terrain")
 			return false
 		elseif self.running.explore == "unseen" or self.running.explore == "object" and self.running.cnt ~= #self.running.path then
diff --git a/game/modules/tome/data/general/events/cultists.lua b/game/modules/tome/data/general/events/cultists.lua
index 2338ac2c2528d11ab55d67bacffe914f31fc98bc..7a7d6a4e8be0b99d9df8bb725d7fab22b0816e4a 100644
--- a/game/modules/tome/data/general/events/cultists.lua
+++ b/game/modules/tome/data/general/events/cultists.lua
@@ -52,6 +52,7 @@ for i, p in ipairs(list) do
 	g.nice_tiler = nil
 	g.grow = nil g.dig = nil
 	g.special = true
+	g.autoexplore_ignore = true
 	g.is_monolith = true
 	game.zone:addEntity(game.level, g, "terrain", p.x, p.y)
 
diff --git a/game/modules/tome/data/general/events/fearscape-portal.lua b/game/modules/tome/data/general/events/fearscape-portal.lua
index d09369aee7b57dbb4e9b835e1d5bc048cc555d62..0d8d291eda4b59c8085c9eb6c2df7af926f9ca0f 100644
--- a/game/modules/tome/data/general/events/fearscape-portal.lua
+++ b/game/modules/tome/data/general/events/fearscape-portal.lua
@@ -166,6 +166,7 @@ g.block_move = function(self, x, y, who, act, couldpass)
 		end
 		self.broken = true
 		self.change_level = nil
+		self.autoexplore_ignore = true
 	end, "Destroy", "Enter")
 
 	return false
diff --git a/game/modules/tome/data/general/events/glowing-chest.lua b/game/modules/tome/data/general/events/glowing-chest.lua
index f9861937c41cf0fc6da6e6524fdc75f6ebfa68c1..4138e679426200b82391bea4361272ca654ba5b4 100644
--- a/game/modules/tome/data/general/events/glowing-chest.lua
+++ b/game/modules/tome/data/general/events/glowing-chest.lua
@@ -81,6 +81,8 @@ g.block_move = function(self, x, y, who, act, couldpass)
 		end
 		self.chest_item = nil
 		self.chest_guards = nil
+		self.block_move = nil
+		self.autoexplore_ignore = true
 	end end, "Open", "Leave")
 
 	return false
diff --git a/game/modules/tome/data/general/events/naga-portal.lua b/game/modules/tome/data/general/events/naga-portal.lua
index 1dc6d9a4e6b144fcc26431344024a8bae68c8806..cb34593573bb3ce1f4a1fcb70148c728e5d27abe 100644
--- a/game/modules/tome/data/general/events/naga-portal.lua
+++ b/game/modules/tome/data/general/events/naga-portal.lua
@@ -135,6 +135,7 @@ g.block_move = function(self, x, y, who, act, couldpass)
 		end
 		self.broken = true
 		self.change_level = nil
+		self.autoexplore_ignore = true
 	end, "Destroy", "Enter")
 
 	return false
diff --git a/game/modules/tome/data/general/events/old-battle-field.lua b/game/modules/tome/data/general/events/old-battle-field.lua
index d8fbe32b50e9f470e0594c7ead531865ead46a54..51207d783b8c5bb75cbc561bcc3e73bcab5df5da 100644
--- a/game/modules/tome/data/general/events/old-battle-field.lua
+++ b/game/modules/tome/data/general/events/old-battle-field.lua
@@ -138,6 +138,7 @@ if tries < 100 then
 				game.level.map:updateMap(x, y)
 
 				self.block_move = nil
+				self.autoexplore_ignore = true
 				self:change_level_check()
 				require("engine.ui.Dialog"):simplePopup("Fall...", "As you tried to dig the grave the ground fell under you. You find yourself stranded in an eerie lit cavern.")
 			end end)
diff --git a/game/modules/tome/data/general/events/tombstones.lua b/game/modules/tome/data/general/events/tombstones.lua
index 1040de533fa8caff2442aa2f8f7ff4e54414683b..9fb80a16bee1f456569c4eb7adf282d215f6abc1 100644
--- a/game/modules/tome/data/general/events/tombstones.lua
+++ b/game/modules/tome/data/general/events/tombstones.lua
@@ -52,6 +52,7 @@ if tries < 100 then
 			game.level.map:updateMap(x, y)
 
 			self.block_move = nil
+			self.autoexplore_ignore = true
 			if rng.percent(20) then game.log("There is nothing there.") return end
 
 			local m = game.zone:makeEntity(game.level, "actor", {properties={"undead"}, add_levels=10, random_boss={nb_classes=1, rank=3, ai = "tactical", loot_quantity = 0, no_loot_randart = true}}, nil, true)
diff --git a/game/modules/tome/data/general/events/weird-pedestals.lua b/game/modules/tome/data/general/events/weird-pedestals.lua
index 2456bc8dbf7eec67f6e65aa66a00fbf6937deeec..a6e1c0a5aa5f910cee0257dbedc1315e2db0782f 100644
--- a/game/modules/tome/data/general/events/weird-pedestals.lua
+++ b/game/modules/tome/data/general/events/weird-pedestals.lua
@@ -62,6 +62,8 @@ for i = 1, 3 do
 			who:restInit(20, "inspecting", "inspected", function(cnt, max)
 				if cnt > max then
 					self.pedestal_activated = true
+					self.block_move = nil
+					self.autoexplore_ignore = true
 					require("engine.ui.Dialog"):simplePopup("Weird Pedestal", "As you inspect it a shadow materializes near you, and suddenly it is no more a shadow!")
 
 					local m = game.zone:makeEntity(game.level, "actor", {
diff --git a/game/modules/tome/data/quests/escort-duty.lua b/game/modules/tome/data/quests/escort-duty.lua
index 0e2ef508653997495c46d8f02bea87908e8f2e93..bc59e2843d89ba4ff37f7927b40b9a91f05561d2 100644
--- a/game/modules/tome/data/quests/escort-duty.lua
+++ b/game/modules/tome/data/quests/escort-duty.lua
@@ -392,6 +392,7 @@ on_grant = function(self, who)
 	g.add_displays = g.add_displays or {}
 	g.add_displays[#g.add_displays+1] = mod.class.Grid.new{image="terrain/maze_teleport.png"}
 	g.notice = true
+	g.escort_portal = true
 	g.nice_tiler = nil
 	g.on_move = function(self, x, y, who)
 		if not who.escort_quest then return end
diff --git a/game/modules/tome/data/zones/slime-tunnels/grids.lua b/game/modules/tome/data/zones/slime-tunnels/grids.lua
index 7c4438af48e0e2e24bc55f426022746dfc3264d3..48ad60c5e1899a7fafc28043ae59f9a454229933 100644
--- a/game/modules/tome/data/zones/slime-tunnels/grids.lua
+++ b/game/modules/tome/data/zones/slime-tunnels/grids.lua
@@ -23,22 +23,22 @@ load("/data/general/grids/slime.lua")
 
 newEntity{
 	define_as = "ORB_DRAGON",
-	name = "orb pedestal (dragon)", image = "terrain/slime/slime_floor_01.png", add_displays={class.new{image = "terrain/pedestal_01.png", display_h=2, display_y=-1}},
+	name = "orb pedestal (dragon)", special = true, image = "terrain/slime/slime_floor_01.png", add_displays={class.new{image = "terrain/pedestal_01.png", display_h=2, display_y=-1}},
 	display = '_', color_r=255, color_g=255, color_b=255, back_color=colors.LIGHT_RED,
 }
 newEntity{
 	define_as = "ORB_UNDEATH",
-	name = "orb pedestal (undeath)", image = "terrain/slime/slime_floor_01.png", add_displays={class.new{image = "terrain/pedestal_01.png", display_h=2, display_y=-1}},
+	name = "orb pedestal (undeath)", special = true, image = "terrain/slime/slime_floor_01.png", add_displays={class.new{image = "terrain/pedestal_01.png", display_h=2, display_y=-1}},
 	display = '_', color_r=255, color_g=255, color_b=255, back_color=colors.LIGHT_RED,
 }
 newEntity{
 	define_as = "ORB_ELEMENTS",
-	name = "orb pedestal (elements)", image = "terrain/slime/slime_floor_01.png", add_displays={class.new{image = "terrain/pedestal_01.png", display_h=2, display_y=-1}},
+	name = "orb pedestal (elements)", special = true, image = "terrain/slime/slime_floor_01.png", add_displays={class.new{image = "terrain/pedestal_01.png", display_h=2, display_y=-1}},
 	display = '_', color_r=255, color_g=255, color_b=255, back_color=colors.LIGHT_RED,
 }
 newEntity{
 	define_as = "ORB_DESTRUCTION",
-	name = "orb pedestal (destruction)", image = "terrain/slime/slime_floor_01.png", add_displays={class.new{image = "terrain/pedestal_01.png", display_h=2, display_y=-1}},
+	name = "orb pedestal (destruction)", special = true, image = "terrain/slime/slime_floor_01.png", add_displays={class.new{image = "terrain/pedestal_01.png", display_h=2, display_y=-1}},
 	display = '_', color_r=255, color_g=255, color_b=255, back_color=colors.LIGHT_RED,
 }
 
diff --git a/game/modules/tome/load.lua b/game/modules/tome/load.lua
index eafb06b1e354099ad72c32fc50cf27496a80f3b2..19a4166533f0fa9124ee55a257d36fba7ee71a5c 100644
--- a/game/modules/tome/load.lua
+++ b/game/modules/tome/load.lua
@@ -227,7 +227,7 @@ ActorResource:defineResource("Psi", "psi", ActorTalents.T_PSI_POOL, "psi_regen",
 ActorStats:defineStat("Strength",	"str", 10, 1, 100, "Strength defines your character's ability to apply physical force. It increases your melee damage, damage done with heavy weapons, your chance to resist physical effects, and carrying capacity.")
 ActorStats:defineStat("Dexterity",	"dex", 10, 1, 100, "Dexterity defines your character's ability to be agile and alert. It increases your chance to hit, your ability to avoid attacks, and your damage with light or ranged weapons.")
 ActorStats:defineStat("Magic",		"mag", 10, 1, 100, "Magic defines your character's ability to manipulate the magical energy of the world. It increases your spell power, and the effect of spells and other magic items.")
-ActorStats:defineStat("Willpower",	"wil", 10, 1, 100, "Willpower defines your character's ability to concentrate. It increases your mana ,stamina and PSI capacity, and your chance to resist mental attacks.")
+ActorStats:defineStat("Willpower",	"wil", 10, 1, 100, "Willpower defines your character's ability to concentrate. It increases your mana, stamina and PSI capacity, and your chance to resist mental attacks.")
 ActorStats:defineStat("Cunning",	"cun", 10, 1, 100, "Cunning defines your character's ability to learn, think, and react. It allows you to learn many worldly abilities, and increases your mental capabilities and chance of critical hits.")
 ActorStats:defineStat("Constitution",	"con", 10, 1, 100, "Constitution defines your character's ability to withstand and resist damage. It increases your maximum life and physical resistance.")
 -- Luck is hidden and starts at half max value (50) which is considered the standard