diff --git a/game/engine/Actor.lua b/game/engine/Actor.lua
index ae58809e84916d5414e74c752ad6a1f23d22bed3..d7297b10d23f95e864f03b67e5fcf433cf553896 100644
--- a/game/engine/Actor.lua
+++ b/game/engine/Actor.lua
@@ -27,6 +27,8 @@ module(..., package.seeall, class.inherit(Entity))
 _M.display_on_seen = true
 _M.display_on_remember = false
 _M.display_on_unknown = false
+-- Allow actors to act as object carriers, if the interface is loaded
+_M.__allow_carrier = true
 
 function _M:init(t, no_default)
 	t = t or {}
diff --git a/game/engine/interface/ActorInventory.lua b/game/engine/interface/ActorInventory.lua
index e960d57752b221eab82e86fe8ba426deaf49c8b3..476beb68c99885139c037956ea434490067befae 100644
--- a/game/engine/interface/ActorInventory.lua
+++ b/game/engine/interface/ActorInventory.lua
@@ -174,11 +174,13 @@ end
 
 --- Called upon adding an object
 function _M:onAddObject(o)
-	-- Apply carrier properties
-	if o.carrier then
+	if self.__allow_carrier then
+		-- Apply carrier properties
 		o.carried = {}
-		for k, e in pairs(o.carrier) do
-			o.carried[k] = self:addTemporaryValue(k, e)
+		if o.carrier then
+			for k, e in pairs(o.carrier) do
+				o.carried[k] = self:addTemporaryValue(k, e)
+			end
 		end
 	end
 end
@@ -346,8 +348,8 @@ end
 --- Call when an object is worn
 function _M:onWear(o)
 	-- Apply wielder properties
+	o.wielded = {}
 	if o.wielder then
-		o.wielded = {}
 		for k, e in pairs(o.wielder) do
 			o.wielded[k] = self:addTemporaryValue(k, e)
 		end
diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index 31d31ef5113d8bc7914c484b85666eea63c11c24..e32c566c21e8a2908cef11aefcda432b919c5d1d 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -292,6 +292,18 @@ function _M:probabilityTravel(x, y, dist)
 	return true
 end
 
+--- Teleports randomly to a passable grid
+-- This simply calls the default actor teleportRandom but first checks for space-time stability
+-- @param x the coord of the teleporatation
+-- @param y the coord of the teleporatation
+-- @param dist the radius of the random effect, if set to 0 it is a precise teleport
+-- @param min_dist the minimun radius of of the effect, will never teleport closer. Defaults to 0 if not set
+-- @return true if the teleport worked
+function _M:teleportRandom(x, y, dist, min_dist)
+
+	return engine.Actor.teleportRandom(x, y, dist, min_dist)
+end
+
 --- Quake a zone
 -- Moves randomly each grid to an other grid
 function _M:doQuake(tg, x, y)
@@ -1185,6 +1197,7 @@ function _M:canBe(what)
 	if what == "blind" and rng.percent(100 * (self:attr("blind_immune") or 0)) then return false end
 	if what == "silence" and rng.percent(100 * (self:attr("silence_immune") or 0)) then return false end
 	if what == "disarm" and rng.percent(100 * (self:attr("disarm_immune") or 0)) then return false end
+	if what == "pin" and rng.percent(100 * (self:attr("pin_immune") or 0)) then return false end
 	if what == "stun" and rng.percent(100 * (self:attr("stun_immune") or 0)) then return false end
 	if what == "fear" and rng.percent(100 * (self:attr("fear_immune") or 0)) then return false end
 	if what == "knockback" and rng.percent(100 * (self:attr("knockback_immune") or 0)) then return false end
diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua
index 64d9da091fdd1b06a3f6aee509f22ee5da28f8c4..9f8d4a6272648d860167fa32ee080c3f49c7aa2d 100644
--- a/game/modules/tome/class/Game.lua
+++ b/game/modules/tome/class/Game.lua
@@ -485,6 +485,8 @@ function _M:setupCommands()
 		end,
 		[{"_f","ctrl"}] = function()
 			if config.settings.tome.cheat then
