diff --git a/game/engines/default/engine/interface/ActorTemporaryEffects.lua b/game/engines/default/engine/interface/ActorTemporaryEffects.lua
index be6d0936277b27eeb0bae9cc568a496534dc6470..581a62c35b4834c73de76e8edd4cf150e356f60e 100644
--- a/game/engines/default/engine/interface/ActorTemporaryEffects.lua
+++ b/game/engines/default/engine/interface/ActorTemporaryEffects.lua
@@ -61,6 +61,12 @@ function _M:init(t)
 	self.tmp = self.tmp or {}
 end
 
+--- Returns the effect definition
+function _M:getEffectFromId(id)
+	if type(id) == "table" then return id end
+	return _M.tempeffect_def[id]
+end
+
 --- Counts down timed effects, call from your actors "act" method
 -- @param filter if not nil a function that gets passed the effect and its parameters, must return true to handle the effect
 function _M:timedEffects(filter)
@@ -74,7 +80,7 @@ function _M:timedEffects(filter)
 			else
 				if def.on_timeout then
 					if p.src then p.src.__project_source = p end -- intermediate projector source
-					if def.on_timeout(self, p) then
+					if def.on_timeout(self, p, def) then
 						todel[#todel+1] = eff
 					end
 					if p.src then p.src.__project_source = nil end
@@ -101,18 +107,19 @@ function _M:setEffect(eff_id, dur, p, silent)
 	if dur <= 0 then return self:removeEffect(eff_id) end
 	dur = math.floor(dur)
 
-	for k, e in pairs(_M.tempeffect_def[eff_id].parameters) do
+	local ed = _M.tempeffect_def[eff_id]
+	for k, e in pairs(ed.parameters) do
 		if not p[k] then p[k] = e end
 	end
 	p.dur = dur
 	p.effect_id = eff_id
-	if self:check("on_set_temporary_effect", eff_id, _M.tempeffect_def[eff_id], p) then return end
+	if self:check("on_set_temporary_effect", eff_id, ed, p) then return end
 	if p.dur <= 0 then return self:removeEffect(eff_id) end
 
 	-- If we already have it, we check if it knows how to "merge", or else we remove it and re-add it
 	if self:hasEffect(eff_id) then
-		if _M.tempeffect_def[eff_id].on_merge then
-			self.tmp[eff_id] = _M.tempeffect_def[eff_id].on_merge(self, self.tmp[eff_id], p)
+		if ed.on_merge then
+			self.tmp[eff_id] = ed.on_merge(self, self.tmp[eff_id], p, ed)
 			self.changed = true
 			return
 		else
@@ -121,8 +128,8 @@ function _M:setEffect(eff_id, dur, p, silent)
 	end
 
 	self.tmp[eff_id] = p
-	if _M.tempeffect_def[eff_id].on_gain then
-		local ret, fly = _M.tempeffect_def[eff_id].on_gain(self, p)
+	if ed.on_gain then
+		local ret, fly = ed.on_gain(self, p)
 		if not silent and not had then
 			if ret then
 				game.logSeen(self, ret:gsub("#Target#", self.name:capitalize()):gsub("#target#", self.name))
@@ -133,9 +140,9 @@ function _M:setEffect(eff_id, dur, p, silent)
 			end
 		end
 	end
-	if _M.tempeffect_def[eff_id].activate then _M.tempeffect_def[eff_id].activate(self, p) end
+	if ed.activate then ed.activate(self, p, ed) end
 	self.changed = true
-	self:check("on_temporary_effect_added", eff_id, _M.tempeffect_def[eff_id], p)
+	self:check("on_temporary_effect_added", eff_id, ed, p)
 end
 
 --- Check timed effect
@@ -169,7 +176,7 @@ function _M:removeEffect(eff, silent, force)
 			self:removeTemporaryValue(p.__tmpvals[i][1], p.__tmpvals[i][2])
 		end
 	end
-	if _M.tempeffect_def[eff].deactivate then _M.tempeffect_def[eff].deactivate(self, p) end
+	if _M.tempeffect_def[eff].deactivate then _M.tempeffect_def[eff].deactivate(self, p, _M.tempeffect_def[eff]) end
 	self:check("on_temporary_effect_removed", eff, _M.tempeffect_def[eff], p)
 end
 
@@ -184,6 +191,14 @@ function _M:copyEffect(eff_id)
 	return param
 end
 
+--- Reduces time remaining
+function _M:alterEffectDuration(eff_id, v)
+	local e = self.tmp[eff_id]
+	if not e then return end
+	e.dur = e.dur - 1
+	if e.dur <= 0 then self:removeEffect(eff_id) return true end
+end
+
 --- Removes the effect
 function _M:removeAllEffects()
 	local todel = {}
diff --git a/game/engines/default/modules/boot/dialogs/Credits.lua b/game/engines/default/modules/boot/dialogs/Credits.lua
index 4d0db80acb85f757e72a52369093db3e5a639c2c..c956d2c69a801b960473a28285e02f861ae21249 100644
--- a/game/engines/default/modules/boot/dialogs/Credits.lua
+++ b/game/engines/default/modules/boot/dialogs/Credits.lua
@@ -59,6 +59,7 @@ local credits = {
 
 	{"World Builders", title=1},
 	{"Aaron 'Sage Acrin' Vandegrift"},
+	{"Alexander '0player' Sedov"},
 	{"Chris 'Shibari' Davidson"},
 	{"Doctornull"},
 	{"Em 'Susramanian' Jay"},
diff --git a/game/modules/tome/class/interface/ActorInscriptions.lua b/game/modules/tome/class/interface/ActorInscriptions.lua
index 91c609eb49014f4272fb5d0a7e8a43b5eb122d94..9e8c92d1e3f99cc10355ecab7d2bb482ea14452a 100644
--- a/game/modules/tome/class/interface/ActorInscriptions.lua
+++ b/game/modules/tome/class/interface/ActorInscriptions.lua
@@ -134,6 +134,9 @@ function _M:getInscriptionData(name)
 		) * d.use_any_stat
 		d.inc_stat = max * d.use_stat_mod
 	elseif d.use_stat and d.use_stat_mod then d.inc_stat = self:getStat(d.use_stat) * d.use_stat_mod end
+	if self:attr("inscriptions_stat_multiplier") and d.inc_stat then
+		d.inc_stat = d.inc_stat * (1 + self.inscriptions_stat_multiplier)
+	end
 	return d
 end
 
diff --git a/game/modules/tome/class/interface/Combat.lua b/game/modules/tome/class/interface/Combat.lua
index af00e7a266205c26fce0c24bd920f9e0579afb14..b3ede9e2e3fe444f673e4b81ee7f64894ab3abb8 100644
--- a/game/modules/tome/class/interface/Combat.lua
+++ b/game/modules/tome/class/interface/Combat.lua
@@ -1313,7 +1313,7 @@ function _M:combatCrit(weapon)
 	if weapon.talented and self:knowTalent(Talents.T_LETHALITY) then
 		addcrit = 1 + self:callTalent(Talents.T_LETHALITY, "getCriticalChance")
 	end
-	local crit = self.combat_physcrit + (self:getCun() - 10) * 0.3 + (self:getLck() - 50) * 0.30 + (weapon.physcrit or 1) + addcrit
+	local crit = self.combat_physcrit + (self.combat_generic_crit or 0) + (self:getCun() - 10) * 0.3 + (self:getLck() - 50) * 0.30 + (weapon.physcrit or 1) + addcrit
 
 	return math.max(crit, 0) -- note: crit > 100% may be offset by crit reduction elsewhere
 end
@@ -1690,7 +1690,7 @@ end
 
 --- Gets spellcrit
 function _M:combatSpellCrit()
-	local crit = self.combat_spellcrit + (self:getCun() - 10) * 0.3 + (self:getLck() - 50) * 0.30 + 1
+	local crit = self.combat_spellcrit + (self.combat_generic_crit or 0) + (self:getCun() - 10) * 0.3 + (self:getLck() - 50) * 0.30 + 1
 
 	return util.bound(crit, 0, 100)
 end
@@ -1703,7 +1703,7 @@ function _M:combatMindCrit(add)
 		add = t.getMindCritChange(self, t)
 	end
 
-	local crit = self.combat_mindcrit + (self:getCun() - 10) * 0.3 + (self:getLck() - 50) * 0.30 + 1 + add
+	local crit = self.combat_mindcrit + (self.combat_generic_crit or 0) + (self:getCun() - 10) * 0.3 + (self:getLck() - 50) * 0.30 + 1 + add
 
 	return util.bound(crit, 0, 100)
 end
diff --git a/game/modules/tome/data/birth/descriptors.lua b/game/modules/tome/data/birth/descriptors.lua
index e5ee3695f7ff506545a33148a341982aba8f1aed..70e59afe3b2e19c92fd0e8ddf95fcad2e40b7ffe 100644
--- a/game/modules/tome/data/birth/descriptors.lua
+++ b/game/modules/tome/data/birth/descriptors.lua
@@ -329,6 +329,7 @@ load("/data/birth/races/elf.lua")
 load("/data/birth/races/halfling.lua")
 load("/data/birth/races/dwarf.lua")
 load("/data/birth/races/yeek.lua")
+load("/data/birth/races/ogre.lua")
 load("/data/birth/races/undead.lua")
 load("/data/birth/races/construct.lua")
 
diff --git a/game/modules/tome/data/birth/races/ogre.lua b/game/modules/tome/data/birth/races/ogre.lua
new file mode 100644
index 0000000000000000000000000000000000000000..8dc94e0be23547058d330a96a7673f9298d801e1
--- /dev/null
+++ b/game/modules/tome/data/birth/races/ogre.lua
@@ -0,0 +1,85 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009 - 2014 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+---------------------------------------------------------
+--                       Giants                         --
+---------------------------------------------------------
+newBirthDescriptor{
+	type = "race",
+	name = "Giant",
+	locked = function() return profile.mod.allow_build.race_giant end,
+	locked_desc = "WRITE ME",
+	desc = {
+		"WRITE ME",
+	},
+	descriptor_choices =
+	{
+		subrace =
+		{
+			Ogre = "allow",
+			__ALL__ = "disallow",
+		},
+	},
+	copy = {
+		type = "giant", subtype="giant",
+		starting_zone = "trollmire",
+		starting_quest = "start-allied",
+		resolvers.inventory{ id=true, {defined="ORB_SCRYING"} },
+	},
+}
+
+---------------------------------------------------------
+--                       Ogres                         --
+---------------------------------------------------------
+newBirthDescriptor
+{
+	type = "subrace",
+	name = "Ogre",
+	locked = function() return profile.mod.allow_build.race_ogre end,
+	locked_desc = "WRITE ME",
+	desc = {
+		"WRITE ME",
+		"They possess the #GOLD#Ogric Wrath#WHITE# talent which allows them a boost of speed every once in a while.",
+		"#GOLD#Stat modifiers:",
+		"#LIGHT_BLUE# * +3 Strength, -1 Dexterity, +0 Constitution",
+		"#LIGHT_BLUE# * +2 Magic, -2 Willpower, +2 Cunning",
+		"#GOLD#Life per level:#LIGHT_BLUE# 13",
+		"#GOLD#Experience penalty:#LIGHT_BLUE# 30%",
+	},
+	moddable_attachement_spots = "race_ogre",
+	inc_stats = { str=3, mag=2, wil=-2, cun=2, dex=1, con=0 },
+	experience = 1.3,
+	talents_types = { ["race/ogre"]={true, 0} },
+	talents = { [ActorTalents.T_OGRE_WRATH]=1 },
+	copy = {
+		moddable_tile = "ogre_#sex#",
+		random_name_def = "shalore_#sex#", random_name_max_syllables = 4,
+		default_wilderness = {"playerpop", "shaloren"},
+		starting_zone = "scintillating-caves",
+		starting_quest = "start-shaloren",
+		faction = "shalore",
+		starting_intro = "ogre",
+		life_rating = 13,
+		size_category = 4,
+		resolvers.inscription("RUNE:_SHIELDING", {cooldown=14, dur=5, power=100}),
+		resolvers.inscription("RUNE:_PHASE_DOOR", {cooldown=7, range=10, dur=5, power=15}),
+	},
+	experience = 1.3,
+	random_escort_possibilities = { {"tier1.1", 1, 2}, {"tier1.2", 1, 2}, {"daikara", 1, 2}, {"old-forest", 1, 4}, {"dreadfell", 1, 8}, {"reknor", 1, 2}, },
+}
diff --git a/game/modules/tome/data/birth/worlds.lua b/game/modules/tome/data/birth/worlds.lua
index 1d94fa85473ad4ebd3cd4b4fb5a0158ba18d7151..3c7dd254084fc928d7cc63e3687aaac1688133cc 100644
--- a/game/modules/tome/data/birth/worlds.lua
+++ b/game/modules/tome/data/birth/worlds.lua
@@ -28,6 +28,7 @@ local default_eyal_descriptors = function(add)
 		Dwarf = "allow",
 		Halfling = "allow",
 		Yeek = "allow",
+		Giant = "allow",
 		Undead = "allow",
 		Construct = "allow",
 	},
diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua
index 3f0c923c5b71605c55033b45d7829d26c74eb06b..76807eb12563a66a71c49090871b84f0891f7702 100644
--- a/game/modules/tome/data/damage_types.lua
+++ b/game/modules/tome/data/damage_types.lua
@@ -414,7 +414,7 @@ setDefaultProjector(function(src, x, y, type, dam, tmp, no_martyr)
 
 		local source_talent = src.__projecting_for and src.__projecting_for.project_type and (src.__projecting_for.project_type.talent_id or src.__projecting_for.project_type.talent) and src.getTalentFromId and src:getTalentFromId(src.__projecting_for.project_type.talent or src.__projecting_for.project_type.talent_id)
 		local dead
-		dead, dam = target:takeHit(dam, src, {damtype=type, source_talent=source_talent})
+		dead, dam = target:takeHit(dam, src, {damtype=type, source_talent=source_talent, initial_dam=dam})
 
 		-- Log damage for later
 		if not DamageType:get(type).hideMessage then
diff --git a/game/modules/tome/data/talents/misc/races.lua b/game/modules/tome/data/talents/misc/races.lua
index 862bdfdd34567bbebf5e7be4723f78525e785d14..b558a21e3d5d7dc98b4470ea0ff9d26463aff27b 100644
--- a/game/modules/tome/data/talents/misc/races.lua
+++ b/game/modules/tome/data/talents/misc/races.lua
@@ -179,7 +179,7 @@ newTalent{
 	points = 5,
 	cooldown = function(self, t) return math.ceil(self:combatTalentLimit(t, 5, 47, 35)) end, -- Limit > 5
 	getChance = function(self, t) return self:combatTalentLimit(t, 100, 21, 45) end, -- Limit < 100%
-	getInvis = function(self, t) return self:combatStatScale("mag" , 7, 25) end,
+	getInvis = function(self, t) return math.ceil(self:combatStatScale("mag" , 7, 25)) end,
 	mode = "sustained",
 	no_energy = true,
 	activate = function(self, t)
@@ -917,3 +917,119 @@ newTalent{
 		and allows you to identify any item you could not recognize yourself.]])
 	end,
 }
