diff --git a/game/engine/interface/ActorLevel.lua b/game/engine/interface/ActorLevel.lua
index ebfac4919c82d2ea90b39c10ab641a1eca719024..7278d96a93a9a79edaf664be79021d5797c3643e 100644
--- a/game/engine/interface/ActorLevel.lua
+++ b/game/engine/interface/ActorLevel.lua
@@ -85,6 +85,7 @@ end
 --- Gains some experience
 -- If a levelup happens it calls self:levelup(), modules are encourraged to rewrite it to do whatever is needed.
 function _M:gainExp(value)
+	self.changed = true
 	self.exp = math.max(0, self.exp + value)
 	while self:getExpChart(self.level + 1) and self.exp >= self:getExpChart(self.level + 1) and (not self.actors_max_level or self.level < self.actors_max_level) do
 		-- At max level, if any
diff --git a/game/engine/interface/ActorLife.lua b/game/engine/interface/ActorLife.lua
index cff88973974d6a1223f9a6a6514ae0b9284a2ab6..c415eab7381696c85275c57ad0b6789e50faa386 100644
--- a/game/engine/interface/ActorLife.lua
+++ b/game/engine/interface/ActorLife.lua
@@ -52,6 +52,7 @@ end
 --- Heal some
 function _M:heal(value, src)
 	self.life = util.bound(self.life + value, 0, self.max_life)
+	self.changed = true
 end
 
 --- Remove some HP from an actor
@@ -60,6 +61,7 @@ end
 function _M:takeHit(value, src)
 	if self.onTakeHit then value = self:onTakeHit(value, src) end
 	self.life = self.life - value
+	self.changed = true
 	if self.life <= 0 then
 		game.logSeen(self, "%s killed %s!", src.name:capitalize(), self.name)
 		return self:die(src)
@@ -70,6 +72,7 @@ end
 function _M:die(src)
 	game.level:removeEntity(self)
 	self.dead = true
+	self.changed = true
 
 	self:check("on_die", src)
 end
diff --git a/game/engine/interface/ActorStats.lua b/game/engine/interface/ActorStats.lua
index 5b301d9664c3be9a03d07b79635583106eabf4cf..09e6baf6b57f1062384f80e0ba2674f9a34e5b4a 100644
--- a/game/engine/interface/ActorStats.lua
+++ b/game/engine/interface/ActorStats.lua
@@ -74,6 +74,7 @@ function _M:incStat(stat, val)
 	if self:getStat(stat) ~= old then
 		self:onStatChange(stat, self:getStat(stat) - old)
 	end
+	self.changed = true
 	return self:getStat(stat) - old
 end
 
@@ -83,7 +84,8 @@ end
 -- @param stat the stat id
 -- @param scale a scaling factor, nil means max stat value
 -- @param raw false if the scaled result must be rounded down
-function _M:getStat(stat, scale, raw)
+-- @param no_inc if true it wont include stats gained by self.inc_stats
+function _M:getStat(stat, scale, raw, no_inc)
 	local val, inc
 	if type(stat) == "string" then
 		val = self.stats[_M.stats_def[stat].id]
@@ -92,7 +94,7 @@ function _M:getStat(stat, scale, raw)
 		val = self.stats[stat]
 		inc = self.inc_stats[stat]
 	end
-	val = util.bound(val, _M.stats_def[stat].min, _M.stats_def[stat].max) + inc
+	val = util.bound(val, _M.stats_def[stat].min, _M.stats_def[stat].max) + ((not no_inc) and inc or 0)
 	if scale then
 		if not raw then
 			val = math.floor(val * scale / _M.stats_def[stat].max)
diff --git a/game/modules/tome/class/Player.lua b/game/modules/tome/class/Player.lua
index d3a297babcd1100c54e75ef208a94719a0c4ead0..64eedde2f17e352d69414717b9cf68d2ae432e5d 100644
--- a/game/modules/tome/class/Player.lua
+++ b/game/modules/tome/class/Player.lua
@@ -169,6 +169,7 @@ function _M:playerFOV()
 			if self:attr("detect_object") and game.level.map(x, y, game.level.map.OBJECT) then ok = true end
 			if self:attr("detect_trap") and game.level.map(x, y, game.level.map.TRAP) then
 				game.level.map(x, y, game.level.map.TRAP):setKnown(self, true)
+				game.level.map:updateMap(x, y)
 				ok = true
 			end
 
diff --git a/game/modules/tome/data/talents/techniques/2hweapon.lua b/game/modules/tome/data/talents/techniques/2hweapon.lua
index 9da68aa6522aa43e6f3e024f839f4e62a9b206d5..af77b1561f751f727ec270d923e0d939377d9d72 100644
--- a/game/modules/tome/data/talents/techniques/2hweapon.lua
+++ b/game/modules/tome/data/talents/techniques/2hweapon.lua
@@ -33,8 +33,8 @@ newTalent{
 		end
 
 		return {
-			atk = self:addTemporaryValue("combat_dam", 5 + self:getStr(7) * self:getTalentLevel(t)),
-			dam = self:addTemporaryValue("combat_atk", 5 + self:getDex(7) * self:getTalentLevel(t)),
+			dam = self:addTemporaryValue("combat_dam", 5 + self:getStr(7) * self:getTalentLevel(t)),
+			atk = self:addTemporaryValue("combat_atk", 5 + self:getDex(7) * self:getTalentLevel(t)),
 			def = self:addTemporaryValue("combat_def", -5 - 2 * (self:getTalentLevelRaw(t)-1)),
 			armor = self:addTemporaryValue("combat_armor", -5 - 2 * (self:getTalentLevelRaw(t)-1)),
 		}
diff --git a/game/modules/tome/dialogs/LevelupStatsDialog.lua b/game/modules/tome/dialogs/LevelupStatsDialog.lua
index fd85750ca3d54b7f940b5dc7c4bf892272fd32ad..4769e03925fcd317a72c1e9d97cf3dbac5c383a5 100644
--- a/game/modules/tome/dialogs/LevelupStatsDialog.lua
+++ b/game/modules/tome/dialogs/LevelupStatsDialog.lua
@@ -63,7 +63,7 @@ function _M:incStat(v)
 			self:simplePopup("Not enough stat points", "You have no stat points left!")
 			return
 		end
-		if self.actor:getStat(self.sel) >= self.actor.level * 1.4 + 20 then
+		if self.actor:getStat(self.sel, nil, nil, true) >= self.actor.level * 1.4 + 20 then
 			self:simplePopup("Stat is at the maximun for your level", "You can not increase this stat further until next level!")
 			return
 		end
@@ -72,7 +72,7 @@ function _M:incStat(v)
 			return
 		end
 	else
-		if self.actor_dup:getStat(self.sel) == self.actor:getStat(self.sel) then
+		if self.actor_dup:getStat(self.sel, nil, nil, true) == self.actor:getStat(self.sel, nil, nil, true) then
 			self:simplePopup("Impossible", "You cannot take out more points!")
 			return
 		end