diff --git a/game/modules/tome/class/interface/Combat.lua b/game/modules/tome/class/interface/Combat.lua
index 586104d927b44f8b20cf612b226a2d11bd4c4a69..82ea0217b7c3f1e6e1294b21465a99d91e1fb83e 100644
--- a/game/modules/tome/class/interface/Combat.lua
+++ b/game/modules/tome/class/interface/Combat.lua
@@ -1021,15 +1021,6 @@ function _M:attackTargetHitProcs(target, weapon, dam, apr, armor, damtype, mult,
 		t.do_throw(target, self, t)
 	end
 
-	-- Greater Weapon Focus
-	local gwf = self:hasEffect(self.EFF_GREATER_WEAPON_FOCUS)
-	if hitted and not target.dead and weapon and gwf and not gwf.inside and rng.percent(gwf.chance) then
-		gwf.inside = true
-		game.logSeen(self, "%s focuses and gains an extra blow!", self.name:capitalize())
-		self:attackTargetWith(target, weapon, damtype, mult)
-		gwf.inside = nil
-	end
-
 	-- Zero gravity
 	if hitted and game.level.data.zero_gravity and rng.percent(util.bound(dam, 0, 100)) then
 		target:knockback(self.x, self.y, math.ceil(math.log(dam)))
diff --git a/game/modules/tome/data/talents/techniques/battle-tactics.lua b/game/modules/tome/data/talents/techniques/battle-tactics.lua
index 8283584493f2ea87a2fe639c9709f9f7ba3e0cf4..f5f762eaf31112d135a5f1ca8b70fab5ebf52bbc 100644
--- a/game/modules/tome/data/talents/techniques/battle-tactics.lua
+++ b/game/modules/tome/data/talents/techniques/battle-tactics.lua
@@ -23,20 +23,20 @@ newTalent{
 	type = {"technique/battle-tactics", 1},
 	require = techs_req_high1,
 	points = 5,
-	cooldown = 20,
+	cooldown = 15,
 	stamina = 25,
 	tactical = { ATTACK = 3 },
 	no_energy = true,
-	getdur = function(self,t) return math.floor(self:combatTalentLimit(t, 8, 2, 6)) end, -- Limit to <10
-	getchance = function(self,t) return self:combatLimit(self:combatTalentStatDamage(t, "dex", 10, 60),100, 6.8, 6.8, 61, 61) end, -- Limit < 100%
+	getdur = function(self,t) return math.floor(self:combatTalentLimit(t, 10, 3, 8)) end, -- Limit to <10
+	getchance = function(self,t) return self:combatLimit(self:combatTalentStatDamage(t, "dex", 10, 90),100, 6.8, 6.8, 61, 61) end, -- Limit < 100%
 	action = function(self, t)
 		self:setEffect(self.EFF_GREATER_WEAPON_FOCUS, t.getdur(self,t), {chance=t.getchance(self, t)})
 		return true
 	end,
 	info = function(self, t)
-		return ([[Concentrate on your blows; each strike has a %d%% chance to deal another, similar, blow for %d turns.
-		This works for all blows, even ones from other talents and from shield bashes.
-		The chance increases with your Dexterity.]]):format(t.getchance(self, t), t.getdur(self, t))
+		return ([[Concentrate on your blows; for %d turns, each successful strike you land has a %d%% chance to trigger another, similar strike.
+		This works for all blows, even those from other talents and from shield bashes, but can happen only once each turn.
+		The chance increases with your Dexterity.]]):format(t.getdur(self, t), t.getchance(self, t))
 	end,
 }
 
diff --git a/game/modules/tome/data/timed_effects/physical.lua b/game/modules/tome/data/timed_effects/physical.lua
index 628b12d01ffa90e8b1f5e2263514cc6dad640f89..72d18656993601a1ff24a5e349800c104a31a3bd 100644
--- a/game/modules/tome/data/timed_effects/physical.lua
+++ b/game/modules/tome/data/timed_effects/physical.lua
@@ -1302,12 +1302,20 @@ newEffect{
 newEffect{
 	name = "GREATER_WEAPON_FOCUS", image = "talents/greater_weapon_focus.png",
 	desc = "Greater Weapon Focus",
-	long_desc = function(self, eff) return ("%d%% chance to score a secondary blow."):format(eff.chance) end,
+	long_desc = function(self, eff) return ("Each melee blow landed has a %d%% chance to trigger an additional melee blow (up to once per turn)."):format(eff.chance) end,
 	type = "physical",
 	subtype = { tactic=true },
 	status = "beneficial",
-	parameters = { chance=50 },
+	parameters = { chance=25 },
+	-- trigger once per turn for targets
+	callbackOnMeleeAttack = function(self, eff, target, hitted, crit, weapon, damtype, mult, dam, hd)
+		if hitted and weapon and not self.turn_procs._gwf and not target.dead and rng.percent(eff.chance) then
+			self.turn_procs._gwf = true
+			self:attackTargetWith(target, weapon, damtype, mult)
+		end
+	end,
 	activate = function(self, eff)
+		eff.src = self
 	end,
 	deactivate = function(self, eff)
 	end,