+
+------------------------------------------------------------------
+-- Ogre' powers
+------------------------------------------------------------------
+newTalentType{ type="race/ogre", name = "ogre", is_spell=true, generic = true, description = "The various racial bonuses a character can have." }
+newTalent{
+	short_name = "OGRE_WRATH",
+	name = "Ogric Wrath",
+	type = {"race/ogre", 1},
+	require = racial_req1,
+	points = 5,
+	no_energy = true,
+	cooldown = function(self, t) return math.ceil(self:combatTalentLimit(t, 10, 47, 35)) end, -- Limit >10
+	getduration = function(self) return math.floor(self:combatStatScale("str", 5, 12)) end,
+	range = 4,
+	no_npc_use = true,
+	requires_target = true,
+	direct_hit = true,
+	target = function(self, t) return {type="hit", range=self:getTalentRange(t), talent=t} end,
+	action = function(self, t)
+		self:setEffect(self.EFF_OGRIC_WRATH, t.getduration(self, t), {})
+		return true
+	end,
+	info = function(self, t)
+		return ([[You enter an ogric wrath for %d turns.
+		Whenever you miss a melee attack or one of your damage is reduced by a damage shield or effect you gain a charge of Ogre Fury(up to 5 charges).
+		Each charge grants 10%% stun and confusion resistance, 20%% critical damage power and 5%% critical strike chance.
+		You loose a charge each time you deal a critical strike.
+		The duration will increase with your Strength.]]):format(t.getduration(self))
+	end,
+}
+
+newTalent{
+	name = "Grisly Constitution",
+	type = {"race/ogre", 2},
+	require = racial_req2,
+	points = 5,
+	mode = "passive",
+	getSave = function(self, t) return self:combatTalentScale(t, 5, 20, 0.75) end,
+	getMult = function(self, t) return self:combatTalentScale(t, 15, 40) / 100 end,
+	passives = function(self, t, p)
+		self:talentTemporaryValue(p, "combat_spellresist", t.getSave(self, t))
+		self:talentTemporaryValue(p, "inscriptions_stat_multiplier", t.getMult(self, t))
+	end,
+	info = function(self, t)
+		return ([[An ogre's body is used to spells and inscriptions.
+		Increases spell save by %d and improves the contibution of primary stats on infusions and runes by %d%%.]]):
+		format(t.getSave(self, t), t.getMult(self, t) * 100)
+	end,
+}
+
+newTalent{
+	name = "Scar-Scripted Flesh",
+	type = {"race/ogre", 3},
+	require = racial_req3,
+	points = 5,
+	mode = "passive",
+	getChance = function(self, t) return self:combatTalentLimit(t, 100, 20, 45) end, -- Limit < 100%
+	callbackOnCrit = function(self, t)
+		if not rng.percent(t.getChance(self, t)) then return end
+		self:alterEffectDuration(self.EFF_RUNE_COOLDOWN, -1)
+		self:alterEffectDuration(self.EFF_INFUSION_COOLDOWN, -1)
+
+		local list = {}
+		for tid, c in pairs(self.talents_cd) do
+			local t = self:getTalentFromId(tid)
+			if t and t.is_inscription then
+				list[#list+1] = tid
+			end
+		end
+		if #list > 0 then
+			local tid = rng.table(list)
+			self:alterTalentCoolingdown(tid, -1)
+		end
+	end,
+	info = function(self, t)
+		return ([[When you crit you have %d%% chances to reduce the remaining cooldown of one of your inscriptions and of any saturations effects.
+		This effect can only happen once per turn.]]):
+		format(t.getChance(self, t))
+	end,
+}
+
+newTalent{
+	name = "Writ Large",
+	type = {"race/ogre", 4},
+	require = racial_req4,
+	points = 5,
+	no_energy = true,
+	cooldown = function(self, t) return math.ceil(self:combatTalentLimit(t, 6, 47, 35)) end, -- Limit >6
+	range = 4,
+	no_unlearn_last = true,
+	getDuration = function(self, t) return math.floor(self:combatTalentLimit(t, 15, 5, 10)) end,
+	on_learn = function(self, t)
+		if self:getTalentLevelRaw(t) == 5 then
+			self.max_inscriptions = self.max_inscriptions + 1
+		end
+	end,
+	on_unlearn = function(self, t)
+		if self:getTalentLevelRaw(t) == 4 then
+			self.max_inscriptions = self.max_inscriptions - 1
+		end
+	end,
+	action = function(self, t)
+		self:removeEffect(self.EFF_RUNE_COOLDOWN)
+		self:removeEffect(self.EFF_INFUSION_COOLDOWN)
+		self:setEffect(self.EFF_WRIT_LARGE, t.getDuration(self, t), {power=1})
+		game:playSoundNear(self, "talents/spell_generic")
+		return true
+	end,
+	info = function(self, t)
+		return ([[Instantly removes runic and infusion saturations.
+		For %d turns your inscriptions cooldown twice as fast.
+		At level 5 your command over inscriptions is so good that you can use one more.]]):
+		format(t.getDuration(self, t))
+	end,
+}
diff --git a/game/modules/tome/data/texts/intro-ogre.lua b/game/modules/tome/data/texts/intro-ogre.lua
new file mode 100644
index 0000000000000000000000000000000000000000..1d0ee416b9c6c7d8a6808ef3d840f832f97307b2
--- /dev/null
+++ b/game/modules/tome/data/texts/intro-ogre.lua
@@ -0,0 +1,32 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009 - 2014 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+return [[Welcome #LIGHT_GREEN#@name@#WHITE#.
+WRITE ME
+
+You are of the Shaloren, the Elven race with the closest ties to magic, and you are despised.
+While your people are at peace with the other kingdoms, many have not forgotten it was your race that created the terrible Spellblaze, thousands of years ago.
+
+You have decided to venture into the old and wild places looking for ancient treasures and glory.
+
+You have come to the north of the Shaloren capital city of Elvala, in search of the Scintillating Caves. It is infested with vermin and seemingly alive crystals.
+To the west lies another dangerous place: a camp of Rhaloren. They are renegade Shaloren who do not wish to restrict their magic usage. Stopping them is good for both your race and your treasure hunt.
+
+After days of travel, you have found the caves and entered it. What will you find there...?
+]]
diff --git a/game/modules/tome/data/timed_effects/magical.lua b/game/modules/tome/data/timed_effects/magical.lua
index bc682a16dc6bf37056328cce3a2875474606f294..a7c01edf0c102db0c6e981e4360c899c2e2af066 100644
--- a/game/modules/tome/data/timed_effects/magical.lua
+++ b/game/modules/tome/data/timed_effects/magical.lua
@@ -3159,4 +3159,105 @@ newEffect{
 	on_timeout = function(self, eff)
 		DamageType:get(DamageType.TEMPORAL).projector(eff.src, self.x, self.y, DamageType.TEMPORAL, eff.power)
 	end,
+}
+
+newEffect{
+	name = "OGRIC_WRATH", image = "talents/ogric_wrath.png",
+	desc = "Ogric Wrath",
+	long_desc = function(self, eff) return ("Do not try to resist it!"):format() end,
+	type = "magical",
+	subtype = { runic=true },
+	status = "beneficial",
+	parameters = { power=1 },
+	on_gain = function(self, err) return "#Target# enters an ogric frenzy.", "+Ogric Wrath" end,
+	on_lose = function(self, err) return "#Target# calms down.", "-Ogric Wrath" end,
+	callbackOnDealDamage = function(self, eff, val, target, dead, death_note)
+		if not death_note or not death_note.initial_dam then return end
+		if val >= death_note.initial_dam then return end
+		if self:reactionToward(target) >= 0 then return end
+		if self.turn_procs.ogric_wrath then return end
+
+		self.turn_procs.ogric_wrath = true
+		self:setEffect(self.EFF_OGRE_FURY, 1, {})
+	end,
+	callbackOnMeleeAttack = function(self, eff, target, hitted, crit, weapon, damtype, mult, dam)
+		if hitted then return true end
+		if self:reactionToward(target) >= 0 then return end
+		if self.turn_procs.ogric_wrath then return end
+
+		self.turn_procs.ogric_wrath = true
+		self:setEffect(self.EFF_OGRE_FURY, 1, {})
+	end,
+}
+
+newEffect{
+	name = "OGRE_FURY", image = "talents/ogric_wrath.png",
+	desc = "Ogre Fury",
+	long_desc = function(self, eff) return ("Inscriptions cooldown twice as fast."):format(eff.power) end,
+	type = "magical", decrease = 0,
+	subtype = { runic=true },
+	status = "beneficial",
+	parameters = { stacks=1, max_stacks=5 },
+	charges = function(self, eff) return eff.stacks end,
+	do_effect = function(self, eff, add)
+		if eff.stun then self:removeTemporaryValue("stun_immune", eff.stun) end
+		if eff.conf then self:removeTemporaryValue("confusion_immune", eff.conf) end
+		if eff.cdam then self:removeTemporaryValue("combat_critical_power", eff.cdam) end
+		if eff.crit then self:removeTemporaryValue("combat_generic_crit", eff.crit) end
+		if add then
+			eff.stun = self:addTemporaryValue("stun_immune", eff.stacks * 0.1)
+			eff.conf = self:addTemporaryValue("confusion_immune", eff.stacks * 0.1)
+			eff.cdam = self:addTemporaryValue("combat_critical_power", eff.stacks * 20)
+			eff.crit = self:addTemporaryValue("combat_generic_crit", eff.stacks * 5)
+		end
+	end,
+	callbackOnCrit = function(self, eff)
+		eff.stacks = eff.stacks - 1
+		if eff.stacks == 0 then
+			self:removeEffect(self.EFF_OGRE_FURY)
+		else
+			local e = self:getEffectFromId(self.EFF_OGRE_FURY)
+			e.do_effect(self, eff, true)
+		end
+	end,
+	on_merge = function(self, old_eff, new_eff, e)
+		old_eff.dur = new_eff.dur
+		old_eff.stacks = util.bound(old_eff.stacks + 1, 1, new_eff.max_stacks)
+		e.do_effect(self, old_eff, true)
+		return old_eff
+	end,
+	activate = function(self, eff, e)
+		e.do_effect(self, eff, true)
+	end,
+	deactivate = function(self, eff, e)
+		e.do_effect(self, eff, false)
+	end,
+}
+
+newEffect{
+	name = "WRIT_LARGE", image = "talents/writ_large.png",
+	desc = "Writ Large",
+	long_desc = function(self, eff) return ("Inscriptions cooldown twice as fast."):format(eff.power) end,
+	type = "magical",
+	subtype = { runic=true },
+	status = "beneficial",
+	parameters = { power=1 },
+	on_gain = function(self, err) return nil, "+Writ Large" end,
+	on_lose = function(self, err) return nil, "-Writ Large" end,
+	callbackOnActBase = function(self, eff)
+		if not self:attr("no_talents_cooldown") then
+			for tid, c in pairs(self.talents_cd) do
+				local t = self:getTalentFromId(tid)
+				if t and t.is_inscription then
+					self.changed = true
+					self.talents_cd[tid] = self.talents_cd[tid] - eff.power
+					if self.talents_cd[tid] <= 0 then
+						self.talents_cd[tid] = nil
+						if self.onTalentCooledDown then self:onTalentCooledDown(tid) end
+						if t.cooldownStop then t.cooldownStop(self, t) end
+					end
+				end
+			end
+		end
+	end,
 }
\ No newline at end of file