diff --git a/game/modules/tome/data/general/objects/potions.lua b/game/modules/tome/data/general/objects/potions.lua
index c88df101f30a1c748ff430fc0c54dd3e2ec8a2c0..6815536f58794dec589122bb6065c61dfb2ec822 100644
--- a/game/modules/tome/data/general/objects/potions.lua
+++ b/game/modules/tome/data/general/objects/potions.lua
@@ -284,3 +284,16 @@ newEntity{ base = "BASE_POTION",
 		return "destroy", true
 	end}
 }
+
+newEntity{ base = "BASE_POTION",
+	name = "potion of free action",
+	color = colors.YELLOW,
+	level_range = {15, 50},
+	rarity = 6,
+	cost = 7,
+
+	use_simple = { name="resist stuns, dazes and pinning", use = function(self, who)
+		who:setEffect(who.EFF_FREE_ACTION, 4 + math.floor(who:getMag(3)), {power=1})
+		return "destroy", true
+	end}
+}
diff --git a/game/modules/tome/data/timed_effects.lua b/game/modules/tome/data/timed_effects.lua
index de6224f1f4760bab13ae5aaa1a5713776e55c0c2..74d57d711a56e9fae94433c66a4e90d48e009390 100644
--- a/game/modules/tome/data/timed_effects.lua
+++ b/game/modules/tome/data/timed_effects.lua
@@ -1041,3 +1041,23 @@ newEffect{
 		self:removeTemporaryValue("continuum_destabilization", eff.effid)
 	end,
 }
+
+newEffect{
+	name = "FREE_ACTION",
+	desc = "Free Action",
+	type = "magical",
+	status = "beneficial",
+	parameters = { power=1 },
+	on_gain = function(self, err) return "#Target# is moving freely .", "+Free Action" end,
+	on_lose = function(self, err) return "#Target# is moving less freely.", "-Free Action" end,
+	activate = function(self, eff)
+		eff.stun = self:addTemporaryValue("stun_immune", eff.power)
+		eff.daze = self:addTemporaryValue("daze_immune", eff.power)
+		eff.pin = self:addTemporaryValue("pin_immune", eff.power)
+	end,
+	deactivate = function(self, eff)
+		self:removeTemporaryValue("stun_immune", eff.stun)
+		self:removeTemporaryValue("daze_immune", eff.daze)
+		self:removeTemporaryValue("pin_immune", eff.pin)
+	end,
+}