diff --git a/game/engines/default/data/gfx/dark-ui/button1.png b/game/engines/default/data/gfx/dark-ui/button1.png
index b696b63c7354af9179e11742083c3c5f68067f4a..3963fcd3820f63622d2080abfe1ad358a1034585 100644
Binary files a/game/engines/default/data/gfx/dark-ui/button1.png and b/game/engines/default/data/gfx/dark-ui/button1.png differ
diff --git a/game/engines/default/data/gfx/dark-ui/button2.png b/game/engines/default/data/gfx/dark-ui/button2.png
index 30013b312b81efa2b56ff80cf558f75b8eb03f3e..50decf97ae8a3f695c34a55dd98c8a8439c5c8e7 100644
Binary files a/game/engines/default/data/gfx/dark-ui/button2.png and b/game/engines/default/data/gfx/dark-ui/button2.png differ
diff --git a/game/engines/default/data/gfx/dark-ui/button3.png b/game/engines/default/data/gfx/dark-ui/button3.png
index 69c594711c12e998bfa0caf5beb98d891a0f6e4e..1cbdf1c4dc34d514765c30add411b47728fe8273 100644
Binary files a/game/engines/default/data/gfx/dark-ui/button3.png and b/game/engines/default/data/gfx/dark-ui/button3.png differ
diff --git a/game/engines/default/data/gfx/dark-ui/button4.png b/game/engines/default/data/gfx/dark-ui/button4.png
index 5a3a87eee8b19edf9606fe97c3d121c9418e685f..68266cc4108ac4a33d94974a36215bb4cc7f83ca 100644
Binary files a/game/engines/default/data/gfx/dark-ui/button4.png and b/game/engines/default/data/gfx/dark-ui/button4.png differ
diff --git a/game/engines/default/data/gfx/dark-ui/button5.png b/game/engines/default/data/gfx/dark-ui/button5.png
index 2cd49a68cd2f7019ec21aae5ac25d8234fb72206..338a8abe5f342e8205dc90dadb7532a740c66758 100644
Binary files a/game/engines/default/data/gfx/dark-ui/button5.png and b/game/engines/default/data/gfx/dark-ui/button5.png differ
diff --git a/game/engines/default/data/gfx/dark-ui/button6.png b/game/engines/default/data/gfx/dark-ui/button6.png
index 931918643c5c89c182cd0dfd52d7ea019b23dc9d..343a43df1019c9c1d624a327299ca0f6c052acb5 100644
Binary files a/game/engines/default/data/gfx/dark-ui/button6.png and b/game/engines/default/data/gfx/dark-ui/button6.png differ
diff --git a/game/engines/default/data/gfx/dark-ui/button7.png b/game/engines/default/data/gfx/dark-ui/button7.png
index f59166d7c62e0c6a994dc26127424a3a515ea3e7..f54753cd1ab0c37db1edbd7472a86ec627f1d12a 100644
Binary files a/game/engines/default/data/gfx/dark-ui/button7.png and b/game/engines/default/data/gfx/dark-ui/button7.png differ
diff --git a/game/engines/default/data/gfx/dark-ui/button8.png b/game/engines/default/data/gfx/dark-ui/button8.png
index 2694686a9aead719ebb2386d61f33ca770eaa894..37f0314dfcd5ce628882c1d12b15ff5e38530c74 100644
Binary files a/game/engines/default/data/gfx/dark-ui/button8.png and b/game/engines/default/data/gfx/dark-ui/button8.png differ
diff --git a/game/engines/default/data/gfx/dark-ui/button9.png b/game/engines/default/data/gfx/dark-ui/button9.png
index eab39e6bae61dbc684bad7cfcc6ffa51804a7c29..1e30559f6226562fc05aabfe5de44b3814b2114d 100644
Binary files a/game/engines/default/data/gfx/dark-ui/button9.png and b/game/engines/default/data/gfx/dark-ui/button9.png differ
diff --git a/game/engines/default/data/gfx/dark-ui/button_sel1.png b/game/engines/default/data/gfx/dark-ui/button_sel1.png
index eef967f1b882b54239cdcdb6a1ab019e18f79972..a64299e437ae0c43508fbe23f714d8bcb1de6ab0 100644
Binary files a/game/engines/default/data/gfx/dark-ui/button_sel1.png and b/game/engines/default/data/gfx/dark-ui/button_sel1.png differ
diff --git a/game/engines/default/data/gfx/dark-ui/button_sel2.png b/game/engines/default/data/gfx/dark-ui/button_sel2.png
index 300d58be2214b443bc6d1320b27c5f46ded609cd..e1a0dbf84b03c235b1754a31f4a86283b7ea3bd0 100644
Binary files a/game/engines/default/data/gfx/dark-ui/button_sel2.png and b/game/engines/default/data/gfx/dark-ui/button_sel2.png differ
diff --git a/game/engines/default/data/gfx/dark-ui/button_sel3.png b/game/engines/default/data/gfx/dark-ui/button_sel3.png
index ee226edb56558a132996f5ff90b2fbf4bd2f5410..e052cb2dc4d21fe9becd088abba6ac3de888c710 100644
Binary files a/game/engines/default/data/gfx/dark-ui/button_sel3.png and b/game/engines/default/data/gfx/dark-ui/button_sel3.png differ
diff --git a/game/engines/default/data/gfx/dark-ui/button_sel4.png b/game/engines/default/data/gfx/dark-ui/button_sel4.png
index 61b3be41f237cd42801730a58544320308387a38..1b362969c707c54237f1fbcb584cc4cd54167698 100644
Binary files a/game/engines/default/data/gfx/dark-ui/button_sel4.png and b/game/engines/default/data/gfx/dark-ui/button_sel4.png differ
diff --git a/game/engines/default/data/gfx/dark-ui/button_sel5.png b/game/engines/default/data/gfx/dark-ui/button_sel5.png
index 47c1a301ef9fc4a5202cde047c4ad79fdc341330..0eed50792e9ab437ecc2d336437aa76647c624bb 100644
Binary files a/game/engines/default/data/gfx/dark-ui/button_sel5.png and b/game/engines/default/data/gfx/dark-ui/button_sel5.png differ
diff --git a/game/engines/default/data/gfx/dark-ui/button_sel6.png b/game/engines/default/data/gfx/dark-ui/button_sel6.png
index ea72e46ae64303902543b2ab50f49bffd0547f63..5d1e88ff0028ecc45f85a174dda20f48da4130c3 100644
Binary files a/game/engines/default/data/gfx/dark-ui/button_sel6.png and b/game/engines/default/data/gfx/dark-ui/button_sel6.png differ
diff --git a/game/engines/default/data/gfx/dark-ui/button_sel7.png b/game/engines/default/data/gfx/dark-ui/button_sel7.png
index 1a813bcff63ee9dea60b4f4be21420d57fb35b48..714fd79ad8e3d4dfe90cd1d6083a7e7ecc8ae979 100644
Binary files a/game/engines/default/data/gfx/dark-ui/button_sel7.png and b/game/engines/default/data/gfx/dark-ui/button_sel7.png differ
diff --git a/game/engines/default/data/gfx/dark-ui/button_sel8.png b/game/engines/default/data/gfx/dark-ui/button_sel8.png
index e337cc35fb3739c2d8ffa448540ddb201a9ae356..2341418ef9f0d07733d4ed6fdf964b03ccc2eb01 100644
Binary files a/game/engines/default/data/gfx/dark-ui/button_sel8.png and b/game/engines/default/data/gfx/dark-ui/button_sel8.png differ
diff --git a/game/engines/default/data/gfx/dark-ui/button_sel9.png b/game/engines/default/data/gfx/dark-ui/button_sel9.png
index 4f2ed0f0a7cec4db11ad8775473ed3ed4f5a3ece..7edd6aaa4b1af78e96c21145e857558a2413adfe 100644
Binary files a/game/engines/default/data/gfx/dark-ui/button_sel9.png and b/game/engines/default/data/gfx/dark-ui/button_sel9.png differ
diff --git a/game/engines/default/data/gfx/dark-ui/mouse-down.png b/game/engines/default/data/gfx/dark-ui/mouse-down.png
index b0b12c5d4100c7464b5e8af3e69153e718064c77..3ba36d61dc2a638d350df5e9df1a6551ddfb669d 100644
Binary files a/game/engines/default/data/gfx/dark-ui/mouse-down.png and b/game/engines/default/data/gfx/dark-ui/mouse-down.png differ
diff --git a/game/engines/default/data/gfx/dark-ui/mouse.png b/game/engines/default/data/gfx/dark-ui/mouse.png
index 4a95038883d785fff0a128f1fda4247e37027d9f..2ccf05e5921c7defc9163a16b91503678622ca0a 100644
Binary files a/game/engines/default/data/gfx/dark-ui/mouse.png and b/game/engines/default/data/gfx/dark-ui/mouse.png differ
diff --git a/game/engines/default/engine/HotkeysIconsDisplay.lua b/game/engines/default/engine/HotkeysIconsDisplay.lua
index e2c4f9294603ba1943df5ef0bb79d8445888ae24..9cf28a48b8bf615959243f4150ad93face572af3 100644
--- a/game/engines/default/engine/HotkeysIconsDisplay.lua
+++ b/game/engines/default/engine/HotkeysIconsDisplay.lua
@@ -234,7 +234,7 @@ function _M:display()
 				end
 				if o and o.wielded and o.use_talent and o.use_talent.id then
 					local t = a:getTalentFromId(o.use_talent.id)