+				self.player:incStat("str", 100) self.player:incStat("dex", 100) self.player:incStat("mag", 100) self.player:incStat("wil", 100) self.player:incStat("cun", 100) self.player:incStat("con", 100)
+				self.player:learnTalent(self.player.T_HEAVY_ARMOUR_TRAINING, true) self.player:learnTalent(self.player.T_MASSIVE_ARMOUR_TRAINING, true)
 				for i, e in ipairs(self.zone.object_list) do
 					if e.unique and e.rarity then
 						local a = self.zone:finishEntity(self.level, "object", e)
diff --git a/game/modules/tome/class/Object.lua b/game/modules/tome/class/Object.lua
index d50b9a242684f7d5afcba2c52b816d82d95789e0..989d786b24f9d265f3c10cf7dbed68ed299e46e2 100644
--- a/game/modules/tome/class/Object.lua
+++ b/game/modules/tome/class/Object.lua
@@ -68,6 +68,10 @@ function _M:use(who, typ)
 		game.logPlayer(who, "You are silenced!")
 		return
 	end
+	if self:wornInven() and not self.wielded and not self.use_no_wear then
+		game.logPlayer(who, "You must wear this object to use it!")
+		return
+	end
 
 	local types = {}
 	if self:canUseObject() then types[#types+1] = "use" end
@@ -286,6 +290,7 @@ function _M:getTextualDesc()
 	if w.silence_immune then desc[#desc+1] = ("Increases silence immunity: %d%%."):format(w.silence_immune * 100) end
 	if w.disarm_immune then desc[#desc+1] = ("Increases disarm immunity: %d%%."):format(w.disarm_immune * 100) end
 	if w.confusion_immune then desc[#desc+1] = ("Increases confusion immunity: %d%%."):format(w.confusion_immune * 100) end
+	if w.pin_immune then desc[#desc+1] = ("Increases pinning immunity: %d%%."):format(w.pin_immune * 100) end
 	if w.stun_immune then desc[#desc+1] = ("Increases stun immunity: %d%%."):format(w.stun_immune * 100) end
 	if w.fear_immune then desc[#desc+1] = ("Increases fear immunity: %d%%."):format(w.fear_immune * 100) end
 	if w.knockback_immune then desc[#desc+1] = ("Increases knockback immunity: %d%%."):format(w.knockback_immune * 100) end
diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua
index 3c2b3e1ef938bd799549c70cfad126a7762804d0..c957051c50bf4078dd310a9ca7b6348ef1afacf8 100644
--- a/game/modules/tome/data/damage_types.lua
+++ b/game/modules/tome/data/damage_types.lua
@@ -328,7 +328,7 @@ newDamageType{
 		DamageType:get(DamageType.COLD).projector(src, x, y, DamageType.COLD, dam.dam)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
-			if target:checkHit(src:combatSpellpower(), target:combatSpellResist(), 0, 95, 15) and target:canBe("stun") and not target:attr("fly") and not target:attr("levitation") then
+			if target:checkHit(src:combatSpellpower(), target:combatSpellResist(), 0, 95, 15) and target:canBe("pin") and target:canBe("stun") and not target:attr("fly") and not target:attr("levitation") then
 				target:setEffect(target.EFF_FROZEN_FEET, dam.dur, {})
 			end
 		end
@@ -584,7 +584,7 @@ newDamageType{
 		DamageType:get(DamageType.PHYSICAL).projector(src, x, y, DamageType.PHYSICAL, dam.dam)
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
-			if target:checkHit(src:combatAttackStr(), target:combatPhysicalResist(), 0, 95, 15) then
+			if target:checkHit(src:combatAttackStr(), target:combatPhysicalResist(), 0, 95, 15) and target:canBe("pin") then
 				target:setEffect(target.EFF_PINNED, dam.dur, {})
 			else
 				game.logSeen(target, "%s resists!", target.name:capitalize())
diff --git a/game/modules/tome/data/general/objects/quest-artifacts.lua b/game/modules/tome/data/general/objects/quest-artifacts.lua
index 98e382b19a420d774ed1d48d9dc1088e0735e37d..595300a6399724d471bf7ec0908e23ef7f96774b 100644
--- a/game/modules/tome/data/general/objects/quest-artifacts.lua
+++ b/game/modules/tome/data/general/objects/quest-artifacts.lua
@@ -114,6 +114,10 @@ newEntity{ define_as = "ORB_UNDEATH",
 			return true
 		end
 	end,
+
+	carrier = {
+		inc_stats = { [Stats.STAT_DEX] = 6, },
+	},
 }
 
 -- Gorbat Pride
@@ -133,6 +137,10 @@ newEntity{ define_as = "ORB_DRAGON",
 			return true
 		end
 	end,
+
+	carrier = {
+		inc_stats = { [Stats.STAT_CUN] = 6, },
+	},
 }
 
 -- Vor Pride
@@ -152,6 +160,10 @@ newEntity{ define_as = "ORB_ELEMENTS",
 			return true
 		end
 	end,
+
+	carrier = {
+		inc_stats = { [Stats.STAT_MAG] = 6, },
+	},
 }
 
 -- Grushnak Pride
@@ -171,4 +183,8 @@ newEntity{ define_as = "ORB_DESTRUCTION",
 			return true
 		end
 	end,
+
+	carrier = {
+		inc_stats = { [Stats.STAT_STR] = 6, },
+	},
 }
diff --git a/game/modules/tome/data/general/objects/world-artifacts.lua b/game/modules/tome/data/general/objects/world-artifacts.lua
index 1aea25624cb15976c43b5f1ddace6c6e8583dcd0..9b8d1f88d98a18b126e8db7249d79c9ad43dc8d4 100644
--- a/game/modules/tome/data/general/objects/world-artifacts.lua
+++ b/game/modules/tome/data/general/objects/world-artifacts.lua
@@ -96,7 +96,7 @@ newEntity{ base = "BASE_RING",
 	unided_name = "multi-hued ring",
 	desc = [[This ring shines with many colors.]],
 	level_range = {15, 30},
-	rarity = 150,
+	rarity = 200,
 	cost = 500,
 	material_level = 3,
 
@@ -416,3 +416,99 @@ newEntity{
 		end
 	end },
 }
+
+newEntity{ base = "BASE_HELM",
+	unique = true,
+	name = "Star of Earendil",
+	unided_name = "shining helm",
+	desc = [[A headband with a glowing gem set in it, made in likeness of the silmaril that Earendil wore, and imbued with some of its light.]],
+	level_range = {20, 28},
+	rarity = 240,
+	cost = 700,
+	material_level = 4,
+	wielder = {
+		lite = 1,
+		combat_armor = 6,
+		fatigue = 4,
+		blind_immune = 0.3,
+		inc_stats = { [Stats.STAT_WIL] = 3, [Stats.STAT_MAG] = 4, },
+	},
+	max_power = 30, power_regen = 1,
+	use_talent = { id = Talents.T_SUN_FLARE, level = 3, power = 30 },
+}
+
+newEntity{ base = "BASE_KNIFE",
+	unique = true,
+	name = "Sting, Bilbo's Small Sword",
+	unided_name = "shining dagger",
+	desc = [["I will give you a name, and I shall call you Sting."
+The perfect size for Bilbo, and stamped forever by the courage he found in Mirkwood, this sturdy little blade grants the wearer combat prowess and survivalabilities they did not know they had.]],
+	level_range = {40, 50},
+	rarity = 300,
+	require = { stat = { dex=44 }, },
+	cost = 550,
+	material_level = 5,
+	combat = {
+		dam = 45,
+		apr = 11,
+		physcrit = 18,
+		dammod = {dex=0.55,str=0.35},
+	},
+	wielder = {
+		lite = 1,
+		inc_damage={
+			[DamageType.PHYSICAL] = 10,
+			[DamageType.LIGHT] = 8,
+		},
+		pin_immune = 0.5,
+		inc_stats = { [Stats.STAT_DEX] = 5, [Stats.STAT_CUN] = 4, },
+		esp = {["humanoid/orc"]=1},
+	},
+}
+
+newEntity{ base = "BASE_RING",
+	unique = true,
+	name = "Ring of the War Master", color = colors.DARK_GREY,
+	unided_name = "blade-edged ring",
+	desc = [[Elrond was told of the way to fashion a fourth ring by Celebrimbor, one he did not make out of fear it would also fall under the influence of the Ruling Ring.
+After Frodo destroyed it, Elrond passed the knowledge to Aragorn the King of Men to use against any remaining forces which once followed Sauron.]],
+	level_range = {15, 30},
+	rarity = 200,
+	cost = 500,
+	material_level = 5,
+
+	wielder = {
+		inc_stats = { [Stats.STAT_STR] = 3, [Stats.STAT_DEX] = 3, [Stats.STAT_CON] = 3, },
+		talents_types_mastery = {
+			["technique/2hweapon-cripple"] = 0.1,
+			["technique/2hweapon-offense"] = 0.1,
+			["technique/archery-bow"] = 0.1,
+			["technique/archery-sling"] = 0.1,
+			["technique/archery-training"] = 0.1,
+			["technique/archery-utility"] = 0.1,
+			["technique/combat-techniques-active"] = 0.1,
+			["technique/combat-techniques-passive"] = 0.1,
+			["technique/combat-training"] = 0.1,
+			["technique/dualweapon-attack"] = 0.1,
+			["technique/dualweapon-training"] = 0.1,
+			["technique/shield-defense"] = 0.1,
+			["technique/shield-offense"] = 0.1,
+		},
+	},
+}
+
+newEntity{
+	unique = true,
+	type = "jewelry", subtype="anhk",
+	unided_name = "glowing anhk",
+	name = "Anchoring Anhk",
+	desc = [[As you lift the anhk you feel stable. The world around you feels stable.]],
+	level_range = {15, 50},
+	rarity = 400,
+	display = "*", color=colors.YELLOW, image = "object/fireopal.png",
+	encumber = 2,
+
+	carrier = {
+
+	},
+}
diff --git a/game/modules/tome/data/talents/gifts/summon-utility.lua b/game/modules/tome/data/talents/gifts/summon-utility.lua
index 07694634adad4707128f300d07084ef6684055f8..877f68f5a44d0f13a15f3cdd177f0cf80a99bd59 100644
--- a/game/modules/tome/data/talents/gifts/summon-utility.lua
+++ b/game/modules/tome/data/talents/gifts/summon-utility.lua
@@ -80,7 +80,7 @@ newTalent{ short_name="SPIDER_WEB",
 		if not x or not y then return nil end
 		self:project(tg, x, y, function(tx, ty)
 			local target = game.level.map(tx, ty, Map.ACTOR)
-			if target and target:checkHit(self:combatAttackStr(), target:combatPhysicalResist(), 0, 95, 7) then
+			if target and target:checkHit(self:combatAttackStr(), target:combatPhysicalResist(), 0, 95, 7) and target:canBe("pin") then
 				target:setEffect(target.EFF_PINNED, 3 + self:getTalentLevel(t), {})
 			end
 		end)
diff --git a/game/modules/tome/data/talents/misc/npcs.lua b/game/modules/tome/data/talents/misc/npcs.lua
index ab8c4fe7d0636496380377b5c26becad79ca721f..1d48da8789f3f697c7256570a3970dd0b92adc4d 100644
--- a/game/modules/tome/data/talents/misc/npcs.lua
+++ b/game/modules/tome/data/talents/misc/npcs.lua
@@ -611,7 +611,7 @@ newTalent{
 				return mod.class.Trap.canTrigger(self, x, y, who)
 			end,
 			triggered = function(self, x, y, who)
-				if who:checkHit(self.disarm_power + 5, who:combatPhysicalResist(), 0, 95, 15) and who:canBe("stun") then
+				if who:checkHit(self.disarm_power + 5, who:combatPhysicalResist(), 0, 95, 15) and who:canBe("stun") and who:canBe("pin") then
 					who:setEffect(who.EFF_PINNED, dur, {})
 				else
 					game.logSeen(who, "%s resists!", who.name:capitalize())
diff --git a/game/modules/tome/data/talents/techniques/archery.lua b/game/modules/tome/data/talents/techniques/archery.lua
index 4d5abbe8190e9c832fad84cd383b2136cec27aeb..0e70367b6c8678a765f052d8743a164f140dbcae 100644
--- a/game/modules/tome/data/talents/techniques/archery.lua
+++ b/game/modules/tome/data/talents/techniques/archery.lua
@@ -234,7 +234,7 @@ newTalent{
 	require = techs_dex_req3,
 	range = 20,
 	archery_onhit = function(self, t, target, x, y)
-		if target:checkHit(self:combatAttackDex(), target:combatPhysicalResist(), 0, 95, 10) then
+		if target:checkHit(self:combatAttackDex(), target:combatPhysicalResist(), 0, 95, 10) and target:canBe("pin") then
 			target:setEffect(target.EFF_PINNED, 2 + self:getTalentLevelRaw(t), {})
 		else
 			game.logSeen(target, "%s resists!", target.name:capitalize())