-					if not a:preUseTalent(t, true, true) then
+					if not a:preUseTalent(t, true, true, true) then
 						angle = 0
 						color = {190,190,190}
 						frame = "disabled"
diff --git a/game/engines/default/engine/dialogs/VideoOptions.lua b/game/engines/default/engine/dialogs/VideoOptions.lua
index fce7d710059de7d103d42fa6897d442eb59492fc..bfb1a2c0f1fa29a0cbdcdf16b7b4e487c6e20142 100644
--- a/game/engines/default/engine/dialogs/VideoOptions.lua
+++ b/game/engines/default/engine/dialogs/VideoOptions.lua
@@ -249,7 +249,7 @@ function _M:generateList()
 									revertMove()
 								end
 							end
-							,  _"Accept", _"Revert")
+							,  _t"Accept", _t"Revert")
 						game:registerTimer(10
 							, function()
 								-- Blast out changes if no response
diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index 5559833218b23099da6f24f09bdf0f10707c52e3..db0b92e1692b72742290ec0be672b07cb31b1500 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -5683,12 +5683,11 @@ end
 -- Check the actor can cast it
 -- @param ab the talent (not the id, the table)
 -- @return true to continue, false to stop
-function _M:preUseTalent(ab, silent, fake)
+function _M:preUseTalent(ab, silent, fake, ignore_ressources)
 	if ab._ai_parsed == nil then -- add some AI info to the talent if needed
 		print("[Actor:preUseTalent] PARSING TALENT for AI info", ab.id, self.name)
 		mod.class.interface.ActorAI.aiParseTalent(ab, self)
 	end
-
 	if self.forbid_talents and self.forbid_talents[ab.id] then
 		if not silent then game.logSeen(self, self.forbid_talents[ab.id] or "%s can not use %s.", self:getName():capitalize(), ab.name) end
 		return false
@@ -5778,7 +5777,7 @@ function _M:preUseTalent(ab, silent, fake)
 	end
 
 	-- check resource costs (sustains can always be deactivated at no cost)
-	if not self:attr("force_talent_ignore_ressources") and not self:isTalentActive(ab.id) and (not self.talent_no_resources or not self.talent_no_resources[ab.id]) then
+	if not ignore_ressources and not self:attr("force_talent_ignore_ressources") and not self:isTalentActive(ab.id) and (not self.talent_no_resources or not self.talent_no_resources[ab.id]) then
 		local rname, cost, rmin, rmax
 		-- check for sustained resources
 		self.on_preuse_checking_resources = true
diff --git a/game/modules/tome/class/Player.lua b/game/modules/tome/class/Player.lua
index db3aa134b26ed192109bda2fce8b21a58cdcd924..aa0c2c59a25f73f8f7552fd6e4ba34431a92147c 100644
--- a/game/modules/tome/class/Player.lua
+++ b/game/modules/tome/class/Player.lua
@@ -1482,7 +1482,7 @@ function _M:playerUseItem(object, item, inven)
 		if not o then return end
 		local co = coroutine.create(function()
 			self.changed = true
-			return self:playerUseObject(object, item, inven)
+			return self:playerUseObject(o, item, inven)
 		end)
 		local ok, ret = coroutine.resume(co)
 		if not ok and ret then print(debug.traceback(co)) error(ret) end
diff --git a/game/modules/tome/data/chats/ring-of-blood-master.lua b/game/modules/tome/data/chats/ring-of-blood-master.lua
index e7c851f5700c66b6d6d2b5ed148831ca995685cd..659e6a82a6b89c860fd5b6ef7bdda62dc3093f52 100644
--- a/game/modules/tome/data/chats/ring-of-blood-master.lua
+++ b/game/modules/tome/data/chats/ring-of-blood-master.lua
@@ -34,7 +34,7 @@ newChat{ id="what",
 Since you do not look like slave fodder to me I will offer to let you pay to play the game.
 If you feel you cannot take part in a slaver's game, I am afraid you will need to... disappear.]],
 	answers = {
-		{_t"Slavers? This is so wrong! [attack]", action=attack("You think so? Die.")},
+		{_t"Slavers? This is so wrong! [attack]", action=attack(_t"You think so? Die.")},
 		{_t"Game? I like playing, what's this about?", jump="game"},
 	}
 }
diff --git a/game/modules/tome/data/gfx/particles/arcanestorm.lua b/game/modules/tome/data/gfx/particles/arcanestorm.lua
index a1219d6e4fccfd0c8f218354793849064c434740..2993f09fd86bcfa18b99c75f736167698d9c6418 100644
--- a/game/modules/tome/data/gfx/particles/arcanestorm.lua
+++ b/game/modules/tome/data/gfx/particles/arcanestorm.lua
@@ -17,6 +17,7 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
+local radius = radius or 5
 base_size = 32
 can_shift = true
 
@@ -24,7 +25,7 @@ return { generator = function()
 	local ad = rng.range(0, 360)
 	local a = math.rad(ad)
 	local dir = math.rad(ad + 90)
-	local r = rng.avg(1, 40 * 3)
+	local r = rng.avg(1, 16 + 32 * radius)
 	local dirv = math.rad(5)
 
 	return {
@@ -44,7 +45,7 @@ return { generator = function()
 	}
 end, },
 function(self)
-	self.ps:emit(10)
+	self.ps:emit(radius * radius / 2)
 end,
-500,
+2000,
 "weather/snowflake"
diff --git a/game/modules/tome/data/quests/escort-duty.lua b/game/modules/tome/data/quests/escort-duty.lua
index f2b452dde532c049d6dd60648e7e1b222e2fbd0e..406b9e6449100c3f434b685836d6dcecb5bd0928 100644
--- a/game/modules/tome/data/quests/escort-duty.lua
+++ b/game/modules/tome/data/quests/escort-duty.lua
@@ -67,7 +67,7 @@ desc = function(self, who)
 		if self.abandoned then
 			desc[#desc+1] = ("You abandoned %s, to death."):tformat(_t(self.kind.name))
 		else
-			desc[#desc+1] = ("You failed to protect the %s from death by %s."):tformat(_t(self.kind.name), self.killing_npc or "???")
+			desc[#desc+1] = ("You failed to protect the %s from death by %s."):tformat(_t(self.kind.name), _t(self.killing_npc) or _t"???")
 		end
 	else
 		desc[#desc+1] = ("Escort the %s to the recall portal on level %s."):tformat(_t(self.kind.name), self.level_name)
diff --git a/game/modules/tome/data/talents/misc/npcs.lua b/game/modules/tome/data/talents/misc/npcs.lua
index 6dbd42c5dc5c501713dbe147f875b79ec0edbafa..e1560f7676532b48c08e69e4577a1afba2cb1da4 100644
--- a/game/modules/tome/data/talents/misc/npcs.lua
+++ b/game/modules/tome/data/talents/misc/npcs.lua
@@ -1023,7 +1023,7 @@ newTalent{
 	direct_hit = true,
 	requires_target = true,
 	target = function(self, t)
-		return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t)}
+		return {type="ball", range=self:getTalentRange(t), friendlyfire=false, radius=self:getTalentRadius(t)}
 	end,
 	tactical = { ATTACK = { PHYSICAL = 2 } },
 	getDamage = function(self, t) return self:combatScale(self:getStr()*self:getTalentLevel(t), 20, 0, 420, 500) end,
diff --git a/game/modules/tome/data/talents/psionic/voracity.lua b/game/modules/tome/data/talents/psionic/voracity.lua
index 9cce8d548354e5f04c4344a1e6e5182e36da685b..c9835db6a4ea53ed065a5dc752e8fdff9b0eeca5 100644
--- a/game/modules/tome/data/talents/psionic/voracity.lua
+++ b/game/modules/tome/data/talents/psionic/voracity.lua
@@ -65,7 +65,7 @@ newTalent{
 						act:setEffect(act.EFF_SLEEP, 4, {src=self, power=en, insomnia=en, no_ct_effect=true, apply_power=self:combatMindpower()})
 						game.level.map:particleEmitter(act.x, act.y, 1, "generic_charge", {rm=0, rM=0, gm=180, gM=255, bm=180, bM=255, am=35, aM=90})
 					else
-						game.logSeen(self, "%s resists the sleep!", act.name:capitalize())
+						game.logSeen(self, "%s resists the sleep!", act:getName():capitalize())
 					end
 				end
 			end
diff --git a/game/modules/tome/data/talents/spells/arcane.lua b/game/modules/tome/data/talents/spells/arcane.lua
index c2b47b0e7b7af1a7e861f0dc1fdf65e6a2a1aea0..7573354be6e6fb647731baa298192165394ad3b7 100644
--- a/game/modules/tome/data/talents/spells/arcane.lua
+++ b/game/modules/tome/data/talents/spells/arcane.lua
@@ -152,7 +152,7 @@ newTalent{
 	use_only_arcane = 1,
 	no_energy = true,
 	tactical = { MANA = 3, DEFEND = 2, },
-	radius = 5,
+	radius = function(self, t) return self:hasEffect(self.EFF_AETHER_AVATAR) and 10 or 5 end,
 	getMaxAbsorb = function(self, t) return self:getShieldAmount(self:combatTalentSpellDamage(t, 50, 450)) end,
 	getManaRatio = function(self, t) return self:combatTalentLimit(t, 0.2, 0.95, 0.35) end,
 	-- Note: effects handled in mod.class.Actor:onTakeHit function
@@ -175,7 +175,7 @@ newTalent{
 			DamageType.ARCANE, self:spellCrit(dam / 5),
 			radius,
 			5, nil,
-			{type="arcanestorm", only_one=true},
+			{type="arcanestorm", args={radius=radius}, only_one=true},
 			function(e) e.x = e.src.x e.y = e.src.y return true end,
 			false
 		)
diff --git a/game/modules/tome/data/talents/spells/eradication.lua b/game/modules/tome/data/talents/spells/eradication.lua
index fed103215eb0ae2ca8075f4be9af014fb23cd5b7..68bbbbb5335c94550e98330decb9104df02aaa89 100644
--- a/game/modules/tome/data/talents/spells/eradication.lua
+++ b/game/modules/tome/data/talents/spells/eradication.lua
@@ -169,7 +169,7 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[Your target's doom draws near. Its healing factor is reduced by 80%%, and will take %d%% of its remaining life (or %0.2f, whichever is lower) over 10 turns as frostdusk damage.
-		This spell is so powerful that every 2 turns it tears a part of the target's soul, generating one soul for you.
+		This spell is so powerful that every 3 turns it tears a part of the target's soul, generating one soul for you.
 		The damage will increase with your Spellpower.]]):
 		tformat(t.getDamage(self, t), t.getMax(self, t))
 	end,
diff --git a/game/modules/tome/data/talents/spells/ice.lua b/game/modules/tome/data/talents/spells/ice.lua
index 2240d3f5d06b302b2c0c0a5c0a2bb8339aee0552..bc2d0e48b2383347b7460a7b6566e6bdb255a30e 100644
--- a/game/modules/tome/data/talents/spells/ice.lua
+++ b/game/modules/tome/data/talents/spells/ice.lua
@@ -118,7 +118,7 @@ newTalent{
 					-- Instakill critters
 					if act.rank <= 1 then
 						if act:canBe("instakill") then
-							game.logSeen(act, "%s shatters!", act.name:capitalize())
+							game.logSeen(act, "%s shatters!", act:getName():capitalize())
 							act:die(self)
 						end
 					end
diff --git a/game/modules/tome/data/talents/spells/necrosis.lua b/game/modules/tome/data/talents/spells/necrosis.lua
index 65456a94375d5f2c6685ff8677a0078a3309ddb6..2488bb7da6a4a78ad2ab90332a67d1a2bf092f2c 100644
--- a/game/modules/tome/data/talents/spells/necrosis.lua
+++ b/game/modules/tome/data/talents/spells/necrosis.lua
@@ -102,7 +102,7 @@ newTalent{
 	mode = "passive",
 	no_npc_use = true, -- They mostly wouldnt use it efficiently
 	getLifeBonus = function(self, t) return self:combatTalentScale(t, 8, 30) end,
-	getCrit = function(self, t) return self:combatTalentScale(t, 1, 3) end,
+	getCrit = function(self, t) return self:combatTalentScale(t, 1, 1.8) end,
 	countRunes = function(self, t)
 		local nb = 0
 		for tid, lvl in pairs(self.talents) do
diff --git a/game/modules/tome/data/talents/spells/thaumaturgy.lua b/game/modules/tome/data/talents/spells/thaumaturgy.lua
index 98c5313c83271fee4bddd8ae1af672a723219b30..598bf0cd5e0aa02b277a8548a947ec219db55f10 100644
--- a/game/modules/tome/data/talents/spells/thaumaturgy.lua
+++ b/game/modules/tome/data/talents/spells/thaumaturgy.lua
@@ -67,6 +67,7 @@ newTalent{
 		["spell/lightning"] = 	{ "T_CHAIN_LIGHTNING", "T_NOVA", "T_SHOCK" },
 		["spell/water"] = 	{ "T_GLACIAL_VAPOUR", "T_TIDAL_WAVE", "T_FREEZE", "T_FROZEN_GROUND" },
 		["spell/earth"] = 	{ "T_MUDSLIDE", "T_EARTHEN_MISSILES", "T_EARTHQUAKE" },
+		["spell/phantasm"] = 	{ "T_ILLUMINATE" },
 	},
 	callbackOnDealDamage = function(self, t, val, target, dead, death_note)
 		if not rng.percent(t:_getChance(self)) then return end
@@ -107,13 +108,32 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
+		local spells = {}
+		local is_aethar_avatar = self:hasEffect(self.EFF_AETHER_AVATAR)
+		for kind, list in pairs(t.spells_list) do
+			for _, tid in ipairs(list) do
+				local tt = self:getTalentFromId(tid)
+				if self:knowTalent(tid) then
+					if (not is_aethar_avatar or (tt.use_only_arcane and self:getTalentLevel(self.T_AETHER_AVATAR) >= tt.use_only_arcane)) then
+						spells[#spells+1] = ("#LIGHT_BLUE#%s [known, eligible]#LAST#"):tformat(tt.name)
+					else
+						spells[#spells+1] = ("#YELLOW#%s [known]#LAST#"):tformat(tt.name)
+					end
+				else
+					spells[#spells+1] = ("#GREY#%s [unknown]#LAST#"):tformat(tt.name)
+				end
+			end
+		end
+		table.sort(spells, function(a, b) return a:removeColorCodes() < b:removeColorCodes() end)
 		return ([[Casting beam spells has become so instinctive for you that you can now easily weave in other spells at the same time.
 		Anytime you cast a beam spell there is a %d%% chance to automatically cast an offensive spell that you know.
 		Beam spells duplicated by the Orb of Thaumaturgy can also trigger this effect.
 		This can only happen once (or twice with Orb of Thaumaturgy) per turn.
-		The additional cast will cost mana but no turn and will not active its cooldown.
-		During Aether Avatar only compatible spells are used.]]):
-		tformat(t:_getChance(self))
+		The additional cast will cost mana but no turn, will not active its cooldown and can trigger on spells currently on cooldown.
+		During Aether Avatar only compatible spells are used.
+
+		Eligible spells: %s]]):
+		tformat(t:_getChance(self), table.concat(spells, ", "))
 	end,
 }
 
@@ -123,7 +143,7 @@ newTalent{
 	require = spells_req_high3,
 	points = 5,
 	mode = "sustained",
-	mana = 40,
+	sustain_mana = 40,
 	cooldown = 20,
 	use_only_arcane = 5,
 	tactical = { BUFF=1 },
diff --git a/game/modules/tome/data/talents/spells/wildfire.lua b/game/modules/tome/data/talents/spells/wildfire.lua
index 92be2e99d778b5576da9d34621771e4e2477ee9b..4a7df2d8b864cfb2da2171253f83759dfe1f213a 100644
--- a/game/modules/tome/data/talents/spells/wildfire.lua
+++ b/game/modules/tome/data/talents/spells/wildfire.lua
@@ -75,17 +75,14 @@ newTalent{
 	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 55) end,
 	activate = function(self, t)
 		game:playSoundNear(self, "talents/fire")
-		local cft = self:getTalentFromId(self.T_CLEANSING_FLAMES)
 		self:addShaderAura("burning_wake", "awesomeaura", {time_factor=3500, alpha=0.6, flame_scale=0.6}, "particles_images/wings.png")
 		return {
 			bw = self:addTemporaryValue("burning_wake", t.getDamage(self, t)),
-			cf = self:addTemporaryValue("cleansing_flames", cft.getChance(self, cft)),
 		}
 	end,
 	deactivate = function(self, t, p)
 		self:removeShaderAura("burning_wake")
 		self:removeTemporaryValue("burning_wake", p.bw)
-		self:removeTemporaryValue("cleansing_flames", p.cf)
 		return true
 	end,
 	info = function(self, t)
diff --git a/game/modules/tome/data/talents/uber/cun.lua b/game/modules/tome/data/talents/uber/cun.lua
index a840da83effd4b90092c3237721acab52e0cfe0e..419b48f5baf957f0542dcf6233fab73bfb1165de 100644
--- a/game/modules/tome/data/talents/uber/cun.lua
+++ b/game/modules/tome/data/talents/uber/cun.lua
@@ -471,7 +471,7 @@ uberTalent{
 	mode = "passive",
 	cant_steal = true,
 	info = function(self, t)
-		return ([[You are adept at many different skills, granting you +1.5 to all talent levels.
+		return ([[You are adept at many different skills, granting you +1.5 to all known talent levels.
 		This works on already known talents and those that you will learn afterwards.]]):tformat()
 	end,
 	passives = function(self, t, p)
diff --git a/game/modules/tome/data/timed_effects/magical.lua b/game/modules/tome/data/timed_effects/magical.lua
index bbea4c10b01497162899eed6673452d2c06465a3..4e6f7666a236f33306ee2c61b4c18bab8ac4317d 100644
--- a/game/modules/tome/data/timed_effects/magical.lua
+++ b/game/modules/tome/data/timed_effects/magical.lua
@@ -2006,13 +2006,14 @@ newEffect{
 	on_lose = function(self, err) return _t"#Target# is freed from the impending doom.", _t"-Doomed" end,
 	activate = function(self, eff)
 		eff.healid = self:addTemporaryValue("healing_factor", -0.8)
-		eff.soul_turn = false
+		eff.soul_turn = 0
 	end,
 	on_timeout = function(self, eff)
 		if eff.src.dead or not game.level:hasEntity(eff.src) then return true end
 		DamageType:get(DamageType.FROSTDUSK).projector(eff.src, self.x, self.y, DamageType.FROSTDUSK, eff.dam)
-		eff.soul_turn = not eff.soul_turn
-		if eff.soul_turn then
+		eff.soul_turn = eff.soul_turn + 1
+		if eff.soul_turn >= 3 then
+			eff.soul_turn = 0
 			eff.src:incSoul(1)
 			game.logSeen(self, "#CRIMSON#A piece of the soul of %s is torn apart by Impending Doom!", self:getName())
 		end
@@ -5303,7 +5304,7 @@ newEffect{
 		self:effectTemporaryValue(eff, "cleansing_flames", eff.chance)
 	end,
 	on_timeout = function(self, eff)
-		DamageType:get(DamageType.FIRE).projector(self, self.x, self.y, DamageType.FIRE, eff.power)
+		DamageType:get(DamageType.INFERNO).projector(self, self.x, self.y, DamageType.INFERNO, eff.power)
 	end,
 }
 
diff --git a/game/modules/tome/data/zones/town-lumberjack-village/npcs.lua b/game/modules/tome/data/zones/town-lumberjack-village/npcs.lua
index 0aedf003843ce31e5e4c04e9a135484e226b63fc..4c8b2a7e172019355ca629b0a5dc5f4c6f5685ab 100644
--- a/game/modules/tome/data/zones/town-lumberjack-village/npcs.lua
+++ b/game/modules/tome/data/zones/town-lumberjack-village/npcs.lua
@@ -77,7 +77,7 @@ newEntity{ defined_as = "LUMBERJACK",
 	max_life = 100, life_rating = 10,
 	stats = { str=20 },
 	rank = 2,
-	size_category = 2,
+	size_category = 3,
 	infravision = 10,
 
 	body = { INVEN = 10, MAINHAND=1, OFFHAND=1, BODY=1 },
diff --git a/game/modules/tome/dialogs/LevelupDialog.lua b/game/modules/tome/dialogs/LevelupDialog.lua
index 2c37065122888d1835965f4f3865871ee35092cc..83ebfa51fc40cd624ed6ecd13b8a23ba4051109f 100644
--- a/game/modules/tome/dialogs/LevelupDialog.lua
+++ b/game/modules/tome/dialogs/LevelupDialog.lua
@@ -998,7 +998,7 @@ function _M:getTalentDesc(item)
 				-- list[i] = d:tokenize(tokenize_number.decimal)
 			end			
 			text:add({"font", "bold"}, _t"Current talent level: "..traw)
-			if lvl_alt ~= 0 then text:add((" (%+d bonus level)"):tformat(lvl_alt)) end
+			if lvl_alt ~= 0 then text:add((" (%+0.1f bonus level)"):tformat(lvl_alt)) end
 			text:add({"font", "normal"}, true)
 			text:merge(tstring:diffMulti(list, function(diffs, res)
 				for i, d in ipairs(diffs) do
@@ -1028,7 +1028,7 @@ function _M:getTalentDesc(item)
 				local req = self.actor:getTalentReqDesc(item.talent, 1):toTString():tokenize(" ()[]")
 				text:add{"color","WHITE"}
 				text:add({"font", "bold"}, _t"First talent level: ", tostring(traw+1))
-				if lvl_alt ~= 0 then text:add((" (%+d bonus level)"):tformat(lvl_alt)) end
+				if lvl_alt ~= 0 then text:add((" (%+0.1f bonus level)"):tformat(lvl_alt)) end
 				text:add({"font", "normal"}, true)
 				text:merge(req)
 				text:merge(self.actor:getTalentFullDescription(t, 1000):diffWith(self.actor:getTalentFullDescription(t, 1), diff_color))
@@ -1037,14 +1037,14 @@ function _M:getTalentDesc(item)
 				local req2 = self.actor:getTalentReqDesc(item.talent, 1):toTString():tokenize(" ()[]")
 				text:add{"color","WHITE"}
 				text:add({"font", "bold"}, traw == 0 and _t"Next talent level" or _t"Current talent level: ", tostring(traw), " [-> ", tostring(traw + 1), "]")
-				if lvl_alt ~= 0 then text:add((" (%+d bonus level)"):tformat(lvl_alt)) end
+				if lvl_alt ~= 0 then text:add((" (%+0.1f bonus level)"):tformat(lvl_alt)) end
 				text:add({"font", "normal"}, true)
 				text:merge(req2:diffWith(req, diff_full))
 				text:merge(self.actor:getTalentFullDescription(t, 1):diffWith(self.actor:getTalentFullDescription(t), diff_full))
 			else
 				local req = self.actor:getTalentReqDesc(item.talent):toTString():tokenize(" ()[]")
 				text:add({"font", "bold"}, _t"Current talent level: "..traw)
-				if lvl_alt ~= 0 then text:add((" (%+d bonus level)"):tformat(lvl_alt)) end
+				if lvl_alt ~= 0 then text:add((" (%+0.1f bonus level)"):tformat(lvl_alt)) end
 				text:add({"font", "normal"}, true)
 				text:merge(req)
 				text:merge(self.actor:getTalentFullDescription(t, 1000):diffWith(self.actor:getTalentFullDescription(t), diff_color))
diff --git a/src/main.c b/src/main.c
index 29ff0fd3ee68a0cacb171bc777224f5133312465..688dc3a6c751bbc7dc5cf3cf586bcefe88f41b33 100644
--- a/src/main.c
+++ b/src/main.c
@@ -55,6 +55,12 @@
 #define WINDOW_ICON_PATH ("/engines/default/data/gfx/te4-icon.png")
 #define JOY_DEADZONE 0.21
 
+#ifdef SELFEXE_WINDOWS
+// Force nvidia optimus and amd equivalent to use the real GPU instead of the intel crappy one
+__declspec( dllexport ) DWORD NvOptimusEnablement                = 0x00000001;
+__declspec( dllexport ) int AmdPowerXpressRequestHighPerformance = 1;
+#endif
+
 int start_xpos = -1, start_ypos = -1;
 bool ignore_window_change_pos = FALSE;
 char *override_home = NULL;