Quantcast

Generate reference scripts from SimulationCraft profiles.

Johnny C. Lam [05-21-14 - 13:08]
Generate reference scripts from SimulationCraft profiles.

These reference scripts are modified by hand to create the default Ovale
scripts.  Save the generated scripts to more easily see what has changed
in the SimulationCraft action lists and to determine what needs to be
updated in the default scripts.

git-svn-id: svn://svn.curseforge.net/wow/ovale/mainline/trunk@1481 d5049fe3-3747-40f7-a4b5-f36d6801af5f
Filename
OvaleSimulationCraft.lua
generate.lua
scripts/files.xml
scripts/simulationcraft_deathknight_frost_1h_t16h.lua
scripts/simulationcraft_deathknight_frost_2h_t16h.lua
scripts/simulationcraft_deathknight_unholy_t16h.lua
scripts/simulationcraft_druid_balance_t16h.lua
scripts/simulationcraft_druid_feral_t16h.lua
scripts/simulationcraft_druid_feral_t16h_adv_rotation.lua
scripts/simulationcraft_hunter_bm_t16h.lua
scripts/simulationcraft_hunter_mm_t16h.lua
scripts/simulationcraft_hunter_sv_t16h.lua
scripts/simulationcraft_mage_arcane_t16h.lua
scripts/simulationcraft_mage_fire_t16h.lua
scripts/simulationcraft_mage_frost_t16h.lua
scripts/simulationcraft_monk_windwalker_1h_t16h.lua
scripts/simulationcraft_monk_windwalker_2h_t16h.lua
scripts/simulationcraft_paladin_protection_t16h.lua
scripts/simulationcraft_paladin_retribution_t16h.lua
scripts/simulationcraft_priest_shadow_t16h.lua
scripts/simulationcraft_rogue_assassination_t16h.lua
scripts/simulationcraft_rogue_combat_t16h.lua
scripts/simulationcraft_rogue_subtlety_t16h.lua
scripts/simulationcraft_shaman_elemental_t16h.lua
scripts/simulationcraft_shaman_enhancement_t16h.lua
scripts/simulationcraft_warlock_affliction_t16h.lua
scripts/simulationcraft_warlock_demonology_t16h.lua
scripts/simulationcraft_warlock_destruction_t16h.lua
scripts/simulationcraft_warrior_arms_t16h.lua
scripts/simulationcraft_warrior_fury_1h_t16h.lua
scripts/simulationcraft_warrior_fury_2h_t16h.lua
scripts/simulationcraft_warrior_protection_t16h.lua
diff --git a/OvaleSimulationCraft.lua b/OvaleSimulationCraft.lua
index 5a501ca..448b393 100644
--- a/OvaleSimulationCraft.lua
+++ b/OvaleSimulationCraft.lua
@@ -23,6 +23,7 @@ local strlower = string.lower
 local strmatch = string.match
 local strsplit = strsplit
 local strupper = string.upper
+local strsub = string.sub
 local tconcat = table.concat
 local tinsert = table.insert
 local tonumber = tonumber
@@ -174,11 +175,24 @@ do
 		for class in pairs(SIMC_CLASS) do
 			local simcName = profile[class]
 			if simcName then
+				profile.simcName = strsub(simcName, 2, -2)
 				profile.class = class
-				self:Append(script, "# Based on SimulationCraft profile %s.", simcName)
-				self:Append(script, "#	class=%s", class)
+				break
 			end
 		end
+
+		self:Append(script, "local _, Ovale = ...")
+		self:Append(script, "local OvaleScripts = Ovale.OvaleScripts")
+		self:Append(script, "")
+		self:Append(script, "do")
+		self:Append(script, [[	local name = "SimulationCraft: %s"]], profile.simcName)
+		self:Append(script, [[	local desc = "[5.4] SimulationCraft: %s" ]], profile.simcName)
+		self:Append(script, "	local code = [[")
+
+		self:Append(script, [[# Based on SimulationCraft profile "%s".]], profile.simcName)
+		if profile.class then
+			self:Append(script, "#	class=%s", profile.class)
+		end
 		if profile.spec then
 			self:Append(script, "#	spec=%s", profile.spec)
 		end
@@ -231,6 +245,12 @@ do
 		for _, v in ipairs(symbols) do
 			self:Append(script, format("# %s", v))
 		end
+		self:Append(script, "]]")
+		if profile.class then
+			self:Append(script, [[	OvaleScripts:RegisterScript("%s", name, desc, code, "reference")]], strupper(profile.class))
+		end
+		self:Append(script, "end")
+
 		return script
 	end
 end
@@ -380,6 +400,7 @@ do
 		["^$"] = false,
 		["^auto_attack$"] = false,
 		["^auto_shot$"] = false,
+		["^elixir$"] = false,
 		["^flask$"] = false,
 		["^food$"] = false,
 		["^snapshot_stats$"] = false,
diff --git a/generate.lua b/generate.lua
index c3dafdc..16122cc 100644
--- a/generate.lua
+++ b/generate.lua
@@ -7,7 +7,7 @@ do
 	local OvaleSimulationCraft = Ovale.OvaleSimulationCraft

 	local profilesDirectory = "..\\SimulationCraft\\profiles\\Tier16H"
-	local outputDirectory = "profiles"
+	local outputDirectory = "scripts"

 	local saveInput = io.input()
 	local saveOutput = io.output()
@@ -23,7 +23,8 @@ do
 				local simc = OvaleSimulationCraft(simcStr)
 				simc.simcComments = true

-				local outputFileName = string.gsub(filename, ".simc", ".txt")
+				local outputFileName = "simulationcraft_" .. string.lower(string.gsub(filename, ".simc", ".lua"))
+				outputFileName = string.gsub(outputFileName, "death_knight", "deathknight")
 				print("Generating " .. outputFileName)
 				local outputName = outputDirectory .. "/" .. outputFileName
 				io.output(outputName)
diff --git a/scripts/files.xml b/scripts/files.xml
index 11b8383..1a94f89 100644
--- a/scripts/files.xml
+++ b/scripts/files.xml
@@ -27,4 +27,34 @@

 	<Script file="leafkiller_druid.lua" />
 	<Script file="wiljo_mage.lua" />
+
+	<Script file="simulationcraft_deathknight_frost_1h_t16h.lua" />
+	<Script file="simulationcraft_deathknight_frost_2h_t16h.lua" />
+	<Script file="simulationcraft_deathknight_unholy_t16h.lua" />
+	<Script file="simulationcraft_druid_balance_t16h.lua" />
+	<Script file="simulationcraft_druid_feral_t16h.lua" />
+	<Script file="simulationcraft_druid_feral_t16h_adv_rotation.lua" />
+	<Script file="simulationcraft_hunter_bm_t16h.lua" />
+	<Script file="simulationcraft_hunter_mm_t16h.lua" />
+	<Script file="simulationcraft_hunter_sv_t16h.lua" />
+	<Script file="simulationcraft_mage_arcane_t16h.lua" />
+	<Script file="simulationcraft_mage_fire_t16h.lua" />
+	<Script file="simulationcraft_mage_frost_t16h.lua" />
+	<Script file="simulationcraft_monk_windwalker_1h_t16h.lua" />
+	<Script file="simulationcraft_monk_windwalker_2h_t16h.lua" />
+	<Script file="simulationcraft_paladin_protection_t16h.lua" />
+	<Script file="simulationcraft_paladin_retribution_t16h.lua" />
+	<Script file="simulationcraft_priest_shadow_t16h.lua" />
+	<Script file="simulationcraft_rogue_assassination_t16h.lua" />
+	<Script file="simulationcraft_rogue_combat_t16h.lua" />
+	<Script file="simulationcraft_rogue_subtlety_t16h.lua" />
+	<Script file="simulationcraft_shaman_elemental_t16h.lua" />
+	<Script file="simulationcraft_shaman_enhancement_t16h.lua" />
+	<Script file="simulationcraft_warlock_affliction_t16h.lua" />
+	<Script file="simulationcraft_warlock_demonology_t16h.lua" />
+	<Script file="simulationcraft_warlock_destruction_t16h.lua" />
+	<Script file="simulationcraft_warrior_arms_t16h.lua" />
+	<Script file="simulationcraft_warrior_fury_1h_t16h.lua" />
+	<Script file="simulationcraft_warrior_fury_2h_t16h.lua" />
+	<Script file="simulationcraft_warrior_protection_t16h.lua" />
 </Ui>
diff --git a/scripts/simulationcraft_deathknight_frost_1h_t16h.lua b/scripts/simulationcraft_deathknight_frost_1h_t16h.lua
new file mode 100644
index 0000000..91a0cbc
--- /dev/null
+++ b/scripts/simulationcraft_deathknight_frost_1h_t16h.lua
@@ -0,0 +1,180 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+	local name = "SimulationCraft: Death_Knight_Frost_1h_T16H"
+	local desc = "[5.4] SimulationCraft: Death_Knight_Frost_1h_T16H"
+	local code = [[
+# Based on SimulationCraft profile "Death_Knight_Frost_1h_T16H".
+#	class=deathknight
+#	spec=frost
+#	talents=http://us.battle.net/wow/en/tool/talent-calculator#dZ!1...0.
+#	glyphs=loud_horn
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_deathknight_spells)
+
+AddFunction FrostAoeActions
+{
+	#unholy_blight,if=talent.unholy_blight.enabled
+	if TalentPoints(unholy_blight_talent) Spell(unholy_blight)
+	#pestilence,if=dot.blood_plague.ticking&talent.plague_leech.enabled,line_cd=28
+	if target.DebuffPresent(blood_plague_debuff) and TalentPoints(plague_leech_talent) Spell(pestilence)
+	#pestilence,if=dot.blood_plague.ticking&talent.unholy_blight.enabled&cooldown.unholy_blight.remains<49,line_cd=28
+	if target.DebuffPresent(blood_plague_debuff) and TalentPoints(unholy_blight_talent) and SpellCooldown(unholy_blight) < 49 Spell(pestilence)
+	#howling_blast
+	Spell(howling_blast)
+	#blood_tap,if=talent.blood_tap.enabled&buff.blood_charge.stack>10
+	if TalentPoints(blood_tap_talent) and BuffStacks(blood_charge_buff) > 10 BloodTap()
+	#frost_strike,if=runic_power>76
+	if RunicPower() > 76 Spell(frost_strike)
+	#death_and_decay,if=unholy=1
+	if { Rune(unholy) >= 1 and Rune(unholy) < 2 } Spell(death_and_decay)
+	#plague_strike,if=unholy=2
+	if Rune(unholy) >= 2 Spell(plague_strike)
+	#blood_tap,if=talent.blood_tap.enabled
+	if TalentPoints(blood_tap_talent) BloodTap()
+	#frost_strike
+	Spell(frost_strike)
+	#horn_of_winter
+	Spell(horn_of_winter)
+	#plague_leech,if=talent.plague_leech.enabled&unholy=1
+	if TalentPoints(plague_leech_talent) and { Rune(unholy) >= 1 and Rune(unholy) < 2 } PlagueLeech()
+	#plague_strike,if=unholy=1
+	if { Rune(unholy) >= 1 and Rune(unholy) < 2 } Spell(plague_strike)
+	#empower_rune_weapon
+	Spell(empower_rune_weapon)
+}
+
+AddFunction FrostSingleTargetActions
+{
+	#blood_tap,if=talent.blood_tap.enabled&(buff.blood_charge.stack>10&(runic_power>76|(runic_power>=20&buff.killing_machine.react)))
+	if TalentPoints(blood_tap_talent) and { BuffStacks(blood_charge_buff) > 10 and { RunicPower() > 76 or { RunicPower() >= 20 and BuffPresent(killing_machine_buff) } } } BloodTap()
+	#frost_strike,if=buff.killing_machine.react|runic_power>88
+	if BuffPresent(killing_machine_buff) or RunicPower() > 88 Spell(frost_strike)
+	#howling_blast,if=death>1|frost>1
+	if Rune(death) >= 2 or Rune(frost) >= 2 Spell(howling_blast)
+	#unholy_blight,if=talent.unholy_blight.enabled&((dot.frost_fever.remains<3|dot.blood_plague.remains<3))
+	if TalentPoints(unholy_blight_talent) and { { target.DebuffRemains(frost_fever_debuff) < 3 or target.DebuffRemains(blood_plague_debuff) < 3 } } Spell(unholy_blight)
+	#soul_reaper,if=target.health.pct-3*(target.health.pct%target.time_to_die)<=35
+	if target.HealthPercent() -3 * { target.HealthPercent() / target.TimeToDie() } <= 35 Spell(soul_reaper_frost)
+	#blood_tap,if=talent.blood_tap.enabled&((target.health.pct-3*(target.health.pct%target.time_to_die)<=35&cooldown.soul_reaper.remains=0))
+	if TalentPoints(blood_tap_talent) and { { target.HealthPercent() -3 * { target.HealthPercent() / target.TimeToDie() } <= 35 and not SpellCooldown(soul_reaper_frost) > 0 } } BloodTap()
+	#howling_blast,if=!dot.frost_fever.ticking
+	if not target.DebuffPresent(frost_fever_debuff) Spell(howling_blast)
+	#plague_strike,if=!dot.blood_plague.ticking&unholy>0
+	if not target.DebuffPresent(blood_plague_debuff) and Rune(unholy) >= 1 Spell(plague_strike)
+	#howling_blast,if=buff.rime.react
+	if BuffPresent(rime_buff) Spell(howling_blast)
+	#frost_strike,if=runic_power>76
+	if RunicPower() > 76 Spell(frost_strike)
+	#obliterate,if=unholy>0&!buff.killing_machine.react
+	if Rune(unholy) >= 1 and not BuffPresent(killing_machine_buff) Spell(obliterate)
+	#howling_blast
+	Spell(howling_blast)
+	#frost_strike,if=talent.runic_empowerment.enabled&unholy=1
+	if TalentPoints(runic_empowerment_talent) and { Rune(unholy) >= 1 and Rune(unholy) < 2 } Spell(frost_strike)
+	#blood_tap,if=talent.blood_tap.enabled&(target.health.pct-3*(target.health.pct%target.time_to_die)>35|buff.blood_charge.stack>=8)
+	if TalentPoints(blood_tap_talent) and { target.HealthPercent() -3 * { target.HealthPercent() / target.TimeToDie() } > 35 or BuffStacks(blood_charge_buff) >= 8 } BloodTap()
+	#frost_strike,if=runic_power>=40
+	if RunicPower() >= 40 Spell(frost_strike)
+	#horn_of_winter
+	Spell(horn_of_winter)
+	#blood_tap,if=talent.blood_tap.enabled
+	if TalentPoints(blood_tap_talent) BloodTap()
+	#plague_leech,if=talent.plague_leech.enabled
+	if TalentPoints(plague_leech_talent) PlagueLeech()
+	#empower_rune_weapon
+	Spell(empower_rune_weapon)
+}
+
+AddFunction FrostDefaultActions
+{
+	#auto_attack
+	#antimagic_shell,damage=100000
+	Spell(antimagic_shell)
+	#pillar_of_frost
+	Spell(pillar_of_frost)
+	#mogu_power_potion,if=target.time_to_die<=30|(target.time_to_die<=60&buff.pillar_of_frost.up)
+	if target.TimeToDie() <= 30 or { target.TimeToDie() <= 60 and BuffPresent(pillar_of_frost_buff) } UsePotionStrength()
+	#empower_rune_weapon,if=target.time_to_die<=60&(buff.mogu_power_potion.up|buff.golemblood_potion.up)
+	if target.TimeToDie() <= 60 and { BuffPresent(mogu_power_potion_buff) or BuffPresent(golemblood_potion_buff) } Spell(empower_rune_weapon)
+	#blood_fury
+	Spell(blood_fury)
+	#berserking
+	Spell(berserking)
+	#arcane_torrent
+	Spell(arcane_torrent)
+	#use_item,slot=hands
+	UseItemActions()
+	#raise_dead
+	Spell(raise_dead)
+	#run_action_list,name=aoe,if=active_enemies>=3
+	if Enemies() >= 3 FrostAoeActions()
+	#run_action_list,name=single_target,if=active_enemies<3
+	if Enemies() < 3 FrostSingleTargetActions()
+}
+
+AddFunction FrostPrecombatActions
+{
+	#flask,type=winters_bite
+	#food,type=black_pepper_ribs_and_shrimp
+	#horn_of_winter
+	Spell(horn_of_winter)
+	#frost_presence
+	if not Stance(deathknight_frost_presence) Spell(frost_presence)
+	#snapshot_stats
+	#army_of_the_dead
+	Spell(army_of_the_dead)
+	#mogu_power_potion
+	UsePotionStrength()
+	#pillar_of_frost
+	Spell(pillar_of_frost)
+	#raise_dead
+	Spell(raise_dead)
+}
+
+AddIcon mastery=frost help=main
+{
+	if InCombat(no) FrostPrecombatActions()
+	FrostDefaultActions()
+}
+
+### Required symbols
+# antimagic_shell
+# arcane_torrent
+# army_of_the_dead
+# berserking
+# blood_charge_buff
+# blood_fury
+# blood_plague_debuff
+# blood_tap
+# blood_tap_talent
+# death_and_decay
+# empower_rune_weapon
+# frost_fever_debuff
+# frost_presence
+# frost_strike
+# golemblood_potion_buff
+# horn_of_winter
+# howling_blast
+# killing_machine_buff
+# mogu_power_potion
+# mogu_power_potion_buff
+# obliterate
+# pestilence
+# pillar_of_frost
+# pillar_of_frost_buff
+# plague_leech
+# plague_leech_talent
+# plague_strike
+# raise_dead
+# rime_buff
+# runic_empowerment_talent
+# soul_reaper_frost
+# unholy_blight
+# unholy_blight_talent
+]]
+	OvaleScripts:RegisterScript("DEATHKNIGHT", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_deathknight_frost_2h_t16h.lua b/scripts/simulationcraft_deathknight_frost_2h_t16h.lua
new file mode 100644
index 0000000..e892a96
--- /dev/null
+++ b/scripts/simulationcraft_deathknight_frost_2h_t16h.lua
@@ -0,0 +1,191 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+	local name = "SimulationCraft: Death_Knight_Frost_2h_T16H"
+	local desc = "[5.4] SimulationCraft: Death_Knight_Frost_2h_T16H"
+	local code = [[
+# Based on SimulationCraft profile "Death_Knight_Frost_2h_T16H".
+#	class=deathknight
+#	spec=frost
+#	talents=http://us.battle.net/wow/en/tool/talent-calculator#dZ!1...0.
+#	glyphs=loud_horn
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_deathknight_spells)
+
+AddFunction FrostAoeActions
+{
+	#unholy_blight,if=talent.unholy_blight.enabled
+	if TalentPoints(unholy_blight_talent) Spell(unholy_blight)
+	#pestilence,if=dot.blood_plague.ticking&talent.plague_leech.enabled,line_cd=28
+	if target.DebuffPresent(blood_plague_debuff) and TalentPoints(plague_leech_talent) Spell(pestilence)
+	#pestilence,if=dot.blood_plague.ticking&talent.unholy_blight.enabled&cooldown.unholy_blight.remains<49,line_cd=28
+	if target.DebuffPresent(blood_plague_debuff) and TalentPoints(unholy_blight_talent) and SpellCooldown(unholy_blight) < 49 Spell(pestilence)
+	#howling_blast
+	Spell(howling_blast)
+	#blood_tap,if=talent.blood_tap.enabled&buff.blood_charge.stack>10
+	if TalentPoints(blood_tap_talent) and BuffStacks(blood_charge_buff) > 10 BloodTap()
+	#frost_strike,if=runic_power>76
+	if RunicPower() > 76 Spell(frost_strike)
+	#death_and_decay,if=unholy=1
+	if { Rune(unholy) >= 1 and Rune(unholy) < 2 } Spell(death_and_decay)
+	#plague_strike,if=unholy=2
+	if Rune(unholy) >= 2 Spell(plague_strike)
+	#blood_tap,if=talent.blood_tap.enabled
+	if TalentPoints(blood_tap_talent) BloodTap()
+	#frost_strike
+	Spell(frost_strike)
+	#horn_of_winter
+	Spell(horn_of_winter)
+	#plague_leech,if=talent.plague_leech.enabled&unholy=1
+	if TalentPoints(plague_leech_talent) and { Rune(unholy) >= 1 and Rune(unholy) < 2 } PlagueLeech()
+	#plague_strike,if=unholy=1
+	if { Rune(unholy) >= 1 and Rune(unholy) < 2 } Spell(plague_strike)
+	#empower_rune_weapon
+	Spell(empower_rune_weapon)
+}
+
+AddFunction FrostSingleTargetActions
+{
+	#plague_leech,if=talent.plague_leech.enabled&((dot.blood_plague.remains<1|dot.frost_fever.remains<1))
+	if TalentPoints(plague_leech_talent) and { { target.DebuffRemains(blood_plague_debuff) < 1 or target.DebuffRemains(frost_fever_debuff) < 1 } } PlagueLeech()
+	#outbreak,if=!dot.frost_fever.ticking|!dot.blood_plague.ticking
+	if not target.DebuffPresent(frost_fever_debuff) or not target.DebuffPresent(blood_plague_debuff) Spell(outbreak)
+	#unholy_blight,if=talent.unholy_blight.enabled&((!dot.frost_fever.ticking|!dot.blood_plague.ticking))
+	if TalentPoints(unholy_blight_talent) and { { not target.DebuffPresent(frost_fever_debuff) or not target.DebuffPresent(blood_plague_debuff) } } Spell(unholy_blight)
+	#soul_reaper,if=target.health.pct-3*(target.health.pct%target.time_to_die)<=35
+	if target.HealthPercent() -3 * { target.HealthPercent() / target.TimeToDie() } <= 35 Spell(soul_reaper_frost)
+	#blood_tap,if=talent.blood_tap.enabled&((target.health.pct-3*(target.health.pct%target.time_to_die)<=35&cooldown.soul_reaper.remains=0))
+	if TalentPoints(blood_tap_talent) and { { target.HealthPercent() -3 * { target.HealthPercent() / target.TimeToDie() } <= 35 and not SpellCooldown(soul_reaper_frost) > 0 } } BloodTap()
+	#howling_blast,if=!dot.frost_fever.ticking
+	if not target.DebuffPresent(frost_fever_debuff) Spell(howling_blast)
+	#plague_strike,if=!dot.blood_plague.ticking
+	if not target.DebuffPresent(blood_plague_debuff) Spell(plague_strike)
+	#howling_blast,if=buff.rime.react
+	if BuffPresent(rime_buff) Spell(howling_blast)
+	#obliterate,if=buff.killing_machine.react
+	if BuffPresent(killing_machine_buff) Spell(obliterate)
+	#blood_tap,if=talent.blood_tap.enabled&buff.killing_machine.react
+	if TalentPoints(blood_tap_talent) and BuffPresent(killing_machine_buff) BloodTap()
+	#blood_tap,if=talent.blood_tap.enabled&(buff.blood_charge.stack>10&runic_power>76)
+	if TalentPoints(blood_tap_talent) and { BuffStacks(blood_charge_buff) > 10 and RunicPower() > 76 } BloodTap()
+	#frost_strike,if=runic_power>76
+	if RunicPower() > 76 Spell(frost_strike)
+	#obliterate,if=blood=2|frost=2|unholy=2
+	if Rune(blood) >= 2 or Rune(frost) >= 2 or Rune(unholy) >= 2 Spell(obliterate)
+	#plague_leech,if=talent.plague_leech.enabled&((dot.blood_plague.remains<3|dot.frost_fever.remains<3))
+	if TalentPoints(plague_leech_talent) and { { target.DebuffRemains(blood_plague_debuff) < 3 or target.DebuffRemains(frost_fever_debuff) < 3 } } PlagueLeech()
+	#outbreak,if=dot.frost_fever.remains<3|dot.blood_plague.remains<3
+	if target.DebuffRemains(frost_fever_debuff) < 3 or target.DebuffRemains(blood_plague_debuff) < 3 Spell(outbreak)
+	#unholy_blight,if=talent.unholy_blight.enabled&((dot.frost_fever.remains<3|dot.blood_plague.remains<3))
+	if TalentPoints(unholy_blight_talent) and { { target.DebuffRemains(frost_fever_debuff) < 3 or target.DebuffRemains(blood_plague_debuff) < 3 } } Spell(unholy_blight)
+	#frost_strike,if=talent.runic_empowerment.enabled&(frost=0|unholy=0|blood=0)
+	if TalentPoints(runic_empowerment_talent) and { Rune(frost) < 1 or Rune(unholy) < 1 or Rune(blood) < 1 } Spell(frost_strike)
+	#frost_strike,if=talent.blood_tap.enabled&buff.blood_charge.stack<=10
+	if TalentPoints(blood_tap_talent) and BuffStacks(blood_charge_buff) <= 10 Spell(frost_strike)
+	#horn_of_winter
+	Spell(horn_of_winter)
+	#obliterate
+	Spell(obliterate)
+	#blood_tap,if=talent.blood_tap.enabled&(buff.blood_charge.stack>10&runic_power>=20)
+	if TalentPoints(blood_tap_talent) and { BuffStacks(blood_charge_buff) > 10 and RunicPower() >= 20 } BloodTap()
+	#frost_strike
+	Spell(frost_strike)
+	#plague_leech,if=talent.plague_leech.enabled
+	if TalentPoints(plague_leech_talent) PlagueLeech()
+	#empower_rune_weapon
+	Spell(empower_rune_weapon)
+}
+
+AddFunction FrostDefaultActions
+{
+	#auto_attack
+	#antimagic_shell,damage=100000
+	Spell(antimagic_shell)
+	#pillar_of_frost
+	Spell(pillar_of_frost)
+	#mogu_power_potion,if=target.time_to_die<=30|(target.time_to_die<=60&buff.pillar_of_frost.up)
+	if target.TimeToDie() <= 30 or { target.TimeToDie() <= 60 and BuffPresent(pillar_of_frost_buff) } UsePotionStrength()
+	#empower_rune_weapon,if=target.time_to_die<=60&(buff.mogu_power_potion.up|buff.golemblood_potion.up)
+	if target.TimeToDie() <= 60 and { BuffPresent(mogu_power_potion_buff) or BuffPresent(golemblood_potion_buff) } Spell(empower_rune_weapon)
+	#blood_fury
+	Spell(blood_fury)
+	#berserking
+	Spell(berserking)
+	#arcane_torrent
+	Spell(arcane_torrent)
+	#use_item,slot=hands
+	UseItemActions()
+	#raise_dead
+	Spell(raise_dead)
+	#run_action_list,name=aoe,if=active_enemies>=3
+	if Enemies() >= 3 FrostAoeActions()
+	#run_action_list,name=single_target,if=active_enemies<3
+	if Enemies() < 3 FrostSingleTargetActions()
+}
+
+AddFunction FrostPrecombatActions
+{
+	#flask,type=winters_bite
+	#food,type=black_pepper_ribs_and_shrimp
+	#horn_of_winter
+	Spell(horn_of_winter)
+	#frost_presence
+	if not Stance(deathknight_frost_presence) Spell(frost_presence)
+	#snapshot_stats
+	#army_of_the_dead
+	Spell(army_of_the_dead)
+	#mogu_power_potion
+	UsePotionStrength()
+	#pillar_of_frost
+	Spell(pillar_of_frost)
+	#raise_dead
+	Spell(raise_dead)
+}
+
+AddIcon mastery=frost help=main
+{
+	if InCombat(no) FrostPrecombatActions()
+	FrostDefaultActions()
+}
+
+### Required symbols
+# antimagic_shell
+# arcane_torrent
+# army_of_the_dead
+# berserking
+# blood_charge_buff
+# blood_fury
+# blood_plague_debuff
+# blood_tap
+# blood_tap_talent
+# death_and_decay
+# empower_rune_weapon
+# frost_fever_debuff
+# frost_presence
+# frost_strike
+# golemblood_potion_buff
+# horn_of_winter
+# howling_blast
+# killing_machine_buff
+# mogu_power_potion
+# mogu_power_potion_buff
+# obliterate
+# outbreak
+# pestilence
+# pillar_of_frost
+# pillar_of_frost_buff
+# plague_leech
+# plague_leech_talent
+# plague_strike
+# raise_dead
+# rime_buff
+# runic_empowerment_talent
+# soul_reaper_frost
+# unholy_blight
+# unholy_blight_talent
+]]
+	OvaleScripts:RegisterScript("DEATHKNIGHT", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_deathknight_unholy_t16h.lua b/scripts/simulationcraft_deathknight_unholy_t16h.lua
new file mode 100644
index 0000000..855bdcf
--- /dev/null
+++ b/scripts/simulationcraft_deathknight_unholy_t16h.lua
@@ -0,0 +1,203 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+	local name = "SimulationCraft: Death_Knight_Unholy_T16H"
+	local desc = "[5.4] SimulationCraft: Death_Knight_Unholy_T16H"
+	local code = [[
+# Based on SimulationCraft profile "Death_Knight_Unholy_T16H".
+#	class=deathknight
+#	spec=unholy
+#	talents=http://us.battle.net/wow/en/tool/talent-calculator#db!2...0.
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_deathknight_spells)
+
+AddFunction UnholyAoeActions
+{
+	#unholy_blight,if=talent.unholy_blight.enabled
+	if TalentPoints(unholy_blight_talent) Spell(unholy_blight)
+	#plague_strike,if=!dot.blood_plague.ticking|!dot.frost_fever.ticking
+	if not target.DebuffPresent(blood_plague_debuff) or not target.DebuffPresent(frost_fever_debuff) Spell(plague_strike)
+	#pestilence,if=dot.blood_plague.ticking&talent.plague_leech.enabled,line_cd=28
+	if target.DebuffPresent(blood_plague_debuff) and TalentPoints(plague_leech_talent) Spell(pestilence)
+	#pestilence,if=dot.blood_plague.ticking&talent.unholy_blight.enabled&cooldown.unholy_blight.remains<49,line_cd=28
+	if target.DebuffPresent(blood_plague_debuff) and TalentPoints(unholy_blight_talent) and SpellCooldown(unholy_blight) < 49 Spell(pestilence)
+	#summon_gargoyle
+	Spell(summon_gargoyle)
+	#dark_transformation
+	Spell(dark_transformation)
+	#blood_tap,if=talent.blood_tap.enabled&buff.shadow_infusion.stack=5
+	if TalentPoints(blood_tap_talent) and BuffStacks(shadow_infusion_buff) == 5 BloodTap()
+	#blood_boil,if=blood=2|death=2
+	if Rune(blood) >= 2 or { Rune(death) >= 2 and Rune(death) < 3 } Spell(blood_boil)
+	#death_and_decay,if=unholy=1
+	if { Rune(unholy) >= 1 and Rune(unholy) < 2 } Spell(death_and_decay)
+	#soul_reaper,if=unholy=2&target.health.pct-3*(target.health.pct%target.time_to_die)<=35
+	if Rune(unholy) >= 2 and target.HealthPercent() -3 * { target.HealthPercent() / target.TimeToDie() } <= 35 Spell(soul_reaper_unholy)
+	#scourge_strike,if=unholy=2
+	if Rune(unholy) >= 2 Spell(scourge_strike)
+	#blood_tap,if=talent.blood_tap.enabled&buff.blood_charge.stack>10
+	if TalentPoints(blood_tap_talent) and BuffStacks(blood_charge_buff) > 10 BloodTap()
+	#death_coil,if=runic_power>90|buff.sudden_doom.react|(buff.dark_transformation.down&rune.unholy<=1)
+	if RunicPower() > 90 or BuffPresent(sudden_doom_buff) or { BuffExpires(dark_transformation_buff) and Rune(unholy) <= 1 } Spell(death_coil)
+	#blood_boil
+	Spell(blood_boil)
+	#icy_touch
+	Spell(icy_touch)
+	#soul_reaper,if=unholy=1&target.health.pct-3*(target.health.pct%target.time_to_die)<=35
+	if { Rune(unholy) >= 1 and Rune(unholy) < 2 } and target.HealthPercent() -3 * { target.HealthPercent() / target.TimeToDie() } <= 35 Spell(soul_reaper_unholy)
+	#scourge_strike,if=unholy=1
+	if { Rune(unholy) >= 1 and Rune(unholy) < 2 } Spell(scourge_strike)
+	#death_coil
+	Spell(death_coil)
+	#blood_tap,if=talent.blood_tap.enabled
+	if TalentPoints(blood_tap_talent) BloodTap()
+	#plague_leech,if=talent.plague_leech.enabled&unholy=1
+	if TalentPoints(plague_leech_talent) and { Rune(unholy) >= 1 and Rune(unholy) < 2 } PlagueLeech()
+	#horn_of_winter
+	Spell(horn_of_winter)
+	#empower_rune_weapon
+	Spell(empower_rune_weapon)
+}
+
+AddFunction UnholySingleTargetActions
+{
+	#outbreak,if=stat.attack_power>(dot.blood_plague.attack_power*1.1)&time>15&!(cooldown.unholy_blight.remains>79)
+	if AttackPower() > { target.DebuffAttackPower(blood_plague_debuff) * 1.1 } and TimeInCombat() > 15 and not { SpellCooldown(unholy_blight) > 79 } Spell(outbreak)
+	#plague_strike,if=stat.attack_power>(dot.blood_plague.attack_power*1.1)&time>15&!(cooldown.unholy_blight.remains>79)
+	if AttackPower() > { target.DebuffAttackPower(blood_plague_debuff) * 1.1 } and TimeInCombat() > 15 and not { SpellCooldown(unholy_blight) > 79 } Spell(plague_strike)
+	#blood_tap,if=talent.blood_tap.enabled&(buff.blood_charge.stack>10&runic_power>=32)
+	if TalentPoints(blood_tap_talent) and { BuffStacks(blood_charge_buff) > 10 and RunicPower() >= 32 } BloodTap()
+	#unholy_blight,if=talent.unholy_blight.enabled&((dot.frost_fever.remains<3|dot.blood_plague.remains<3))
+	if TalentPoints(unholy_blight_talent) and { { target.DebuffRemains(frost_fever_debuff) < 3 or target.DebuffRemains(blood_plague_debuff) < 3 } } Spell(unholy_blight)
+	#outbreak,if=dot.frost_fever.remains<3|dot.blood_plague.remains<3
+	if target.DebuffRemains(frost_fever_debuff) < 3 or target.DebuffRemains(blood_plague_debuff) < 3 Spell(outbreak)
+	#soul_reaper,if=target.health.pct-3*(target.health.pct%target.time_to_die)<=35
+	if target.HealthPercent() -3 * { target.HealthPercent() / target.TimeToDie() } <= 35 Spell(soul_reaper_unholy)
+	#blood_tap,if=talent.blood_tap.enabled&((target.health.pct-3*(target.health.pct%target.time_to_die)<=35&cooldown.soul_reaper.remains=0))
+	if TalentPoints(blood_tap_talent) and { { target.HealthPercent() -3 * { target.HealthPercent() / target.TimeToDie() } <= 35 and not SpellCooldown(soul_reaper_unholy) > 0 } } BloodTap()
+	#plague_strike,if=!dot.blood_plague.ticking|!dot.frost_fever.ticking
+	if not target.DebuffPresent(blood_plague_debuff) or not target.DebuffPresent(frost_fever_debuff) Spell(plague_strike)
+	#summon_gargoyle
+	Spell(summon_gargoyle)
+	#dark_transformation
+	Spell(dark_transformation)
+	#death_coil,if=runic_power>90
+	if RunicPower() > 90 Spell(death_coil)
+	#death_and_decay,if=unholy=2
+	if Rune(unholy) >= 2 Spell(death_and_decay)
+	#blood_tap,if=talent.blood_tap.enabled&(unholy=2&cooldown.death_and_decay.remains=0)
+	if TalentPoints(blood_tap_talent) and { Rune(unholy) >= 2 and not SpellCooldown(death_and_decay) > 0 } BloodTap()
+	#scourge_strike,if=unholy=2
+	if Rune(unholy) >= 2 Spell(scourge_strike)
+	#festering_strike,if=blood=2&frost=2
+	if Rune(blood) >= 2 and Rune(frost) >= 2 Spell(festering_strike)
+	#death_and_decay
+	Spell(death_and_decay)
+	#blood_tap,if=talent.blood_tap.enabled&cooldown.death_and_decay.remains=0
+	if TalentPoints(blood_tap_talent) and not SpellCooldown(death_and_decay) > 0 BloodTap()
+	#death_coil,if=buff.sudden_doom.react|(buff.dark_transformation.down&rune.unholy<=1)
+	if BuffPresent(sudden_doom_buff) or { BuffExpires(dark_transformation_buff) and Rune(unholy) <= 1 } Spell(death_coil)
+	#scourge_strike
+	Spell(scourge_strike)
+	#plague_leech,if=talent.plague_leech.enabled&cooldown.outbreak.remains<1
+	if TalentPoints(plague_leech_talent) and SpellCooldown(outbreak) < 1 PlagueLeech()
+	#festering_strike
+	Spell(festering_strike)
+	#horn_of_winter
+	Spell(horn_of_winter)
+	#death_coil
+	Spell(death_coil)
+	#blood_tap,if=talent.blood_tap.enabled&buff.blood_charge.stack>=8
+	if TalentPoints(blood_tap_talent) and BuffStacks(blood_charge_buff) >= 8 BloodTap()
+	#empower_rune_weapon
+	Spell(empower_rune_weapon)
+}
+
+AddFunction UnholyDefaultActions
+{
+	#auto_attack
+	#antimagic_shell,damage=100000
+	Spell(antimagic_shell)
+	#blood_fury
+	Spell(blood_fury)
+	#berserking
+	Spell(berserking)
+	#arcane_torrent
+	Spell(arcane_torrent)
+	#use_item,slot=hands
+	UseItemActions()
+	#mogu_power_potion,if=buff.dark_transformation.up&target.time_to_die<=60
+	if BuffPresent(dark_transformation_buff) and target.TimeToDie() <= 60 UsePotionStrength()
+	#unholy_frenzy,if=time>=4
+	if TimeInCombat() >= 4 Spell(unholy_frenzy)
+	#run_action_list,name=aoe,if=active_enemies>=3
+	if Enemies() >= 3 UnholyAoeActions()
+	#run_action_list,name=single_target,if=active_enemies<3
+	if Enemies() < 3 UnholySingleTargetActions()
+}
+
+AddFunction UnholyPrecombatActions
+{
+	#flask,type=winters_bite
+	#food,type=black_pepper_ribs_and_shrimp
+	#horn_of_winter
+	Spell(horn_of_winter)
+	#unholy_presence
+	if not Stance(deathknight_unholy_presence) Spell(unholy_presence)
+	#snapshot_stats
+	#army_of_the_dead
+	Spell(army_of_the_dead)
+	#mogu_power_potion
+	UsePotionStrength()
+	#raise_dead
+	Spell(raise_dead)
+}
+
+AddIcon mastery=unholy help=main
+{
+	if InCombat(no) UnholyPrecombatActions()
+	UnholyDefaultActions()
+}
+
+### Required symbols
+# antimagic_shell
+# arcane_torrent
+# army_of_the_dead
+# berserking
+# blood_boil
+# blood_charge_buff
+# blood_fury
+# blood_plague_debuff
+# blood_tap
+# blood_tap_talent
+# dark_transformation
+# dark_transformation_buff
+# death_and_decay
+# death_coil
+# empower_rune_weapon
+# festering_strike
+# frost_fever_debuff
+# horn_of_winter
+# icy_touch
+# mogu_power_potion
+# outbreak
+# pestilence
+# plague_leech
+# plague_leech_talent
+# plague_strike
+# raise_dead
+# scourge_strike
+# shadow_infusion_buff
+# soul_reaper_unholy
+# sudden_doom_buff
+# summon_gargoyle
+# unholy_blight
+# unholy_blight_talent
+# unholy_frenzy
+# unholy_presence
+]]
+	OvaleScripts:RegisterScript("DEATHKNIGHT", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_druid_balance_t16h.lua b/scripts/simulationcraft_druid_balance_t16h.lua
new file mode 100644
index 0000000..be4af07
--- /dev/null
+++ b/scripts/simulationcraft_druid_balance_t16h.lua
@@ -0,0 +1,124 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+	local name = "SimulationCraft: Druid_Balance_T16H"
+	local desc = "[5.4] SimulationCraft: Druid_Balance_T16H"
+	local code = [[
+# Based on SimulationCraft profile "Druid_Balance_T16H".
+#	class=druid
+#	spec=balance
+#	talents=http://us.battle.net/wow/en/tool/talent-calculator#Ua!.0.1.0
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_druid_spells)
+
+AddFunction BalanceDefaultActions
+{
+	#jade_serpent_potion,if=buff.bloodlust.react|target.time_to_die<=40|buff.celestial_alignment.up
+	if BuffPresent(burst_haste any=1) or target.TimeToDie() <= 40 or BuffPresent(celestial_alignment_buff) UsePotionIntellect()
+	#starfall,if=!buff.starfall.up
+	if not BuffPresent(starfall_buff) Spell(starfall)
+	#force_of_nature,if=talent.force_of_nature.enabled
+	if TalentPoints(force_of_nature_talent) Spell(force_of_nature_caster)
+	#berserking,if=buff.celestial_alignment.up
+	if BuffPresent(celestial_alignment_buff) Spell(berserking)
+	#use_item,slot=hands,if=buff.celestial_alignment.up|cooldown.celestial_alignment.remains>30
+	if BuffPresent(celestial_alignment_buff) or SpellCooldown(celestial_alignment) > 30 UseItemActions()
+	#wild_mushroom_detonate,moving=0,if=buff.wild_mushroom.stack>0&buff.solar_eclipse.up
+	if WildMushroomCount() > 0 and BuffPresent(solar_eclipse_buff) Spell(wild_mushroom_detonate)
+	#natures_swiftness,if=talent.dream_of_cenarius.enabled
+	if TalentPoints(dream_of_cenarius_talent) Spell(natures_swiftness)
+	#healing_touch,if=talent.dream_of_cenarius.enabled&!buff.dream_of_cenarius.up&mana.pct>25
+	if TalentPoints(dream_of_cenarius_talent) and not BuffPresent(dream_of_cenarius_caster_buff) and ManaPercent() > 25 Spell(healing_touch)
+	#incarnation,if=talent.incarnation.enabled&(buff.lunar_eclipse.up|buff.solar_eclipse.up)
+	if TalentPoints(incarnation_talent) and { BuffPresent(lunar_eclipse_buff) or BuffPresent(solar_eclipse_buff) } Spell(incarnation)
+	#celestial_alignment,if=(!buff.lunar_eclipse.up&!buff.solar_eclipse.up)&(buff.chosen_of_elune.up|!talent.incarnation.enabled|cooldown.incarnation.remains>10)
+	if { not BuffPresent(lunar_eclipse_buff) and not BuffPresent(solar_eclipse_buff) } and { BuffPresent(chosen_of_elune_buff) or not TalentPoints(incarnation_talent) or SpellCooldown(incarnation) > 10 } Spell(celestial_alignment)
+	#natures_vigil,if=talent.natures_vigil.enabled
+	if TalentPoints(natures_vigil_talent) Spell(natures_vigil)
+	#starsurge,if=buff.shooting_stars.react&(active_enemies<5|!buff.solar_eclipse.up)
+	if BuffPresent(shooting_stars_buff) and { Enemies() < 5 or not BuffPresent(solar_eclipse_buff) } Spell(starsurge)
+	#moonfire,cycle_targets=1,if=buff.lunar_eclipse.up&(remains<(buff.natures_grace.remains-2+2*set_bonus.tier14_4pc_caster))
+	if BuffPresent(lunar_eclipse_buff) and { target.DebuffRemains(moonfire_debuff) < { BuffRemains(natures_grace_buff) -2 + 2 * ArmorSetBonus(T14_caster 4) } } Spell(moonfire)
+	#sunfire,cycle_targets=1,if=buff.solar_eclipse.up&(remains<(buff.natures_grace.remains-2+2*set_bonus.tier14_4pc_caster))
+	if BuffPresent(solar_eclipse_buff) and { target.DebuffRemains(sunfire_debuff) < { BuffRemains(natures_grace_buff) -2 + 2 * ArmorSetBonus(T14_caster 4) } } Spell(sunfire)
+	#hurricane,if=active_enemies>4&buff.solar_eclipse.up&buff.natures_grace.up
+	if Enemies() > 4 and BuffPresent(solar_eclipse_buff) and BuffPresent(natures_grace_buff) Spell(hurricane)
+	#moonfire,cycle_targets=1,if=active_enemies<5&(remains<(buff.natures_grace.remains-2+2*set_bonus.tier14_4pc_caster))
+	if Enemies() < 5 and { target.DebuffRemains(moonfire_debuff) < { BuffRemains(natures_grace_buff) -2 + 2 * ArmorSetBonus(T14_caster 4) } } Spell(moonfire)
+	#sunfire,cycle_targets=1,if=active_enemies<5&(remains<(buff.natures_grace.remains-2+2*set_bonus.tier14_4pc_caster))
+	if Enemies() < 5 and { target.DebuffRemains(sunfire_debuff) < { BuffRemains(natures_grace_buff) -2 + 2 * ArmorSetBonus(T14_caster 4) } } Spell(sunfire)
+	#hurricane,if=active_enemies>5&buff.solar_eclipse.up&mana.pct>25
+	if Enemies() > 5 and BuffPresent(solar_eclipse_buff) and ManaPercent() > 25 Spell(hurricane)
+	#moonfire,cycle_targets=1,if=buff.lunar_eclipse.up&ticks_remain<2
+	if BuffPresent(lunar_eclipse_buff) and target.TicksRemain(moonfire_debuff) < 2 Spell(moonfire)
+	#sunfire,cycle_targets=1,if=buff.solar_eclipse.up&ticks_remain<2
+	if BuffPresent(solar_eclipse_buff) and target.TicksRemain(sunfire_debuff) < 2 Spell(sunfire)
+	#hurricane,if=active_enemies>4&buff.solar_eclipse.up&mana.pct>25
+	if Enemies() > 4 and BuffPresent(solar_eclipse_buff) and ManaPercent() > 25 Spell(hurricane)
+	#starsurge,if=cooldown_react
+	if Spell(starsurge) Spell(starsurge)
+	#starfire,if=buff.celestial_alignment.up&cast_time<buff.celestial_alignment.remains
+	if BuffPresent(celestial_alignment_buff) and CastTime(starfire) < BuffRemains(celestial_alignment_buff) Spell(starfire)
+	#wrath,if=buff.celestial_alignment.up&cast_time<buff.celestial_alignment.remains
+	if BuffPresent(celestial_alignment_buff) and CastTime(wrath) < BuffRemains(celestial_alignment_buff) Spell(wrath)
+	#starfire,if=eclipse_dir=1|(eclipse_dir=0&eclipse>0)
+	if EclipseDir() == 1 or { EclipseDir() == 0 and Eclipse() > 0 } Spell(starfire)
+	#wrath,if=eclipse_dir=-1|(eclipse_dir=0&eclipse<=0)
+	if EclipseDir() == -1 or { EclipseDir() == 0 and Eclipse() <= 0 } Spell(wrath)
+	#moonfire,moving=1,cycle_targets=1,if=ticks_remain<2
+	if Speed() > 0 and target.TicksRemain(moonfire_debuff) < 2 Spell(moonfire)
+	#sunfire,moving=1,cycle_targets=1,if=ticks_remain<2
+	if Speed() > 0 and target.TicksRemain(sunfire_debuff) < 2 Spell(sunfire)
+	#wild_mushroom,moving=1,if=buff.wild_mushroom.stack<buff.wild_mushroom.max_stack
+	if Speed() > 0 and WildMushroomCount() < 3 Spell(wild_mushroom_caster)
+	#starsurge,moving=1,if=buff.shooting_stars.react
+	if Speed() > 0 and BuffPresent(shooting_stars_buff) Spell(starsurge)
+	#moonfire,moving=1,if=buff.lunar_eclipse.up
+	if Speed() > 0 and BuffPresent(lunar_eclipse_buff) Spell(moonfire)
+	#sunfire,moving=1
+	if Speed() > 0 Spell(sunfire)
+}
+
+AddIcon mastery=balance help=main
+{
+	BalanceDefaultActions()
+}
+
+### Required symbols
+# berserking
+# celestial_alignment
+# celestial_alignment_buff
+# chosen_of_elune_buff
+# dream_of_cenarius_caster_buff
+# dream_of_cenarius_talent
+# force_of_nature_caster
+# force_of_nature_talent
+# healing_touch
+# hurricane
+# incarnation
+# incarnation_talent
+# jade_serpent_potion
+# lunar_eclipse_buff
+# moonfire
+# moonfire_debuff
+# natures_grace_buff
+# natures_swiftness
+# natures_vigil
+# natures_vigil_talent
+# shooting_stars_buff
+# solar_eclipse_buff
+# starfall
+# starfall_buff
+# starfire
+# starsurge
+# sunfire
+# sunfire_debuff
+# wild_mushroom_caster
+# wild_mushroom_detonate
+# wrath
+]]
+	OvaleScripts:RegisterScript("DRUID", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_druid_feral_t16h.lua b/scripts/simulationcraft_druid_feral_t16h.lua
new file mode 100644
index 0000000..4ffe241
--- /dev/null
+++ b/scripts/simulationcraft_druid_feral_t16h.lua
@@ -0,0 +1,303 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+	local name = "SimulationCraft: Druid_Feral_T16H"
+	local desc = "[5.4] SimulationCraft: Druid_Feral_T16H"
+	local code = [[
+# Based on SimulationCraft profile "Druid_Feral_T16H".
+#	class=druid
+#	spec=feral
+#	talents=http://us.battle.net/wow/en/tool/talent-calculator#UZ!...2.1
+#	glyphs=savagery/cat_form
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_druid_spells)
+
+AddFunction FeralFillerActions
+{
+	#ravage
+	Spell(ravage usable=1)
+	#rake,if=target.time_to_die-dot.rake.remains>3&action.rake.tick_damage*(dot.rake.ticks_remain+1)-dot.rake.tick_dmg*dot.rake.ticks_remain>action.mangle_cat.hit_damage
+	if target.TimeToDie() - target.DebuffRemains(rake_debuff) > 3 and target.Damage(rake_debuff) * { target.TicksRemain(rake_debuff) + 1 } - target.LastEstimatedDamage(rake_debuff) * target.TicksRemain(rake_debuff) > target.Damage(mangle_cat) Spell(rake)
+	#shred,if=(buff.omen_of_clarity.react|buff.berserk.up|energy.regen>=15)&buff.king_of_the_jungle.down
+	if { BuffPresent(omen_of_clarity_melee_buff) or BuffPresent(berserk_cat_buff) or EnergyRegen() >= 15 } and BuffExpires(king_of_the_jungle_buff) Spell(shred)
+	#mangle_cat,if=buff.king_of_the_jungle.down
+	if BuffExpires(king_of_the_jungle_buff) Spell(mangle_cat)
+}
+
+AddFunction FeralDefaultActions
+{
+	#swap_action_list,name=basic
+	FeralBasicActions()
+}
+
+AddFunction FeralBasicActions
+{
+	#swap_action_list,name=aoe,if=active_enemies>=5
+	if Enemies() >= 5 FeralAoeActions()
+	#auto_attack
+	#skull_bash_cat
+	FeralInterrupt()
+	#force_of_nature,if=charges=3|trinket.proc.agility.react|(buff.rune_of_reorigination.react&buff.rune_of_reorigination.remains<1)|target.time_to_die<20
+	if Charges(force_of_nature_melee) == 3 or BuffPresent(trinket_proc_agility_buff) or { BuffPresent(rune_of_reorigination_buff) and BuffRemains(rune_of_reorigination_buff) < 1 } or target.TimeToDie() < 20 Spell(force_of_nature_melee)
+	#ferocious_bite,if=dot.rip.ticking&dot.rip.remains<=3&target.health.pct<=25
+	if target.DebuffPresent(rip_debuff) and target.DebuffRemains(rip_debuff) <= 3 and target.HealthPercent() <= 25 Spell(ferocious_bite)
+	#faerie_fire,if=debuff.weakened_armor.stack<3
+	if target.DebuffStacks(weakened_armor_debuff any=1) < 3 Spell(faerie_fire)
+	#healing_touch,if=talent.dream_of_cenarius.enabled&buff.predatory_swiftness.up&buff.dream_of_cenarius.down&(buff.predatory_swiftness.remains<1.5|combo_points>=4)
+	if TalentPoints(dream_of_cenarius_talent) and BuffPresent(predatory_swiftness_buff) and BuffExpires(dream_of_cenarius_melee_buff) and { BuffRemains(predatory_swiftness_buff) < 1.5 or ComboPoints() >= 4 } Spell(healing_touch)
+	#savage_roar,if=buff.savage_roar.remains<3
+	if BuffRemains(savage_roar_buff) < 3 SavageRoar()
+	#virmens_bite_potion,if=(target.health.pct<30&buff.berserk.up)|target.time_to_die<=40
+	if { target.HealthPercent() < 30 and BuffPresent(berserk_cat_buff) } or target.TimeToDie() <= 40 UsePotionAgility()
+	#tigers_fury,if=energy<=35&!buff.omen_of_clarity.react
+	if Energy() <= 35 and not BuffPresent(omen_of_clarity_melee_buff) Spell(tigers_fury)
+	#berserk,if=buff.tigers_fury.up
+	if BuffPresent(tigers_fury_buff) Spell(berserk_cat)
+	#use_item,slot=hands,if=buff.tigers_fury.up
+	if BuffPresent(tigers_fury_buff) UseItemActions()
+	#blood_fury,if=buff.tigers_fury.up
+	if BuffPresent(tigers_fury_buff) Spell(blood_fury)
+	#berserking,if=buff.tigers_fury.up
+	if BuffPresent(tigers_fury_buff) Spell(berserking)
+	#arcane_torrent,if=buff.tigers_fury.up
+	if BuffPresent(tigers_fury_buff) Spell(arcane_torrent)
+	#rip,if=combo_points>=5&target.health.pct<=25&action.rip.tick_damage%dot.rip.tick_dmg>=1.15
+	if ComboPoints() >= 5 and target.HealthPercent() <= 25 and target.Damage(rip_debuff) / target.LastEstimatedDamage(rip_debuff) >= 1.15 Spell(rip)
+	#ferocious_bite,if=combo_points>=5&target.health.pct<=25&dot.rip.ticking
+	if ComboPoints() >= 5 and target.HealthPercent() <= 25 and target.DebuffPresent(rip_debuff) Spell(ferocious_bite)
+	#rip,if=combo_points>=5&dot.rip.remains<2
+	if ComboPoints() >= 5 and target.DebuffRemains(rip_debuff) < 2 Spell(rip)
+	#thrash_cat,if=buff.omen_of_clarity.react&dot.thrash_cat.remains<3
+	if BuffPresent(omen_of_clarity_melee_buff) and target.DebuffRemains(thrash_cat_debuff) < 3 Spell(thrash_cat)
+	#rake,cycle_targets=1,if=dot.rake.remains<3|action.rake.tick_damage>dot.rake.tick_dmg
+	if target.DebuffRemains(rake_debuff) < 3 or target.Damage(rake_debuff) > target.LastEstimatedDamage(rake_debuff) Spell(rake)
+	#pool_resource,for_next=1
+	#thrash_cat,if=dot.thrash_cat.remains<3&(dot.rip.remains>=8&buff.savage_roar.remains>=12|buff.berserk.up|combo_points>=5)
+	if target.DebuffRemains(thrash_cat_debuff) < 3 and { target.DebuffRemains(rip_debuff) >= 8 and BuffRemains(savage_roar_buff) >= 12 or BuffPresent(berserk_cat_buff) or ComboPoints() >= 5 } wait Spell(thrash_cat)
+	#pool_resource,if=combo_points>=5&!(energy.time_to_max<=1|(buff.berserk.up&energy>=25)|(buff.feral_rage.up&buff.feral_rage.remains<=1))&dot.rip.ticking
+	unless ComboPoints() >= 5 and not { TimeToMaxEnergy() <= 1 or { BuffPresent(berserk_cat_buff) and Energy() >= 25 } or { BuffPresent(feral_rage_buff) and BuffRemains(feral_rage_buff) <= 1 } } and target.DebuffPresent(rip_debuff)
+	{
+		#ferocious_bite,if=combo_points>=5&dot.rip.ticking
+		if ComboPoints() >= 5 and target.DebuffPresent(rip_debuff) Spell(ferocious_bite)
+		#run_action_list,name=filler,if=buff.omen_of_clarity.react
+		if BuffPresent(omen_of_clarity_melee_buff) FeralFillerActions()
+		#run_action_list,name=filler,if=buff.feral_fury.react
+		if BuffPresent(feral_fury_buff) FeralFillerActions()
+		#run_action_list,name=filler,if=(combo_points<5&dot.rip.remains<3.0)|(combo_points=0&buff.savage_roar.remains<2)
+		if { ComboPoints() < 5 and target.DebuffRemains(rip_debuff) < 3 } or { ComboPoints() == 0 and BuffRemains(savage_roar_buff) < 2 } FeralFillerActions()
+		#run_action_list,name=filler,if=target.time_to_die<=8.5
+		if target.TimeToDie() <= 8.5 FeralFillerActions()
+		#run_action_list,name=filler,if=buff.tigers_fury.up|buff.berserk.up
+		if BuffPresent(tigers_fury_buff) or BuffPresent(berserk_cat_buff) FeralFillerActions()
+		#run_action_list,name=filler,if=cooldown.tigers_fury.remains<=3
+		if SpellCooldown(tigers_fury) <= 3 FeralFillerActions()
+		#run_action_list,name=filler,if=energy.time_to_max<=1.0
+		if TimeToMaxEnergy() <= 1 FeralFillerActions()
+	}
+}
+
+AddFunction FeralAoeActions
+{
+	#swap_action_list,name=default,if=active_enemies<5
+	if Enemies() < 5 FeralDefaultActions()
+	#auto_attack
+	#faerie_fire,cycle_targets=1,if=debuff.weakened_armor.stack<3
+	if target.DebuffStacks(weakened_armor_debuff any=1) < 3 Spell(faerie_fire)
+	#savage_roar,if=buff.savage_roar.down|(buff.savage_roar.remains<3&combo_points>0)
+	if BuffExpires(savage_roar_buff) or { BuffRemains(savage_roar_buff) < 3 and ComboPoints() > 0 } SavageRoar()
+	#use_item,slot=hands,if=buff.tigers_fury.up
+	if BuffPresent(tigers_fury_buff) UseItemActions()
+	#blood_fury,if=buff.tigers_fury.up
+	if BuffPresent(tigers_fury_buff) Spell(blood_fury)
+	#berserking,if=buff.tigers_fury.up
+	if BuffPresent(tigers_fury_buff) Spell(berserking)
+	#arcane_torrent,if=buff.tigers_fury.up
+	if BuffPresent(tigers_fury_buff) Spell(arcane_torrent)
+	#tigers_fury,if=energy<=35&!buff.omen_of_clarity.react
+	if Energy() <= 35 and not BuffPresent(omen_of_clarity_melee_buff) Spell(tigers_fury)
+	#berserk,if=buff.tigers_fury.up
+	if BuffPresent(tigers_fury_buff) Spell(berserk_cat)
+	#pool_resource,for_next=1
+	#thrash_cat,if=buff.rune_of_reorigination.up
+	if BuffPresent(rune_of_reorigination_buff) wait Spell(thrash_cat)
+	#pool_resource,wait=0.1,for_next=1
+	#thrash_cat,if=dot.thrash_cat.remains<3|(buff.tigers_fury.up&dot.thrash_cat.remains<9)
+	if target.DebuffRemains(thrash_cat_debuff) < 3 or { BuffPresent(tigers_fury_buff) and target.DebuffRemains(thrash_cat_debuff) < 9 } wait Spell(thrash_cat)
+	#savage_roar,if=buff.savage_roar.remains<9&combo_points>=5
+	if BuffRemains(savage_roar_buff) < 9 and ComboPoints() >= 5 SavageRoar()
+	#rip,if=combo_points>=5
+	if ComboPoints() >= 5 Spell(rip)
+	#rake,cycle_targets=1,if=(active_enemies<8|buff.rune_of_reorigination.up)&dot.rake.remains<3&target.time_to_die>=15
+	if { Enemies() < 8 or BuffPresent(rune_of_reorigination_buff) } and target.DebuffRemains(rake_debuff) < 3 and target.TimeToDie() >= 15 Spell(rake)
+	#swipe_cat,if=buff.savage_roar.remains<=5
+	if BuffRemains(savage_roar_buff) <= 5 Spell(swipe_cat)
+	#swipe_cat,if=buff.tigers_fury.up|buff.berserk.up
+	if BuffPresent(tigers_fury_buff) or BuffPresent(berserk_cat_buff) Spell(swipe_cat)
+	#swipe_cat,if=cooldown.tigers_fury.remains<3
+	if SpellCooldown(tigers_fury) < 3 Spell(swipe_cat)
+	#swipe_cat,if=buff.omen_of_clarity.react
+	if BuffPresent(omen_of_clarity_melee_buff) Spell(swipe_cat)
+	#swipe_cat,if=energy.time_to_max<=1
+	if TimeToMaxEnergy() <= 1 Spell(swipe_cat)
+}
+
+AddFunction FeralPrecombatActions
+{
+	#flask,type=spring_blossoms
+	#food,type=sea_mist_rice_noodles
+	#mark_of_the_wild,if=!aura.str_agi_int.up
+	if not BuffPresent(str_agi_int any=1) Spell(mark_of_the_wild)
+	#healing_touch,if=!buff.dream_of_cenarius.up&talent.dream_of_cenarius.enabled
+	if not BuffPresent(dream_of_cenarius_melee_buff) and TalentPoints(dream_of_cenarius_talent) Spell(healing_touch)
+	#cat_form
+	if not Stance(druid_cat_form) Spell(cat_form)
+	#savage_roar
+	SavageRoar()
+	#stealth
+	if Stealthed(no) Spell(prowl)
+	#snapshot_stats
+	#virmens_bite_potion
+	UsePotionAgility()
+}
+
+AddFunction FeralAdvancedActions
+{
+	#swap_action_list,name=aoe,if=active_enemies>=5
+	if Enemies() >= 5 FeralAoeActions()
+	#auto_attack
+	#skull_bash_cat
+	FeralInterrupt()
+	#force_of_nature,if=charges=3|(buff.rune_of_reorigination.react&buff.rune_of_reorigination.remains<1)|(buff.vicious.react&buff.vicious.remains<1)|target.time_to_die<20
+	if Charges(force_of_nature_melee) == 3 or { BuffPresent(rune_of_reorigination_buff) and BuffRemains(rune_of_reorigination_buff) < 1 } or { BuffPresent(trinket_proc_agility_buff) and BuffRemains(trinket_proc_agility_buff) < 1 } or target.TimeToDie() < 20 Spell(force_of_nature_melee)
+	#blood_fury
+	Spell(blood_fury)
+	#berserking
+	Spell(berserking)
+	#arcane_torrent
+	Spell(arcane_torrent)
+	#ravage,if=buff.stealthed.up
+	if Stealthed() Spell(ravage usable=1)
+	#ferocious_bite,if=dot.rip.ticking&dot.rip.remains<=3&target.health.pct<=25
+	if target.DebuffPresent(rip_debuff) and target.DebuffRemains(rip_debuff) <= 3 and target.HealthPercent() <= 25 Spell(ferocious_bite)
+	#faerie_fire,if=debuff.weakened_armor.stack<3
+	if target.DebuffStacks(weakened_armor_debuff any=1) < 3 Spell(faerie_fire)
+	#healing_touch,if=talent.dream_of_cenarius.enabled&buff.predatory_swiftness.up&buff.dream_of_cenarius.down&(buff.predatory_swiftness.remains<1.5|combo_points>=4)
+	if TalentPoints(dream_of_cenarius_talent) and BuffPresent(predatory_swiftness_buff) and BuffExpires(dream_of_cenarius_melee_buff) and { BuffRemains(predatory_swiftness_buff) < 1.5 or ComboPoints() >= 4 } Spell(healing_touch)
+	#savage_roar,if=buff.savage_roar.down
+	if BuffExpires(savage_roar_buff) SavageRoar()
+	#tigers_fury,if=energy<=35&!buff.omen_of_clarity.react
+	if Energy() <= 35 and not BuffPresent(omen_of_clarity_melee_buff) Spell(tigers_fury)
+	#berserk,if=buff.tigers_fury.up|(target.time_to_die<18&cooldown.tigers_fury.remains>6)
+	if BuffPresent(tigers_fury_buff) or { target.TimeToDie() < 18 and SpellCooldown(tigers_fury) > 6 } Spell(berserk_cat)
+	#use_item,slot=hands,if=buff.tigers_fury.up
+	if BuffPresent(tigers_fury_buff) UseItemActions()
+	#thrash_cat,if=buff.omen_of_clarity.react&dot.thrash_cat.remains<3&target.time_to_die>=6
+	if BuffPresent(omen_of_clarity_melee_buff) and target.DebuffRemains(thrash_cat_debuff) < 3 and target.TimeToDie() >= 6 Spell(thrash_cat)
+	#ferocious_bite,if=target.time_to_die<=1&combo_points>=3
+	if target.TimeToDie() <= 1 and ComboPoints() >= 3 Spell(ferocious_bite)
+	#savage_roar,if=buff.savage_roar.remains<=3&combo_points>0&target.health.pct<25
+	if BuffRemains(savage_roar_buff) <= 3 and ComboPoints() > 0 and target.HealthPercent() < 25 SavageRoar()
+	#virmens_bite_potion,if=(combo_points>=5&(target.time_to_die*(target.health.pct-25)%target.health.pct)<15&buff.rune_of_reorigination.up)|target.time_to_die<=40
+	if { ComboPoints() >= 5 and { target.TimeToDie() * { target.HealthPercent() -25 } / target.HealthPercent() } < 15 and BuffPresent(rune_of_reorigination_buff) } or target.TimeToDie() <= 40 UsePotionAgility()
+	#rip,if=combo_points>=5&action.rip.tick_damage%dot.rip.tick_dmg>=1.15&target.time_to_die>30
+	if ComboPoints() >= 5 and target.Damage(rip_debuff) / target.LastEstimatedDamage(rip_debuff) >= 1.15 and target.TimeToDie() > 30 Spell(rip)
+	#rip,if=combo_points>=4&action.rip.tick_damage%dot.rip.tick_dmg>=0.95&target.time_to_die>30&buff.rune_of_reorigination.up&buff.rune_of_reorigination.remains<=1.5
+	if ComboPoints() >= 4 and target.Damage(rip_debuff) / target.LastEstimatedDamage(rip_debuff) >= 0.95 and target.TimeToDie() > 30 and BuffPresent(rune_of_reorigination_buff) and BuffRemains(rune_of_reorigination_buff) <= 1.5 Spell(rip)
+	#pool_resource,if=combo_points>=5&target.health.pct<=25&dot.rip.ticking&!(energy>=50|(buff.berserk.up&energy>=25))
+	unless ComboPoints() >= 5 and target.HealthPercent() <= 25 and target.DebuffPresent(rip_debuff) and not { Energy() >= 50 or { BuffPresent(berserk_cat_buff) and Energy() >= 25 } }
+	{
+		#ferocious_bite,if=combo_points>=5&dot.rip.ticking&target.health.pct<=25
+		if ComboPoints() >= 5 and target.DebuffPresent(rip_debuff) and target.HealthPercent() <= 25 Spell(ferocious_bite)
+		#rip,if=combo_points>=5&target.time_to_die>=6&dot.rip.remains<2&(buff.berserk.up|dot.rip.remains+1.9<=cooldown.tigers_fury.remains)
+		if ComboPoints() >= 5 and target.TimeToDie() >= 6 and target.DebuffRemains(rip_debuff) < 2 and { BuffPresent(berserk_cat_buff) or target.DebuffRemains(rip_debuff) + 1.9 <= SpellCooldown(tigers_fury) } Spell(rip)
+		#savage_roar,if=buff.savage_roar.remains<=3&combo_points>0&buff.savage_roar.remains+2>dot.rip.remains
+		if BuffRemains(savage_roar_buff) <= 3 and ComboPoints() > 0 and BuffRemains(savage_roar_buff) + 2 > target.DebuffRemains(rip_debuff) SavageRoar()
+		#savage_roar,if=buff.savage_roar.remains<=6&combo_points>=5&buff.savage_roar.remains+2<=dot.rip.remains&dot.rip.ticking
+		if BuffRemains(savage_roar_buff) <= 6 and ComboPoints() >= 5 and BuffRemains(savage_roar_buff) + 2 <= target.DebuffRemains(rip_debuff) and target.DebuffPresent(rip_debuff) SavageRoar()
+		#savage_roar,if=buff.savage_roar.remains<=12&combo_points>=5&energy.time_to_max<=1&buff.savage_roar.remains<=dot.rip.remains+6&dot.rip.ticking
+		if BuffRemains(savage_roar_buff) <= 12 and ComboPoints() >= 5 and TimeToMaxEnergy() <= 1 and BuffRemains(savage_roar_buff) <= target.DebuffRemains(rip_debuff) + 6 and target.DebuffPresent(rip_debuff) SavageRoar()
+		#rake,if=buff.rune_of_reorigination.up&dot.rake.remains<9&buff.rune_of_reorigination.remains<=1.5
+		if BuffPresent(rune_of_reorigination_buff) and target.DebuffRemains(rake_debuff) < 9 and BuffRemains(rune_of_reorigination_buff) <= 1.5 Spell(rake)
+		#rake,cycle_targets=1,if=target.time_to_die-dot.rake.remains>3&(action.rake.tick_damage>dot.rake.tick_dmg|(dot.rake.remains<3&action.rake.tick_damage%dot.rake.tick_dmg>=0.75))
+		if target.TimeToDie() - target.DebuffRemains(rake_debuff) > 3 and { target.Damage(rake_debuff) > target.LastEstimatedDamage(rake_debuff) or { target.DebuffRemains(rake_debuff) < 3 and target.Damage(rake_debuff) / target.LastEstimatedDamage(rake_debuff) >= 0.75 } } Spell(rake)
+		#pool_resource,for_next=1
+		#thrash_cat,if=target.time_to_die>=6&dot.thrash_cat.remains<3&(dot.rip.remains>=8&buff.savage_roar.remains>=12|buff.berserk.up|combo_points>=5)&dot.rip.ticking
+		if target.TimeToDie() >= 6 and target.DebuffRemains(thrash_cat_debuff) < 3 and { target.DebuffRemains(rip_debuff) >= 8 and BuffRemains(savage_roar_buff) >= 12 or BuffPresent(berserk_cat_buff) or ComboPoints() >= 5 } and target.DebuffPresent(rip_debuff) wait Spell(thrash_cat)
+		#pool_resource,for_next=1
+		#thrash_cat,if=target.time_to_die>=6&dot.thrash_cat.remains<9&buff.rune_of_reorigination.up&buff.rune_of_reorigination.remains<=1.5&dot.rip.ticking
+		if target.TimeToDie() >= 6 and target.DebuffRemains(thrash_cat_debuff) < 9 and BuffPresent(rune_of_reorigination_buff) and BuffRemains(rune_of_reorigination_buff) <= 1.5 and target.DebuffPresent(rip_debuff) wait Spell(thrash_cat)
+		#pool_resource,if=combo_points>=5&!(energy.time_to_max<=1|(buff.berserk.up&energy>=25)|(buff.feral_rage.up&buff.feral_rage.remains<=1))&dot.rip.ticking
+		unless ComboPoints() >= 5 and not { TimeToMaxEnergy() <= 1 or { BuffPresent(berserk_cat_buff) and Energy() >= 25 } or { BuffPresent(feral_rage_buff) and BuffRemains(feral_rage_buff) <= 1 } } and target.DebuffPresent(rip_debuff)
+		{
+			#ferocious_bite,if=combo_points>=5&dot.rip.ticking
+			if ComboPoints() >= 5 and target.DebuffPresent(rip_debuff) Spell(ferocious_bite)
+			#run_action_list,name=filler,if=buff.omen_of_clarity.react
+			if BuffPresent(omen_of_clarity_melee_buff) FeralFillerActions()
+			#run_action_list,name=filler,if=buff.feral_fury.react
+			if BuffPresent(feral_fury_buff) FeralFillerActions()
+			#run_action_list,name=filler,if=(combo_points<5&dot.rip.remains<3.0)|(combo_points=0&buff.savage_roar.remains<2)
+			if { ComboPoints() < 5 and target.DebuffRemains(rip_debuff) < 3 } or { ComboPoints() == 0 and BuffRemains(savage_roar_buff) < 2 } FeralFillerActions()
+			#run_action_list,name=filler,if=target.time_to_die<=8.5
+			if target.TimeToDie() <= 8.5 FeralFillerActions()
+			#run_action_list,name=filler,if=buff.tigers_fury.up|buff.berserk.up
+			if BuffPresent(tigers_fury_buff) or BuffPresent(berserk_cat_buff) FeralFillerActions()
+			#run_action_list,name=filler,if=cooldown.tigers_fury.remains<=3
+			if SpellCooldown(tigers_fury) <= 3 FeralFillerActions()
+			#run_action_list,name=filler,if=energy.time_to_max<=1.0
+			if TimeToMaxEnergy() <= 1 FeralFillerActions()
+		}
+	}
+}
+
+AddIcon mastery=feral help=main
+{
+	if InCombat(no) FeralPrecombatActions()
+	FeralDefaultActions()
+}
+
+### Required symbols
+# arcane_torrent
+# berserk_cat
+# berserk_cat_buff
+# berserking
+# blood_fury
+# cat_form
+# dream_of_cenarius_melee_buff
+# dream_of_cenarius_talent
+# faerie_fire
+# feral_fury_buff
+# feral_rage_buff
+# ferocious_bite
+# force_of_nature_melee
+# healing_touch
+# king_of_the_jungle_buff
+# mangle_cat
+# mark_of_the_wild
+# omen_of_clarity_melee_buff
+# predatory_swiftness_buff
+# prowl
+# rake
+# rake_debuff
+# ravage
+# rip
+# rip_debuff
+# rune_of_reorigination_buff
+# savage_roar
+# savage_roar_buff
+# shred
+# skull_bash_cat
+# str_agi_int
+# swipe_cat
+# thrash_cat
+# thrash_cat_debuff
+# tigers_fury
+# tigers_fury_buff
+# trinket_proc_agility_buff
+# virmens_bite_potion
+# weakened_armor_debuff
+]]
+	OvaleScripts:RegisterScript("DRUID", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_druid_feral_t16h_adv_rotation.lua b/scripts/simulationcraft_druid_feral_t16h_adv_rotation.lua
new file mode 100644
index 0000000..5510cea
--- /dev/null
+++ b/scripts/simulationcraft_druid_feral_t16h_adv_rotation.lua
@@ -0,0 +1,303 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+	local name = "SimulationCraft: Druid_Feral_T16H_Adv_Rotation"
+	local desc = "[5.4] SimulationCraft: Druid_Feral_T16H_Adv_Rotation"
+	local code = [[
+# Based on SimulationCraft profile "Druid_Feral_T16H_Adv_Rotation".
+#	class=druid
+#	spec=feral
+#	talents=http://us.battle.net/wow/en/tool/talent-calculator#UZ!...2.1
+#	glyphs=savagery/cat_form
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_druid_spells)
+
+AddFunction FeralFillerActions
+{
+	#ravage
+	Spell(ravage usable=1)
+	#rake,if=target.time_to_die-dot.rake.remains>3&action.rake.tick_damage*(dot.rake.ticks_remain+1)-dot.rake.tick_dmg*dot.rake.ticks_remain>action.mangle_cat.hit_damage
+	if target.TimeToDie() - target.DebuffRemains(rake_debuff) > 3 and target.Damage(rake_debuff) * { target.TicksRemain(rake_debuff) + 1 } - target.LastEstimatedDamage(rake_debuff) * target.TicksRemain(rake_debuff) > target.Damage(mangle_cat) Spell(rake)
+	#shred,if=(buff.omen_of_clarity.react|buff.berserk.up|energy.regen>=15)&buff.king_of_the_jungle.down
+	if { BuffPresent(omen_of_clarity_melee_buff) or BuffPresent(berserk_cat_buff) or EnergyRegen() >= 15 } and BuffExpires(king_of_the_jungle_buff) Spell(shred)
+	#mangle_cat,if=buff.king_of_the_jungle.down
+	if BuffExpires(king_of_the_jungle_buff) Spell(mangle_cat)
+}
+
+AddFunction FeralDefaultActions
+{
+	#swap_action_list,name=advanced
+	FeralAdvancedActions()
+}
+
+AddFunction FeralBasicActions
+{
+	#swap_action_list,name=aoe,if=active_enemies>=5
+	if Enemies() >= 5 FeralAoeActions()
+	#auto_attack
+	#skull_bash_cat
+	FeralInterrupt()
+	#force_of_nature,if=charges=3|trinket.proc.agility.react|(buff.rune_of_reorigination.react&buff.rune_of_reorigination.remains<1)|target.time_to_die<20
+	if Charges(force_of_nature_melee) == 3 or BuffPresent(trinket_proc_agility_buff) or { BuffPresent(rune_of_reorigination_buff) and BuffRemains(rune_of_reorigination_buff) < 1 } or target.TimeToDie() < 20 Spell(force_of_nature_melee)
+	#ferocious_bite,if=dot.rip.ticking&dot.rip.remains<=3&target.health.pct<=25
+	if target.DebuffPresent(rip_debuff) and target.DebuffRemains(rip_debuff) <= 3 and target.HealthPercent() <= 25 Spell(ferocious_bite)
+	#faerie_fire,if=debuff.weakened_armor.stack<3
+	if target.DebuffStacks(weakened_armor_debuff any=1) < 3 Spell(faerie_fire)
+	#healing_touch,if=talent.dream_of_cenarius.enabled&buff.predatory_swiftness.up&buff.dream_of_cenarius.down&(buff.predatory_swiftness.remains<1.5|combo_points>=4)
+	if TalentPoints(dream_of_cenarius_talent) and BuffPresent(predatory_swiftness_buff) and BuffExpires(dream_of_cenarius_melee_buff) and { BuffRemains(predatory_swiftness_buff) < 1.5 or ComboPoints() >= 4 } Spell(healing_touch)
+	#savage_roar,if=buff.savage_roar.remains<3
+	if BuffRemains(savage_roar_buff) < 3 SavageRoar()
+	#virmens_bite_potion,if=(target.health.pct<30&buff.berserk.up)|target.time_to_die<=40
+	if { target.HealthPercent() < 30 and BuffPresent(berserk_cat_buff) } or target.TimeToDie() <= 40 UsePotionAgility()
+	#tigers_fury,if=energy<=35&!buff.omen_of_clarity.react
+	if Energy() <= 35 and not BuffPresent(omen_of_clarity_melee_buff) Spell(tigers_fury)
+	#berserk,if=buff.tigers_fury.up
+	if BuffPresent(tigers_fury_buff) Spell(berserk_cat)
+	#use_item,slot=hands,if=buff.tigers_fury.up
+	if BuffPresent(tigers_fury_buff) UseItemActions()
+	#blood_fury,if=buff.tigers_fury.up
+	if BuffPresent(tigers_fury_buff) Spell(blood_fury)
+	#berserking,if=buff.tigers_fury.up
+	if BuffPresent(tigers_fury_buff) Spell(berserking)
+	#arcane_torrent,if=buff.tigers_fury.up
+	if BuffPresent(tigers_fury_buff) Spell(arcane_torrent)
+	#rip,if=combo_points>=5&target.health.pct<=25&action.rip.tick_damage%dot.rip.tick_dmg>=1.15
+	if ComboPoints() >= 5 and target.HealthPercent() <= 25 and target.Damage(rip_debuff) / target.LastEstimatedDamage(rip_debuff) >= 1.15 Spell(rip)
+	#ferocious_bite,if=combo_points>=5&target.health.pct<=25&dot.rip.ticking
+	if ComboPoints() >= 5 and target.HealthPercent() <= 25 and target.DebuffPresent(rip_debuff) Spell(ferocious_bite)
+	#rip,if=combo_points>=5&dot.rip.remains<2
+	if ComboPoints() >= 5 and target.DebuffRemains(rip_debuff) < 2 Spell(rip)
+	#thrash_cat,if=buff.omen_of_clarity.react&dot.thrash_cat.remains<3
+	if BuffPresent(omen_of_clarity_melee_buff) and target.DebuffRemains(thrash_cat_debuff) < 3 Spell(thrash_cat)
+	#rake,cycle_targets=1,if=dot.rake.remains<3|action.rake.tick_damage>dot.rake.tick_dmg
+	if target.DebuffRemains(rake_debuff) < 3 or target.Damage(rake_debuff) > target.LastEstimatedDamage(rake_debuff) Spell(rake)
+	#pool_resource,for_next=1
+	#thrash_cat,if=dot.thrash_cat.remains<3&(dot.rip.remains>=8&buff.savage_roar.remains>=12|buff.berserk.up|combo_points>=5)
+	if target.DebuffRemains(thrash_cat_debuff) < 3 and { target.DebuffRemains(rip_debuff) >= 8 and BuffRemains(savage_roar_buff) >= 12 or BuffPresent(berserk_cat_buff) or ComboPoints() >= 5 } wait Spell(thrash_cat)
+	#pool_resource,if=combo_points>=5&!(energy.time_to_max<=1|(buff.berserk.up&energy>=25)|(buff.feral_rage.up&buff.feral_rage.remains<=1))&dot.rip.ticking
+	unless ComboPoints() >= 5 and not { TimeToMaxEnergy() <= 1 or { BuffPresent(berserk_cat_buff) and Energy() >= 25 } or { BuffPresent(feral_rage_buff) and BuffRemains(feral_rage_buff) <= 1 } } and target.DebuffPresent(rip_debuff)
+	{
+		#ferocious_bite,if=combo_points>=5&dot.rip.ticking
+		if ComboPoints() >= 5 and target.DebuffPresent(rip_debuff) Spell(ferocious_bite)
+		#run_action_list,name=filler,if=buff.omen_of_clarity.react
+		if BuffPresent(omen_of_clarity_melee_buff) FeralFillerActions()
+		#run_action_list,name=filler,if=buff.feral_fury.react
+		if BuffPresent(feral_fury_buff) FeralFillerActions()
+		#run_action_list,name=filler,if=(combo_points<5&dot.rip.remains<3.0)|(combo_points=0&buff.savage_roar.remains<2)
+		if { ComboPoints() < 5 and target.DebuffRemains(rip_debuff) < 3 } or { ComboPoints() == 0 and BuffRemains(savage_roar_buff) < 2 } FeralFillerActions()
+		#run_action_list,name=filler,if=target.time_to_die<=8.5
+		if target.TimeToDie() <= 8.5 FeralFillerActions()
+		#run_action_list,name=filler,if=buff.tigers_fury.up|buff.berserk.up
+		if BuffPresent(tigers_fury_buff) or BuffPresent(berserk_cat_buff) FeralFillerActions()
+		#run_action_list,name=filler,if=cooldown.tigers_fury.remains<=3
+		if SpellCooldown(tigers_fury) <= 3 FeralFillerActions()
+		#run_action_list,name=filler,if=energy.time_to_max<=1.0
+		if TimeToMaxEnergy() <= 1 FeralFillerActions()
+	}
+}
+
+AddFunction FeralAoeActions
+{
+	#swap_action_list,name=default,if=active_enemies<5
+	if Enemies() < 5 FeralDefaultActions()
+	#auto_attack
+	#faerie_fire,cycle_targets=1,if=debuff.weakened_armor.stack<3
+	if target.DebuffStacks(weakened_armor_debuff any=1) < 3 Spell(faerie_fire)
+	#savage_roar,if=buff.savage_roar.down|(buff.savage_roar.remains<3&combo_points>0)
+	if BuffExpires(savage_roar_buff) or { BuffRemains(savage_roar_buff) < 3 and ComboPoints() > 0 } SavageRoar()
+	#use_item,slot=hands,if=buff.tigers_fury.up
+	if BuffPresent(tigers_fury_buff) UseItemActions()
+	#blood_fury,if=buff.tigers_fury.up
+	if BuffPresent(tigers_fury_buff) Spell(blood_fury)
+	#berserking,if=buff.tigers_fury.up
+	if BuffPresent(tigers_fury_buff) Spell(berserking)
+	#arcane_torrent,if=buff.tigers_fury.up
+	if BuffPresent(tigers_fury_buff) Spell(arcane_torrent)
+	#tigers_fury,if=energy<=35&!buff.omen_of_clarity.react
+	if Energy() <= 35 and not BuffPresent(omen_of_clarity_melee_buff) Spell(tigers_fury)
+	#berserk,if=buff.tigers_fury.up
+	if BuffPresent(tigers_fury_buff) Spell(berserk_cat)
+	#pool_resource,for_next=1
+	#thrash_cat,if=buff.rune_of_reorigination.up
+	if BuffPresent(rune_of_reorigination_buff) wait Spell(thrash_cat)
+	#pool_resource,wait=0.1,for_next=1
+	#thrash_cat,if=dot.thrash_cat.remains<3|(buff.tigers_fury.up&dot.thrash_cat.remains<9)
+	if target.DebuffRemains(thrash_cat_debuff) < 3 or { BuffPresent(tigers_fury_buff) and target.DebuffRemains(thrash_cat_debuff) < 9 } wait Spell(thrash_cat)
+	#savage_roar,if=buff.savage_roar.remains<9&combo_points>=5
+	if BuffRemains(savage_roar_buff) < 9 and ComboPoints() >= 5 SavageRoar()
+	#rip,if=combo_points>=5
+	if ComboPoints() >= 5 Spell(rip)
+	#rake,cycle_targets=1,if=(active_enemies<8|buff.rune_of_reorigination.up)&dot.rake.remains<3&target.time_to_die>=15
+	if { Enemies() < 8 or BuffPresent(rune_of_reorigination_buff) } and target.DebuffRemains(rake_debuff) < 3 and target.TimeToDie() >= 15 Spell(rake)
+	#swipe_cat,if=buff.savage_roar.remains<=5
+	if BuffRemains(savage_roar_buff) <= 5 Spell(swipe_cat)
+	#swipe_cat,if=buff.tigers_fury.up|buff.berserk.up
+	if BuffPresent(tigers_fury_buff) or BuffPresent(berserk_cat_buff) Spell(swipe_cat)
+	#swipe_cat,if=cooldown.tigers_fury.remains<3
+	if SpellCooldown(tigers_fury) < 3 Spell(swipe_cat)
+	#swipe_cat,if=buff.omen_of_clarity.react
+	if BuffPresent(omen_of_clarity_melee_buff) Spell(swipe_cat)
+	#swipe_cat,if=energy.time_to_max<=1
+	if TimeToMaxEnergy() <= 1 Spell(swipe_cat)
+}
+
+AddFunction FeralPrecombatActions
+{
+	#flask,type=spring_blossoms
+	#food,type=sea_mist_rice_noodles
+	#mark_of_the_wild,if=!aura.str_agi_int.up
+	if not BuffPresent(str_agi_int any=1) Spell(mark_of_the_wild)
+	#healing_touch,if=!buff.dream_of_cenarius.up&talent.dream_of_cenarius.enabled
+	if not BuffPresent(dream_of_cenarius_melee_buff) and TalentPoints(dream_of_cenarius_talent) Spell(healing_touch)
+	#cat_form
+	if not Stance(druid_cat_form) Spell(cat_form)
+	#savage_roar
+	SavageRoar()
+	#stealth
+	if Stealthed(no) Spell(prowl)
+	#snapshot_stats
+	#virmens_bite_potion
+	UsePotionAgility()
+}
+
+AddFunction FeralAdvancedActions
+{
+	#swap_action_list,name=aoe,if=active_enemies>=5
+	if Enemies() >= 5 FeralAoeActions()
+	#auto_attack
+	#skull_bash_cat
+	FeralInterrupt()
+	#force_of_nature,if=charges=3|(buff.rune_of_reorigination.react&buff.rune_of_reorigination.remains<1)|(buff.vicious.react&buff.vicious.remains<1)|target.time_to_die<20
+	if Charges(force_of_nature_melee) == 3 or { BuffPresent(rune_of_reorigination_buff) and BuffRemains(rune_of_reorigination_buff) < 1 } or { BuffPresent(trinket_proc_agility_buff) and BuffRemains(trinket_proc_agility_buff) < 1 } or target.TimeToDie() < 20 Spell(force_of_nature_melee)
+	#blood_fury
+	Spell(blood_fury)
+	#berserking
+	Spell(berserking)
+	#arcane_torrent
+	Spell(arcane_torrent)
+	#ravage,if=buff.stealthed.up
+	if Stealthed() Spell(ravage usable=1)
+	#ferocious_bite,if=dot.rip.ticking&dot.rip.remains<=3&target.health.pct<=25
+	if target.DebuffPresent(rip_debuff) and target.DebuffRemains(rip_debuff) <= 3 and target.HealthPercent() <= 25 Spell(ferocious_bite)
+	#faerie_fire,if=debuff.weakened_armor.stack<3
+	if target.DebuffStacks(weakened_armor_debuff any=1) < 3 Spell(faerie_fire)
+	#healing_touch,if=talent.dream_of_cenarius.enabled&buff.predatory_swiftness.up&buff.dream_of_cenarius.down&(buff.predatory_swiftness.remains<1.5|combo_points>=4)
+	if TalentPoints(dream_of_cenarius_talent) and BuffPresent(predatory_swiftness_buff) and BuffExpires(dream_of_cenarius_melee_buff) and { BuffRemains(predatory_swiftness_buff) < 1.5 or ComboPoints() >= 4 } Spell(healing_touch)
+	#savage_roar,if=buff.savage_roar.down
+	if BuffExpires(savage_roar_buff) SavageRoar()
+	#tigers_fury,if=energy<=35&!buff.omen_of_clarity.react
+	if Energy() <= 35 and not BuffPresent(omen_of_clarity_melee_buff) Spell(tigers_fury)
+	#berserk,if=buff.tigers_fury.up|(target.time_to_die<18&cooldown.tigers_fury.remains>6)
+	if BuffPresent(tigers_fury_buff) or { target.TimeToDie() < 18 and SpellCooldown(tigers_fury) > 6 } Spell(berserk_cat)
+	#use_item,slot=hands,if=buff.tigers_fury.up
+	if BuffPresent(tigers_fury_buff) UseItemActions()
+	#thrash_cat,if=buff.omen_of_clarity.react&dot.thrash_cat.remains<3&target.time_to_die>=6
+	if BuffPresent(omen_of_clarity_melee_buff) and target.DebuffRemains(thrash_cat_debuff) < 3 and target.TimeToDie() >= 6 Spell(thrash_cat)
+	#ferocious_bite,if=target.time_to_die<=1&combo_points>=3
+	if target.TimeToDie() <= 1 and ComboPoints() >= 3 Spell(ferocious_bite)
+	#savage_roar,if=buff.savage_roar.remains<=3&combo_points>0&target.health.pct<25
+	if BuffRemains(savage_roar_buff) <= 3 and ComboPoints() > 0 and target.HealthPercent() < 25 SavageRoar()
+	#virmens_bite_potion,if=(combo_points>=5&(target.time_to_die*(target.health.pct-25)%target.health.pct)<15&buff.rune_of_reorigination.up)|target.time_to_die<=40
+	if { ComboPoints() >= 5 and { target.TimeToDie() * { target.HealthPercent() -25 } / target.HealthPercent() } < 15 and BuffPresent(rune_of_reorigination_buff) } or target.TimeToDie() <= 40 UsePotionAgility()
+	#rip,if=combo_points>=5&action.rip.tick_damage%dot.rip.tick_dmg>=1.15&target.time_to_die>30
+	if ComboPoints() >= 5 and target.Damage(rip_debuff) / target.LastEstimatedDamage(rip_debuff) >= 1.15 and target.TimeToDie() > 30 Spell(rip)
+	#rip,if=combo_points>=4&action.rip.tick_damage%dot.rip.tick_dmg>=0.95&target.time_to_die>30&buff.rune_of_reorigination.up&buff.rune_of_reorigination.remains<=1.5
+	if ComboPoints() >= 4 and target.Damage(rip_debuff) / target.LastEstimatedDamage(rip_debuff) >= 0.95 and target.TimeToDie() > 30 and BuffPresent(rune_of_reorigination_buff) and BuffRemains(rune_of_reorigination_buff) <= 1.5 Spell(rip)
+	#pool_resource,if=combo_points>=5&target.health.pct<=25&dot.rip.ticking&!(energy>=50|(buff.berserk.up&energy>=25))
+	unless ComboPoints() >= 5 and target.HealthPercent() <= 25 and target.DebuffPresent(rip_debuff) and not { Energy() >= 50 or { BuffPresent(berserk_cat_buff) and Energy() >= 25 } }
+	{
+		#ferocious_bite,if=combo_points>=5&dot.rip.ticking&target.health.pct<=25
+		if ComboPoints() >= 5 and target.DebuffPresent(rip_debuff) and target.HealthPercent() <= 25 Spell(ferocious_bite)
+		#rip,if=combo_points>=5&target.time_to_die>=6&dot.rip.remains<2&(buff.berserk.up|dot.rip.remains+1.9<=cooldown.tigers_fury.remains)
+		if ComboPoints() >= 5 and target.TimeToDie() >= 6 and target.DebuffRemains(rip_debuff) < 2 and { BuffPresent(berserk_cat_buff) or target.DebuffRemains(rip_debuff) + 1.9 <= SpellCooldown(tigers_fury) } Spell(rip)
+		#savage_roar,if=buff.savage_roar.remains<=3&combo_points>0&buff.savage_roar.remains+2>dot.rip.remains
+		if BuffRemains(savage_roar_buff) <= 3 and ComboPoints() > 0 and BuffRemains(savage_roar_buff) + 2 > target.DebuffRemains(rip_debuff) SavageRoar()
+		#savage_roar,if=buff.savage_roar.remains<=6&combo_points>=5&buff.savage_roar.remains+2<=dot.rip.remains&dot.rip.ticking
+		if BuffRemains(savage_roar_buff) <= 6 and ComboPoints() >= 5 and BuffRemains(savage_roar_buff) + 2 <= target.DebuffRemains(rip_debuff) and target.DebuffPresent(rip_debuff) SavageRoar()
+		#savage_roar,if=buff.savage_roar.remains<=12&combo_points>=5&energy.time_to_max<=1&buff.savage_roar.remains<=dot.rip.remains+6&dot.rip.ticking
+		if BuffRemains(savage_roar_buff) <= 12 and ComboPoints() >= 5 and TimeToMaxEnergy() <= 1 and BuffRemains(savage_roar_buff) <= target.DebuffRemains(rip_debuff) + 6 and target.DebuffPresent(rip_debuff) SavageRoar()
+		#rake,if=buff.rune_of_reorigination.up&dot.rake.remains<9&buff.rune_of_reorigination.remains<=1.5
+		if BuffPresent(rune_of_reorigination_buff) and target.DebuffRemains(rake_debuff) < 9 and BuffRemains(rune_of_reorigination_buff) <= 1.5 Spell(rake)
+		#rake,cycle_targets=1,if=target.time_to_die-dot.rake.remains>3&(action.rake.tick_damage>dot.rake.tick_dmg|(dot.rake.remains<3&action.rake.tick_damage%dot.rake.tick_dmg>=0.75))
+		if target.TimeToDie() - target.DebuffRemains(rake_debuff) > 3 and { target.Damage(rake_debuff) > target.LastEstimatedDamage(rake_debuff) or { target.DebuffRemains(rake_debuff) < 3 and target.Damage(rake_debuff) / target.LastEstimatedDamage(rake_debuff) >= 0.75 } } Spell(rake)
+		#pool_resource,for_next=1
+		#thrash_cat,if=target.time_to_die>=6&dot.thrash_cat.remains<3&(dot.rip.remains>=8&buff.savage_roar.remains>=12|buff.berserk.up|combo_points>=5)&dot.rip.ticking
+		if target.TimeToDie() >= 6 and target.DebuffRemains(thrash_cat_debuff) < 3 and { target.DebuffRemains(rip_debuff) >= 8 and BuffRemains(savage_roar_buff) >= 12 or BuffPresent(berserk_cat_buff) or ComboPoints() >= 5 } and target.DebuffPresent(rip_debuff) wait Spell(thrash_cat)
+		#pool_resource,for_next=1
+		#thrash_cat,if=target.time_to_die>=6&dot.thrash_cat.remains<9&buff.rune_of_reorigination.up&buff.rune_of_reorigination.remains<=1.5&dot.rip.ticking
+		if target.TimeToDie() >= 6 and target.DebuffRemains(thrash_cat_debuff) < 9 and BuffPresent(rune_of_reorigination_buff) and BuffRemains(rune_of_reorigination_buff) <= 1.5 and target.DebuffPresent(rip_debuff) wait Spell(thrash_cat)
+		#pool_resource,if=combo_points>=5&!(energy.time_to_max<=1|(buff.berserk.up&energy>=25)|(buff.feral_rage.up&buff.feral_rage.remains<=1))&dot.rip.ticking
+		unless ComboPoints() >= 5 and not { TimeToMaxEnergy() <= 1 or { BuffPresent(berserk_cat_buff) and Energy() >= 25 } or { BuffPresent(feral_rage_buff) and BuffRemains(feral_rage_buff) <= 1 } } and target.DebuffPresent(rip_debuff)
+		{
+			#ferocious_bite,if=combo_points>=5&dot.rip.ticking
+			if ComboPoints() >= 5 and target.DebuffPresent(rip_debuff) Spell(ferocious_bite)
+			#run_action_list,name=filler,if=buff.omen_of_clarity.react
+			if BuffPresent(omen_of_clarity_melee_buff) FeralFillerActions()
+			#run_action_list,name=filler,if=buff.feral_fury.react
+			if BuffPresent(feral_fury_buff) FeralFillerActions()
+			#run_action_list,name=filler,if=(combo_points<5&dot.rip.remains<3.0)|(combo_points=0&buff.savage_roar.remains<2)
+			if { ComboPoints() < 5 and target.DebuffRemains(rip_debuff) < 3 } or { ComboPoints() == 0 and BuffRemains(savage_roar_buff) < 2 } FeralFillerActions()
+			#run_action_list,name=filler,if=target.time_to_die<=8.5
+			if target.TimeToDie() <= 8.5 FeralFillerActions()
+			#run_action_list,name=filler,if=buff.tigers_fury.up|buff.berserk.up
+			if BuffPresent(tigers_fury_buff) or BuffPresent(berserk_cat_buff) FeralFillerActions()
+			#run_action_list,name=filler,if=cooldown.tigers_fury.remains<=3
+			if SpellCooldown(tigers_fury) <= 3 FeralFillerActions()
+			#run_action_list,name=filler,if=energy.time_to_max<=1.0
+			if TimeToMaxEnergy() <= 1 FeralFillerActions()
+		}
+	}
+}
+
+AddIcon mastery=feral help=main
+{
+	if InCombat(no) FeralPrecombatActions()
+	FeralDefaultActions()
+}
+
+### Required symbols
+# arcane_torrent
+# berserk_cat
+# berserk_cat_buff
+# berserking
+# blood_fury
+# cat_form
+# dream_of_cenarius_melee_buff
+# dream_of_cenarius_talent
+# faerie_fire
+# feral_fury_buff
+# feral_rage_buff
+# ferocious_bite
+# force_of_nature_melee
+# healing_touch
+# king_of_the_jungle_buff
+# mangle_cat
+# mark_of_the_wild
+# omen_of_clarity_melee_buff
+# predatory_swiftness_buff
+# prowl
+# rake
+# rake_debuff
+# ravage
+# rip
+# rip_debuff
+# rune_of_reorigination_buff
+# savage_roar
+# savage_roar_buff
+# shred
+# skull_bash_cat
+# str_agi_int
+# swipe_cat
+# thrash_cat
+# thrash_cat_debuff
+# tigers_fury
+# tigers_fury_buff
+# trinket_proc_agility_buff
+# virmens_bite_potion
+# weakened_armor_debuff
+]]
+	OvaleScripts:RegisterScript("DRUID", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_hunter_bm_t16h.lua b/scripts/simulationcraft_hunter_bm_t16h.lua
new file mode 100644
index 0000000..aaaaa29
--- /dev/null
+++ b/scripts/simulationcraft_hunter_bm_t16h.lua
@@ -0,0 +1,136 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+	local name = "SimulationCraft: Hunter_BM_T16H"
+	local desc = "[5.4] SimulationCraft: Hunter_BM_T16H"
+	local code = [[
+# Based on SimulationCraft profile "Hunter_BM_T16H".
+#	class=hunter
+#	spec=beast_mastery
+#	talents=http://us.battle.net/wow/en/tool/talent-calculator#Ya!...100
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_hunter_spells)
+
+AddFunction BeastMasteryDefaultActions
+{
+	#virmens_bite_potion,if=target.time_to_die<=25|buff.stampede.up
+	if target.TimeToDie() <= 25 or BuffPresent(stampede_buff) UsePotionAgility()
+	#use_item,slot=hands
+	UseItemActions()
+	#auto_shot
+	#explosive_trap,if=active_enemies>1
+	if Enemies() > 1 Spell(explosive_trap)
+	#serpent_sting,if=!ticking
+	if not target.DebuffPresent(serpent_sting_debuff) Spell(serpent_sting)
+	#blood_fury
+	Spell(blood_fury)
+	#dire_beast,if=enabled
+	if TalentPoints(dire_beast_talent) Spell(dire_beast)
+	#fervor,if=enabled&focus<=65
+	if TalentPoints(fervor_talent) and Focus() <= 65 Spell(fervor)
+	#bestial_wrath,if=focus>60&!buff.beast_within.up
+	if Focus() > 60 and not BuffPresent(beast_within_buff) Spell(bestial_wrath)
+	#multi_shot,if=active_enemies>5|(active_enemies>1&buff.beast_cleave.down)
+	if Enemies() > 5 or { Enemies() > 1 and BuffExpires(beast_cleave_buff) } Spell(multi_shot)
+	#rapid_fire,if=!buff.rapid_fire.up
+	if not BuffPresent(rapid_fire_buff) Spell(rapid_fire)
+	#stampede,if=trinket.stat.agility.up|target.time_to_die<=20|(trinket.stacking_stat.agility.stack>10&trinket.stat.agility.cooldown_remains<=3)
+	if BuffPresent(trinket_stat_agility_buff) or target.TimeToDie() <= 20 or { BuffStacks(trinket_stacking_stat_agility_buff) > 10 and { ItemCooldown(Trinket0Slot) + ItemCooldown(Trinket1Slot) } <= 3 } Spell(stampede)
+	#barrage,if=enabled&active_enemies>5
+	if TalentPoints(barrage_talent) and Enemies() > 5 Spell(barrage)
+	#kill_shot
+	Spell(kill_shot usable=1)
+	#kill_command
+	if pet.Present() KillCommand()
+	#a_murder_of_crows,if=enabled&!ticking
+	if TalentPoints(a_murder_of_crows_talent) and not target.DebuffPresent(a_murder_of_crows_debuff) Spell(a_murder_of_crows)
+	#glaive_toss,if=enabled
+	if TalentPoints(glaive_toss_talent) Spell(glaive_toss)
+	#lynx_rush,if=enabled&!dot.lynx_rush.ticking
+	if TalentPoints(lynx_rush_talent) and not target.DebuffPresent(lynx_rush_debuff) Spell(lynx_rush)
+	#barrage,if=enabled
+	if TalentPoints(barrage_talent) Spell(barrage)
+	#powershot,if=enabled
+	if TalentPoints(powershot_talent) Spell(powershot)
+	#cobra_shot,if=active_enemies>5
+	if Enemies() > 5 Spell(cobra_shot)
+	#arcane_shot,if=buff.thrill_of_the_hunt.react|buff.beast_within.up
+	if BuffPresent(thrill_of_the_hunt_buff) or BuffPresent(beast_within_buff) Spell(arcane_shot)
+	#focus_fire,five_stacks=1
+	if BuffStacks(frenzy_buff any=1) == 5 Spell(focus_fire)
+	#cobra_shot,if=dot.serpent_sting.remains<6
+	if target.DebuffRemains(serpent_sting_debuff) < 6 Spell(cobra_shot)
+	#arcane_shot,if=focus>=61
+	if Focus() >= 61 Spell(arcane_shot)
+	#cobra_shot
+	Spell(cobra_shot)
+}
+
+AddFunction BeastMasteryPrecombatActions
+{
+	#flask,type=spring_blossoms
+	#food,type=sea_mist_rice_noodles
+	#aspect_of_the_hawk
+	if not Stance(hunter_aspect_of_the_hawk) Spell(aspect_of_the_hawk)
+	#hunters_mark,if=target.time_to_die>=21&!debuff.ranged_vulnerability.up
+	if target.TimeToDie() >= 21 and not target.DebuffPresent(ranged_vulnerability any=1) Spell(hunters_mark)
+	#summon_pet
+	SummonPet()
+	#snapshot_stats
+	#virmens_bite_potion
+	UsePotionAgility()
+}
+
+AddIcon mastery=beast_mastery help=main
+{
+	if InCombat(no) BeastMasteryPrecombatActions()
+	BeastMasteryDefaultActions()
+}
+
+### Required symbols
+# a_murder_of_crows
+# a_murder_of_crows_debuff
+# a_murder_of_crows_talent
+# arcane_shot
+# aspect_of_the_hawk
+# barrage
+# barrage_talent
+# beast_cleave_buff
+# beast_within_buff
+# bestial_wrath
+# blood_fury
+# cobra_shot
+# dire_beast
+# dire_beast_talent
+# explosive_trap
+# fervor
+# fervor_talent
+# focus_fire
+# glaive_toss
+# glaive_toss_talent
+# hunters_mark
+# kill_command
+# kill_shot
+# lynx_rush
+# lynx_rush_debuff
+# lynx_rush_talent
+# multi_shot
+# powershot
+# powershot_talent
+# rapid_fire
+# rapid_fire_buff
+# serpent_sting
+# serpent_sting_debuff
+# stampede
+# stampede_buff
+# summon_pet
+# thrill_of_the_hunt_buff
+# trinket_stacking_stat_agility_buff
+# trinket_stat_agility_buff
+# virmens_bite_potion
+]]
+	OvaleScripts:RegisterScript("HUNTER", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_hunter_mm_t16h.lua b/scripts/simulationcraft_hunter_mm_t16h.lua
new file mode 100644
index 0000000..44c2985
--- /dev/null
+++ b/scripts/simulationcraft_hunter_mm_t16h.lua
@@ -0,0 +1,150 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+	local name = "SimulationCraft: Hunter_MM_T16H"
+	local desc = "[5.4] SimulationCraft: Hunter_MM_T16H"
+	local code = [[
+# Based on SimulationCraft profile "Hunter_MM_T16H".
+#	class=hunter
+#	spec=marksmanship
+#	talents=http://us.battle.net/wow/en/tool/talent-calculator#YZ!...000
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_hunter_spells)
+
+AddFunction MarksmanshipCarefulAimActions
+{
+	#serpent_sting,if=!ticking
+	if not target.DebuffPresent(serpent_sting_debuff) Spell(serpent_sting)
+	#chimera_shot
+	Spell(chimera_shot)
+	#steady_shot,if=buff.pre_steady_focus.up&buff.steady_focus.remains<6
+	if BuffPresent(pre_steady_focus_buff) and BuffRemains(steady_focus_buff) < 6 Spell(steady_shot)
+	#aimed_shot
+	Spell(aimed_shot)
+	#glaive_toss,if=enabled
+	if TalentPoints(glaive_toss_talent) Spell(glaive_toss)
+	#steady_shot
+	Spell(steady_shot)
+}
+
+AddFunction MarksmanshipDefaultActions
+{
+	#virmens_bite_potion,if=target.time_to_die<=25|buff.stampede.up
+	if target.TimeToDie() <= 25 or BuffPresent(stampede_buff) UsePotionAgility()
+	#auto_shot
+	#explosive_trap,if=active_enemies>1
+	if Enemies() > 1 Spell(explosive_trap)
+	#blood_fury
+	Spell(blood_fury)
+	#powershot,if=enabled
+	if TalentPoints(powershot_talent) Spell(powershot)
+	#lynx_rush,if=enabled&!dot.lynx_rush.ticking
+	if TalentPoints(lynx_rush_talent) and not target.DebuffPresent(lynx_rush_debuff) Spell(lynx_rush)
+	#fervor,if=enabled&focus<=50
+	if TalentPoints(fervor_talent) and Focus() <= 50 Spell(fervor)
+	#rapid_fire,if=!buff.rapid_fire.up
+	if not BuffPresent(rapid_fire_buff) Spell(rapid_fire)
+	#stampede,if=trinket.stat.agility.up|target.time_to_die<=20|(trinket.stacking_stat.agility.stack>10&trinket.stat.agility.cooldown_remains<=3)
+	if BuffPresent(trinket_stat_agility_buff) or target.TimeToDie() <= 20 or { BuffStacks(trinket_stacking_stat_agility_buff) > 10 and { ItemCooldown(Trinket0Slot) + ItemCooldown(Trinket1Slot) } <= 3 } Spell(stampede)
+	#a_murder_of_crows,if=enabled&!ticking
+	if TalentPoints(a_murder_of_crows_talent) and not target.DebuffPresent(a_murder_of_crows_debuff) Spell(a_murder_of_crows)
+	#dire_beast,if=enabled
+	if TalentPoints(dire_beast_talent) Spell(dire_beast)
+	#run_action_list,name=careful_aim,if=target.health.pct>80
+	if target.HealthPercent() > 80 MarksmanshipCarefulAimActions()
+	#steady_shot,if=buff.pre_steady_focus.up&buff.steady_focus.remains<=4
+	if BuffPresent(pre_steady_focus_buff) and BuffRemains(steady_focus_buff) <= 4 Spell(steady_shot)
+	#glaive_toss,if=enabled
+	if TalentPoints(glaive_toss_talent) Spell(glaive_toss)
+	#barrage,if=enabled
+	if TalentPoints(barrage_talent) Spell(barrage)
+	#serpent_sting,if=!ticking
+	if not target.DebuffPresent(serpent_sting_debuff) Spell(serpent_sting)
+	#chimera_shot
+	Spell(chimera_shot)
+	#steady_shot,if=buff.steady_focus.remains<(action.steady_shot.cast_time+1)&!in_flight
+	if BuffRemains(steady_focus_buff) < { CastTime(steady_shot) + 1 } and not InFlightToTarget(steady_shot) Spell(steady_shot)
+	#kill_shot
+	Spell(kill_shot usable=1)
+	#multi_shot,if=active_enemies>=4
+	if Enemies() >= 4 Spell(multi_shot)
+	#aimed_shot,if=buff.master_marksman_fire.react
+	if BuffPresent(master_marksman_fire_buff) Spell(aimed_shot)
+	#arcane_shot,if=buff.thrill_of_the_hunt.react
+	if BuffPresent(thrill_of_the_hunt_buff) Spell(arcane_shot)
+	#aimed_shot,if=cast_time<1.6
+	if CastTime(aimed_shot) < 1.6 Spell(aimed_shot)
+	#arcane_shot,if=focus>=60|(focus>=43&(cooldown.chimera_shot.remains>=action.steady_shot.cast_time))&(!buff.rapid_fire.up&!buff.bloodlust.react)
+	if Focus() >= 60 or { Focus() >= 43 and { SpellCooldown(chimera_shot) >= CastTime(steady_shot) } } and { not BuffPresent(rapid_fire_buff) and not BuffPresent(burst_haste any=1) } Spell(arcane_shot)
+	#steady_shot
+	Spell(steady_shot)
+}
+
+AddFunction MarksmanshipPrecombatActions
+{
+	#flask,type=spring_blossoms
+	#food,type=sea_mist_rice_noodles
+	#aspect_of_the_hawk
+	if not Stance(hunter_aspect_of_the_hawk) Spell(aspect_of_the_hawk)
+	#hunters_mark,if=target.time_to_die>=21&!debuff.ranged_vulnerability.up
+	if target.TimeToDie() >= 21 and not target.DebuffPresent(ranged_vulnerability any=1) Spell(hunters_mark)
+	#summon_pet
+	SummonPet()
+	#snapshot_stats
+	#virmens_bite_potion
+	UsePotionAgility()
+}
+
+AddIcon mastery=marksmanship help=main
+{
+	if InCombat(no) MarksmanshipPrecombatActions()
+	MarksmanshipDefaultActions()
+}
+
+### Required symbols
+# a_murder_of_crows
+# a_murder_of_crows_debuff
+# a_murder_of_crows_talent
+# aimed_shot
+# arcane_shot
+# aspect_of_the_hawk
+# barrage
+# barrage_talent
+# blood_fury
+# chimera_shot
+# dire_beast
+# dire_beast_talent
+# explosive_trap
+# fervor
+# fervor_talent
+# glaive_toss
+# glaive_toss_talent
+# hunters_mark
+# kill_shot
+# lynx_rush
+# lynx_rush_debuff
+# lynx_rush_talent
+# master_marksman_fire_buff
+# multi_shot
+# powershot
+# powershot_talent
+# pre_steady_focus_buff
+# rapid_fire
+# rapid_fire_buff
+# serpent_sting
+# serpent_sting_debuff
+# stampede
+# stampede_buff
+# steady_focus_buff
+# steady_shot
+# summon_pet
+# thrill_of_the_hunt_buff
+# trinket_stacking_stat_agility_buff
+# trinket_stat_agility_buff
+# virmens_bite_potion
+]]
+	OvaleScripts:RegisterScript("HUNTER", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_hunter_sv_t16h.lua b/scripts/simulationcraft_hunter_sv_t16h.lua
new file mode 100644
index 0000000..305dcc8
--- /dev/null
+++ b/scripts/simulationcraft_hunter_sv_t16h.lua
@@ -0,0 +1,133 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+	local name = "SimulationCraft: Hunter_SV_T16H"
+	local desc = "[5.4] SimulationCraft: Hunter_SV_T16H"
+	local code = [[
+# Based on SimulationCraft profile "Hunter_SV_T16H".
+#	class=hunter
+#	spec=survival
+#	talents=http://us.battle.net/wow/en/tool/talent-calculator#Yb!...200
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_hunter_spells)
+
+AddFunction SurvivalDefaultActions
+{
+	#virmens_bite_potion,if=target.time_to_die<=25|buff.stampede.up
+	if target.TimeToDie() <= 25 or BuffPresent(stampede_buff) UsePotionAgility()
+	#blood_fury
+	Spell(blood_fury)
+	#auto_shot
+	#explosive_trap,if=active_enemies>1
+	if Enemies() > 1 Spell(explosive_trap)
+	#fervor,if=enabled&focus<=50
+	if TalentPoints(fervor_talent) and Focus() <= 50 Spell(fervor)
+	#a_murder_of_crows,if=enabled&!ticking
+	if TalentPoints(a_murder_of_crows_talent) and not target.DebuffPresent(a_murder_of_crows_debuff) Spell(a_murder_of_crows)
+	#lynx_rush,if=enabled&!dot.lynx_rush.ticking
+	if TalentPoints(lynx_rush_talent) and not target.DebuffPresent(lynx_rush_debuff) Spell(lynx_rush)
+	#explosive_shot,if=buff.lock_and_load.react
+	if BuffPresent(lock_and_load_buff) Spell(explosive_shot)
+	#glaive_toss,if=enabled
+	if TalentPoints(glaive_toss_talent) Spell(glaive_toss)
+	#powershot,if=enabled
+	if TalentPoints(powershot_talent) Spell(powershot)
+	#barrage,if=enabled
+	if TalentPoints(barrage_talent) Spell(barrage)
+	#serpent_sting,if=!ticking&target.time_to_die>=10
+	if not target.DebuffPresent(serpent_sting_debuff) and target.TimeToDie() >= 10 Spell(serpent_sting)
+	#explosive_shot,if=cooldown_react
+	if Spell(explosive_shot) Spell(explosive_shot)
+	#kill_shot
+	Spell(kill_shot usable=1)
+	#black_arrow,if=!ticking&target.time_to_die>=8
+	if not target.DebuffPresent(black_arrow_debuff) and target.TimeToDie() >= 8 Spell(black_arrow)
+	#multi_shot,if=active_enemies>3
+	if Enemies() > 3 Spell(multi_shot)
+	#multi_shot,if=buff.thrill_of_the_hunt.react&dot.serpent_sting.remains<2
+	if BuffPresent(thrill_of_the_hunt_buff) and target.DebuffRemains(serpent_sting_debuff) < 2 Spell(multi_shot)
+	#arcane_shot,if=buff.thrill_of_the_hunt.react
+	if BuffPresent(thrill_of_the_hunt_buff) Spell(arcane_shot)
+	#rapid_fire,if=!buff.rapid_fire.up
+	if not BuffPresent(rapid_fire_buff) Spell(rapid_fire)
+	#dire_beast,if=enabled
+	if TalentPoints(dire_beast_talent) Spell(dire_beast)
+	#stampede,if=trinket.stat.agility.up|target.time_to_die<=20|(trinket.stacking_stat.agility.stack>10&trinket.stat.agility.cooldown_remains<=3)
+	if BuffPresent(trinket_stat_agility_buff) or target.TimeToDie() <= 20 or { BuffStacks(trinket_stacking_stat_agility_buff) > 10 and { ItemCooldown(Trinket0Slot) + ItemCooldown(Trinket1Slot) } <= 3 } Spell(stampede)
+	#cobra_shot,if=dot.serpent_sting.remains<6
+	if target.DebuffRemains(serpent_sting_debuff) < 6 Spell(cobra_shot)
+	#arcane_shot,if=focus>=67&active_enemies<2
+	if Focus() >= 67 and Enemies() < 2 Spell(arcane_shot)
+	#multi_shot,if=focus>=67&active_enemies>1
+	if Focus() >= 67 and Enemies() > 1 Spell(multi_shot)
+	#cobra_shot
+	Spell(cobra_shot)
+}
+
+AddFunction SurvivalPrecombatActions
+{
+	#flask,type=spring_blossoms
+	#food,type=sea_mist_rice_noodles
+	#aspect_of_the_hawk
+	if not Stance(hunter_aspect_of_the_hawk) Spell(aspect_of_the_hawk)
+	#hunters_mark,if=target.time_to_die>=21&!debuff.ranged_vulnerability.up
+	if target.TimeToDie() >= 21 and not target.DebuffPresent(ranged_vulnerability any=1) Spell(hunters_mark)
+	#summon_pet
+	SummonPet()
+	#snapshot_stats
+	#virmens_bite_potion
+	UsePotionAgility()
+}
+
+AddIcon mastery=survival help=main
+{
+	if InCombat(no) SurvivalPrecombatActions()
+	SurvivalDefaultActions()
+}
+
+### Required symbols
+# a_murder_of_crows
+# a_murder_of_crows_debuff
+# a_murder_of_crows_talent
+# arcane_shot
+# aspect_of_the_hawk
+# barrage
+# barrage_talent
+# black_arrow
+# black_arrow_debuff
+# blood_fury
+# cobra_shot
+# dire_beast
+# dire_beast_talent
+# explosive_shot
+# explosive_trap
+# fervor
+# fervor_talent
+# glaive_toss
+# glaive_toss_talent
+# hunters_mark
+# kill_shot
+# lock_and_load_buff
+# lynx_rush
+# lynx_rush_debuff
+# lynx_rush_talent
+# multi_shot
+# powershot
+# powershot_talent
+# rapid_fire
+# rapid_fire_buff
+# serpent_sting
+# serpent_sting_debuff
+# stampede
+# stampede_buff
+# summon_pet
+# thrill_of_the_hunt_buff
+# trinket_stacking_stat_agility_buff
+# trinket_stat_agility_buff
+# virmens_bite_potion
+]]
+	OvaleScripts:RegisterScript("HUNTER", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_mage_arcane_t16h.lua b/scripts/simulationcraft_mage_arcane_t16h.lua
new file mode 100644
index 0000000..c8a1f5c
--- /dev/null
+++ b/scripts/simulationcraft_mage_arcane_t16h.lua
@@ -0,0 +1,148 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+	local name = "SimulationCraft: Mage_Arcane_T16H"
+	local desc = "[5.4] SimulationCraft: Mage_Arcane_T16H"
+	local code = [[
+# Based on SimulationCraft profile "Mage_Arcane_T16H".
+#	class=mage
+#	spec=arcane
+#	talents=http://us.battle.net/wow/en/tool/talent-calculator#ea!0...11
+#	glyphs=mana_gem/mirror_image/arcane_power
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_mage_spells)
+
+AddFunction ArcaneAoeActions
+{
+	#flamestrike
+	Spell(flamestrike)
+	#living_bomb,cycle_targets=1,if=(!ticking|remains<tick_time)&target.time_to_die>tick_time*3
+	if { not target.DebuffPresent(living_bomb_debuff) or target.DebuffRemains(living_bomb_debuff) < target.TickTime(living_bomb_debuff) } and target.TimeToDie() > target.TickTime(living_bomb_debuff) * 3 Spell(living_bomb)
+	#arcane_barrage,if=buff.arcane_charge.stack>=4
+	if DebuffStacks(arcane_charge_debuff) >= 4 Spell(arcane_barrage)
+	#arcane_explosion
+	Spell(arcane_explosion)
+}
+
+AddFunction ArcaneSingleTargetActions
+{
+	#arcane_barrage,if=buff.alter_time.up&buff.alter_time.remains<2
+	if BuffPresent(alter_time_buff) and BuffRemains(alter_time_buff) < 2 Spell(arcane_barrage)
+	#arcane_missiles,if=buff.alter_time.up
+	if BuffPresent(alter_time_buff) Spell(arcane_missiles)
+	#arcane_blast,if=buff.alter_time.up
+	if BuffPresent(alter_time_buff) Spell(arcane_blast)
+	#arcane_blast,if=buff.profound_magic.up&buff.arcane_charge.stack>3&mana.pct>93
+	if BuffPresent(profound_magic_buff) and DebuffStacks(arcane_charge_debuff) > 3 and ManaPercent() > 93 Spell(arcane_blast)
+	#arcane_missiles,if=(buff.arcane_missiles.stack=2&cooldown.arcane_power.remains>0)|(buff.arcane_charge.stack>=4&cooldown.arcane_power.remains>8)
+	if { BuffStacks(arcane_missiles_buff) == 2 and SpellCooldown(arcane_power) > 0 } or { DebuffStacks(arcane_charge_debuff) >= 4 and SpellCooldown(arcane_power) > 8 } Spell(arcane_missiles)
+	#living_bomb,cycle_targets=1,if=(!ticking|remains<tick_time)&target.time_to_die>tick_time*3
+	if { not target.DebuffPresent(living_bomb_debuff) or target.DebuffRemains(living_bomb_debuff) < target.TickTime(living_bomb_debuff) } and target.TimeToDie() > target.TickTime(living_bomb_debuff) * 3 Spell(living_bomb)
+	#arcane_barrage,if=buff.arcane_charge.stack>=4&mana.pct<95
+	if DebuffStacks(arcane_charge_debuff) >= 4 and ManaPercent() < 95 Spell(arcane_barrage)
+	#presence_of_mind
+	Spell(presence_of_mind)
+	#arcane_blast
+	Spell(arcane_blast)
+	#arcane_barrage,moving=1
+	if Speed() > 0 Spell(arcane_barrage)
+	#fire_blast,moving=1
+	if Speed() > 0 Spell(fire_blast)
+	#ice_lance,moving=1
+	if Speed() > 0 Spell(ice_lance)
+}
+
+AddFunction ArcaneDefaultActions
+{
+	#counterspell,if=target.debuff.casting.react
+	if target.IsInterruptible() Spell(counterspell)
+	#cancel_buff,name=alter_time,moving=1
+	#conjure_mana_gem,if=mana_gem_charges<3&target.debuff.invulnerable.react
+	if ItemCharges(mana_gem) < 3 and target.InCombat(no) ConjureManaGem()
+	#time_warp,if=target.health.pct<25|time>5
+	if target.HealthPercent() < 25 or TimeInCombat() > 5 Spell(time_warp)
+	#rune_of_power,if=buff.rune_of_power.remains<cast_time
+	if RuneOfPowerRemains() < CastTime(rune_of_power) Spell(rune_of_power)
+	#rune_of_power,if=cooldown.arcane_power.remains=0&buff.rune_of_power.remains<buff.arcane_power.duration
+	if not SpellCooldown(arcane_power) > 0 and RuneOfPowerRemains() < SpellData(arcane_power_buff duration) Spell(rune_of_power)
+	#mirror_image
+	Spell(mirror_image)
+	#mana_gem,if=mana.pct<80&buff.alter_time.down
+	if ManaPercent() < 80 and BuffExpires(alter_time_buff) UseManaGem()
+	#arcane_power,if=time_to_bloodlust>180&((buff.rune_of_power.remains>=buff.arcane_power.duration&buff.arcane_missiles.stack=2&buff.arcane_charge.stack>2)|target.time_to_die<buff.arcane_power.duration+5),moving=0
+	if TimeToBloodlust() > 180 and { { RuneOfPowerRemains() >= SpellData(arcane_power_buff duration) and BuffStacks(arcane_missiles_buff) == 2 and DebuffStacks(arcane_charge_debuff) > 2 } or target.TimeToDie() < SpellData(arcane_power_buff duration) + 5 } Spell(arcane_power)
+	#berserking,if=buff.alter_time.down&(buff.arcane_power.up|target.time_to_die<18)
+	if BuffExpires(alter_time_buff) and { BuffPresent(arcane_power_buff) or target.TimeToDie() < 18 } Spell(berserking)
+	#jade_serpent_potion,if=buff.alter_time.down&(buff.arcane_power.up|target.time_to_die<50)
+	if BuffExpires(alter_time_buff) and { BuffPresent(arcane_power_buff) or target.TimeToDie() < 50 } UsePotionIntellect()
+	#use_item,slot=hands,sync=alter_time_activate,if=buff.alter_time.down
+	if not SpellCooldown(alter_time_activate) > 0 and BuffExpires(alter_time_buff) UseItemActions()
+	#alter_time,if=buff.alter_time.down&buff.arcane_power.up
+	if BuffExpires(alter_time_buff) and BuffPresent(arcane_power_buff) Spell(alter_time)
+	#use_item,slot=hands,if=(cooldown.alter_time_activate.remains>45|target.time_to_die<25)&buff.rune_of_power.remains>20
+	if { SpellCooldown(alter_time_activate) > 45 or target.TimeToDie() < 25 } and RuneOfPowerRemains() > 20 UseItemActions()
+	#run_action_list,name=aoe,if=active_enemies>=6
+	if Enemies() >= 6 ArcaneAoeActions()
+	#run_action_list,name=single_target,if=active_enemies<6
+	if Enemies() < 6 ArcaneSingleTargetActions()
+}
+
+AddFunction ArcanePrecombatActions
+{
+	#flask,type=warm_sun
+	#food,type=mogu_fish_stew
+	#arcane_brilliance
+	if BuffExpires(critical_strike any=1) or BuffExpires(spell_power_multiplier any=1) Spell(arcane_brilliance)
+	#frost_armor
+	if BuffExpires(frost_armor_buff) Spell(frost_armor)
+	#snapshot_stats
+	#rune_of_power
+	Spell(rune_of_power)
+	#jade_serpent_potion
+	UsePotionIntellect()
+	#mirror_image
+	Spell(mirror_image)
+}
+
+AddIcon mastery=arcane help=main
+{
+	if InCombat(no) ArcanePrecombatActions()
+	ArcaneDefaultActions()
+}
+
+### Required symbols
+# alter_time
+# alter_time_activate
+# alter_time_buff
+# arcane_barrage
+# arcane_blast
+# arcane_brilliance
+# arcane_charge_debuff
+# arcane_explosion
+# arcane_missiles
+# arcane_missiles_buff
+# arcane_power
+# arcane_power_buff
+# berserking
+# conjure_mana_gem
+# counterspell
+# fire_blast
+# flamestrike
+# frost_armor
+# frost_armor_buff
+# ice_lance
+# jade_serpent_potion
+# living_bomb
+# living_bomb_debuff
+# mana_gem
+# mirror_image
+# presence_of_mind
+# profound_magic_buff
+# rune_of_power
+# time_warp
+]]
+	OvaleScripts:RegisterScript("MAGE", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_mage_fire_t16h.lua b/scripts/simulationcraft_mage_fire_t16h.lua
new file mode 100644
index 0000000..3e1af69
--- /dev/null
+++ b/scripts/simulationcraft_mage_fire_t16h.lua
@@ -0,0 +1,128 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+	local name = "SimulationCraft: Mage_Fire_T16H"
+	local desc = "[5.4] SimulationCraft: Mage_Fire_T16H"
+	local code = [[
+# Based on SimulationCraft profile "Mage_Fire_T16H".
+#	class=mage
+#	spec=fire
+#	talents=http://us.battle.net/wow/en/tool/talent-calculator#eZ!0...11
+#	glyphs=combustion/counterspell
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_mage_spells)
+
+AddFunction FireDefaultActions
+{
+	#counterspell,if=target.debuff.casting.react
+	if target.IsInterruptible() Spell(counterspell)
+	#cancel_buff,name=alter_time,moving=1
+	#conjure_mana_gem,if=mana_gem_charges<3&target.debuff.invulnerable.react
+	if ItemCharges(mana_gem) < 3 and target.InCombat(no) ConjureManaGem()
+	#time_warp,if=target.health.pct<25|time>5
+	if target.HealthPercent() < 25 or TimeInCombat() > 5 Spell(time_warp)
+	#rune_of_power,if=buff.rune_of_power.remains<cast_time&buff.alter_time.down
+	if RuneOfPowerRemains() < CastTime(rune_of_power) and BuffExpires(alter_time_buff) Spell(rune_of_power)
+	#rune_of_power,if=cooldown.alter_time_activate.remains=0&buff.rune_of_power.remains<6
+	if not SpellCooldown(alter_time_activate) > 0 and RuneOfPowerRemains() < 6 Spell(rune_of_power)
+	#berserking,if=buff.alter_time.down&target.time_to_die<18
+	if BuffExpires(alter_time_buff) and target.TimeToDie() < 18 Spell(berserking)
+	#jade_serpent_potion,if=buff.alter_time.down&target.time_to_die<45
+	if BuffExpires(alter_time_buff) and target.TimeToDie() < 45 UsePotionIntellect()
+	#mirror_image
+	Spell(mirror_image)
+	#combustion,if=target.time_to_die<22
+	if target.TimeToDie() < 22 Spell(combustion)
+	#combustion,if=dot.ignite.tick_dmg>=((3*action.pyroblast.crit_damage)*mastery_value*0.5)
+	if target.LastEstimatedDamage(ignite_debuff) >= { { 3 * target.CritDamage(pyroblast) } * MasteryEffect() / 100 * 0.5 } Spell(combustion)
+	#combustion,if=dot.ignite.tick_dmg>=((action.fireball.crit_damage+action.inferno_blast.crit_damage+action.pyroblast.hit_damage)*mastery_value*0.5)&dot.pyroblast.ticking&buff.alter_time.down&buff.pyroblast.down&buff.presence_of_mind.down
+	if target.LastEstimatedDamage(ignite_debuff) >= { { target.CritDamage(fireball) + target.CritDamage(inferno_blast) + target.Damage(pyroblast) } * MasteryEffect() / 100 * 0.5 } and target.DebuffPresent(pyroblast_debuff) and BuffExpires(alter_time_buff) and BuffExpires(pyroblast_buff) and BuffExpires(presence_of_mind_buff) Spell(combustion)
+	#berserking,sync=alter_time_activate,if=buff.alter_time.down
+	if not SpellCooldown(alter_time_activate) > 0 and BuffExpires(alter_time_buff) Spell(berserking)
+	#presence_of_mind,sync=alter_time_activate,if=buff.alter_time.down
+	if not SpellCooldown(alter_time_activate) > 0 and BuffExpires(alter_time_buff) Spell(presence_of_mind)
+	#jade_serpent_potion,sync=alter_time_activate,if=buff.alter_time.down
+	if not SpellCooldown(alter_time_activate) > 0 and BuffExpires(alter_time_buff) UsePotionIntellect()
+	#use_item,slot=hands,sync=alter_time_activate
+	if not SpellCooldown(alter_time_activate) > 0 UseItemActions()
+	#alter_time,if=time_to_bloodlust>180&buff.alter_time.down&buff.pyroblast.react
+	if TimeToBloodlust() > 180 and BuffExpires(alter_time_buff) and BuffPresent(pyroblast_buff) Spell(alter_time)
+	#use_item,slot=hands,if=cooldown.alter_time_activate.remains>40|target.time_to_die<12
+	if SpellCooldown(alter_time_activate) > 40 or target.TimeToDie() < 12 UseItemActions()
+	#presence_of_mind,if=cooldown.alter_time_activate.remains>60|target.time_to_die<5
+	if SpellCooldown(alter_time_activate) > 60 or target.TimeToDie() < 5 Spell(presence_of_mind)
+	#flamestrike,if=active_enemies>=5
+	if Enemies() >= 5 Spell(flamestrike)
+	#inferno_blast,if=dot.combustion.ticking&active_enemies>1
+	if target.DebuffPresent(combustion_debuff) and Enemies() > 1 Spell(inferno_blast)
+	#pyroblast,if=buff.pyroblast.react|buff.presence_of_mind.up
+	if BuffPresent(pyroblast_buff) or BuffPresent(presence_of_mind_buff) Spell(pyroblast)
+	#inferno_blast,if=buff.heating_up.react&buff.pyroblast.down
+	if BuffPresent(heating_up_buff) and BuffExpires(pyroblast_buff) Spell(inferno_blast)
+	#living_bomb,cycle_targets=1,if=(!ticking|remains<tick_time)&target.time_to_die>tick_time*3
+	if { not target.DebuffPresent(living_bomb_debuff) or target.DebuffRemains(living_bomb_debuff) < target.TickTime(living_bomb_debuff) } and target.TimeToDie() > target.TickTime(living_bomb_debuff) * 3 Spell(living_bomb)
+	#fireball
+	Spell(fireball)
+	#scorch,moving=1
+	if Speed() > 0 Spell(scorch)
+}
+
+AddFunction FirePrecombatActions
+{
+	#flask,type=warm_sun
+	#food,type=mogu_fish_stew
+	#arcane_brilliance
+	if BuffExpires(critical_strike any=1) or BuffExpires(spell_power_multiplier any=1) Spell(arcane_brilliance)
+	#molten_armor
+	if BuffExpires(molten_armor_buff) Spell(molten_armor)
+	#snapshot_stats
+	#rune_of_power
+	Spell(rune_of_power)
+	#jade_serpent_potion
+	UsePotionIntellect()
+	#mirror_image
+	Spell(mirror_image)
+}
+
+AddIcon mastery=fire help=main
+{
+	if InCombat(no) FirePrecombatActions()
+	FireDefaultActions()
+}
+
+### Required symbols
+# alter_time
+# alter_time_activate
+# alter_time_buff
+# arcane_brilliance
+# berserking
+# combustion
+# combustion_debuff
+# conjure_mana_gem
+# counterspell
+# fireball
+# flamestrike
+# heating_up_buff
+# ignite_debuff
+# inferno_blast
+# jade_serpent_potion
+# living_bomb
+# living_bomb_debuff
+# mana_gem
+# mirror_image
+# molten_armor
+# molten_armor_buff
+# presence_of_mind
+# presence_of_mind_buff
+# pyroblast
+# pyroblast_buff
+# pyroblast_debuff
+# rune_of_power
+# scorch
+# time_warp
+]]
+	OvaleScripts:RegisterScript("MAGE", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_mage_frost_t16h.lua b/scripts/simulationcraft_mage_frost_t16h.lua
new file mode 100644
index 0000000..c7977cd
--- /dev/null
+++ b/scripts/simulationcraft_mage_frost_t16h.lua
@@ -0,0 +1,128 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+	local name = "SimulationCraft: Mage_Frost_T16H"
+	local desc = "[5.4] SimulationCraft: Mage_Frost_T16H"
+	local code = [[
+# Based on SimulationCraft profile "Mage_Frost_T16H".
+#	class=mage
+#	spec=frost
+#	talents=http://us.battle.net/wow/en/tool/talent-calculator#eb!0...11
+#	glyphs=evocation/icy_veins/splitting_ice
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_mage_spells)
+
+AddFunction FrostDefaultActions
+{
+	#counterspell,if=target.debuff.casting.react
+	if target.IsInterruptible() Spell(counterspell)
+	#cancel_buff,name=alter_time,moving=1
+	#conjure_mana_gem,if=mana_gem_charges<3&target.debuff.invulnerable.react
+	if ItemCharges(mana_gem) < 3 and target.InCombat(no) ConjureManaGem()
+	#time_warp,if=target.health.pct<25|time>5
+	if target.HealthPercent() < 25 or TimeInCombat() > 5 Spell(time_warp)
+	#rune_of_power,if=buff.rune_of_power.remains<cast_time&buff.alter_time.down
+	if RuneOfPowerRemains() < CastTime(rune_of_power) and BuffExpires(alter_time_buff) Spell(rune_of_power)
+	#rune_of_power,if=cooldown.icy_veins.remains=0&buff.rune_of_power.remains<20
+	if not IcyVeinsCooldownRemains() > 0 and RuneOfPowerRemains() < 20 Spell(rune_of_power)
+	#mirror_image
+	Spell(mirror_image)
+	#frozen_orb
+	Spell(frozen_orb)
+	#icy_veins,if=time_to_bloodlust>180&((buff.brain_freeze.react|buff.fingers_of_frost.react)|target.time_to_die<22),moving=0
+	if TimeToBloodlust() > 180 and { { BuffPresent(brain_freeze_buff) or BuffPresent(fingers_of_frost_buff) } or target.TimeToDie() < 22 } IcyVeins()
+	#berserking,if=buff.icy_veins.up|target.time_to_die<18
+	if BuffPresent(icy_veins_buff) or target.TimeToDie() < 18 Spell(berserking)
+	#jade_serpent_potion,if=buff.icy_veins.up|target.time_to_die<45
+	if BuffPresent(icy_veins_buff) or target.TimeToDie() < 45 UsePotionIntellect()
+	#presence_of_mind,if=buff.icy_veins.up|cooldown.icy_veins.remains>15|target.time_to_die<15
+	if BuffPresent(icy_veins_buff) or IcyVeinsCooldownRemains() > 15 or target.TimeToDie() < 15 Spell(presence_of_mind)
+	#use_item,slot=hands,sync=alter_time_activate,if=buff.alter_time.down
+	if not SpellCooldown(alter_time_activate) > 0 and BuffExpires(alter_time_buff) UseItemActions()
+	#alter_time,if=buff.alter_time.down&buff.icy_veins.up
+	if BuffExpires(alter_time_buff) and BuffPresent(icy_veins_buff) Spell(alter_time)
+	#use_item,slot=hands,if=(cooldown.alter_time_activate.remains>45&buff.rune_of_power.remains>20)|target.time_to_die<25
+	if { SpellCooldown(alter_time_activate) > 45 and RuneOfPowerRemains() > 20 } or target.TimeToDie() < 25 UseItemActions()
+	#flamestrike,if=active_enemies>=5
+	if Enemies() >= 5 Spell(flamestrike)
+	#frostfire_bolt,if=buff.alter_time.up&buff.brain_freeze.up
+	if BuffPresent(alter_time_buff) and BuffPresent(brain_freeze_buff) Spell(frostfire_bolt)
+	#ice_lance,if=buff.alter_time.up&buff.fingers_of_frost.up
+	if BuffPresent(alter_time_buff) and BuffPresent(fingers_of_frost_buff) Spell(ice_lance)
+	#living_bomb,cycle_targets=1,if=(!ticking|remains<tick_time)&target.time_to_die>tick_time*3
+	if { not target.DebuffPresent(living_bomb_debuff) or target.DebuffRemains(living_bomb_debuff) < target.TickTime(living_bomb_debuff) } and target.TimeToDie() > target.TickTime(living_bomb_debuff) * 3 Spell(living_bomb)
+	#frostfire_bolt,if=buff.brain_freeze.react&cooldown.icy_veins.remains>2
+	if BuffPresent(brain_freeze_buff) and IcyVeinsCooldownRemains() > 2 Spell(frostfire_bolt)
+	#ice_lance,if=buff.frozen_thoughts.react&buff.fingers_of_frost.up
+	if BuffPresent(frozen_thoughts_buff) and BuffPresent(fingers_of_frost_buff) Spell(ice_lance)
+	#ice_lance,if=buff.fingers_of_frost.up&(buff.fingers_of_frost.remains<2|(buff.fingers_of_frost.stack>1&cooldown.icy_veins.remains>2))
+	if BuffPresent(fingers_of_frost_buff) and { BuffRemains(fingers_of_frost_buff) < 2 or { BuffStacks(fingers_of_frost_buff) > 1 and IcyVeinsCooldownRemains() > 2 } } Spell(ice_lance)
+	#frostbolt
+	Spell(frostbolt)
+	#fire_blast,moving=1
+	if Speed() > 0 Spell(fire_blast)
+	#ice_lance,moving=1
+	if Speed() > 0 Spell(ice_lance)
+}
+
+AddFunction FrostPrecombatActions
+{
+	#flask,type=warm_sun
+	#food,type=mogu_fish_stew
+	#arcane_brilliance
+	if BuffExpires(critical_strike any=1) or BuffExpires(spell_power_multiplier any=1) Spell(arcane_brilliance)
+	#frost_armor
+	if BuffExpires(frost_armor_buff) Spell(frost_armor)
+	#water_elemental
+	if pet.Present(no) Spell(water_elemental)
+	#snapshot_stats
+	#rune_of_power
+	Spell(rune_of_power)
+	#jade_serpent_potion
+	UsePotionIntellect()
+	#mirror_image
+	Spell(mirror_image)
+}
+
+AddIcon mastery=frost help=main
+{
+	if InCombat(no) FrostPrecombatActions()
+	FrostDefaultActions()
+}
+
+### Required symbols
+# alter_time
+# alter_time_activate
+# alter_time_buff
+# arcane_brilliance
+# berserking
+# brain_freeze_buff
+# conjure_mana_gem
+# counterspell
+# fingers_of_frost_buff
+# fire_blast
+# flamestrike
+# frost_armor
+# frost_armor_buff
+# frostbolt
+# frostfire_bolt
+# frozen_orb
+# frozen_thoughts_buff
+# ice_lance
+# icy_veins
+# icy_veins_buff
+# jade_serpent_potion
+# living_bomb
+# living_bomb_debuff
+# mana_gem
+# mirror_image
+# presence_of_mind
+# rune_of_power
+# time_warp
+# water_elemental
+]]
+	OvaleScripts:RegisterScript("MAGE", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_monk_windwalker_1h_t16h.lua b/scripts/simulationcraft_monk_windwalker_1h_t16h.lua
new file mode 100644
index 0000000..c14aa26
--- /dev/null
+++ b/scripts/simulationcraft_monk_windwalker_1h_t16h.lua
@@ -0,0 +1,141 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+	local name = "SimulationCraft: Monk_Windwalker_1h_T16H"
+	local desc = "[5.4] SimulationCraft: Monk_Windwalker_1h_T16H"
+	local code = [[
+# Based on SimulationCraft profile "Monk_Windwalker_1h_T16H".
+#	class=monk
+#	spec=windwalker
+#	talents=http://us.battle.net/wow/en/tool/talent-calculator#fb!002221
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_monk_spells)
+
+AddFunction WindwalkerAoeActions
+{
+	#rushing_jade_wind,if=talent.rushing_jade_wind.enabled
+	if TalentPoints(rushing_jade_wind_talent) Spell(rushing_jade_wind)
+	#zen_sphere,cycle_targets=1,if=talent.zen_sphere.enabled&!dot.zen_sphere.ticking
+	if TalentPoints(zen_sphere_talent) and not BuffPresent(zen_sphere_buff) Spell(zen_sphere)
+	#chi_wave,if=talent.chi_wave.enabled
+	if TalentPoints(chi_wave_talent) Spell(chi_wave)
+	#chi_burst,if=talent.chi_burst.enabled
+	if TalentPoints(chi_burst_talent) Spell(chi_burst)
+	#rising_sun_kick,if=chi=chi.max
+	if Chi() == MaxChi() Spell(rising_sun_kick)
+	#spinning_crane_kick,if=!talent.rushing_jade_wind.enabled
+	if not TalentPoints(rushing_jade_wind_talent) Spell(spinning_crane_kick)
+}
+
+AddFunction WindwalkerSingleTargetActions
+{
+	#rising_sun_kick
+	Spell(rising_sun_kick)
+	#fists_of_fury,if=buff.energizing_brew.down&energy.time_to_max>4&buff.tiger_power.remains>4
+	if BuffExpires(energizing_brew_buff) and TimeToMaxEnergy() > 4 and BuffRemains(tiger_power_buff) > 4 Spell(fists_of_fury)
+	#chi_wave,if=talent.chi_wave.enabled&energy.time_to_max>2
+	if TalentPoints(chi_wave_talent) and TimeToMaxEnergy() > 2 Spell(chi_wave)
+	#chi_burst,if=talent.chi_burst.enabled&energy.time_to_max>2
+	if TalentPoints(chi_burst_talent) and TimeToMaxEnergy() > 2 Spell(chi_burst)
+	#zen_sphere,cycle_targets=1,if=talent.zen_sphere.enabled&energy.time_to_max>2&!dot.zen_sphere.ticking
+	if TalentPoints(zen_sphere_talent) and TimeToMaxEnergy() > 2 and not BuffPresent(zen_sphere_buff) Spell(zen_sphere)
+	#blackout_kick,if=buff.combo_breaker_bok.react
+	if BuffPresent(combo_breaker_bok_buff) Spell(blackout_kick)
+	#tiger_palm,if=buff.combo_breaker_tp.react&(buff.combo_breaker_tp.remains<=2|energy.time_to_max>=2)
+	if BuffPresent(combo_breaker_tp_buff) and { BuffRemains(combo_breaker_tp_buff) <= 2 or TimeToMaxEnergy() >= 2 } Spell(tiger_palm)
+	#jab,if=chi.max-chi>=2
+	if MaxChi() - Chi() >= 2 Spell(jab)
+	#blackout_kick,if=energy+energy.regen*cooldown.rising_sun_kick.remains>=40
+	if Energy() + EnergyRegen() * SpellCooldown(rising_sun_kick) >= 40 Spell(blackout_kick)
+}
+
+AddFunction WindwalkerDefaultActions
+{
+	#auto_attack
+	#chi_sphere,if=talent.power_strikes.enabled&buff.chi_sphere.react&chi<4
+	#virmens_bite_potion,if=buff.bloodlust.react|target.time_to_die<=60
+	if BuffPresent(burst_haste any=1) or target.TimeToDie() <= 60 UsePotionAgility()
+	#use_item,name=gloves_of_the_golden_protector
+	UseItemActions()
+	#berserking
+	Spell(berserking)
+	#chi_brew,if=talent.chi_brew.enabled&chi<=2&(trinket.proc.agility.react|(charges=1&recharge_time<=10)|charges=2|target.time_to_die<charges*10)
+	if TalentPoints(chi_brew_talent) and Chi() <= 2 and { BuffPresent(trinket_proc_agility_buff) or { Charges(chi_brew) == 1 and SpellChargeCooldown(chi_brew) <= 10 } or Charges(chi_brew) == 2 or target.TimeToDie() < Charges(chi_brew) * 10 } Spell(chi_brew)
+	#tiger_palm,if=buff.tiger_power.remains<=3
+	if BuffRemains(tiger_power_buff) <= 3 Spell(tiger_palm)
+	#tigereye_brew,if=buff.tigereye_brew_use.down&buff.tigereye_brew.stack=20
+	if BuffExpires(tigereye_brew_use_buff) and BuffStacks(tigereye_brew_buff) == 20 Spell(tigereye_brew)
+	#tigereye_brew,if=buff.tigereye_brew_use.down&trinket.proc.agility.react
+	if BuffExpires(tigereye_brew_use_buff) and BuffPresent(trinket_proc_agility_buff) Spell(tigereye_brew)
+	#tigereye_brew,if=buff.tigereye_brew_use.down&chi>=2&(trinket.proc.agility.react|trinket.proc.strength.react|buff.tigereye_brew.stack>=15|target.time_to_die<40)&debuff.rising_sun_kick.up&buff.tiger_power.up
+	if BuffExpires(tigereye_brew_use_buff) and Chi() >= 2 and { BuffPresent(trinket_proc_agility_buff) or BuffPresent(trinket_proc_strength_buff) or BuffStacks(tigereye_brew_buff) >= 15 or target.TimeToDie() < 40 } and target.DebuffPresent(rising_sun_kick_debuff) and BuffPresent(tiger_power_buff) Spell(tigereye_brew)
+	#energizing_brew,if=energy.time_to_max>5
+	if TimeToMaxEnergy() > 5 Spell(energizing_brew)
+	#rising_sun_kick,if=debuff.rising_sun_kick.down
+	if target.DebuffExpires(rising_sun_kick_debuff) Spell(rising_sun_kick)
+	#tiger_palm,if=buff.tiger_power.down&debuff.rising_sun_kick.remains>1&energy.time_to_max>1
+	if BuffExpires(tiger_power_buff) and target.DebuffRemains(rising_sun_kick_debuff) > 1 and TimeToMaxEnergy() > 1 Spell(tiger_palm)
+	#invoke_xuen,if=talent.invoke_xuen.enabled
+	if TalentPoints(invoke_xuen_talent) Spell(invoke_xuen)
+	#run_action_list,name=aoe,if=active_enemies>=3
+	if Enemies() >= 3 WindwalkerAoeActions()
+	#run_action_list,name=single_target,if=active_enemies<3
+	if Enemies() < 3 WindwalkerSingleTargetActions()
+}
+
+AddFunction WindwalkerPrecombatActions
+{
+	#flask,type=spring_blossoms
+	#food,type=sea_mist_rice_noodles
+	#stance,choose=fierce_tiger
+	if not Stance(monk_stance_of_the_fierce_tiger) Spell(stance_of_the_fierce_tiger)
+	#snapshot_stats
+	#virmens_bite_potion
+	UsePotionAgility()
+}
+
+AddIcon mastery=windwalker help=main
+{
+	if InCombat(no) WindwalkerPrecombatActions()
+	WindwalkerDefaultActions()
+}
+
+### Required symbols
+# berserking
+# blackout_kick
+# chi_brew
+# chi_brew_talent
+# chi_burst
+# chi_burst_talent
+# chi_wave
+# chi_wave_talent
+# combo_breaker_bok_buff
+# combo_breaker_tp_buff
+# energizing_brew
+# energizing_brew_buff
+# fists_of_fury
+# invoke_xuen
+# invoke_xuen_talent
+# jab
+# rising_sun_kick
+# rising_sun_kick_debuff
+# rushing_jade_wind
+# rushing_jade_wind_talent
+# spinning_crane_kick
+# tiger_palm
+# tiger_power_buff
+# tigereye_brew
+# tigereye_brew_buff
+# tigereye_brew_use_buff
+# trinket_proc_agility_buff
+# trinket_proc_strength_buff
+# virmens_bite_potion
+# zen_sphere
+# zen_sphere_buff
+# zen_sphere_talent
+]]
+	OvaleScripts:RegisterScript("MONK", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_monk_windwalker_2h_t16h.lua b/scripts/simulationcraft_monk_windwalker_2h_t16h.lua
new file mode 100644
index 0000000..6313cc4
--- /dev/null
+++ b/scripts/simulationcraft_monk_windwalker_2h_t16h.lua
@@ -0,0 +1,141 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+	local name = "SimulationCraft: Monk_Windwalker_2h_T16H"
+	local desc = "[5.4] SimulationCraft: Monk_Windwalker_2h_T16H"
+	local code = [[
+# Based on SimulationCraft profile "Monk_Windwalker_2h_T16H".
+#	class=monk
+#	spec=windwalker
+#	talents=http://us.battle.net/wow/en/tool/talent-calculator#fb!002221
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_monk_spells)
+
+AddFunction WindwalkerAoeActions
+{
+	#rushing_jade_wind,if=talent.rushing_jade_wind.enabled
+	if TalentPoints(rushing_jade_wind_talent) Spell(rushing_jade_wind)
+	#zen_sphere,cycle_targets=1,if=talent.zen_sphere.enabled&!dot.zen_sphere.ticking
+	if TalentPoints(zen_sphere_talent) and not BuffPresent(zen_sphere_buff) Spell(zen_sphere)
+	#chi_wave,if=talent.chi_wave.enabled
+	if TalentPoints(chi_wave_talent) Spell(chi_wave)
+	#chi_burst,if=talent.chi_burst.enabled
+	if TalentPoints(chi_burst_talent) Spell(chi_burst)
+	#rising_sun_kick,if=chi=chi.max
+	if Chi() == MaxChi() Spell(rising_sun_kick)
+	#spinning_crane_kick,if=!talent.rushing_jade_wind.enabled
+	if not TalentPoints(rushing_jade_wind_talent) Spell(spinning_crane_kick)
+}
+
+AddFunction WindwalkerSingleTargetActions
+{
+	#rising_sun_kick
+	Spell(rising_sun_kick)
+	#fists_of_fury,if=buff.energizing_brew.down&energy.time_to_max>4&buff.tiger_power.remains>4
+	if BuffExpires(energizing_brew_buff) and TimeToMaxEnergy() > 4 and BuffRemains(tiger_power_buff) > 4 Spell(fists_of_fury)
+	#chi_wave,if=talent.chi_wave.enabled&energy.time_to_max>2
+	if TalentPoints(chi_wave_talent) and TimeToMaxEnergy() > 2 Spell(chi_wave)
+	#chi_burst,if=talent.chi_burst.enabled&energy.time_to_max>2
+	if TalentPoints(chi_burst_talent) and TimeToMaxEnergy() > 2 Spell(chi_burst)
+	#zen_sphere,cycle_targets=1,if=talent.zen_sphere.enabled&energy.time_to_max>2&!dot.zen_sphere.ticking
+	if TalentPoints(zen_sphere_talent) and TimeToMaxEnergy() > 2 and not BuffPresent(zen_sphere_buff) Spell(zen_sphere)
+	#blackout_kick,if=buff.combo_breaker_bok.react
+	if BuffPresent(combo_breaker_bok_buff) Spell(blackout_kick)
+	#tiger_palm,if=buff.combo_breaker_tp.react&(buff.combo_breaker_tp.remains<=2|energy.time_to_max>=2)
+	if BuffPresent(combo_breaker_tp_buff) and { BuffRemains(combo_breaker_tp_buff) <= 2 or TimeToMaxEnergy() >= 2 } Spell(tiger_palm)
+	#jab,if=chi.max-chi>=2
+	if MaxChi() - Chi() >= 2 Spell(jab)
+	#blackout_kick,if=energy+energy.regen*cooldown.rising_sun_kick.remains>=40
+	if Energy() + EnergyRegen() * SpellCooldown(rising_sun_kick) >= 40 Spell(blackout_kick)
+}
+
+AddFunction WindwalkerDefaultActions
+{
+	#auto_attack
+	#chi_sphere,if=talent.power_strikes.enabled&buff.chi_sphere.react&chi<4
+	#virmens_bite_potion,if=buff.bloodlust.react|target.time_to_die<=60
+	if BuffPresent(burst_haste any=1) or target.TimeToDie() <= 60 UsePotionAgility()
+	#use_item,name=gloves_of_the_golden_protector
+	UseItemActions()
+	#berserking
+	Spell(berserking)
+	#chi_brew,if=talent.chi_brew.enabled&chi<=2&(trinket.proc.agility.react|(charges=1&recharge_time<=10)|charges=2|target.time_to_die<charges*10)
+	if TalentPoints(chi_brew_talent) and Chi() <= 2 and { BuffPresent(trinket_proc_agility_buff) or { Charges(chi_brew) == 1 and SpellChargeCooldown(chi_brew) <= 10 } or Charges(chi_brew) == 2 or target.TimeToDie() < Charges(chi_brew) * 10 } Spell(chi_brew)
+	#tiger_palm,if=buff.tiger_power.remains<=3
+	if BuffRemains(tiger_power_buff) <= 3 Spell(tiger_palm)
+	#tigereye_brew,if=buff.tigereye_brew_use.down&buff.tigereye_brew.stack=20
+	if BuffExpires(tigereye_brew_use_buff) and BuffStacks(tigereye_brew_buff) == 20 Spell(tigereye_brew)
+	#tigereye_brew,if=buff.tigereye_brew_use.down&trinket.proc.agility.react
+	if BuffExpires(tigereye_brew_use_buff) and BuffPresent(trinket_proc_agility_buff) Spell(tigereye_brew)
+	#tigereye_brew,if=buff.tigereye_brew_use.down&chi>=2&(trinket.proc.agility.react|trinket.proc.strength.react|buff.tigereye_brew.stack>=15|target.time_to_die<40)&debuff.rising_sun_kick.up&buff.tiger_power.up
+	if BuffExpires(tigereye_brew_use_buff) and Chi() >= 2 and { BuffPresent(trinket_proc_agility_buff) or BuffPresent(trinket_proc_strength_buff) or BuffStacks(tigereye_brew_buff) >= 15 or target.TimeToDie() < 40 } and target.DebuffPresent(rising_sun_kick_debuff) and BuffPresent(tiger_power_buff) Spell(tigereye_brew)
+	#energizing_brew,if=energy.time_to_max>5
+	if TimeToMaxEnergy() > 5 Spell(energizing_brew)
+	#rising_sun_kick,if=debuff.rising_sun_kick.down
+	if target.DebuffExpires(rising_sun_kick_debuff) Spell(rising_sun_kick)
+	#tiger_palm,if=buff.tiger_power.down&debuff.rising_sun_kick.remains>1&energy.time_to_max>1
+	if BuffExpires(tiger_power_buff) and target.DebuffRemains(rising_sun_kick_debuff) > 1 and TimeToMaxEnergy() > 1 Spell(tiger_palm)
+	#invoke_xuen,if=talent.invoke_xuen.enabled
+	if TalentPoints(invoke_xuen_talent) Spell(invoke_xuen)
+	#run_action_list,name=aoe,if=active_enemies>=3
+	if Enemies() >= 3 WindwalkerAoeActions()
+	#run_action_list,name=single_target,if=active_enemies<3
+	if Enemies() < 3 WindwalkerSingleTargetActions()
+}
+
+AddFunction WindwalkerPrecombatActions
+{
+	#flask,type=spring_blossoms
+	#food,type=sea_mist_rice_noodles
+	#stance,choose=fierce_tiger
+	if not Stance(monk_stance_of_the_fierce_tiger) Spell(stance_of_the_fierce_tiger)
+	#snapshot_stats
+	#virmens_bite_potion
+	UsePotionAgility()
+}
+
+AddIcon mastery=windwalker help=main
+{
+	if InCombat(no) WindwalkerPrecombatActions()
+	WindwalkerDefaultActions()
+}
+
+### Required symbols
+# berserking
+# blackout_kick
+# chi_brew
+# chi_brew_talent
+# chi_burst
+# chi_burst_talent
+# chi_wave
+# chi_wave_talent
+# combo_breaker_bok_buff
+# combo_breaker_tp_buff
+# energizing_brew
+# energizing_brew_buff
+# fists_of_fury
+# invoke_xuen
+# invoke_xuen_talent
+# jab
+# rising_sun_kick
+# rising_sun_kick_debuff
+# rushing_jade_wind
+# rushing_jade_wind_talent
+# spinning_crane_kick
+# tiger_palm
+# tiger_power_buff
+# tigereye_brew
+# tigereye_brew_buff
+# tigereye_brew_use_buff
+# trinket_proc_agility_buff
+# trinket_proc_strength_buff
+# virmens_bite_potion
+# zen_sphere
+# zen_sphere_buff
+# zen_sphere_talent
+]]
+	OvaleScripts:RegisterScript("MONK", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_paladin_protection_t16h.lua b/scripts/simulationcraft_paladin_protection_t16h.lua
new file mode 100644
index 0000000..ab37f40
--- /dev/null
+++ b/scripts/simulationcraft_paladin_protection_t16h.lua
@@ -0,0 +1,136 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+	local name = "SimulationCraft: Paladin_Protection_T16H"
+	local desc = "[5.4] SimulationCraft: Paladin_Protection_T16H"
+	local code = [[
+# Based on SimulationCraft profile "Paladin_Protection_T16H".
+#	class=paladin
+#	spec=protection
+#	talents=http://us.battle.net/wow/en/tool/talent-calculator#bZ!201121
+#	glyphs=focused_shield/alabaster_shield/divine_protection
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_paladin_spells)
+
+AddFunction ProtectionDefaultActions
+{
+	#
+	#auto_attack
+	#blood_fury
+	Spell(blood_fury)
+	#berserking
+	Spell(berserking)
+	#arcane_torrent
+	Spell(arcane_torrent_mana)
+	#avenging_wrath
+	Spell(avenging_wrath)
+	#holy_avenger,if=talent.holy_avenger.enabled
+	if TalentPoints(holy_avenger_talent) Spell(holy_avenger)
+	#divine_protection
+	Spell(divine_protection)
+	#guardian_of_ancient_kings
+	Spell(guardian_of_ancient_kings_tank)
+	#eternal_flame,if=talent.eternal_flame.enabled&(buff.eternal_flame.remains<2&buff.bastion_of_glory.react>2&(holy_power>=3|buff.divine_purpose.react|buff.bastion_of_power.react))
+	if TalentPoints(eternal_flame_talent) and { BuffRemains(eternal_flame_buff) < 2 and BuffPresent(bastion_of_glory_buff) > 2 and { HolyPower() >= 3 or BuffPresent(divine_purpose_buff) or BuffPresent(bastion_of_power_buff) } } Spell(eternal_flame)
+	#eternal_flame,if=talent.eternal_flame.enabled&(buff.bastion_of_power.react&buff.bastion_of_glory.react>=5)
+	if TalentPoints(eternal_flame_talent) and { BuffPresent(bastion_of_power_buff) and BuffPresent(bastion_of_glory_buff) >= 5 } Spell(eternal_flame)
+	#shield_of_the_righteous,if=holy_power>=5|buff.divine_purpose.react|incoming_damage_1500ms>=health.max*0.3
+	if HolyPower() >= 5 or BuffPresent(divine_purpose_buff) or IncomingDamage(1.500) >= MaxHealth() * 0.3 Spell(shield_of_the_righteous)
+	#judgment,if=talent.sanctified_wrath.enabled&buff.avenging_wrath.react
+	if TalentPoints(sanctified_wrath_talent) and BuffPresent(avenging_wrath_buff) Spell(judgment)
+	#wait,sec=cooldown.judgment.remains,if=talent.sanctified_wrath.enabled&cooldown.judgment.remains>0&cooldown.judgment.remains<=0.5
+	if TalentPoints(sanctified_wrath_talent) and SpellCooldown(judgment) > 0 and SpellCooldown(judgment) <= 0.5 wait Spell(judgment)
+	#crusader_strike
+	Spell(crusader_strike)
+	#wait,sec=cooldown.crusader_strike.remains,if=cooldown.crusader_strike.remains>0&cooldown.crusader_strike.remains<=0.5
+	if SpellCooldown(crusader_strike) > 0 and SpellCooldown(crusader_strike) <= 0.5 wait Spell(crusader_strike)
+	#judgment
+	Spell(judgment)
+	#wait,sec=cooldown.judgment.remains,if=cooldown.judgment.remains>0&cooldown.judgment.remains<=0.5&(cooldown.crusader_strike.remains-cooldown.judgment.remains)>=0.5
+	if SpellCooldown(judgment) > 0 and SpellCooldown(judgment) <= 0.5 and { SpellCooldown(crusader_strike) - SpellCooldown(judgment) } >= 0.5 wait Spell(judgment)
+	#avengers_shield
+	Spell(avengers_shield)
+	#sacred_shield,if=talent.sacred_shield.enabled&target.dot.sacred_shield.remains<5
+	if TalentPoints(sacred_shield_talent) and target.BuffRemains(sacred_shield_buff) < 5 Spell(sacred_shield)
+	#holy_wrath
+	Spell(holy_wrath)
+	#execution_sentence,if=talent.execution_sentence.enabled
+	if TalentPoints(execution_sentence_talent) Spell(execution_sentence)
+	#lights_hammer,if=talent.lights_hammer.enabled
+	if TalentPoints(lights_hammer_talent) Spell(lights_hammer)
+	#hammer_of_wrath
+	Spell(hammer_of_wrath usable=1)
+	#consecration,if=target.debuff.flying.down&!ticking
+	if target.True(not flying_debuff) and not target.DebuffPresent(consecration_debuff) Spell(consecration)
+	#holy_prism,if=talent.holy_prism.enabled
+	if TalentPoints(holy_prism_talent) Spell(holy_prism)
+	#sacred_shield,if=talent.sacred_shield.enabled
+	if TalentPoints(sacred_shield_talent) Spell(sacred_shield)
+}
+
+AddFunction ProtectionPrecombatActions
+{
+	#flask,type=earth
+	#food,type=chun_tian_spring_rolls
+	#blessing_of_kings,if=(!aura.str_agi_int.up)&(aura.mastery.up)
+	if { not BuffPresent(str_agi_int any=1) } and { BuffPresent(mastery any=1) } Spell(blessing_of_kings)
+	#blessing_of_might,if=!aura.mastery.up
+	if not BuffPresent(mastery any=1) Spell(blessing_of_might)
+	#seal_of_insight
+	if not Stance(paladin_seal_of_insight) Spell(seal_of_insight)
+	#sacred_shield,if=talent.sacred_shield.enabled
+	if TalentPoints(sacred_shield_talent) Spell(sacred_shield)
+	#snapshot_stats
+}
+
+AddIcon mastery=protection help=main
+{
+	if InCombat(no) ProtectionPrecombatActions()
+	ProtectionDefaultActions()
+}
+
+### Required symbols
+# arcane_torrent_mana
+# avengers_shield
+# avenging_wrath
+# avenging_wrath_buff
+# bastion_of_glory_buff
+# bastion_of_power_buff
+# berserking
+# blessing_of_kings
+# blessing_of_might
+# blood_fury
+# consecration
+# consecration_debuff
+# crusader_strike
+# divine_protection
+# divine_purpose_buff
+# eternal_flame
+# eternal_flame_buff
+# eternal_flame_talent
+# execution_sentence
+# execution_sentence_talent
+# guardian_of_ancient_kings_tank
+# hammer_of_wrath
+# holy_avenger
+# holy_avenger_talent
+# holy_prism
+# holy_prism_talent
+# holy_wrath
+# judgment
+# lights_hammer
+# lights_hammer_talent
+# mastery
+# sacred_shield
+# sacred_shield_buff
+# sacred_shield_talent
+# sanctified_wrath_talent
+# seal_of_insight
+# shield_of_the_righteous
+# str_agi_int
+]]
+	OvaleScripts:RegisterScript("PALADIN", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_paladin_retribution_t16h.lua b/scripts/simulationcraft_paladin_retribution_t16h.lua
new file mode 100644
index 0000000..70e5186
--- /dev/null
+++ b/scripts/simulationcraft_paladin_retribution_t16h.lua
@@ -0,0 +1,154 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+	local name = "SimulationCraft: Paladin_Retribution_T16H"
+	local desc = "[5.4] SimulationCraft: Paladin_Retribution_T16H"
+	local code = [[
+# Based on SimulationCraft profile "Paladin_Retribution_T16H".
+#	class=paladin
+#	spec=retribution
+#	talents=http://us.battle.net/wow/en/tool/talent-calculator#bb!110112
+#	glyphs=double_jeopardy/mass_exorcism
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_paladin_spells)
+
+AddFunction RetributionDefaultActions
+{
+	#rebuke
+	Interrupt()
+	#mogu_power_potion,if=(buff.bloodlust.react|(buff.ancient_power.up&buff.avenging_wrath.up)|target.time_to_die<=40)
+	if { BuffPresent(burst_haste any=1) or { BuffPresent(ancient_power_buff) and BuffPresent(avenging_wrath_buff) } or target.TimeToDie() <= 40 } UsePotionStrength()
+	#auto_attack
+	#inquisition,if=(buff.inquisition.down|buff.inquisition.remains<=2)&(holy_power>=3|target.time_to_die<holy_power*20|buff.divine_purpose.react)
+	if { BuffExpires(inquisition_buff) or BuffRemains(inquisition_buff) <= 2 } and { HolyPower() >= 3 or target.TimeToDie() < HolyPower() * 20 or BuffPresent(divine_purpose_buff) } Spell(inquisition)
+	#avenging_wrath,if=buff.inquisition.up
+	if BuffPresent(inquisition_buff) Spell(avenging_wrath)
+	#guardian_of_ancient_kings,if=buff.inquisition.up
+	if BuffPresent(inquisition_buff) Spell(guardian_of_ancient_kings_melee)
+	#holy_avenger,if=talent.holy_avenger.enabled&(buff.inquisition.up&holy_power<=2)
+	if TalentPoints(holy_avenger_talent) and { BuffPresent(inquisition_buff) and HolyPower() <= 2 } Spell(holy_avenger)
+	#use_item,name=gauntlets_of_winged_triumph,if=buff.inquisition.up&(buff.ancient_power.down|buff.ancient_power.stack=12)
+	if BuffPresent(inquisition_buff) and { BuffExpires(ancient_power_buff) or BuffStacks(ancient_power_buff) == 12 } UseItemActions()
+	#blood_fury
+	Spell(blood_fury)
+	#berserking
+	Spell(berserking)
+	#arcane_torrent
+	Spell(arcane_torrent_mana)
+	#execution_sentence,if=talent.execution_sentence.enabled&(buff.inquisition.up&(buff.ancient_power.down|buff.ancient_power.stack=12))
+	if TalentPoints(execution_sentence_talent) and { BuffPresent(inquisition_buff) and { BuffExpires(ancient_power_buff) or BuffStacks(ancient_power_buff) == 12 } } Spell(execution_sentence)
+	#lights_hammer,if=talent.lights_hammer.enabled&(buff.inquisition.up&(buff.ancient_power.down|buff.ancient_power.stack=12))
+	if TalentPoints(lights_hammer_talent) and { BuffPresent(inquisition_buff) and { BuffExpires(ancient_power_buff) or BuffStacks(ancient_power_buff) == 12 } } Spell(lights_hammer)
+	#divine_storm,if=active_enemies>=2&(holy_power=5|buff.divine_purpose.react|(buff.holy_avenger.up&holy_power>=3))
+	if Enemies() >= 2 and { HolyPower() == 5 or BuffPresent(divine_purpose_buff) or { BuffPresent(holy_avenger_buff) and HolyPower() >= 3 } } Spell(divine_storm)
+	#divine_storm,if=buff.divine_crusader.react&holy_power=5
+	if BuffPresent(divine_crusader_buff) and HolyPower() == 5 Spell(divine_storm)
+	#templars_verdict,if=holy_power=5|buff.holy_avenger.up&holy_power>=3
+	if HolyPower() == 5 or BuffPresent(holy_avenger_buff) and HolyPower() >= 3 Spell(templars_verdict)
+	#templars_verdict,if=buff.divine_purpose.react&buff.divine_purpose.remains<4
+	if BuffPresent(divine_purpose_buff) and BuffRemains(divine_purpose_buff) < 4 Spell(templars_verdict)
+	#hammer_of_wrath
+	Spell(hammer_of_wrath usable=1)
+	#wait,sec=cooldown.hammer_of_wrath.remains,if=cooldown.hammer_of_wrath.remains>0&cooldown.hammer_of_wrath.remains<=0.2
+	if SpellCooldown(hammer_of_wrath) > 0 and SpellCooldown(hammer_of_wrath) <= 0.2 wait Spell(hammer_of_wrath)
+	#divine_storm,if=buff.divine_crusader.react&buff.avenging_wrath.up
+	if BuffPresent(divine_crusader_buff) and BuffPresent(avenging_wrath_buff) Spell(divine_storm)
+	#templars_verdict,if=buff.avenging_wrath.up
+	if BuffPresent(avenging_wrath_buff) Spell(templars_verdict)
+	#hammer_of_the_righteous,if=active_enemies>=4
+	if Enemies() >= 4 Spell(hammer_of_the_righteous)
+	#crusader_strike
+	Spell(crusader_strike)
+	#wait,sec=cooldown.crusader_strike.remains,if=cooldown.crusader_strike.remains>0&cooldown.crusader_strike.remains<=0.2
+	if SpellCooldown(crusader_strike) > 0 and SpellCooldown(crusader_strike) <= 0.2 wait Spell(crusader_strike)
+	#exorcism,if=active_enemies>=2&active_enemies<=4&set_bonus.tier15_2pc_melee&glyph.mass_exorcism.enabled
+	if Enemies() >= 2 and Enemies() <= 4 and ArmorSetBonus(T15_melee 2) and Glyph(glyph_of_mass_exorcism) Spell(exorcism)
+	#judgment
+	Spell(judgment)
+	#wait,sec=cooldown.judgment.remains,if=cooldown.judgment.remains>0&cooldown.judgment.remains<=0.2
+	if SpellCooldown(judgment) > 0 and SpellCooldown(judgment) <= 0.2 wait Spell(judgment)
+	#divine_storm,if=buff.divine_crusader.react
+	if BuffPresent(divine_crusader_buff) Spell(divine_storm)
+	#templars_verdict,if=buff.divine_purpose.react
+	if BuffPresent(divine_purpose_buff) Spell(templars_verdict)
+	#exorcism
+	Spell(exorcism)
+	#wait,sec=cooldown.exorcism.remains,if=cooldown.exorcism.remains>0&cooldown.exorcism.remains<=0.2
+	if SpellCooldown(exorcism) > 0 and SpellCooldown(exorcism) <= 0.2 wait Spell(exorcism)
+	#templars_verdict,if=buff.tier15_4pc_melee.up&active_enemies<4
+	if BuffPresent(tier15_4pc_melee_buff) and Enemies() < 4 Spell(templars_verdict)
+	#divine_storm,if=active_enemies>=2&buff.inquisition.remains>4
+	if Enemies() >= 2 and BuffRemains(inquisition_buff) > 4 Spell(divine_storm)
+	#templars_verdict,if=buff.inquisition.remains>4
+	if BuffRemains(inquisition_buff) > 4 Spell(templars_verdict)
+	#holy_prism,if=talent.holy_prism.enabled
+	if TalentPoints(holy_prism_talent) Spell(holy_prism)
+}
+
+AddFunction RetributionPrecombatActions
+{
+	#flask,type=winters_bite
+	#food,type=black_pepper_ribs_and_shrimp
+	#blessing_of_kings,if=!aura.str_agi_int.up
+	if not BuffPresent(str_agi_int any=1) Spell(blessing_of_kings)
+	#blessing_of_might,if=!aura.mastery.up
+	if not BuffPresent(mastery any=1) Spell(blessing_of_might)
+	#seal_of_truth,if=active_enemies<4
+	if Enemies() < 4 if not Stance(paladin_seal_of_truth) Spell(seal_of_truth)
+	#seal_of_righteousness,if=active_enemies>=4
+	if Enemies() >= 4 if not Stance(paladin_seal_of_righteousness) Spell(seal_of_righteousness)
+	#snapshot_stats
+	#mogu_power_potion
+	UsePotionStrength()
+}
+
+AddIcon mastery=retribution help=main
+{
+	if InCombat(no) RetributionPrecombatActions()
+	RetributionDefaultActions()
+}
+
+### Required symbols
+# ancient_power_buff
+# arcane_torrent_mana
+# avenging_wrath
+# avenging_wrath_buff
+# berserking
+# blessing_of_kings
+# blessing_of_might
+# blood_fury
+# crusader_strike
+# divine_crusader_buff
+# divine_purpose_buff
+# divine_storm
+# execution_sentence
+# execution_sentence_talent
+# exorcism
+# glyph_of_mass_exorcism
+# guardian_of_ancient_kings_melee
+# hammer_of_the_righteous
+# hammer_of_wrath
+# holy_avenger
+# holy_avenger_buff
+# holy_avenger_talent
+# holy_prism
+# holy_prism_talent
+# inquisition
+# inquisition_buff
+# judgment
+# lights_hammer
+# lights_hammer_talent
+# mastery
+# mogu_power_potion
+# rebuke
+# seal_of_righteousness
+# seal_of_truth
+# str_agi_int
+# templars_verdict
+# tier15_4pc_melee_buff
+]]
+	OvaleScripts:RegisterScript("PALADIN", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_priest_shadow_t16h.lua b/scripts/simulationcraft_priest_shadow_t16h.lua
new file mode 100644
index 0000000..a72c10c
--- /dev/null
+++ b/scripts/simulationcraft_priest_shadow_t16h.lua
@@ -0,0 +1,156 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+	local name = "SimulationCraft: Priest_Shadow_T16H"
+	local desc = "[5.4] SimulationCraft: Priest_Shadow_T16H"
+	local code = [[
+# Based on SimulationCraft profile "Priest_Shadow_T16H".
+#	class=priest
+#	spec=shadow
+#	talents=http://us.battle.net/wow/en/tool/talent-calculator#Xb!002202
+#	glyphs=inner_sanctum/mind_flay/dark_archangel/shadowy_friends/shadow_ravens
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_priest_spells)
+
+AddFunction ShadowDefaultActions
+{
+	#shadowform
+	if not Stance(priest_shadowform) Spell(shadowform)
+	#use_item,slot=hands
+	UseItemActions()
+	#jade_serpent_potion,if=buff.bloodlust.react|target.time_to_die<=40
+	if BuffPresent(burst_haste any=1) or target.TimeToDie() <= 40 UsePotionIntellect()
+	#mindbender,if=talent.mindbender.enabled
+	if TalentPoints(mindbender_talent) Spell(mindbender)
+	#shadowfiend,if=!talent.mindbender.enabled
+	if not TalentPoints(mindbender_talent) Spell(shadowfiend)
+	#power_infusion,if=talent.power_infusion.enabled
+	if TalentPoints(power_infusion_talent) Spell(power_infusion)
+	#blood_fury
+	Spell(blood_fury)
+	#berserking
+	Spell(berserking)
+	#arcane_torrent
+	Spell(arcane_torrent_mana)
+	#shadow_word_death,if=buff.shadow_word_death_reset_cooldown.stack=1&active_enemies<=5
+	if BuffStacks(shadow_word_death_reset_cooldown_buff) == 1 and Enemies() <= 5 Spell(shadow_word_death usable=1)
+	#devouring_plague,if=shadow_orb=3&(cooldown.mind_blast.remains<1.5|target.health.pct<20&cooldown.shadow_word_death.remains<1.5)
+	if ShadowOrbs() == 3 and { SpellCooldown(mind_blast) < 1.5 or target.HealthPercent() < 20 and SpellCooldown(shadow_word_death) < 1.5 } Spell(devouring_plague)
+	#mind_blast,if=active_enemies<=5&cooldown_react
+	if Enemies() <= 5 and Spell(mind_blast) Spell(mind_blast)
+	#shadow_word_death,if=buff.shadow_word_death_reset_cooldown.stack=0&active_enemies<=5
+	if BuffStacks(shadow_word_death_reset_cooldown_buff) == 0 and Enemies() <= 5 Spell(shadow_word_death usable=1)
+	#mind_flay_insanity,if=target.dot.devouring_plague_tick.ticks_remain=1,chain=1
+	if TalentPoints(solace_and_insanity_talent) and target.DebuffPresent(devouring_plague_debuff) and target.TicksRemain(devouring_plague_debuff) == 1 Spell(mind_flay)
+	#mind_flay_insanity,interrupt=1,chain=1,if=active_enemies<=5
+	if TalentPoints(solace_and_insanity_talent) and target.DebuffPresent(devouring_plague_debuff) and Enemies() <= 5 Spell(mind_flay)
+	#shadow_word_pain,cycle_targets=1,max_cycle_targets=5,if=miss_react&!ticking
+	if True(miss_react) and not target.DebuffPresent(shadow_word_pain_debuff) and DebuffCountOnAny(shadow_word_pain_debuff) <= 5 Spell(shadow_word_pain)
+	#vampiric_touch,cycle_targets=1,max_cycle_targets=5,if=remains<cast_time&miss_react
+	if target.DebuffRemains(vampiric_touch_debuff) < CastTime(vampiric_touch) and True(miss_react) and DebuffCountOnAny(vampiric_touch_debuff) <= 5 Spell(vampiric_touch)
+	#shadow_word_pain,cycle_targets=1,max_cycle_targets=5,if=miss_react&ticks_remain<=1
+	if True(miss_react) and target.TicksRemain(shadow_word_pain_debuff) <= 1 and DebuffCountOnAny(shadow_word_pain_debuff) <= 5 Spell(shadow_word_pain)
+	#vampiric_touch,cycle_targets=1,max_cycle_targets=5,if=remains<cast_time+tick_time&miss_react
+	if target.DebuffRemains(vampiric_touch_debuff) < CastTime(vampiric_touch) + target.TickTime(vampiric_touch_debuff) and True(miss_react) and DebuffCountOnAny(vampiric_touch_debuff) <= 5 Spell(vampiric_touch)
+	#vampiric_embrace,if=shadow_orb=3&health.pct<=40
+	if ShadowOrbs() == 3 and HealthPercent() <= 40 Spell(vampiric_embrace)
+	#devouring_plague,if=shadow_orb=3&ticks_remain<=1
+	if ShadowOrbs() == 3 and target.TicksRemain(devouring_plague_debuff) <= 1 Spell(devouring_plague)
+	#mind_spike,if=active_enemies<=5&buff.surge_of_darkness.react=2
+	if Enemies() <= 5 and BuffStacks(surge_of_darkness_buff) == 2 Spell(mind_spike)
+	#halo,if=talent.halo.enabled&target.distance<=30&target.distance>=17
+	if TalentPoints(halo_talent) and target.Distance() <= 30 and target.Distance() >= 17 Spell(halo)
+	#cascade_damage,if=talent.cascade.enabled&(active_enemies>1|(target.distance>=25&stat.mastery_rating<15000)|target.distance>=28)&target.distance<=40&target.distance>=11
+	if TalentPoints(cascade_talent) and { Enemies() > 1 or { target.Distance() >= 25 and MasteryRating() < 15000 } or target.Distance() >= 28 } and target.Distance() <= 40 and target.Distance() >= 11 Spell(cascade_damage)
+	#divine_star,if=talent.divine_star.enabled&(active_enemies>1|stat.mastery_rating<3500)&target.distance<=24
+	if TalentPoints(divine_star_talent) and { Enemies() > 1 or MasteryRating() < 3500 } and target.Distance() <= 24 Spell(divine_star)
+	#wait,sec=cooldown.shadow_word_death.remains,if=target.health.pct<20&cooldown.shadow_word_death.remains<0.5&active_enemies<=1
+	if target.HealthPercent() < 20 and SpellCooldown(shadow_word_death) < 0.5 and Enemies() <= 1 wait Spell(shadow_word_death)
+	#wait,sec=cooldown.mind_blast.remains,if=cooldown.mind_blast.remains<0.5&active_enemies<=1
+	if SpellCooldown(mind_blast) < 0.5 and Enemies() <= 1 wait Spell(mind_blast)
+	#mind_spike,if=buff.surge_of_darkness.react&active_enemies<=5
+	if BuffStacks(surge_of_darkness_buff) and Enemies() <= 5 Spell(mind_spike)
+	#mind_sear,chain=1,interrupt=1,if=active_enemies>=3
+	if Enemies() >= 3 Spell(mind_sear)
+	#mind_flay,chain=1,interrupt=1
+	Spell(mind_flay)
+	#shadow_word_death,moving=1
+	if Speed() > 0 Spell(shadow_word_death usable=1)
+	#mind_blast,moving=1,if=buff.divine_insight_shadow.react&cooldown_react
+	if Speed() > 0 and BuffPresent(divine_insight_shadow_buff) and Spell(mind_blast) Spell(mind_blast)
+	#divine_star,moving=1,if=talent.divine_star.enabled&target.distance<=28
+	if Speed() > 0 and TalentPoints(divine_star_talent) and target.Distance() <= 28 Spell(divine_star)
+	#cascade_damage,moving=1,if=talent.cascade.enabled&target.distance<=40
+	if Speed() > 0 and TalentPoints(cascade_talent) and target.Distance() <= 40 Spell(cascade_damage)
+	#shadow_word_pain,moving=1
+	if Speed() > 0 Spell(shadow_word_pain)
+	#dispersion
+	Spell(dispersion)
+}
+
+AddFunction ShadowPrecombatActions
+{
+	#flask,type=warm_sun
+	#food,type=mogu_fish_stew
+	#power_word_fortitude,if=!aura.stamina.up
+	if not BuffPresent(stamina any=1) Spell(power_word_fortitude)
+	#inner_fire
+	if BuffExpires(inner_fire_buff) Spell(inner_fire)
+	#shadowform
+	if not Stance(priest_shadowform) Spell(shadowform)
+	#snapshot_stats
+	#jade_serpent_potion
+	UsePotionIntellect()
+}
+
+AddIcon mastery=shadow help=main
+{
+	if InCombat(no) ShadowPrecombatActions()
+	ShadowDefaultActions()
+}
+
+### Required symbols
+# arcane_torrent_mana
+# berserking
+# blood_fury
+# cascade_damage
+# cascade_talent
+# devouring_plague
+# devouring_plague_debuff
+# dispersion
+# divine_insight_shadow_buff
+# divine_star
+# divine_star_talent
+# halo
+# halo_talent
+# inner_fire
+# inner_fire_buff
+# jade_serpent_potion
+# mind_blast
+# mind_flay
+# mind_flay_insanity
+# mind_sear
+# mind_spike
+# mindbender
+# mindbender_talent
+# power_infusion
+# power_infusion_talent
+# power_word_fortitude
+# shadow_word_death
+# shadow_word_death_reset_cooldown_buff
+# shadow_word_pain
+# shadow_word_pain_debuff
+# shadowfiend
+# shadowform
+# solace_and_insanity_talent
+# stamina
+# surge_of_darkness_buff
+# vampiric_embrace
+# vampiric_touch
+# vampiric_touch_debuff
+]]
+	OvaleScripts:RegisterScript("PRIEST", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_rogue_assassination_t16h.lua b/scripts/simulationcraft_rogue_assassination_t16h.lua
new file mode 100644
index 0000000..3389f82
--- /dev/null
+++ b/scripts/simulationcraft_rogue_assassination_t16h.lua
@@ -0,0 +1,117 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+	local name = "SimulationCraft: Rogue_Assassination_T16H"
+	local desc = "[5.4] SimulationCraft: Rogue_Assassination_T16H"
+	local code = [[
+# Based on SimulationCraft profile "Rogue_Assassination_T16H".
+#	class=rogue
+#	spec=assassination
+#	talents=http://us.battle.net/wow/en/tool/talent-calculator#ca!200002
+#	glyphs=vendetta
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_rogue_spells)
+
+AddFunction AssassinationDefaultActions
+{
+	#virmens_bite_potion,if=buff.bloodlust.react|target.time_to_die<40
+	if BuffPresent(burst_haste any=1) or target.TimeToDie() < 40 UsePotionAgility()
+	#auto_attack
+	#kick
+	if target.IsInterruptible() Spell(kick)
+	#preparation,if=!buff.vanish.up&cooldown.vanish.remains>60
+	if not BuffPresent(vanish_buff) and SpellCooldown(vanish) > 60 Spell(preparation)
+	#use_item,slot=hands
+	UseItemActions()
+	#blood_fury
+	Spell(blood_fury)
+	#berserking
+	Spell(berserking)
+	#arcane_torrent,if=energy<60
+	if Energy() < 60 Spell(arcane_torrent_energy)
+	#vanish,if=time>10&!buff.stealth.up&!buff.shadow_blades.up
+	if TimeInCombat() > 10 and not Stealthed() and not BuffPresent(shadow_blades_buff) Spell(vanish)
+	#mutilate,if=buff.stealth.up
+	if Stealthed() Spell(mutilate)
+	#shadow_blades,if=buff.bloodlust.react|time>60
+	if BuffPresent(burst_haste any=1) or TimeInCombat() > 60 Spell(shadow_blades)
+	#slice_and_dice,if=buff.slice_and_dice.remains<2
+	if BuffRemains(slice_and_dice_buff) < 2 Spell(slice_and_dice)
+	#dispatch,if=dot.rupture.ticks_remain<2&energy>90
+	if target.TicksRemain(rupture_debuff) < 2 and Energy() > 90 Spell(dispatch usable=1)
+	#mutilate,if=dot.rupture.ticks_remain<2&energy>90
+	if target.TicksRemain(rupture_debuff) < 2 and Energy() > 90 Spell(mutilate)
+	#marked_for_death,if=talent.marked_for_death.enabled&combo_points=0
+	if TalentPoints(marked_for_death_talent) and ComboPoints() == 0 Spell(marked_for_death)
+	#rupture,if=ticks_remain<2|(combo_points=5&ticks_remain<3)
+	if target.TicksRemain(rupture_debuff) < 2 or { ComboPoints() == 5 and target.TicksRemain(rupture_debuff) < 3 } Spell(rupture)
+	#fan_of_knives,if=combo_points<5&active_enemies>=4
+	if ComboPoints() < 5 and Enemies() >= 4 Spell(fan_of_knives)
+	#vendetta
+	Spell(vendetta)
+	#envenom,if=combo_points>4
+	if ComboPoints() > 4 Spell(envenom)
+	#envenom,if=combo_points>=2&buff.slice_and_dice.remains<3
+	if ComboPoints() >= 2 and BuffRemains(slice_and_dice_buff) < 3 Spell(envenom)
+	#dispatch,if=combo_points<5
+	if ComboPoints() < 5 Spell(dispatch usable=1)
+	#mutilate
+	Spell(mutilate)
+	#tricks_of_the_trade
+	TricksOfTheTrade()
+}
+
+AddFunction AssassinationPrecombatActions
+{
+	#flask,type=spring_blossoms
+	#food,type=sea_mist_rice_noodles
+	#apply_poison,lethal=deadly
+	ApplyPoisons()
+	#snapshot_stats
+	#virmens_bite_potion
+	UsePotionAgility()
+	#stealth
+	if not IsStealthed() Spell(stealth)
+	#marked_for_death,if=talent.marked_for_death.enabled
+	if TalentPoints(marked_for_death_talent) Spell(marked_for_death)
+	#slice_and_dice,if=talent.marked_for_death.enabled
+	if TalentPoints(marked_for_death_talent) Spell(slice_and_dice)
+}
+
+AddIcon mastery=assassination help=main
+{
+	if InCombat(no) AssassinationPrecombatActions()
+	AssassinationDefaultActions()
+}
+
+### Required symbols
+# apply_poison
+# arcane_torrent_energy
+# berserking
+# blood_fury
+# dispatch
+# envenom
+# fan_of_knives
+# kick
+# marked_for_death
+# marked_for_death_talent
+# mutilate
+# preparation
+# rupture
+# rupture_debuff
+# shadow_blades
+# shadow_blades_buff
+# slice_and_dice
+# slice_and_dice_buff
+# stealth
+# tricks_of_the_trade
+# vanish
+# vanish_buff
+# vendetta
+# virmens_bite_potion
+]]
+	OvaleScripts:RegisterScript("ROGUE", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_rogue_combat_t16h.lua b/scripts/simulationcraft_rogue_combat_t16h.lua
new file mode 100644
index 0000000..0eb01a7
--- /dev/null
+++ b/scripts/simulationcraft_rogue_combat_t16h.lua
@@ -0,0 +1,141 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+	local name = "SimulationCraft: Rogue_Combat_T16H"
+	local desc = "[5.4] SimulationCraft: Rogue_Combat_T16H"
+	local code = [[
+# Based on SimulationCraft profile "Rogue_Combat_T16H".
+#	class=rogue
+#	spec=combat
+#	talents=http://us.battle.net/wow/en/tool/talent-calculator#cZ!200002
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_rogue_spells)
+
+AddFunction CombatFinisherActions
+{
+	#rupture,if=ticks_remain<2&target.time_to_die>=26&(active_enemies<2|!buff.blade_flurry.up)
+	if target.TicksRemain(rupture_debuff) < 2 and target.TimeToDie() >= 26 and { Enemies() < 2 or not BuffPresent(blade_flurry_buff) } Spell(rupture)
+	#crimson_tempest,if=active_enemies>=7&dot.crimson_tempest_dot.ticks_remain<=2
+	if Enemies() >= 7 and target.TicksRemain(crimson_tempest_dot_debuff) <= 2 Spell(crimson_tempest)
+	#eviscerate
+	Spell(eviscerate)
+}
+
+AddFunction CombatGeneratorActions
+{
+	#fan_of_knives,line_cd=5,if=active_enemies>=4
+	if Enemies() >= 4 Spell(fan_of_knives)
+	#revealing_strike,if=ticks_remain<2
+	if target.TicksRemain(revealing_strike_debuff) < 2 Spell(revealing_strike)
+	#sinister_strike
+	Spell(sinister_strike)
+}
+
+AddFunction CombatDefaultActions
+{
+	#virmens_bite_potion,if=buff.bloodlust.react|target.time_to_die<40
+	if BuffPresent(burst_haste any=1) or target.TimeToDie() < 40 UsePotionAgility()
+	#auto_attack
+	#kick
+	if target.IsInterruptible() Spell(kick)
+	#preparation,if=!buff.vanish.up&cooldown.vanish.remains>60
+	if not BuffPresent(vanish_buff) and SpellCooldown(vanish) > 60 Spell(preparation)
+	#use_item,slot=hands,if=time=0|buff.shadow_blades.up
+	if TimeInCombat() == 0 or BuffPresent(shadow_blades_buff) UseItemActions()
+	#blood_fury,if=time=0|buff.shadow_blades.up
+	if TimeInCombat() == 0 or BuffPresent(shadow_blades_buff) Spell(blood_fury)
+	#berserking,if=time=0|buff.shadow_blades.up
+	if TimeInCombat() == 0 or BuffPresent(shadow_blades_buff) Spell(berserking)
+	#arcane_torrent,if=energy<60
+	if Energy() < 60 Spell(arcane_torrent_energy)
+	#blade_flurry,if=(active_enemies>=2&!buff.blade_flurry.up)|(active_enemies<2&buff.blade_flurry.up)
+	if { Enemies() >= 2 and not BuffPresent(blade_flurry_buff) } or { Enemies() < 2 and BuffPresent(blade_flurry_buff) } Spell(blade_flurry)
+	#ambush
+	Spell(ambush usable=1)
+	#vanish,if=time>10&(combo_points<3|(talent.anticipation.enabled&anticipation_charges<3)|(buff.shadow_blades.down&(combo_points<4|(talent.anticipation.enabled&anticipation_charges<4))))&((talent.shadow_focus.enabled&buff.adrenaline_rush.down&energy<20)|(talent.subterfuge.enabled&energy>=90)|(!talent.shadow_focus.enabled&!talent.subterfuge.enabled&energy>=60))
+	if TimeInCombat() > 10 and { ComboPoints() < 3 or { TalentPoints(anticipation_talent) and BuffStacks(anticipation_buff) < 3 } or { BuffExpires(shadow_blades_buff) and { ComboPoints() < 4 or { TalentPoints(anticipation_talent) and BuffStacks(anticipation_buff) < 4 } } } } and { { TalentPoints(shadow_focus_talent) and BuffExpires(adrenaline_rush_buff) and Energy() < 20 } or { TalentPoints(subterfuge_talent) and Energy() >= 90 } or { not TalentPoints(shadow_focus_talent) and not TalentPoints(subterfuge_talent) and Energy() >= 60 } } Spell(vanish)
+	#shadow_blades,if=time>5
+	if TimeInCombat() > 5 Spell(shadow_blades)
+	#killing_spree,if=energy<45
+	if Energy() < 45 Spell(killing_spree)
+	#adrenaline_rush,if=energy<35|buff.shadow_blades.up
+	if Energy() < 35 or BuffPresent(shadow_blades_buff) Spell(adrenaline_rush)
+	#slice_and_dice,if=buff.slice_and_dice.remains<2|(buff.slice_and_dice.remains<15&buff.bandits_guile.stack=11&combo_points>=4)
+	if BuffRemains(slice_and_dice_buff) < 2 or { BuffRemains(slice_and_dice_buff) < 15 and BuffStacks(bandits_guile_buff) == 11 and ComboPoints() >= 4 } Spell(slice_and_dice)
+	#marked_for_death,if=talent.marked_for_death.enabled&(combo_points<=1&dot.revealing_strike.ticking)
+	if TalentPoints(marked_for_death_talent) and { ComboPoints() <= 1 and target.DebuffPresent(revealing_strike_debuff) } Spell(marked_for_death)
+	#run_action_list,name=generator,if=combo_points<5|(talent.anticipation.enabled&anticipation_charges<=4&!dot.revealing_strike.ticking)
+	if ComboPoints() < 5 or { TalentPoints(anticipation_talent) and BuffStacks(anticipation_buff) <= 4 and not target.DebuffPresent(revealing_strike_debuff) } CombatGeneratorActions()
+	#run_action_list,name=finisher,if=!talent.anticipation.enabled|buff.deep_insight.up|cooldown.shadow_blades.remains<=11|anticipation_charges>=4|(buff.shadow_blades.up&anticipation_charges>=3)
+	if not TalentPoints(anticipation_talent) or BuffPresent(deep_insight_buff) or SpellCooldown(shadow_blades) <= 11 or BuffStacks(anticipation_buff) >= 4 or { BuffPresent(shadow_blades_buff) and BuffStacks(anticipation_buff) >= 3 } CombatFinisherActions()
+	#run_action_list,name=generator,if=energy>60|buff.deep_insight.down|buff.deep_insight.remains>5-combo_points
+	if Energy() > 60 or BuffExpires(deep_insight_buff) or BuffRemains(deep_insight_buff) > 5 - ComboPoints() CombatGeneratorActions()
+}
+
+AddFunction CombatPrecombatActions
+{
+	#flask,type=spring_blossoms
+	#food,type=sea_mist_rice_noodles
+	#apply_poison,lethal=deadly
+	ApplyPoisons()
+	#snapshot_stats
+	#virmens_bite_potion
+	UsePotionAgility()
+	#stealth
+	if not IsStealthed() Spell(stealth)
+	#marked_for_death,if=talent.marked_for_death.enabled
+	if TalentPoints(marked_for_death_talent) Spell(marked_for_death)
+	#slice_and_dice,if=talent.marked_for_death.enabled
+	if TalentPoints(marked_for_death_talent) Spell(slice_and_dice)
+}
+
+AddIcon mastery=combat help=main
+{
+	if InCombat(no) CombatPrecombatActions()
+	CombatDefaultActions()
+}
+
+### Required symbols
+# adrenaline_rush
+# adrenaline_rush_buff
+# ambush
+# anticipation_buff
+# anticipation_talent
+# apply_poison
+# arcane_torrent_energy
+# bandits_guile_buff
+# berserking
+# blade_flurry
+# blade_flurry_buff
+# blood_fury
+# crimson_tempest
+# crimson_tempest_dot_debuff
+# deep_insight_buff
+# eviscerate
+# fan_of_knives
+# kick
+# killing_spree
+# marked_for_death
+# marked_for_death_talent
+# preparation
+# revealing_strike
+# revealing_strike_debuff
+# rupture
+# rupture_debuff
+# shadow_blades
+# shadow_blades_buff
+# shadow_focus_talent
+# sinister_strike
+# slice_and_dice
+# slice_and_dice_buff
+# stealth
+# subterfuge_talent
+# vanish
+# vanish_buff
+# virmens_bite_potion
+]]
+	OvaleScripts:RegisterScript("ROGUE", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_rogue_subtlety_t16h.lua b/scripts/simulationcraft_rogue_subtlety_t16h.lua
new file mode 100644
index 0000000..86fe4e1
--- /dev/null
+++ b/scripts/simulationcraft_rogue_subtlety_t16h.lua
@@ -0,0 +1,154 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+	local name = "SimulationCraft: Rogue_Subtlety_T16H"
+	local desc = "[5.4] SimulationCraft: Rogue_Subtlety_T16H"
+	local code = [[
+# Based on SimulationCraft profile "Rogue_Subtlety_T16H".
+#	class=rogue
+#	spec=subtlety
+#	talents=http://us.battle.net/wow/en/tool/talent-calculator#cb!200002
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_rogue_spells)
+
+AddFunction SubtletyPoolActions
+{
+	#preparation,if=!buff.vanish.up&cooldown.vanish.remains>60
+	if not BuffPresent(vanish_buff) and SpellCooldown(vanish) > 60 Spell(preparation)
+}
+
+AddFunction SubtletyPrecombatActions
+{
+	#flask,type=spring_blossoms
+	#food,type=sea_mist_rice_noodles
+	#apply_poison,lethal=deadly
+	ApplyPoisons()
+	#snapshot_stats
+	#virmens_bite_potion
+	UsePotionAgility()
+	#stealth
+	if not IsStealthed() Spell(stealth)
+	#premeditation
+	Spell(premeditation usable=1)
+	#slice_and_dice
+	Spell(slice_and_dice)
+}
+
+AddFunction SubtletyGeneratorActions
+{
+	#run_action_list,name=pool,if=buff.master_of_subtlety.down&buff.shadow_dance.down&debuff.find_weakness.down&(energy+cooldown.shadow_dance.remains*energy.regen<80|energy+cooldown.vanish.remains*energy.regen<60)
+	if BuffExpires(master_of_subtlety_buff) and BuffExpires(shadow_dance_buff) and target.DebuffExpires(find_weakness_debuff) and { Energy() + SpellCooldown(shadow_dance) * EnergyRegen() < 80 or Energy() + SpellCooldown(vanish) * EnergyRegen() < 60 } SubtletyPoolActions()
+	#fan_of_knives,if=active_enemies>=4
+	if Enemies() >= 4 Spell(fan_of_knives)
+	#hemorrhage,if=remains<3|position_front
+	if target.DebuffRemains(hemorrhage_debuff) < 3 or False(position_front) Spell(hemorrhage)
+	#shuriken_toss,if=talent.shuriken_toss.enabled&(energy<65&energy.regen<16)
+	if TalentPoints(shuriken_toss_talent) and { Energy() < 65 and EnergyRegen() < 16 } Spell(shuriken_toss)
+	#backstab
+	Spell(backstab usable=1)
+	#run_action_list,name=pool
+	SubtletyPoolActions()
+}
+
+AddFunction SubtletyFinisherActions
+{
+	#slice_and_dice,if=buff.slice_and_dice.remains<4
+	if BuffRemains(slice_and_dice_buff) < 4 Spell(slice_and_dice)
+	#rupture,if=ticks_remain<2&active_enemies<3
+	if target.TicksRemain(rupture_debuff) < 2 and Enemies() < 3 Spell(rupture)
+	#crimson_tempest,if=(active_enemies>1&dot.crimson_tempest_dot.ticks_remain<=2&combo_points=5)|active_enemies>=5
+	if { Enemies() > 1 and target.TicksRemain(crimson_tempest_dot_debuff) <= 2 and ComboPoints() == 5 } or Enemies() >= 5 Spell(crimson_tempest)
+	#eviscerate,if=active_enemies<4|(active_enemies>3&dot.crimson_tempest_dot.ticks_remain>=2)
+	if Enemies() < 4 or { Enemies() > 3 and target.TicksRemain(crimson_tempest_dot_debuff) >= 2 } Spell(eviscerate)
+	#run_action_list,name=pool
+	SubtletyPoolActions()
+}
+
+AddFunction SubtletyDefaultActions
+{
+	#virmens_bite_potion,if=buff.bloodlust.react|target.time_to_die<40
+	if BuffPresent(burst_haste any=1) or target.TimeToDie() < 40 UsePotionAgility()
+	#auto_attack
+	#kick
+	if target.IsInterruptible() Spell(kick)
+	#use_item,slot=hands,if=buff.shadow_dance.up
+	if BuffPresent(shadow_dance_buff) UseItemActions()
+	#blood_fury,if=buff.shadow_dance.up
+	if BuffPresent(shadow_dance_buff) Spell(blood_fury)
+	#berserking,if=buff.shadow_dance.up
+	if BuffPresent(shadow_dance_buff) Spell(berserking)
+	#arcane_torrent,if=energy<60
+	if Energy() < 60 Spell(arcane_torrent_energy)
+	#shadow_blades
+	Spell(shadow_blades)
+	#premeditation,if=combo_points<=4
+	if ComboPoints() <= 4 Spell(premeditation usable=1)
+	#pool_resource,for_next=1
+	#ambush,if=combo_points<5|(talent.anticipation.enabled&anticipation_charges<3)|(buff.sleight_of_hand.up&buff.sleight_of_hand.remains<=gcd)
+	if ComboPoints() < 5 or { TalentPoints(anticipation_talent) and BuffStacks(anticipation_buff) < 3 } or { BuffPresent(sleight_of_hand_buff) and BuffRemains(sleight_of_hand_buff) <= GCD() } wait Spell(ambush usable=1)
+	#pool_resource,for_next=1,extra_amount=75
+	#shadow_dance,if=energy>=75&buff.stealth.down&buff.vanish.down&debuff.find_weakness.down
+	if Energy() >= 75 and Stealthed(no) and BuffExpires(vanish_buff) and target.DebuffExpires(find_weakness_debuff) wait Spell(shadow_dance)
+	#pool_resource,for_next=1,extra_amount=45
+	#vanish,if=energy>=45&energy<=75&combo_points<=3&buff.shadow_dance.down&buff.master_of_subtlety.down&debuff.find_weakness.down
+	if Energy() >= 45 and Energy() <= 75 and ComboPoints() <= 3 and BuffExpires(shadow_dance_buff) and BuffExpires(master_of_subtlety_buff) and target.DebuffExpires(find_weakness_debuff) wait Spell(vanish)
+	#marked_for_death,if=talent.marked_for_death.enabled&combo_points=0
+	if TalentPoints(marked_for_death_talent) and ComboPoints() == 0 Spell(marked_for_death)
+	#run_action_list,name=generator,if=talent.anticipation.enabled&anticipation_charges<4&buff.slice_and_dice.up&dot.rupture.remains>2&(buff.slice_and_dice.remains<6|dot.rupture.remains<4)
+	if TalentPoints(anticipation_talent) and BuffStacks(anticipation_buff) < 4 and BuffPresent(slice_and_dice_buff) and target.DebuffRemains(rupture_debuff) > 2 and { BuffRemains(slice_and_dice_buff) < 6 or target.DebuffRemains(rupture_debuff) < 4 } SubtletyGeneratorActions()
+	#run_action_list,name=finisher,if=combo_points=5
+	if ComboPoints() == 5 SubtletyFinisherActions()
+	#run_action_list,name=generator,if=combo_points<4|energy>80|talent.anticipation.enabled
+	if ComboPoints() < 4 or Energy() > 80 or TalentPoints(anticipation_talent) SubtletyGeneratorActions()
+	#run_action_list,name=pool
+	SubtletyPoolActions()
+}
+
+AddIcon mastery=subtlety help=main
+{
+	if InCombat(no) SubtletyPrecombatActions()
+	SubtletyDefaultActions()
+}
+
+### Required symbols
+# ambush
+# anticipation_buff
+# anticipation_talent
+# apply_poison
+# arcane_torrent_energy
+# backstab
+# berserking
+# blood_fury
+# crimson_tempest
+# crimson_tempest_dot_debuff
+# eviscerate
+# fan_of_knives
+# find_weakness_debuff
+# hemorrhage
+# hemorrhage_debuff
+# kick
+# marked_for_death
+# marked_for_death_talent
+# master_of_subtlety_buff
+# premeditation
+# preparation
+# rupture
+# rupture_debuff
+# shadow_blades
+# shadow_dance
+# shadow_dance_buff
+# shuriken_toss
+# shuriken_toss_talent
+# sleight_of_hand_buff
+# slice_and_dice
+# slice_and_dice_buff
+# stealth
+# vanish
+# vanish_buff
+# virmens_bite_potion
+]]
+	OvaleScripts:RegisterScript("ROGUE", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_shaman_elemental_t16h.lua b/scripts/simulationcraft_shaman_elemental_t16h.lua
new file mode 100644
index 0000000..c8ab790
--- /dev/null
+++ b/scripts/simulationcraft_shaman_elemental_t16h.lua
@@ -0,0 +1,160 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+	local name = "SimulationCraft: Shaman_Elemental_T16H"
+	local desc = "[5.4] SimulationCraft: Shaman_Elemental_T16H"
+	local code = [[
+# Based on SimulationCraft profile "Shaman_Elemental_T16H".
+#	class=shaman
+#	spec=elemental
+#	talents=http://us.battle.net/wow/en/tool/talent-calculator#Wa!...2.0
+#	glyphs=chain_lightning
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_shaman_spells)
+
+AddFunction ElementalAoeActions
+{
+	#lava_beam
+	Spell(lava_beam)
+	#magma_totem,if=active_enemies>2&!totem.fire.active
+	if Enemies() > 2 and not TotemPresent(fire) Spell(magma_totem)
+	#searing_totem,if=active_enemies<=2&!totem.fire.active
+	if Enemies() <= 2 and not TotemPresent(fire) Spell(searing_totem)
+	#lava_burst,if=active_enemies<3&dot.flame_shock.remains>cast_time&cooldown_react
+	if Enemies() < 3 and target.DebuffRemains(flame_shock_debuff) > CastTime(lava_burst) and Spell(lava_burst) Spell(lava_burst)
+	#flame_shock,cycle_targets=1,if=!ticking&active_enemies<3
+	if not target.DebuffPresent(flame_shock_debuff) and Enemies() < 3 Spell(flame_shock)
+	#earthquake,if=active_enemies>4
+	if Enemies() > 4 Spell(earthquake)
+	#thunderstorm,if=mana.pct_nonproc<80
+	if ManaPercent() < 80 Spell(thunderstorm)
+	#chain_lightning,if=mana.pct_nonproc>10
+	if ManaPercent() > 10 Spell(chain_lightning)
+	#lightning_bolt
+	Spell(lightning_bolt)
+}
+
+AddFunction ElementalSingleActions
+{
+	#use_item,name=grips_of_tidal_force,if=((cooldown.ascendance.remains>10|level<87)&cooldown.fire_elemental_totem.remains>10)|buff.ascendance.up|buff.bloodlust.up|totem.fire_elemental_totem.active
+	if { { SpellCooldown(ascendance_caster) > 10 or Level() < 87 } and SpellCooldown(fire_elemental_totem) > 10 } or BuffPresent(ascendance_caster_buff) or BuffPresent(burst_haste any=1) or TotemPresent(fire totem=fire_elemental_totem) UseItemActions()
+	#unleash_elements,if=talent.unleashed_fury.enabled&!buff.ascendance.up
+	if TalentPoints(unleashed_fury_talent) and not BuffPresent(ascendance_caster_buff) Spell(unleash_elements)
+	#spiritwalkers_grace,moving=1,if=buff.ascendance.up
+	if Speed() > 0 and BuffPresent(ascendance_caster_buff) Spell(spiritwalkers_grace)
+	#lava_burst,if=dot.flame_shock.remains>cast_time&(buff.ascendance.up|cooldown_react)
+	if target.DebuffRemains(flame_shock_debuff) > CastTime(lava_burst) and { BuffPresent(ascendance_caster_buff) or Spell(lava_burst) } Spell(lava_burst)
+	#flame_shock,if=ticks_remain<2
+	if target.TicksRemain(flame_shock_debuff) < 2 Spell(flame_shock)
+	#elemental_blast,if=talent.elemental_blast.enabled
+	if TalentPoints(elemental_blast_talent) Spell(elemental_blast)
+	#earth_shock,if=buff.lightning_shield.react=buff.lightning_shield.max_stack
+	if BuffStacks(lightning_shield_buff) == 7 Spell(earth_shock)
+	#earth_shock,if=buff.lightning_shield.react>3&dot.flame_shock.remains>cooldown&dot.flame_shock.remains<cooldown+action.flame_shock.tick_time
+	if BuffStacks(lightning_shield_buff) > 3 and target.DebuffRemains(flame_shock_debuff) > SpellCooldown(earth_shock) and target.DebuffRemains(flame_shock_debuff) < SpellCooldown(earth_shock) + target.TickTime(flame_shock_debuff) Spell(earth_shock)
+	#flame_shock,if=time>60&remains<=buff.ascendance.duration&cooldown.ascendance.remains+buff.ascendance.duration<duration
+	if TimeInCombat() > 60 and target.DebuffRemains(flame_shock_debuff) <= SpellData(ascendance_caster_buff duration) and SpellCooldown(ascendance_caster) + SpellData(ascendance_caster_buff duration) < SpellData(flame_shock_debuff duration) Spell(flame_shock)
+	#earth_elemental_totem,if=!active&cooldown.fire_elemental_totem.remains>=60
+	if not TotemPresent(earth totem=earth_elemental_totem) and SpellCooldown(fire_elemental_totem) >= 60 Spell(earth_elemental_totem)
+	#searing_totem,if=cooldown.fire_elemental_totem.remains>20&!totem.fire.active
+	if SpellCooldown(fire_elemental_totem) > 20 and not TotemPresent(fire) Spell(searing_totem)
+	#spiritwalkers_grace,moving=1,if=((talent.elemental_blast.enabled&cooldown.elemental_blast.remains=0)|(cooldown.lava_burst.remains=0&!buff.lava_surge.react))|(buff.raid_movement.duration>=action.unleash_elements.gcd+action.earth_shock.gcd)
+	if Speed() > 0 and { { { TalentPoints(elemental_blast_talent) and not SpellCooldown(elemental_blast) > 0 } or { not SpellCooldown(lava_burst) > 0 and not BuffPresent(lava_surge_buff) } } or { 0 >= GCD() + GCD() } } Spell(spiritwalkers_grace)
+	#lightning_bolt
+	Spell(lightning_bolt)
+}
+
+AddFunction ElementalDefaultActions
+{
+	#wind_shear
+	Interrupt()
+	#bloodlust,if=target.health.pct<25|time>5
+	if target.HealthPercent() < 25 or TimeInCombat() > 5 Bloodlust()
+	#stormlash_totem,if=!active&!buff.stormlash.up&(buff.bloodlust.up|time>=60)
+	if not TotemPresent(air totem=stormlash_totem) and not BuffPresent(stormlash_buff) and { BuffPresent(burst_haste any=1) or TimeInCombat() >= 60 } Spell(stormlash_totem)
+	#jade_serpent_potion,if=time>60&(pet.primal_fire_elemental.active|pet.greater_fire_elemental.active|target.time_to_die<=60)
+	if TimeInCombat() > 60 and { TotemPresent(fire totem=fire_elemental_totem) or TotemPresent(fire totem=fire_elemental_totem) or target.TimeToDie() <= 60 } UsePotionIntellect()
+	#berserking,if=!buff.bloodlust.up&!buff.elemental_mastery.up&(set_bonus.tier15_4pc_caster=1|(buff.ascendance.cooldown_remains=0&(dot.flame_shock.remains>buff.ascendance.duration|level<87)))
+	if not BuffPresent(burst_haste any=1) and not BuffPresent(elemental_mastery_buff) and { ArmorSetBonus(T15_caster 4) == 1 or { SpellCooldown(ascendance_caster) == 0 and { target.DebuffRemains(flame_shock_debuff) > SpellData(ascendance_caster_buff duration) or Level() < 87 } } } Spell(berserking)
+	#blood_fury,if=buff.bloodlust.up|buff.ascendance.up|((cooldown.ascendance.remains>10|level<87)&cooldown.fire_elemental_totem.remains>10)
+	if BuffPresent(burst_haste any=1) or BuffPresent(ascendance_caster_buff) or { { SpellCooldown(ascendance_caster) > 10 or Level() < 87 } and SpellCooldown(fire_elemental_totem) > 10 } Spell(blood_fury)
+	#arcane_torrent
+	Spell(arcane_torrent)
+	#elemental_mastery,if=talent.elemental_mastery.enabled&(time>15&((!buff.bloodlust.up&time<120)|(!buff.berserking.up&!buff.bloodlust.up&buff.ascendance.up)|(time>=200&(cooldown.ascendance.remains>30|level<87))))
+	if TalentPoints(elemental_mastery_talent) and { TimeInCombat() > 15 and { { not BuffPresent(burst_haste any=1) and TimeInCombat() < 120 } or { not BuffPresent(berserking_buff) and not BuffPresent(burst_haste any=1) and BuffPresent(ascendance_caster_buff) } or { TimeInCombat() >= 200 and { SpellCooldown(ascendance_caster) > 30 or Level() < 87 } } } } Spell(elemental_mastery)
+	#ancestral_swiftness,if=talent.ancestral_swiftness.enabled&!buff.ascendance.up
+	if TalentPoints(ancestral_swiftness_talent) and not BuffPresent(ascendance_caster_buff) Spell(ancestral_swiftness)
+	#fire_elemental_totem,if=!active
+	if not TotemPresent(fire totem=fire_elemental_totem) Spell(fire_elemental_totem)
+	#ascendance,if=active_enemies>1|(dot.flame_shock.remains>buff.ascendance.duration&(target.time_to_die<20|buff.bloodlust.up|time>=60)&cooldown.lava_burst.remains>0)
+	if Enemies() > 1 or { target.DebuffRemains(flame_shock_debuff) > SpellData(ascendance_caster_buff duration) and { target.TimeToDie() < 20 or BuffPresent(burst_haste any=1) or TimeInCombat() >= 60 } and SpellCooldown(lava_burst) > 0 } Spell(ascendance_caster)
+	#run_action_list,name=single,if=active_enemies=1
+	if Enemies() == 1 ElementalSingleActions()
+	#run_action_list,name=aoe,if=active_enemies>1
+	if Enemies() > 1 ElementalAoeActions()
+}
+
+AddFunction ElementalPrecombatActions
+{
+	#flask,type=warm_sun
+	#food,type=mogu_fish_stew
+	#flametongue_weapon,weapon=main
+	if WeaponEnchantExpires(main) Spell(flametongue_weapon)
+	#lightning_shield,if=!buff.lightning_shield.up
+	if not BuffPresent(lightning_shield_buff) Spell(lightning_shield)
+	#snapshot_stats
+	#jade_serpent_potion
+	UsePotionIntellect()
+}
+
+AddIcon mastery=elemental help=main
+{
+	if InCombat(no) ElementalPrecombatActions()
+	ElementalDefaultActions()
+}
+
+### Required symbols
+# ancestral_swiftness
+# ancestral_swiftness_talent
+# arcane_torrent
+# ascendance_caster
+# ascendance_caster_buff
+# berserking
+# berserking_buff
+# blood_fury
+# bloodlust
+# chain_lightning
+# earth_elemental_totem
+# earth_shock
+# earthquake
+# elemental_blast
+# elemental_blast_talent
+# elemental_mastery
+# elemental_mastery_buff
+# elemental_mastery_talent
+# fire_elemental_totem
+# flame_shock
+# flame_shock_debuff
+# flametongue_weapon
+# jade_serpent_potion
+# lava_beam
+# lava_burst
+# lava_surge_buff
+# lightning_bolt
+# lightning_shield
+# lightning_shield_buff
+# magma_totem
+# searing_totem
+# spiritwalkers_grace
+# stormlash_buff
+# stormlash_totem
+# thunderstorm
+# unleash_elements
+# unleashed_fury_talent
+# wind_shear
+]]
+	OvaleScripts:RegisterScript("SHAMAN", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_shaman_enhancement_t16h.lua b/scripts/simulationcraft_shaman_enhancement_t16h.lua
new file mode 100644
index 0000000..6ea67b4
--- /dev/null
+++ b/scripts/simulationcraft_shaman_enhancement_t16h.lua
@@ -0,0 +1,211 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+	local name = "SimulationCraft: Shaman_Enhancement_T16H"
+	local desc = "[5.4] SimulationCraft: Shaman_Enhancement_T16H"
+	local code = [[
+# Based on SimulationCraft profile "Shaman_Enhancement_T16H".
+#	class=shaman
+#	spec=enhancement
+#	talents=http://us.battle.net/wow/en/tool/talent-calculator#WZ!...0.1
+#	glyphs=chain_lightning
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_shaman_spells)
+
+AddFunction EnhancementAoeActions
+{
+	#fire_nova,if=active_flame_shock>=4
+	if DebuffCountOnAny(flame_shock_debuff) >= 4 Spell(fire_nova)
+	#wait,sec=cooldown.fire_nova.remains,if=active_flame_shock>=4&cooldown.fire_nova.remains<0.67
+	if DebuffCountOnAny(flame_shock_debuff) >= 4 and SpellCooldown(fire_nova) < 0.67 wait Spell(fire_nova)
+	#magma_totem,if=active_enemies>5&!totem.fire.active
+	if Enemies() > 5 and not TotemPresent(fire) Spell(magma_totem)
+	#searing_totem,if=active_enemies<=5&!totem.fire.active
+	if Enemies() <= 5 and not TotemPresent(fire) Spell(searing_totem)
+	#lava_lash,if=dot.flame_shock.ticking
+	if target.DebuffPresent(flame_shock_debuff) Spell(lava_lash)
+	#elemental_blast,if=talent.elemental_blast.enabled&buff.maelstrom_weapon.react>=1
+	if TalentPoints(elemental_blast_talent) and BuffPresent(maelstrom_weapon_buff) >= 1 Spell(elemental_blast)
+	#chain_lightning,if=active_enemies>=2&buff.maelstrom_weapon.react>=3
+	if Enemies() >= 2 and BuffPresent(maelstrom_weapon_buff) >= 3 Spell(chain_lightning)
+	#unleash_elements
+	Spell(unleash_elements)
+	#flame_shock,cycle_targets=1,if=!ticking
+	if not target.DebuffPresent(flame_shock_debuff) Spell(flame_shock)
+	#stormblast
+	Spell(stormblast)
+	#fire_nova,if=active_flame_shock>=3
+	if DebuffCountOnAny(flame_shock_debuff) >= 3 Spell(fire_nova)
+	#chain_lightning,if=active_enemies>=2&buff.maelstrom_weapon.react>=1
+	if Enemies() >= 2 and BuffPresent(maelstrom_weapon_buff) >= 1 Spell(chain_lightning)
+	#stormstrike
+	Spell(stormstrike)
+	#earth_shock,if=active_enemies<4
+	if Enemies() < 4 Spell(earth_shock)
+	#feral_spirit
+	Spell(feral_spirit)
+	#earth_elemental_totem,if=!active&cooldown.fire_elemental_totem.remains>=50
+	if not TotemPresent(earth totem=earth_elemental_totem) and SpellCooldown(fire_elemental_totem) >= 50 Spell(earth_elemental_totem)
+	#spiritwalkers_grace,moving=1
+	if Speed() > 0 Spell(spiritwalkers_grace)
+	#fire_nova,if=active_flame_shock>=1
+	if DebuffCountOnAny(flame_shock_debuff) >= 1 Spell(fire_nova)
+}
+
+AddFunction EnhancementSingleActions
+{
+	#searing_totem,if=!totem.fire.active
+	if not TotemPresent(fire) Spell(searing_totem)
+	#unleash_elements,if=(talent.unleashed_fury.enabled|set_bonus.tier16_2pc_melee=1)
+	if { TalentPoints(unleashed_fury_talent) or ArmorSetBonus(T16_melee 2) == 1 } Spell(unleash_elements)
+	#elemental_blast,if=talent.elemental_blast.enabled&buff.maelstrom_weapon.react>=1
+	if TalentPoints(elemental_blast_talent) and BuffPresent(maelstrom_weapon_buff) >= 1 Spell(elemental_blast)
+	#lightning_bolt,if=buff.maelstrom_weapon.react=5
+	if BuffPresent(maelstrom_weapon_buff) == 5 Spell(lightning_bolt)
+	#feral_spirit,if=set_bonus.tier15_4pc_melee=1
+	if ArmorSetBonus(T15_melee 4) == 1 Spell(feral_spirit)
+	#stormblast
+	Spell(stormblast)
+	#stormstrike
+	Spell(stormstrike)
+	#flame_shock,if=buff.unleash_flame.up&!ticking
+	if BuffPresent(unleash_flame_buff) and not target.DebuffPresent(flame_shock_debuff) Spell(flame_shock)
+	#lava_lash
+	Spell(lava_lash)
+	#lightning_bolt,if=set_bonus.tier15_2pc_melee=1&buff.maelstrom_weapon.react>=4&!buff.ascendance.up
+	if ArmorSetBonus(T15_melee 2) == 1 and BuffPresent(maelstrom_weapon_buff) >= 4 and not BuffPresent(ascendance_melee_buff) Spell(lightning_bolt)
+	#flame_shock,if=(buff.unleash_flame.up&(dot.flame_shock.remains<10|action.flame_shock.tick_damage>dot.flame_shock.tick_dmg))|!ticking
+	if { BuffPresent(unleash_flame_buff) and { target.DebuffRemains(flame_shock_debuff) < 10 or target.Damage(flame_shock_debuff) > target.LastEstimatedDamage(flame_shock_debuff) } } or not target.DebuffPresent(flame_shock_debuff) Spell(flame_shock)
+	#unleash_elements
+	Spell(unleash_elements)
+	#frost_shock,if=glyph.frost_shock.enabled&set_bonus.tier14_4pc_melee=0
+	if Glyph(glyph_of_frost_shock) and ArmorSetBonus(T14_melee 4) == 0 Spell(frost_shock)
+	#lightning_bolt,if=buff.maelstrom_weapon.react>=3&!buff.ascendance.up
+	if BuffPresent(maelstrom_weapon_buff) >= 3 and not BuffPresent(ascendance_melee_buff) Spell(lightning_bolt)
+	#ancestral_swiftness,if=talent.ancestral_swiftness.enabled&buff.maelstrom_weapon.react<2
+	if TalentPoints(ancestral_swiftness_talent) and BuffPresent(maelstrom_weapon_buff) < 2 Spell(ancestral_swiftness)
+	#lightning_bolt,if=buff.ancestral_swiftness.up
+	if BuffPresent(ancestral_swiftness_buff) Spell(lightning_bolt)
+	#earth_shock,if=(!glyph.frost_shock.enabled|set_bonus.tier14_4pc_melee=1)
+	if { not Glyph(glyph_of_frost_shock) or ArmorSetBonus(T14_melee 4) == 1 } Spell(earth_shock)
+	#feral_spirit
+	Spell(feral_spirit)
+	#earth_elemental_totem,if=!active
+	if not TotemPresent(earth totem=earth_elemental_totem) Spell(earth_elemental_totem)
+	#spiritwalkers_grace,moving=1
+	if Speed() > 0 Spell(spiritwalkers_grace)
+	#lightning_bolt,if=buff.maelstrom_weapon.react>1&!buff.ascendance.up
+	if BuffPresent(maelstrom_weapon_buff) > 1 and not BuffPresent(ascendance_melee_buff) Spell(lightning_bolt)
+}
+
+AddFunction EnhancementDefaultActions
+{
+	#wind_shear
+	Interrupt()
+	#bloodlust,if=target.health.pct<25|time>5
+	if target.HealthPercent() < 25 or TimeInCombat() > 5 Bloodlust()
+	#auto_attack
+	#use_item,name=grips_of_celestial_harmony
+	UseItemActions()
+	#stormlash_totem,if=!active&!buff.stormlash.up&(buff.bloodlust.up|time>=60)
+	if not TotemPresent(air totem=stormlash_totem) and not BuffPresent(stormlash_buff) and { BuffPresent(burst_haste any=1) or TimeInCombat() >= 60 } Spell(stormlash_totem)
+	#virmens_bite_potion,if=time>60&(pet.primal_fire_elemental.active|pet.greater_fire_elemental.active|target.time_to_die<=60)
+	if TimeInCombat() > 60 and { TotemPresent(fire totem=fire_elemental_totem) or TotemPresent(fire totem=fire_elemental_totem) or target.TimeToDie() <= 60 } UsePotionAgility()
+	#blood_fury
+	Spell(blood_fury)
+	#arcane_torrent
+	Spell(arcane_torrent)
+	#berserking
+	Spell(berserking)
+	#elemental_mastery,if=talent.elemental_mastery.enabled&(talent.primal_elementalist.enabled&glyph.fire_elemental_totem.enabled&(cooldown.fire_elemental_totem.remains=0|cooldown.fire_elemental_totem.remains>=80))
+	if TalentPoints(elemental_mastery_talent) and { TalentPoints(primal_elementalist_talent) and Glyph(glyph_of_fire_elemental_totem) and { not SpellCooldown(fire_elemental_totem) > 0 or SpellCooldown(fire_elemental_totem) >= 80 } } Spell(elemental_mastery)
+	#elemental_mastery,if=talent.elemental_mastery.enabled&(talent.primal_elementalist.enabled&!glyph.fire_elemental_totem.enabled&(cooldown.fire_elemental_totem.remains=0|cooldown.fire_elemental_totem.remains>=50))
+	if TalentPoints(elemental_mastery_talent) and { TalentPoints(primal_elementalist_talent) and not Glyph(glyph_of_fire_elemental_totem) and { not SpellCooldown(fire_elemental_totem) > 0 or SpellCooldown(fire_elemental_totem) >= 50 } } Spell(elemental_mastery)
+	#elemental_mastery,if=talent.elemental_mastery.enabled&!talent.primal_elementalist.enabled
+	if TalentPoints(elemental_mastery_talent) and not TalentPoints(primal_elementalist_talent) Spell(elemental_mastery)
+	#fire_elemental_totem,if=!active
+	if not TotemPresent(fire totem=fire_elemental_totem) Spell(fire_elemental_totem)
+	#ascendance,if=cooldown.strike.remains>=3
+	if SpellCooldown(strike) >= 3 Spell(ascendance_melee)
+	#lifeblood,if=(glyph.fire_elemental_totem.enabled&(pet.primal_fire_elemental.active|pet.greater_fire_elemental.active))|!glyph.fire_elemental_totem.enabled
+	if { Glyph(glyph_of_fire_elemental_totem) and { TotemPresent(fire totem=fire_elemental_totem) or TotemPresent(fire totem=fire_elemental_totem) } } or not Glyph(glyph_of_fire_elemental_totem) Spell(lifeblood)
+	#run_action_list,name=single,if=active_enemies=1
+	if Enemies() == 1 EnhancementSingleActions()
+	#run_action_list,name=aoe,if=active_enemies>1
+	if Enemies() > 1 EnhancementAoeActions()
+}
+
+AddFunction EnhancementPrecombatActions
+{
+	#flask,type=spring_blossoms
+	#food,type=sea_mist_rice_noodles
+	#windfury_weapon,weapon=main
+	if WeaponEnchantExpires(main) Spell(windfury_weapon)
+	#flametongue_weapon,weapon=off
+	if WeaponEnchantExpires(off) Spell(flametongue_weapon)
+	#lightning_shield,if=!buff.lightning_shield.up
+	if not BuffPresent(lightning_shield_buff) Spell(lightning_shield)
+	#snapshot_stats
+	#virmens_bite_potion
+	UsePotionAgility()
+}
+
+AddIcon mastery=enhancement help=main
+{
+	if InCombat(no) EnhancementPrecombatActions()
+	EnhancementDefaultActions()
+}
+
+### Required symbols
+# ancestral_swiftness
+# ancestral_swiftness_buff
+# ancestral_swiftness_talent
+# arcane_torrent
+# ascendance_melee
+# ascendance_melee_buff
+# berserking
+# blood_fury
+# bloodlust
+# chain_lightning
+# earth_elemental_totem
+# earth_shock
+# elemental_blast
+# elemental_blast_talent
+# elemental_mastery
+# elemental_mastery_talent
+# feral_spirit
+# fire_elemental_totem
+# fire_nova
+# flame_shock
+# flame_shock_debuff
+# flametongue_weapon
+# frost_shock
+# glyph_of_fire_elemental_totem
+# glyph_of_frost_shock
+# lava_lash
+# lifeblood
+# lightning_bolt
+# lightning_shield
+# lightning_shield_buff
+# maelstrom_weapon_buff
+# magma_totem
+# primal_elementalist_talent
+# searing_totem
+# spiritwalkers_grace
+# stormblast
+# stormlash_buff
+# stormlash_totem
+# stormstrike
+# strike
+# unleash_elements
+# unleash_flame_buff
+# unleashed_fury_talent
+# virmens_bite_potion
+# wind_shear
+# windfury_weapon
+]]
+	OvaleScripts:RegisterScript("SHAMAN", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_warlock_affliction_t16h.lua b/scripts/simulationcraft_warlock_affliction_t16h.lua
new file mode 100644
index 0000000..145c477
--- /dev/null
+++ b/scripts/simulationcraft_warlock_affliction_t16h.lua
@@ -0,0 +1,155 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+	local name = "SimulationCraft: Warlock_Affliction_T16H"
+	local desc = "[5.4] SimulationCraft: Warlock_Affliction_T16H"
+	local code = [[
+# Based on SimulationCraft profile "Warlock_Affliction_T16H".
+#	class=warlock
+#	spec=affliction
+#	talents=http://us.battle.net/wow/en/tool/talent-calculator#Va!....00
+#	glyphs=siphon_life
+#	pet=felhunter
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_warlock_spells)
+
+AddFunction AfflictionAoeActions
+{
+	#summon_infernal
+	Spell(summon_infernal)
+	#soulburn,cycle_targets=1,if=buff.soulburn.down&!dot.soulburn_seed_of_corruption.ticking&!action.soulburn_seed_of_corruption.in_flight_to_target&shard_react
+	if BuffExpires(soulburn_buff) and not target.DebuffPresent(soulburn_seed_of_corruption_debuff) and not InFlightToTarget(soulburn_seed_of_corruption) and SoulShards() >= 1 Spell(soulburn)
+	#soul_swap,if=buff.soulburn.up&!dot.agony.ticking&!dot.corruption.ticking
+	if BuffPresent(soulburn_buff) and not target.DebuffPresent(agony_debuff) and not target.DebuffPresent(corruption_debuff) Spell(soul_swap)
+	#soul_swap,cycle_targets=1,if=buff.soulburn.up&dot.corruption.ticking&!dot.agony.ticking
+	if BuffPresent(soulburn_buff) and target.DebuffPresent(corruption_debuff) and not target.DebuffPresent(agony_debuff) Spell(soul_swap)
+	#seed_of_corruption,cycle_targets=1,if=(buff.soulburn.down&!in_flight_to_target&!ticking)|(buff.soulburn.up&!dot.soulburn_seed_of_corruption.ticking&!action.soulburn_seed_of_corruption.in_flight_to_target)
+	if { BuffExpires(soulburn_buff) and not InFlightToTarget(seed_of_corruption) and not target.DebuffPresent(seed_of_corruption_debuff) } or { BuffPresent(soulburn_buff) and not target.DebuffPresent(soulburn_seed_of_corruption_debuff) and not InFlightToTarget(soulburn_seed_of_corruption) } Spell(seed_of_corruption)
+	#haunt,cycle_targets=1,if=!in_flight_to_target&debuff.haunt.remains<cast_time+travel_time&shard_react
+	if not InFlightToTarget(haunt) and target.DebuffRemains(haunt_debuff) < CastTime(haunt) + 0.5 and SoulShards() >= 1 Spell(haunt)
+	#life_tap,if=mana.pct<70
+	if ManaPercent() < 70 Spell(life_tap)
+	#fel_flame,cycle_targets=1,if=!in_flight_to_target
+	if not InFlightToTarget(fel_flame) Spell(fel_flame)
+}
+
+AddFunction AfflictionDefaultActions
+{
+	#curse_of_the_elements,if=debuff.magic_vulnerability.down
+	if target.DebuffExpires(magic_vulnerability any=1) Spell(curse_of_the_elements)
+	#use_item,name=gloves_of_the_horned_nightmare
+	UseItemActions()
+	#jade_serpent_potion,if=buff.bloodlust.react|target.health.pct<=20
+	if BuffPresent(burst_haste any=1) or target.HealthPercent() <= 20 UsePotionIntellect()
+	#berserking
+	Spell(berserking)
+	#dark_soul,if=!talent.archimondes_darkness.enabled|(talent.archimondes_darkness.enabled&(charges=2|trinket.proc.intellect.react|trinket.stacking_proc.intellect.react|target.health.pct<=10))
+	if not TalentPoints(archimondes_darkness_talent) or { TalentPoints(archimondes_darkness_talent) and { Charges(dark_soul_misery) == 2 or BuffPresent(trinket_proc_intellect_buff) or BuffStacks(trinket_stacking_proc_intellect_buff) or target.HealthPercent() <= 10 } } Spell(dark_soul_misery)
+	#service_pet,if=talent.grimoire_of_service.enabled
+	if TalentPoints(grimoire_of_service_talent) ServicePet()
+	#run_action_list,name=aoe,if=active_enemies>6
+	if Enemies() > 6 AfflictionAoeActions()
+	#summon_doomguard
+	Spell(summon_doomguard)
+	#soul_swap,if=buff.soulburn.up
+	if BuffPresent(soulburn_buff) Spell(soul_swap)
+	#soulburn,if=(buff.dark_soul.up|trinket.proc.intellect.react|trinket.stacking_proc.intellect.react>6)&(dot.agony.ticks_remain<=action.agony.add_ticks%2|dot.corruption.ticks_remain<=action.corruption.add_ticks%2|dot.unstable_affliction.ticks_remain<=action.unstable_affliction.add_ticks%2)&shard_react
+	if { BuffPresent(dark_soul_misery_buff) or BuffPresent(trinket_proc_intellect_buff) or BuffStacks(trinket_stacking_proc_intellect_buff) > 6 } and { target.TicksRemain(agony_debuff) <= TicksAdded(agony_debuff) / 2 or target.TicksRemain(corruption_debuff) <= TicksAdded(corruption_debuff) / 2 or target.TicksRemain(unstable_affliction_debuff) <= TicksAdded(unstable_affliction_debuff) / 2 } and SoulShards() >= 1 Spell(soulburn)
+	#soulburn,if=(dot.unstable_affliction.ticks_remain<=1|dot.corruption.ticks_remain<=1|dot.agony.ticks_remain<=1)&shard_react&target.health.pct<=20
+	if { target.TicksRemain(unstable_affliction_debuff) <= 1 or target.TicksRemain(corruption_debuff) <= 1 or target.TicksRemain(agony_debuff) <= 1 } and SoulShards() >= 1 and target.HealthPercent() <= 20 Spell(soulburn)
+	#soul_swap,if=active_enemies>1&buff.soul_swap.down&(buff.dark_soul.up|trinket.proc.intellect.react|trinket.stacking_proc.intellect.react>6)
+	if Enemies() > 1 and BuffExpires(soul_swap_buff) and { BuffPresent(dark_soul_misery_buff) or BuffPresent(trinket_proc_intellect_buff) or BuffStacks(trinket_stacking_proc_intellect_buff) > 6 } Spell(soul_swap)
+	#soul_swap,cycle_targets=1,if=active_enemies>1&buff.soul_swap.up&(dot.agony.ticks_remain<=action.agony.add_ticks%2|dot.corruption.ticks_remain<=action.corruption.add_ticks%2|dot.unstable_affliction.ticks_remain<=action.unstable_affliction.add_ticks%2)&shard_react
+	if Enemies() > 1 and BuffPresent(soul_swap_buff) and { target.TicksRemain(agony_debuff) <= TicksAdded(agony_debuff) / 2 or target.TicksRemain(corruption_debuff) <= TicksAdded(corruption_debuff) / 2 or target.TicksRemain(unstable_affliction_debuff) <= TicksAdded(unstable_affliction_debuff) / 2 } and SoulShards() >= 1 Spell(soul_swap)
+	#haunt,if=!in_flight_to_target&remains<cast_time+travel_time+tick_time&shard_react&target.health.pct<=20
+	if not InFlightToTarget(haunt) and target.DebuffRemains(haunt_debuff) < CastTime(haunt) + 0.5 + target.TickTime(haunt_debuff) and SoulShards() >= 1 and target.HealthPercent() <= 20 Spell(haunt)
+	#drain_soul,interrupt=1,chain=1,if=target.health.pct<=20
+	if target.HealthPercent() <= 20 Spell(drain_soul)
+	#haunt,if=!in_flight_to_target&remains<cast_time+travel_time+tick_time&shard_react
+	if not InFlightToTarget(haunt) and target.DebuffRemains(haunt_debuff) < CastTime(haunt) + 0.5 + target.TickTime(haunt_debuff) and SoulShards() >= 1 Spell(haunt)
+	#agony,if=(tick_damage*n_ticks*(100+crit_pct_current)>4*dot.agony.tick_dmg*dot.agony.ticks_remain*(100+dot.agony.crit_pct))&miss_react
+	if { target.Damage(agony_debuff) * target.Ticks(agony_debuff) * { 100 + SpellCritChance() } > 4 * target.LastEstimatedDamage(agony_debuff) * target.TicksRemain(agony_debuff) * { 100 + target.DebuffSpellCritChance(agony_debuff) } } and True(miss_react) Spell(agony)
+	#corruption,if=((stat.spell_power>spell_power&ticks_remain<add_ticks%2)|(stat.spell_power>spell_power*1.5)|remains<gcd)&miss_react
+	if { { Spellpower() > target.DebuffSpellpower(corruption_debuff) and target.TicksRemain(corruption_debuff) < TicksAdded(corruption_debuff) / 2 } or { Spellpower() > target.DebuffSpellpower(corruption_debuff) * 1.5 } or target.DebuffRemains(corruption_debuff) < GCD() } and True(miss_react) Spell(corruption)
+	#unstable_affliction,if=((stat.spell_power>spell_power&ticks_remain<add_ticks%2)|(stat.spell_power>spell_power*1.5)|remains<cast_time+gcd)&miss_react
+	if { { Spellpower() > target.DebuffSpellpower(unstable_affliction_debuff) and target.TicksRemain(unstable_affliction_debuff) < TicksAdded(unstable_affliction_debuff) / 2 } or { Spellpower() > target.DebuffSpellpower(unstable_affliction_debuff) * 1.5 } or target.DebuffRemains(unstable_affliction_debuff) < CastTime(unstable_affliction) + GCD() } and True(miss_react) Spell(unstable_affliction)
+	#life_tap,if=buff.dark_soul.down&buff.bloodlust.down&mana.pct<50
+	if BuffExpires(dark_soul_misery_buff) and BuffExpires(burst_haste any=1) and ManaPercent() < 50 Spell(life_tap)
+	#malefic_grasp,chain=1,interrupt_if=target.health.pct<=20
+	Spell(malefic_grasp)
+	#life_tap,moving=1,if=mana.pct<80&mana.pct<target.health.pct
+	if Speed() > 0 and ManaPercent() < 80 and ManaPercent() < target.HealthPercent() Spell(life_tap)
+	#fel_flame,moving=1
+	if Speed() > 0 Spell(fel_flame)
+	#life_tap
+	Spell(life_tap)
+}
+
+AddFunction AfflictionPrecombatActions
+{
+	#flask,type=warm_sun
+	#food,type=mogu_fish_stew
+	#dark_intent,if=!aura.spell_power_multiplier.up
+	if not BuffPresent(spell_power_multiplier any=1) Spell(dark_intent)
+	#summon_pet,if=!talent.grimoire_of_sacrifice.enabled|buff.grimoire_of_sacrifice.down
+	if not TalentPoints(grimoire_of_sacrifice_talent) or BuffExpires(grimoire_of_sacrifice_buff) SummonPet()
+	#snapshot_stats
+	#grimoire_of_sacrifice,if=talent.grimoire_of_sacrifice.enabled
+	if pet.Present() and TalentPoints(grimoire_of_sacrifice_talent) Spell(grimoire_of_sacrifice)
+	#service_pet,if=talent.grimoire_of_service.enabled
+	if TalentPoints(grimoire_of_service_talent) ServicePet()
+	#jade_serpent_potion
+	UsePotionIntellect()
+}
+
+AddIcon mastery=affliction help=main
+{
+	if InCombat(no) AfflictionPrecombatActions()
+	AfflictionDefaultActions()
+}
+
+### Required symbols
+# agony
+# agony_debuff
+# archimondes_darkness_talent
+# berserking
+# corruption
+# corruption_debuff
+# curse_of_the_elements
+# dark_intent
+# dark_soul_misery
+# dark_soul_misery_buff
+# drain_soul
+# fel_flame
+# grimoire_of_sacrifice
+# grimoire_of_sacrifice_buff
+# grimoire_of_sacrifice_talent
+# grimoire_of_service_talent
+# haunt
+# haunt_debuff
+# jade_serpent_potion
+# life_tap
+# malefic_grasp
+# seed_of_corruption
+# seed_of_corruption_debuff
+# service_pet
+# soul_swap
+# soul_swap_buff
+# soulburn
+# soulburn_buff
+# soulburn_seed_of_corruption
+# soulburn_seed_of_corruption_debuff
+# spell_power_multiplier
+# summon_doomguard
+# summon_infernal
+# summon_pet
+# trinket_proc_intellect_buff
+# trinket_stacking_proc_intellect_buff
+# unstable_affliction
+# unstable_affliction_debuff
+]]
+	OvaleScripts:RegisterScript("WARLOCK", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_warlock_demonology_t16h.lua b/scripts/simulationcraft_warlock_demonology_t16h.lua
new file mode 100644
index 0000000..ba7c637
--- /dev/null
+++ b/scripts/simulationcraft_warlock_demonology_t16h.lua
@@ -0,0 +1,159 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+	local name = "SimulationCraft: Warlock_Demonology_T16H"
+	local desc = "[5.4] SimulationCraft: Warlock_Demonology_T16H"
+	local code = [[
+# Based on SimulationCraft profile "Warlock_Demonology_T16H".
+#	class=warlock
+#	spec=demonology
+#	talents=http://us.battle.net/wow/en/tool/talent-calculator#VZ!....10
+#	pet=felguard
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_warlock_spells)
+
+AddFunction DemonologyAoeActions
+{
+	#summon_infernal
+	Spell(summon_infernal)
+	#cancel_metamorphosis,if=buff.metamorphosis.up&dot.corruption.remains>10&demonic_fury<=650&buff.dark_soul.down&!dot.immolation_aura.ticking
+	if BuffPresent(metamorphosis_buff) and target.DebuffRemains(corruption_debuff) > 10 and DemonicFury() <= 650 and BuffExpires(dark_soul_knowledge_buff) and not target.DebuffPresent(immolation_aura_debuff) Spell(cancel_metamorphosis)
+	#immolation_aura,if=buff.metamorphosis.up
+	if BuffPresent(metamorphosis_buff) Spell(immolation_aura)
+	#void_ray,if=buff.metamorphosis.up&dot.corruption.remains<10
+	if BuffPresent(metamorphosis_buff) and target.DebuffRemains(corruption_debuff) < 10 Spell(void_ray)
+	#doom,cycle_targets=1,if=buff.metamorphosis.up&(!ticking|remains<tick_time|(ticks_remain+1<n_ticks&buff.dark_soul.up))&target.time_to_die>=30&miss_react
+	if BuffPresent(metamorphosis_buff) and { not target.DebuffPresent(doom_debuff) or target.DebuffRemains(doom_debuff) < target.TickTime(doom_debuff) or { target.TicksRemain(doom_debuff) + 1 < target.Ticks(doom_debuff) and BuffPresent(dark_soul_knowledge_buff) } } and target.TimeToDie() >= 30 and True(miss_react) Spell(doom)
+	#void_ray,if=buff.metamorphosis.up
+	if BuffPresent(metamorphosis_buff) Spell(void_ray)
+	#corruption,cycle_targets=1,if=!ticking&target.time_to_die>30&miss_react
+	if not target.DebuffPresent(corruption_debuff) and target.TimeToDie() > 30 and True(miss_react) Spell(corruption)
+	#hand_of_guldan
+	Spell(hand_of_guldan)
+	#metamorphosis,if=dot.corruption.remains<10|buff.dark_soul.up|demonic_fury>=950|demonic_fury%32>target.time_to_die
+	if target.DebuffRemains(corruption_debuff) < 10 or BuffPresent(dark_soul_knowledge_buff) or DemonicFury() >= 950 or DemonicFury() / 32 > target.TimeToDie() Spell(metamorphosis)
+	#hellfire,chain=1,interrupt=1
+	Spell(hellfire)
+	#life_tap
+	Spell(life_tap)
+}
+
+AddFunction DemonologyDefaultActions
+{
+	#curse_of_the_elements,if=debuff.magic_vulnerability.down
+	if target.DebuffExpires(magic_vulnerability any=1) Spell(curse_of_the_elements)
+	#use_item,name=gloves_of_the_horned_nightmare
+	UseItemActions()
+	#jade_serpent_potion,if=buff.bloodlust.react|target.health.pct<=20
+	if BuffPresent(burst_haste any=1) or target.HealthPercent() <= 20 UsePotionIntellect()
+	#berserking
+	Spell(berserking)
+	#dark_soul,if=!talent.archimondes_darkness.enabled|(talent.archimondes_darkness.enabled&(charges=2|trinket.proc.intellect.react|trinket.stacking_proc.intellect.react|target.health.pct<=10))
+	if not TalentPoints(archimondes_darkness_talent) or { TalentPoints(archimondes_darkness_talent) and { Charges(dark_soul_knowledge) == 2 or BuffPresent(trinket_proc_intellect_buff) or BuffStacks(trinket_stacking_proc_intellect_buff) or target.HealthPercent() <= 10 } } Spell(dark_soul_knowledge)
+	#service_pet,if=talent.grimoire_of_service.enabled
+	if TalentPoints(grimoire_of_service_talent) ServicePet()
+	#felguard:felstorm
+	Spell(felguard_felstorm)
+	#wrathguard:wrathstorm
+	Spell(wrathguard_wrathstorm)
+	#run_action_list,name=aoe,if=active_enemies>4
+	if Enemies() > 4 DemonologyAoeActions()
+	#summon_doomguard
+	Spell(summon_doomguard)
+	#doom,cycle_targets=1,if=buff.metamorphosis.up&(ticks_remain<=1|(ticks_remain+1<n_ticks&buff.dark_soul.up)|(ticks_remain<=add_ticks%2&stat.spell_power>spell_power))&target.time_to_die>=30&miss_react
+	if BuffPresent(metamorphosis_buff) and { target.TicksRemain(doom_debuff) <= 1 or { target.TicksRemain(doom_debuff) + 1 < target.Ticks(doom_debuff) and BuffPresent(dark_soul_knowledge_buff) } or { target.TicksRemain(doom_debuff) <= TicksAdded(doom_debuff) / 2 and Spellpower() > target.DebuffSpellpower(doom_debuff) } } and target.TimeToDie() >= 30 and True(miss_react) Spell(doom)
+	#cancel_metamorphosis,if=buff.metamorphosis.up&buff.dark_soul.down&demonic_fury<=650&target.time_to_die>30&(cooldown.metamorphosis.remains<4|demonic_fury<=300)&!(action.hand_of_guldan.in_flight&dot.shadowflame.remains)
+	if BuffPresent(metamorphosis_buff) and BuffExpires(dark_soul_knowledge_buff) and DemonicFury() <= 650 and target.TimeToDie() > 30 and { SpellCooldown(metamorphosis) < 4 or DemonicFury() <= 300 } and not { InFlightToTarget(hand_of_guldan) and target.DebuffRemains(shadowflame_debuff) } Spell(cancel_metamorphosis)
+	#soul_fire,if=buff.metamorphosis.up&buff.molten_core.react&(buff.dark_soul.remains<action.shadow_bolt.cast_time|buff.dark_soul.remains>cast_time)
+	if BuffPresent(metamorphosis_buff) and BuffPresent(molten_core_buff) and { BuffRemains(dark_soul_knowledge_buff) < CastTime(shadow_bolt) or BuffRemains(dark_soul_knowledge_buff) > CastTime(soul_fire) } Spell(soul_fire)
+	#touch_of_chaos,if=buff.metamorphosis.up
+	if BuffPresent(metamorphosis_buff) Spell(touch_of_chaos)
+	#metamorphosis,if=(buff.dark_soul.up&buff.dark_soul.remains<demonic_fury%32)|demonic_fury>=950|demonic_fury%32>target.time_to_die|(action.hand_of_guldan.in_flight&dot.shadowflame.remains)
+	if { BuffPresent(dark_soul_knowledge_buff) and BuffRemains(dark_soul_knowledge_buff) < DemonicFury() / 32 } or DemonicFury() >= 950 or DemonicFury() / 32 > target.TimeToDie() or { InFlightToTarget(hand_of_guldan) and target.DebuffRemains(shadowflame_debuff) } Spell(metamorphosis)
+	#corruption,cycle_targets=1,if=!ticking&target.time_to_die>=6&miss_react
+	if not target.DebuffPresent(corruption_debuff) and target.TimeToDie() >= 6 and True(miss_react) Spell(corruption)
+	#corruption,cycle_targets=1,if=spell_power<stat.spell_power&ticks_remain<=add_ticks%2&target.time_to_die>=6&miss_react
+	if target.DebuffSpellpower(corruption_debuff) < Spellpower() and target.TicksRemain(corruption_debuff) <= TicksAdded(corruption_debuff) / 2 and target.TimeToDie() >= 6 and True(miss_react) Spell(corruption)
+	#hand_of_guldan,if=!in_flight&dot.shadowflame.remains<travel_time+action.shadow_bolt.cast_time&(charges=2|dot.shadowflame.remains>travel_time|(charges=1&recharge_time<4))
+	if not InFlightToTarget(hand_of_guldan) and target.DebuffRemains(shadowflame_debuff) < 0.5 + CastTime(shadow_bolt) and { Charges(hand_of_guldan) == 2 or target.DebuffRemains(shadowflame_debuff) > 0.5 or { Charges(hand_of_guldan) == 1 and SpellChargeCooldown(hand_of_guldan) < 4 } } Spell(hand_of_guldan)
+	#soul_fire,if=buff.molten_core.react&(buff.dark_soul.remains<action.shadow_bolt.cast_time|buff.dark_soul.remains>cast_time)&(buff.molten_core.react>9|target.health.pct<=28)
+	if BuffPresent(molten_core_buff) and { BuffRemains(dark_soul_knowledge_buff) < CastTime(shadow_bolt) or BuffRemains(dark_soul_knowledge_buff) > CastTime(soul_fire) } and { BuffPresent(molten_core_buff) > 9 or target.HealthPercent() <= 28 } Spell(soul_fire)
+	#life_tap,if=mana.pct<60
+	if ManaPercent() < 60 Spell(life_tap)
+	#shadow_bolt
+	Spell(shadow_bolt)
+	#fel_flame,moving=1
+	if Speed() > 0 Spell(fel_flame)
+	#life_tap
+	Spell(life_tap)
+}
+
+AddFunction DemonologyPrecombatActions
+{
+	#flask,type=warm_sun
+	#food,type=mogu_fish_stew
+	#dark_intent,if=!aura.spell_power_multiplier.up
+	if not BuffPresent(spell_power_multiplier any=1) Spell(dark_intent)
+	#summon_pet,if=!talent.grimoire_of_sacrifice.enabled|buff.grimoire_of_sacrifice.down
+	if not TalentPoints(grimoire_of_sacrifice_talent) or BuffExpires(grimoire_of_sacrifice_buff) SummonPet()
+	#snapshot_stats
+	#grimoire_of_sacrifice,if=talent.grimoire_of_sacrifice.enabled
+	if pet.Present() and TalentPoints(grimoire_of_sacrifice_talent) Spell(grimoire_of_sacrifice)
+	#service_pet,if=talent.grimoire_of_service.enabled
+	if TalentPoints(grimoire_of_service_talent) ServicePet()
+	#jade_serpent_potion
+	UsePotionIntellect()
+}
+
+AddIcon mastery=demonology help=main
+{
+	if InCombat(no) DemonologyPrecombatActions()
+	DemonologyDefaultActions()
+}
+
+### Required symbols
+# archimondes_darkness_talent
+# berserking
+# cancel_metamorphosis
+# corruption
+# corruption_debuff
+# curse_of_the_elements
+# dark_intent
+# dark_soul_knowledge
+# dark_soul_knowledge_buff
+# doom
+# doom_debuff
+# fel_flame
+# felguard_felstorm
+# grimoire_of_sacrifice
+# grimoire_of_sacrifice_buff
+# grimoire_of_sacrifice_talent
+# grimoire_of_service_talent
+# hand_of_guldan
+# hellfire
+# immolation_aura
+# immolation_aura_debuff
+# jade_serpent_potion
+# life_tap
+# metamorphosis
+# metamorphosis_buff
+# molten_core_buff
+# service_pet
+# shadow_bolt
+# shadowflame_debuff
+# soul_fire
+# spell_power_multiplier
+# summon_doomguard
+# summon_infernal
+# summon_pet
+# touch_of_chaos
+# trinket_proc_intellect_buff
+# trinket_stacking_proc_intellect_buff
+# void_ray
+# wrathguard_wrathstorm
+]]
+	OvaleScripts:RegisterScript("WARLOCK", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_warlock_destruction_t16h.lua b/scripts/simulationcraft_warlock_destruction_t16h.lua
new file mode 100644
index 0000000..6fd190a
--- /dev/null
+++ b/scripts/simulationcraft_warlock_destruction_t16h.lua
@@ -0,0 +1,136 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+	local name = "SimulationCraft: Warlock_Destruction_T16H"
+	local desc = "[5.4] SimulationCraft: Warlock_Destruction_T16H"
+	local code = [[
+# Based on SimulationCraft profile "Warlock_Destruction_T16H".
+#	class=warlock
+#	spec=destruction
+#	talents=http://us.battle.net/wow/en/tool/talent-calculator#Vb!....20
+#	pet=felhunter
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_warlock_spells)
+
+AddFunction DestructionAoeActions
+{
+	#summon_infernal
+	Spell(summon_infernal)
+	#rain_of_fire,if=!ticking&!in_flight
+	if not target.DebuffPresent(rain_of_fire_aftermath_debuff) and not InFlightToTarget(rain_of_fire_aftermath) Spell(rain_of_fire_aftermath)
+	#fire_and_brimstone,if=ember_react&buff.fire_and_brimstone.down
+	if BurningEmbers() >= 10 and BuffExpires(fire_and_brimstone_buff) Spell(fire_and_brimstone)
+	#immolate,if=buff.fire_and_brimstone.up&!ticking
+	if BuffPresent(fire_and_brimstone_buff) and not target.DebuffPresent(immolate_debuff) Spell(immolate)
+	#conflagrate,if=buff.fire_and_brimstone.up
+	if BuffPresent(fire_and_brimstone_buff) Spell(conflagrate)
+	#incinerate,if=buff.fire_and_brimstone.up
+	if BuffPresent(fire_and_brimstone_buff) Spell(incinerate)
+	#incinerate
+	Spell(incinerate)
+}
+
+AddFunction DestructionDefaultActions
+{
+	#curse_of_the_elements,if=debuff.magic_vulnerability.down
+	if target.DebuffExpires(magic_vulnerability any=1) Spell(curse_of_the_elements)
+	#use_item,name=gloves_of_the_horned_nightmare
+	UseItemActions()
+	#jade_serpent_potion,if=buff.bloodlust.react|target.health.pct<=20
+	if BuffPresent(burst_haste any=1) or target.HealthPercent() <= 20 UsePotionIntellect()
+	#berserking
+	Spell(berserking)
+	#dark_soul,if=!talent.archimondes_darkness.enabled|(talent.archimondes_darkness.enabled&(charges=2|trinket.proc.intellect.react|trinket.stacking_proc.intellect.react|target.health.pct<=10))
+	if not TalentPoints(archimondes_darkness_talent) or { TalentPoints(archimondes_darkness_talent) and { Charges(dark_soul_instability) == 2 or BuffPresent(trinket_proc_intellect_buff) or BuffStacks(trinket_stacking_proc_intellect_buff) or target.HealthPercent() <= 10 } } Spell(dark_soul_instability)
+	#service_pet,if=talent.grimoire_of_service.enabled
+	if TalentPoints(grimoire_of_service_talent) ServicePet()
+	#run_action_list,name=aoe,if=active_enemies>3
+	if Enemies() > 3 DestructionAoeActions()
+	#summon_doomguard
+	Spell(summon_doomguard)
+	#rain_of_fire,if=!ticking&!in_flight&active_enemies>1
+	if not target.DebuffPresent(rain_of_fire_aftermath_debuff) and not InFlightToTarget(rain_of_fire_aftermath) and Enemies() > 1 Spell(rain_of_fire_aftermath)
+	#havoc,target=2,if=active_enemies>1
+	if Enemies() > 1 Spell(havoc)
+	#shadowburn,if=ember_react&(burning_ember>3.5|mana.pct<=20|target.time_to_die<20|buff.havoc.stack>=1|trinket.proc.intellect.react|(trinket.stacking_proc.intellect.remains<cast_time*4&trinket.stacking_proc.intellect.remains>cast_time))
+	if BurningEmbers() >= 10 and { BurningEmbers() / 10 > 3.5 or ManaPercent() <= 20 or target.TimeToDie() < 20 or DebuffStacksOnAny(havoc_debuff) >= 1 or BuffPresent(trinket_proc_intellect_buff) or { BuffRemains(trinket_stacking_proc_intellect_buff) < CastTime(shadowburn) * 4 and BuffRemains(trinket_stacking_proc_intellect_buff) > CastTime(shadowburn) } } Spell(shadowburn)
+	#immolate,cycle_targets=1,if=n_ticks*crit_pct_current>3*dot.immolate.ticks_remain*dot.immolate.crit_pct&miss_react
+	if target.Ticks(immolate_debuff) * SpellCritChance() > 3 * target.TicksRemain(immolate_debuff) * target.DebuffSpellCritChance(immolate_debuff) and True(miss_react) Spell(immolate)
+	#conflagrate,if=charges=2&buff.havoc.stack=0
+	if Charges(conflagrate) == 2 and DebuffStacksOnAny(havoc_debuff) == 0 Spell(conflagrate)
+	#rain_of_fire,if=!ticking&!in_flight,moving=1
+	if Speed() > 0 and not target.DebuffPresent(rain_of_fire_aftermath_debuff) and not InFlightToTarget(rain_of_fire_aftermath) Spell(rain_of_fire_aftermath)
+	#chaos_bolt,if=ember_react&target.health.pct>20&(buff.backdraft.stack<3|level<86|(active_enemies>1&action.incinerate.cast_time<1))&(burning_ember>(4.5-active_enemies)|buff.skull_banner.remains>cast_time|(trinket.proc.intellect.react&trinket.proc.intellect.remains>cast_time)|(trinket.stacking_proc.intellect.remains<cast_time*2.5&trinket.stacking_proc.intellect.remains>cast_time))
+	if BurningEmbers() >= 10 and target.HealthPercent() > 20 and { BuffStacks(backdraft_buff) < 3 or Level() < 86 or { Enemies() > 1 and CastTime(incinerate) < 1 } } and { BurningEmbers() / 10 > { 4.5 - Enemies() } or BuffRemains(skull_banner_buff) > CastTime(chaos_bolt) or { BuffPresent(trinket_proc_intellect_buff) and BuffRemains(trinket_proc_intellect_buff) > CastTime(chaos_bolt) } or { BuffRemains(trinket_stacking_proc_intellect_buff) < CastTime(chaos_bolt) * 2.5 and BuffRemains(trinket_stacking_proc_intellect_buff) > CastTime(chaos_bolt) } } Spell(chaos_bolt)
+	#chaos_bolt,if=ember_react&target.health.pct>20&(buff.havoc.stack=3&buff.havoc.remains>cast_time)
+	if BurningEmbers() >= 10 and target.HealthPercent() > 20 and { DebuffStacksOnAny(havoc_debuff) == 3 and DebuffRemainsOnAny(havoc_debuff) > CastTime(chaos_bolt) } Spell(chaos_bolt)
+	#conflagrate
+	Spell(conflagrate)
+	#incinerate
+	Spell(incinerate)
+	#fel_flame,moving=1
+	if Speed() > 0 Spell(fel_flame)
+}
+
+AddFunction DestructionPrecombatActions
+{
+	#flask,type=warm_sun
+	#food,type=mogu_fish_stew
+	#dark_intent,if=!aura.spell_power_multiplier.up
+	if not BuffPresent(spell_power_multiplier any=1) Spell(dark_intent)
+	#summon_pet,if=!talent.grimoire_of_sacrifice.enabled|buff.grimoire_of_sacrifice.down
+	if not TalentPoints(grimoire_of_sacrifice_talent) or BuffExpires(grimoire_of_sacrifice_buff) SummonPet()
+	#snapshot_stats
+	#grimoire_of_sacrifice,if=talent.grimoire_of_sacrifice.enabled
+	if pet.Present() and TalentPoints(grimoire_of_sacrifice_talent) Spell(grimoire_of_sacrifice)
+	#service_pet,if=talent.grimoire_of_service.enabled
+	if TalentPoints(grimoire_of_service_talent) ServicePet()
+	#jade_serpent_potion
+	UsePotionIntellect()
+}
+
+AddIcon mastery=destruction help=main
+{
+	if InCombat(no) DestructionPrecombatActions()
+	DestructionDefaultActions()
+}
+
+### Required symbols
+# archimondes_darkness_talent
+# backdraft_buff
+# berserking
+# chaos_bolt
+# conflagrate
+# curse_of_the_elements
+# dark_intent
+# dark_soul_instability
+# fel_flame
+# fire_and_brimstone
+# fire_and_brimstone_buff
+# grimoire_of_sacrifice
+# grimoire_of_sacrifice_buff
+# grimoire_of_sacrifice_talent
+# grimoire_of_service_talent
+# havoc
+# havoc_debuff
+# immolate
+# immolate_debuff
+# incinerate
+# jade_serpent_potion
+# rain_of_fire_aftermath
+# rain_of_fire_aftermath_debuff
+# service_pet
+# shadowburn
+# skull_banner_buff
+# spell_power_multiplier
+# summon_doomguard
+# summon_infernal
+# summon_pet
+# trinket_proc_intellect_buff
+# trinket_stacking_proc_intellect_buff
+]]
+	OvaleScripts:RegisterScript("WARLOCK", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_warrior_arms_t16h.lua b/scripts/simulationcraft_warrior_arms_t16h.lua
new file mode 100644
index 0000000..dd23396
--- /dev/null
+++ b/scripts/simulationcraft_warrior_arms_t16h.lua
@@ -0,0 +1,171 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+	local name = "SimulationCraft: Warrior_Arms_T16H"
+	local desc = "[5.4] SimulationCraft: Warrior_Arms_T16H"
+	local code = [[
+# Based on SimulationCraft profile "Warrior_Arms_T16H".
+#	class=warrior
+#	spec=arms
+#	talents=http://us.battle.net/wow/en/tool/talent-calculator#Za!122011
+#	glyphs=unending_rage/death_from_above/sweeping_strikes/resonating_power
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_warrior_spells)
+
+AddFunction ArmsAoeActions
+{
+	#sweeping_strikes
+	Spell(sweeping_strikes)
+	#cleave,if=rage>110&active_enemies<=4
+	if Rage() > 110 and Enemies() <= 4 Spell(cleave)
+	#bladestorm,if=enabled&(buff.bloodbath.up|!talent.bloodbath.enabled)
+	if TalentPoints(bladestorm_talent) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } Spell(bladestorm)
+	#dragon_roar,if=enabled&debuff.colossus_smash.down
+	if TalentPoints(dragon_roar_talent) and target.DebuffExpires(colossus_smash_debuff) Spell(dragon_roar)
+	#colossus_smash,if=debuff.colossus_smash.remains<1
+	if target.DebuffRemains(colossus_smash_debuff) < 1 Spell(colossus_smash)
+	#thunder_clap,target=2,if=dot.deep_wounds.attack_power*1.1<stat.attack_power
+	if target.DebuffAttackPower(deep_wounds_debuff) * 1.1 < AttackPower() Spell(thunder_clap)
+	#mortal_strike,if=active_enemies=2|rage<50
+	if Enemies() == 2 or Rage() < 50 Spell(mortal_strike)
+	#execute,if=buff.sudden_execute.down&active_enemies=2
+	if BuffExpires(sudden_execute_buff) and Enemies() == 2 Spell(execute)
+	#slam,if=buff.sweeping_strikes.up&debuff.colossus_smash.up
+	if BuffPresent(sweeping_strikes_buff) and target.DebuffPresent(colossus_smash_debuff) Spell(slam)
+	#overpower,if=active_enemies=2
+	if Enemies() == 2 Spell(overpower)
+	#slam,if=buff.sweeping_strikes.up
+	if BuffPresent(sweeping_strikes_buff) Spell(slam)
+	#battle_shout
+	Spell(battle_shout)
+}
+
+AddFunction ArmsSingleTargetActions
+{
+	#heroic_strike,if=rage>115|(debuff.colossus_smash.up&rage>60&set_bonus.tier16_2pc_melee)
+	if Rage() > 115 or { target.DebuffPresent(colossus_smash_debuff) and Rage() > 60 and ArmorSetBonus(T16_melee 2) } Spell(heroic_strike)
+	#mortal_strike,if=dot.deep_wounds.remains<1.0|buff.enrage.down|rage<10
+	if target.DebuffRemains(deep_wounds_debuff) < 1 or BuffExpires(enrage_buff) or Rage() < 10 Spell(mortal_strike)
+	#colossus_smash,if=debuff.colossus_smash.remains<1.0
+	if target.DebuffRemains(colossus_smash_debuff) < 1 Spell(colossus_smash)
+	#bladestorm,if=enabled,interrupt_if=!cooldown.colossus_smash.remains
+	if TalentPoints(bladestorm_talent) Spell(bladestorm)
+	#mortal_strike
+	Spell(mortal_strike)
+	#storm_bolt,if=enabled&debuff.colossus_smash.up
+	if TalentPoints(storm_bolt_talent) and target.DebuffPresent(colossus_smash_debuff) Spell(storm_bolt)
+	#dragon_roar,if=enabled&debuff.colossus_smash.down
+	if TalentPoints(dragon_roar_talent) and target.DebuffExpires(colossus_smash_debuff) Spell(dragon_roar)
+	#execute,if=buff.sudden_execute.down|buff.taste_for_blood.down|rage>90|target.time_to_die<12
+	if BuffExpires(sudden_execute_buff) or BuffExpires(taste_for_blood_buff) or Rage() > 90 or target.TimeToDie() < 12 Spell(execute)
+	#slam,if=target.health.pct>=20&(trinket.stacking_stat.crit.stack>=10|buff.recklessness.up)
+	if target.HealthPercent() >= 20 and { BuffStacks(trinket_stacking_stat_crit_buff) >= 10 or BuffPresent(recklessness_buff) } Spell(slam)
+	#overpower,if=target.health.pct>=20&rage<100|buff.sudden_execute.up
+	if target.HealthPercent() >= 20 and Rage() < 100 or BuffPresent(sudden_execute_buff) Spell(overpower)
+	#execute
+	Spell(execute)
+	#slam,if=target.health.pct>=20
+	if target.HealthPercent() >= 20 Spell(slam)
+	#heroic_throw
+	Spell(heroic_throw)
+	#battle_shout
+	Spell(battle_shout)
+}
+
+AddFunction ArmsDefaultActions
+{
+	#auto_attack
+	#mogu_power_potion,if=(target.health.pct<20&buff.recklessness.up)|buff.bloodlust.react|target.time_to_die<=25
+	if { target.HealthPercent() < 20 and BuffPresent(recklessness_buff) } or BuffPresent(burst_haste any=1) or target.TimeToDie() <= 25 UsePotionStrength()
+	#recklessness,if=!talent.bloodbath.enabled&((cooldown.colossus_smash.remains<2|debuff.colossus_smash.remains>=5)&(target.time_to_die>(192*buff.cooldown_reduction.value)|target.health.pct<20))|buff.bloodbath.up&(target.time_to_die>(192*buff.cooldown_reduction.value)|target.health.pct<20)|target.time_to_die<=12
+	if not TalentPoints(bloodbath_talent) and { { SpellCooldown(colossus_smash) < 2 or target.DebuffRemains(colossus_smash_debuff) >= 5 } and { target.TimeToDie() > { 192 * BuffAmount(cooldown_reduction_strength_buff) } or target.HealthPercent() < 20 } } or BuffPresent(bloodbath_buff) and { target.TimeToDie() > { 192 * BuffAmount(cooldown_reduction_strength_buff) } or target.HealthPercent() < 20 } or target.TimeToDie() <= 12 Spell(recklessness)
+	#avatar,if=enabled&(buff.recklessness.up|target.time_to_die<=25)
+	if TalentPoints(avatar_talent) and { BuffPresent(recklessness_buff) or target.TimeToDie() <= 25 } Spell(avatar)
+	#skull_banner,if=buff.skull_banner.down&(((cooldown.colossus_smash.remains<2|debuff.colossus_smash.remains>=5)&target.time_to_die>192&buff.cooldown_reduction.up)|buff.recklessness.up)
+	if BuffExpires(skull_banner_buff) and { { { SpellCooldown(colossus_smash) < 2 or target.DebuffRemains(colossus_smash_debuff) >= 5 } and target.TimeToDie() > 192 and BuffPresent(cooldown_reduction_strength_buff) } or BuffPresent(recklessness_buff) } Spell(skull_banner)
+	#use_item,slot=hands,if=!talent.bloodbath.enabled&debuff.colossus_smash.up|buff.bloodbath.up
+	if not TalentPoints(bloodbath_talent) and target.DebuffPresent(colossus_smash_debuff) or BuffPresent(bloodbath_buff) UseItemActions()
+	#blood_fury,if=buff.cooldown_reduction.down&(buff.bloodbath.up|(!talent.bloodbath.enabled&debuff.colossus_smash.up))|buff.cooldown_reduction.up&buff.recklessness.up
+	if BuffExpires(cooldown_reduction_strength_buff) and { BuffPresent(bloodbath_buff) or { not TalentPoints(bloodbath_talent) and target.DebuffPresent(colossus_smash_debuff) } } or BuffPresent(cooldown_reduction_strength_buff) and BuffPresent(recklessness_buff) Spell(blood_fury)
+	#berserking,if=buff.cooldown_reduction.down&(buff.bloodbath.up|(!talent.bloodbath.enabled&debuff.colossus_smash.up))|buff.cooldown_reduction.up&buff.recklessness.up
+	if BuffExpires(cooldown_reduction_strength_buff) and { BuffPresent(bloodbath_buff) or { not TalentPoints(bloodbath_talent) and target.DebuffPresent(colossus_smash_debuff) } } or BuffPresent(cooldown_reduction_strength_buff) and BuffPresent(recklessness_buff) Spell(berserking)
+	#arcane_torrent,if=buff.cooldown_reduction.down&(buff.bloodbath.up|(!talent.bloodbath.enabled&debuff.colossus_smash.up))|buff.cooldown_reduction.up&buff.recklessness.up
+	if BuffExpires(cooldown_reduction_strength_buff) and { BuffPresent(bloodbath_buff) or { not TalentPoints(bloodbath_talent) and target.DebuffPresent(colossus_smash_debuff) } } or BuffPresent(cooldown_reduction_strength_buff) and BuffPresent(recklessness_buff) Spell(arcane_torrent)
+	#bloodbath,if=enabled&(debuff.colossus_smash.remains>0.1|cooldown.colossus_smash.remains<5|target.time_to_die<=20)
+	if TalentPoints(bloodbath_talent) and { target.DebuffRemains(colossus_smash_debuff) > 0.1 or SpellCooldown(colossus_smash) < 5 or target.TimeToDie() <= 20 } Spell(bloodbath)
+	#berserker_rage,if=buff.enrage.remains<0.5
+	if BuffRemains(enrage_buff) < 0.5 Spell(berserker_rage)
+	#heroic_leap,if=debuff.colossus_smash.up
+	if target.DebuffPresent(colossus_smash_debuff) Spell(heroic_leap)
+	#run_action_list,name=aoe,if=active_enemies>=2
+	if Enemies() >= 2 ArmsAoeActions()
+	#run_action_list,name=single_target,if=active_enemies<2
+	if Enemies() < 2 ArmsSingleTargetActions()
+}
+
+AddFunction ArmsPrecombatActions
+{
+	#flask,type=winters_bite
+	#food,type=black_pepper_ribs_and_shrimp
+	#snapshot_stats
+	#stance,choose=battle
+	if not Stance(warrior_battle_stance) Spell(battle_stance)
+	#battle_shout
+	Spell(battle_shout)
+	#mogu_power_potion
+	UsePotionStrength()
+}
+
+AddIcon mastery=arms help=main
+{
+	if InCombat(no) ArmsPrecombatActions()
+	ArmsDefaultActions()
+}
+
+### Required symbols
+# arcane_torrent
+# avatar
+# avatar_talent
+# battle_shout
+# berserker_rage
+# berserking
+# bladestorm
+# bladestorm_talent
+# blood_fury
+# bloodbath
+# bloodbath_buff
+# bloodbath_talent
+# cleave
+# colossus_smash
+# colossus_smash_debuff
+# cooldown_reduction_strength_buff
+# deep_wounds_debuff
+# dragon_roar
+# dragon_roar_talent
+# enrage_buff
+# execute
+# heroic_leap
+# heroic_strike
+# heroic_throw
+# mogu_power_potion
+# mortal_strike
+# overpower
+# recklessness
+# recklessness_buff
+# skull_banner
+# skull_banner_buff
+# slam
+# storm_bolt
+# storm_bolt_talent
+# sudden_execute_buff
+# sweeping_strikes
+# sweeping_strikes_buff
+# taste_for_blood_buff
+# thunder_clap
+# trinket_stacking_stat_crit_buff
+]]
+	OvaleScripts:RegisterScript("WARRIOR", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_warrior_fury_1h_t16h.lua b/scripts/simulationcraft_warrior_fury_1h_t16h.lua
new file mode 100644
index 0000000..2c64170
--- /dev/null
+++ b/scripts/simulationcraft_warrior_fury_1h_t16h.lua
@@ -0,0 +1,272 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+	local name = "SimulationCraft: Warrior_Fury_1h_T16H"
+	local desc = "[5.4] SimulationCraft: Warrior_Fury_1h_T16H"
+	local code = [[
+# Based on SimulationCraft profile "Warrior_Fury_1h_T16H".
+#	class=warrior
+#	spec=fury
+#	talents=http://us.battle.net/wow/en/tool/talent-calculator#ZZ!122212
+#	glyphs=unending_rage/death_from_above/bull_rush
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_warrior_spells)
+
+AddFunction FurySingleTargetActions
+{
+	#bloodbath,if=enabled&(cooldown.colossus_smash.remains<2|debuff.colossus_smash.remains>=5|target.time_to_die<=20)
+	if TalentPoints(bloodbath_talent) and { SpellCooldown(colossus_smash) < 2 or target.DebuffRemains(colossus_smash_debuff) >= 5 or target.TimeToDie() <= 20 } Spell(bloodbath)
+	#berserker_rage,if=buff.enrage.remains<1&cooldown.bloodthirst.remains>1
+	if BuffRemains(enrage_buff) < 1 and SpellCooldown(bloodthirst) > 1 Spell(berserker_rage)
+	#heroic_strike,if=((debuff.colossus_smash.up&rage>=40)&target.health.pct>=20)|rage>=100&buff.enrage.up
+	if { { target.DebuffPresent(colossus_smash_debuff) and Rage() >= 40 } and target.HealthPercent() >= 20 } or Rage() >= 100 and BuffPresent(enrage_buff) Spell(heroic_strike)
+	#heroic_leap,if=debuff.colossus_smash.up
+	if target.DebuffPresent(colossus_smash_debuff) Spell(heroic_leap)
+	#storm_bolt,if=enabled&buff.cooldown_reduction.up&debuff.colossus_smash.up
+	if TalentPoints(storm_bolt_talent) and BuffPresent(cooldown_reduction_strength_buff) and target.DebuffPresent(colossus_smash_debuff) Spell(storm_bolt)
+	#raging_blow,if=buff.raging_blow.stack=2&debuff.colossus_smash.up&target.health.pct>=20
+	if BuffStacks(raging_blow_buff) == 2 and target.DebuffPresent(colossus_smash_debuff) and target.HealthPercent() >= 20 Spell(raging_blow)
+	#storm_bolt,if=enabled&buff.cooldown_reduction.down&debuff.colossus_smash.up
+	if TalentPoints(storm_bolt_talent) and BuffExpires(cooldown_reduction_strength_buff) and target.DebuffPresent(colossus_smash_debuff) Spell(storm_bolt)
+	#bloodthirst,if=!(target.health.pct<20&debuff.colossus_smash.up&rage>=30&buff.enrage.up)
+	if not { target.HealthPercent() < 20 and target.DebuffPresent(colossus_smash_debuff) and Rage() >= 30 and BuffPresent(enrage_buff) } Spell(bloodthirst)
+	#wild_strike,if=buff.bloodsurge.react&target.health.pct>=20&cooldown.bloodthirst.remains<=1
+	if BuffPresent(bloodsurge_buff) and target.HealthPercent() >= 20 and SpellCooldown(bloodthirst) <= 1 Spell(wild_strike)
+	#wait,sec=cooldown.bloodthirst.remains,if=!(target.health.pct<20&debuff.colossus_smash.up&rage>=30&buff.enrage.up)&cooldown.bloodthirst.remains<=1
+	if not { target.HealthPercent() < 20 and target.DebuffPresent(colossus_smash_debuff) and Rage() >= 30 and BuffPresent(enrage_buff) } and SpellCooldown(bloodthirst) <= 1 wait Spell(bloodthirst)
+	#dragon_roar,if=enabled&(!debuff.colossus_smash.up&(buff.bloodbath.up|!talent.bloodbath.enabled))
+	if TalentPoints(dragon_roar_talent) and { not target.DebuffPresent(colossus_smash_debuff) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } } Spell(dragon_roar)
+	#colossus_smash
+	Spell(colossus_smash)
+	#storm_bolt,if=enabled&buff.cooldown_reduction.down
+	if TalentPoints(storm_bolt_talent) and BuffExpires(cooldown_reduction_strength_buff) Spell(storm_bolt)
+	#execute,if=debuff.colossus_smash.up|rage>70|target.time_to_die<12
+	if target.DebuffPresent(colossus_smash_debuff) or Rage() > 70 or target.TimeToDie() < 12 Spell(execute)
+	#raging_blow,if=target.health.pct<20|buff.raging_blow.stack=2|(debuff.colossus_smash.up|(cooldown.bloodthirst.remains>=1&buff.raging_blow.remains<=3))
+	if target.HealthPercent() < 20 or BuffStacks(raging_blow_buff) == 2 or { target.DebuffPresent(colossus_smash_debuff) or { SpellCooldown(bloodthirst) >= 1 and BuffRemains(raging_blow_buff) <= 3 } } Spell(raging_blow)
+	#bladestorm,if=enabled
+	if TalentPoints(bladestorm_talent) Spell(bladestorm)
+	#wild_strike,if=buff.bloodsurge.up
+	if BuffPresent(bloodsurge_buff) Spell(wild_strike)
+	#raging_blow,if=cooldown.colossus_smash.remains>=3
+	if SpellCooldown(colossus_smash) >= 3 Spell(raging_blow)
+	#shattering_throw,if=cooldown.colossus_smash.remains>5
+	if SpellCooldown(colossus_smash) > 5 Spell(shattering_throw)
+	#shockwave,if=enabled
+	if TalentPoints(shockwave_talent) Spell(shockwave)
+	#heroic_throw,if=debuff.colossus_smash.down&rage<60
+	if target.DebuffExpires(colossus_smash_debuff) and Rage() < 60 Spell(heroic_throw)
+	#battle_shout,if=rage<70&!debuff.colossus_smash.up
+	if Rage() < 70 and not target.DebuffPresent(colossus_smash_debuff) Spell(battle_shout)
+	#wild_strike,if=debuff.colossus_smash.up&target.health.pct>=20
+	if target.DebuffPresent(colossus_smash_debuff) and target.HealthPercent() >= 20 Spell(wild_strike)
+	#battle_shout,if=rage<70
+	if Rage() < 70 Spell(battle_shout)
+	#wild_strike,if=cooldown.colossus_smash.remains>=2&rage>=70&target.health.pct>=20
+	if SpellCooldown(colossus_smash) >= 2 and Rage() >= 70 and target.HealthPercent() >= 20 Spell(wild_strike)
+	#impending_victory,if=enabled&target.health.pct>=20&cooldown.colossus_smash.remains>=2
+	if TalentPoints(impending_victory_talent) and target.HealthPercent() >= 20 and SpellCooldown(colossus_smash) >= 2 Spell(impending_victory)
+}
+
+AddFunction FuryDefaultActions
+{
+	#auto_attack
+	#mogu_power_potion,if=(target.health.pct<20&buff.recklessness.up)|target.time_to_die<=25
+	if { target.HealthPercent() < 20 and BuffPresent(recklessness_buff) } or target.TimeToDie() <= 25 UsePotionStrength()
+	#recklessness,if=!talent.bloodbath.enabled&((cooldown.colossus_smash.remains<2|debuff.colossus_smash.remains>=5)&(target.time_to_die>(192*buff.cooldown_reduction.value)|target.health.pct<20))|buff.bloodbath.up&(target.time_to_die>(192*buff.cooldown_reduction.value)|target.health.pct<20)|target.time_to_die<=12
+	if not TalentPoints(bloodbath_talent) and { { SpellCooldown(colossus_smash) < 2 or target.DebuffRemains(colossus_smash_debuff) >= 5 } and { target.TimeToDie() > { 192 * BuffAmount(cooldown_reduction_strength_buff) } or target.HealthPercent() < 20 } } or BuffPresent(bloodbath_buff) and { target.TimeToDie() > { 192 * BuffAmount(cooldown_reduction_strength_buff) } or target.HealthPercent() < 20 } or target.TimeToDie() <= 12 Spell(recklessness)
+	#avatar,if=enabled&(buff.recklessness.up|target.time_to_die<=25)
+	if TalentPoints(avatar_talent) and { BuffPresent(recklessness_buff) or target.TimeToDie() <= 25 } Spell(avatar)
+	#skull_banner,if=buff.skull_banner.down&(((cooldown.colossus_smash.remains<2|debuff.colossus_smash.remains>=5)&target.time_to_die>192&buff.cooldown_reduction.up)|buff.recklessness.up)
+	if BuffExpires(skull_banner_buff) and { { { SpellCooldown(colossus_smash) < 2 or target.DebuffRemains(colossus_smash_debuff) >= 5 } and target.TimeToDie() > 192 and BuffPresent(cooldown_reduction_strength_buff) } or BuffPresent(recklessness_buff) } Spell(skull_banner)
+	#use_item,slot=hands,if=!talent.bloodbath.enabled&debuff.colossus_smash.up|buff.bloodbath.up
+	if not TalentPoints(bloodbath_talent) and target.DebuffPresent(colossus_smash_debuff) or BuffPresent(bloodbath_buff) UseItemActions()
+	#blood_fury,if=buff.cooldown_reduction.down&(buff.bloodbath.up|(!talent.bloodbath.enabled&debuff.colossus_smash.up))|buff.cooldown_reduction.up&buff.recklessness.up
+	if BuffExpires(cooldown_reduction_strength_buff) and { BuffPresent(bloodbath_buff) or { not TalentPoints(bloodbath_talent) and target.DebuffPresent(colossus_smash_debuff) } } or BuffPresent(cooldown_reduction_strength_buff) and BuffPresent(recklessness_buff) Spell(blood_fury)
+	#berserking,if=buff.cooldown_reduction.down&(buff.bloodbath.up|(!talent.bloodbath.enabled&debuff.colossus_smash.up))|buff.cooldown_reduction.up&buff.recklessness.up
+	if BuffExpires(cooldown_reduction_strength_buff) and { BuffPresent(bloodbath_buff) or { not TalentPoints(bloodbath_talent) and target.DebuffPresent(colossus_smash_debuff) } } or BuffPresent(cooldown_reduction_strength_buff) and BuffPresent(recklessness_buff) Spell(berserking)
+	#arcane_torrent,if=buff.cooldown_reduction.down&(buff.bloodbath.up|(!talent.bloodbath.enabled&debuff.colossus_smash.up))|buff.cooldown_reduction.up&buff.recklessness.up
+	if BuffExpires(cooldown_reduction_strength_buff) and { BuffPresent(bloodbath_buff) or { not TalentPoints(bloodbath_talent) and target.DebuffPresent(colossus_smash_debuff) } } or BuffPresent(cooldown_reduction_strength_buff) and BuffPresent(recklessness_buff) Spell(arcane_torrent)
+	#run_action_list,name=single_target,if=active_enemies=1
+	if Enemies() == 1 FurySingleTargetActions()
+	#run_action_list,name=two_targets,if=active_enemies=2
+	if Enemies() == 2 FuryTwoTargetsActions()
+	#run_action_list,name=three_targets,if=active_enemies=3
+	if Enemies() == 3 FuryThreeTargetsActions()
+	#run_action_list,name=aoe,if=active_enemies>3
+	if Enemies() > 3 FuryAoeActions()
+}
+
+AddFunction FuryPrecombatActions
+{
+	#flask,type=winters_bite
+	#food,type=black_pepper_ribs_and_shrimp
+	#snapshot_stats
+	#stance,choose=battle
+	if not Stance(warrior_battle_stance) Spell(battle_stance)
+	#battle_shout
+	Spell(battle_shout)
+	#mogu_power_potion
+	UsePotionStrength()
+}
+
+AddFunction FuryTwoTargetsActions
+{
+	#bloodbath,if=enabled&((!talent.bladestorm.enabled&(cooldown.colossus_smash.remains<2|debuff.colossus_smash.remains>=5|target.time_to_die<=20))|(talent.bladestorm.enabled))
+	if TalentPoints(bloodbath_talent) and { { not TalentPoints(bladestorm_talent) and { SpellCooldown(colossus_smash) < 2 or target.DebuffRemains(colossus_smash_debuff) >= 5 or target.TimeToDie() <= 20 } } or { TalentPoints(bladestorm_talent) } } Spell(bloodbath)
+	#berserker_rage,if=(talent.bladestorm.enabled&(buff.bloodbath.up|!talent.bloodbath.enabled)&!cooldown.bladestorm.remains&(!talent.storm_bolt.enabled|(talent.storm_bolt.enabled&!debuff.colossus_smash.up)))|(!talent.bladestorm.enabled&buff.enrage.remains<1&cooldown.bloodthirst.remains>1)
+	if { TalentPoints(bladestorm_talent) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } and not SpellCooldown(bladestorm) and { not TalentPoints(storm_bolt_talent) or { TalentPoints(storm_bolt_talent) and not target.DebuffPresent(colossus_smash_debuff) } } } or { not TalentPoints(bladestorm_talent) and BuffRemains(enrage_buff) < 1 and SpellCooldown(bloodthirst) > 1 } Spell(berserker_rage)
+	#cleave,if=(rage>=60&debuff.colossus_smash.up)|rage>110
+	if { Rage() >= 60 and target.DebuffPresent(colossus_smash_debuff) } or Rage() > 110 Spell(cleave)
+	#heroic_leap,if=buff.enrage.up&(debuff.colossus_smash.up&buff.cooldown_reduction.up|!buff.cooldown_reduction.up)
+	if BuffPresent(enrage_buff) and { target.DebuffPresent(colossus_smash_debuff) and BuffPresent(cooldown_reduction_strength_buff) or not BuffPresent(cooldown_reduction_strength_buff) } Spell(heroic_leap)
+	#bladestorm,if=enabled&(buff.bloodbath.up|!talent.bloodbath.enabled)&(!talent.storm_bolt.enabled|(talent.storm_bolt.enabled&!debuff.colossus_smash.up))
+	if TalentPoints(bladestorm_talent) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } and { not TalentPoints(storm_bolt_talent) or { TalentPoints(storm_bolt_talent) and not target.DebuffPresent(colossus_smash_debuff) } } Spell(bladestorm)
+	#dragon_roar,if=enabled&(!debuff.colossus_smash.up&(buff.bloodbath.up|!talent.bloodbath.enabled))
+	if TalentPoints(dragon_roar_talent) and { not target.DebuffPresent(colossus_smash_debuff) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } } Spell(dragon_roar)
+	#colossus_smash
+	Spell(colossus_smash)
+	#bloodthirst,cycle_targets=1,if=dot.deep_wounds.remains<5
+	if target.DebuffRemains(deep_wounds_debuff) < 5 Spell(bloodthirst)
+	#storm_bolt,if=enabled&debuff.colossus_smash.up
+	if TalentPoints(storm_bolt_talent) and target.DebuffPresent(colossus_smash_debuff) Spell(storm_bolt)
+	#bloodthirst
+	Spell(bloodthirst)
+	#wait,sec=cooldown.bloodthirst.remains,if=!(target.health.pct<20&debuff.colossus_smash.up&rage>=30&buff.enrage.up)&cooldown.bloodthirst.remains<=1
+	if not { target.HealthPercent() < 20 and target.DebuffPresent(colossus_smash_debuff) and Rage() >= 30 and BuffPresent(enrage_buff) } and SpellCooldown(bloodthirst) <= 1 wait Spell(bloodthirst)
+	#raging_blow,if=buff.meat_cleaver.up
+	if BuffPresent(meat_cleaver_buff) Spell(raging_blow)
+	#whirlwind,if=!buff.meat_cleaver.up
+	if not BuffPresent(meat_cleaver_buff) Spell(whirlwind)
+	#shockwave,if=enabled
+	if TalentPoints(shockwave_talent) Spell(shockwave)
+	#execute
+	Spell(execute)
+	#battle_shout
+	Spell(battle_shout)
+	#heroic_throw
+	Spell(heroic_throw)
+}
+
+AddFunction FuryThreeTargetsActions
+{
+	#bloodbath,if=enabled
+	if TalentPoints(bloodbath_talent) Spell(bloodbath)
+	#berserker_rage,if=(talent.bladestorm.enabled&(buff.bloodbath.up|!talent.bloodbath.enabled)&!cooldown.bladestorm.remains)|(!talent.bladestorm.enabled&buff.enrage.remains<1&cooldown.bloodthirst.remains>1)
+	if { TalentPoints(bladestorm_talent) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } and not SpellCooldown(bladestorm) } or { not TalentPoints(bladestorm_talent) and BuffRemains(enrage_buff) < 1 and SpellCooldown(bloodthirst) > 1 } Spell(berserker_rage)
+	#cleave,if=(rage>=70&debuff.colossus_smash.up)|rage>90
+	if { Rage() >= 70 and target.DebuffPresent(colossus_smash_debuff) } or Rage() > 90 Spell(cleave)
+	#heroic_leap,if=buff.enrage.up&(debuff.colossus_smash.up&buff.cooldown_reduction.up|!buff.cooldown_reduction.up)
+	if BuffPresent(enrage_buff) and { target.DebuffPresent(colossus_smash_debuff) and BuffPresent(cooldown_reduction_strength_buff) or not BuffPresent(cooldown_reduction_strength_buff) } Spell(heroic_leap)
+	#bladestorm,if=enabled&(buff.bloodbath.up|!talent.bloodbath.enabled)
+	if TalentPoints(bladestorm_talent) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } Spell(bladestorm)
+	#dragon_roar,if=enabled&!debuff.colossus_smash.up&(buff.bloodbath.up|!talent.bloodbath.enabled)
+	if TalentPoints(dragon_roar_talent) and not target.DebuffPresent(colossus_smash_debuff) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } Spell(dragon_roar)
+	#bloodthirst,cycle_targets=1,if=!dot.deep_wounds.ticking
+	if not target.DebuffPresent(deep_wounds_debuff) Spell(bloodthirst)
+	#colossus_smash
+	Spell(colossus_smash)
+	#storm_bolt,if=enabled&debuff.colossus_smash.up
+	if TalentPoints(storm_bolt_talent) and target.DebuffPresent(colossus_smash_debuff) Spell(storm_bolt)
+	#raging_blow,if=buff.meat_cleaver.stack=2
+	if BuffStacks(meat_cleaver_buff) == 2 Spell(raging_blow)
+	#whirlwind
+	Spell(whirlwind)
+	#shockwave,if=enabled
+	if TalentPoints(shockwave_talent) Spell(shockwave)
+	#raging_blow
+	Spell(raging_blow)
+	#battle_shout
+	Spell(battle_shout)
+	#heroic_throw
+	Spell(heroic_throw)
+}
+
+AddFunction FuryAoeActions
+{
+	#bloodbath,if=enabled
+	if TalentPoints(bloodbath_talent) Spell(bloodbath)
+	#berserker_rage,if=(talent.bladestorm.enabled&(buff.bloodbath.up|!talent.bloodbath.enabled)&!cooldown.bladestorm.remains)|(!talent.bladestorm.enabled&buff.enrage.remains<1&cooldown.bloodthirst.remains>1)
+	if { TalentPoints(bladestorm_talent) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } and not SpellCooldown(bladestorm) } or { not TalentPoints(bladestorm_talent) and BuffRemains(enrage_buff) < 1 and SpellCooldown(bloodthirst) > 1 } Spell(berserker_rage)
+	#cleave,if=rage>90
+	if Rage() > 90 Spell(cleave)
+	#heroic_leap,if=buff.enrage.up
+	if BuffPresent(enrage_buff) Spell(heroic_leap)
+	#bladestorm,if=enabled&(buff.bloodbath.up|!talent.bloodbath.enabled)
+	if TalentPoints(bladestorm_talent) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } Spell(bladestorm)
+	#bloodthirst,cycle_targets=1,if=!dot.deep_wounds.ticking&buff.enrage.down
+	if not target.DebuffPresent(deep_wounds_debuff) and BuffExpires(enrage_buff) Spell(bloodthirst)
+	#raging_blow,if=buff.meat_cleaver.stack=3
+	if BuffStacks(meat_cleaver_buff) == 3 Spell(raging_blow)
+	#whirlwind
+	Spell(whirlwind)
+	#dragon_roar,if=enabled&debuff.colossus_smash.down&(buff.bloodbath.up|!talent.bloodbath.enabled)
+	if TalentPoints(dragon_roar_talent) and target.DebuffExpires(colossus_smash_debuff) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } Spell(dragon_roar)
+	#bloodthirst,cycle_targets=1,if=!dot.deep_wounds.ticking
+	if not target.DebuffPresent(deep_wounds_debuff) Spell(bloodthirst)
+	#colossus_smash
+	Spell(colossus_smash)
+	#storm_bolt,if=enabled
+	if TalentPoints(storm_bolt_talent) Spell(storm_bolt)
+	#shockwave,if=enabled
+	if TalentPoints(shockwave_talent) Spell(shockwave)
+	#battle_shout
+	Spell(battle_shout)
+}
+
+AddIcon mastery=fury help=main
+{
+	if InCombat(no) FuryPrecombatActions()
+	FuryDefaultActions()
+}
+
+### Required symbols
+# arcane_torrent
+# avatar
+# avatar_talent
+# battle_shout
+# berserker_rage
+# berserking
+# bladestorm
+# bladestorm_talent
+# blood_fury
+# bloodbath
+# bloodbath_buff
+# bloodbath_talent
+# bloodsurge_buff
+# bloodthirst
+# cleave
+# colossus_smash
+# colossus_smash_debuff
+# cooldown_reduction_strength_buff
+# deep_wounds_debuff
+# dragon_roar
+# dragon_roar_talent
+# enrage_buff
+# execute
+# heroic_leap
+# heroic_strike
+# heroic_throw
+# impending_victory
+# impending_victory_talent
+# meat_cleaver_buff
+# mogu_power_potion
+# raging_blow
+# raging_blow_buff
+# recklessness
+# recklessness_buff
+# shattering_throw
+# shockwave
+# shockwave_talent
+# skull_banner
+# skull_banner_buff
+# storm_bolt
+# storm_bolt_talent
+# whirlwind
+# wild_strike
+]]
+	OvaleScripts:RegisterScript("WARRIOR", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_warrior_fury_2h_t16h.lua b/scripts/simulationcraft_warrior_fury_2h_t16h.lua
new file mode 100644
index 0000000..95b5775
--- /dev/null
+++ b/scripts/simulationcraft_warrior_fury_2h_t16h.lua
@@ -0,0 +1,275 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+	local name = "SimulationCraft: Warrior_Fury_2h_T16H"
+	local desc = "[5.4] SimulationCraft: Warrior_Fury_2h_T16H"
+	local code = [[
+# Based on SimulationCraft profile "Warrior_Fury_2h_T16H".
+#	class=warrior
+#	spec=fury
+#	talents=http://us.battle.net/wow/en/tool/talent-calculator#ZZ!122012
+#	glyphs=unending_rage/death_from_above/bull_rush
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_warrior_spells)
+
+AddFunction FurySingleTargetActions
+{
+	#bloodbath,if=enabled&(cooldown.colossus_smash.remains<2|debuff.colossus_smash.remains>=5|target.time_to_die<=20)
+	if TalentPoints(bloodbath_talent) and { SpellCooldown(colossus_smash) < 2 or target.DebuffRemains(colossus_smash_debuff) >= 5 or target.TimeToDie() <= 20 } Spell(bloodbath)
+	#berserker_rage,if=buff.enrage.remains<1&cooldown.bloodthirst.remains>1
+	if BuffRemains(enrage_buff) < 1 and SpellCooldown(bloodthirst) > 1 Spell(berserker_rage)
+	#heroic_strike,if=(debuff.colossus_smash.up&rage>=40|rage>=100)&buff.enrage.up
+	if { target.DebuffPresent(colossus_smash_debuff) and Rage() >= 40 or Rage() >= 100 } and BuffPresent(enrage_buff) Spell(heroic_strike)
+	#heroic_leap,if=debuff.colossus_smash.up&buff.enrage.up
+	if target.DebuffPresent(colossus_smash_debuff) and BuffPresent(enrage_buff) Spell(heroic_leap)
+	#bloodthirst,if=!buff.enrage.up
+	if not BuffPresent(enrage_buff) Spell(bloodthirst)
+	#storm_bolt,if=enabled&buff.cooldown_reduction.up&debuff.colossus_smash.up
+	if TalentPoints(storm_bolt_talent) and BuffPresent(cooldown_reduction_strength_buff) and target.DebuffPresent(colossus_smash_debuff) Spell(storm_bolt)
+	#raging_blow,if=buff.raging_blow.stack=2&debuff.colossus_smash.up
+	if BuffStacks(raging_blow_buff) == 2 and target.DebuffPresent(colossus_smash_debuff) Spell(raging_blow)
+	#storm_bolt,if=enabled&buff.cooldown_reduction.down&debuff.colossus_smash.up
+	if TalentPoints(storm_bolt_talent) and BuffExpires(cooldown_reduction_strength_buff) and target.DebuffPresent(colossus_smash_debuff) Spell(storm_bolt)
+	#dragon_roar,if=enabled&(!debuff.colossus_smash.up&(buff.bloodbath.up|!talent.bloodbath.enabled))
+	if TalentPoints(dragon_roar_talent) and { not target.DebuffPresent(colossus_smash_debuff) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } } Spell(dragon_roar)
+	#bloodthirst
+	Spell(bloodthirst)
+	#wild_strike,if=buff.bloodsurge.react&cooldown.bloodthirst.remains<=1&cooldown.bloodthirst.remains>0.3
+	if BuffPresent(bloodsurge_buff) and SpellCooldown(bloodthirst) <= 1 and SpellCooldown(bloodthirst) > 0.3 Spell(wild_strike)
+	#wait,sec=cooldown.bloodthirst.remains,if=!(debuff.colossus_smash.up&rage>=30&buff.enrage.up)&cooldown.bloodthirst.remains<=1
+	if not { target.DebuffPresent(colossus_smash_debuff) and Rage() >= 30 and BuffPresent(enrage_buff) } and SpellCooldown(bloodthirst) <= 1 wait Spell(bloodthirst)
+	#colossus_smash
+	Spell(colossus_smash)
+	#storm_bolt,if=enabled&buff.cooldown_reduction.down
+	if TalentPoints(storm_bolt_talent) and BuffExpires(cooldown_reduction_strength_buff) Spell(storm_bolt)
+	#execute,if=buff.raging_blow.stack<2&(((rage>70&!debuff.colossus_smash.up)|debuff.colossus_smash.up)|trinket.proc.strength.up)|target.time_to_die<5
+	if BuffStacks(raging_blow_buff) < 2 and { { { Rage() > 70 and not target.DebuffPresent(colossus_smash_debuff) } or target.DebuffPresent(colossus_smash_debuff) } or BuffPresent(trinket_proc_strength_buff) } or target.TimeToDie() < 5 Spell(execute)
+	#berserker_rage,if=buff.raging_blow.stack<=1&target.health.pct>=20
+	if BuffStacks(raging_blow_buff) <= 1 and target.HealthPercent() >= 20 Spell(berserker_rage)
+	#raging_blow,if=buff.raging_blow.stack=2|debuff.colossus_smash.up|buff.raging_blow.remains<=3
+	if BuffStacks(raging_blow_buff) == 2 or target.DebuffPresent(colossus_smash_debuff) or BuffRemains(raging_blow_buff) <= 3 Spell(raging_blow)
+	#bladestorm,if=enabled,interrupt_if=cooldown.bloodthirst.remains<1
+	if TalentPoints(bladestorm_talent) Spell(bladestorm)
+	#raging_blow,if=cooldown.colossus_smash.remains>=1
+	if SpellCooldown(colossus_smash) >= 1 Spell(raging_blow)
+	#wild_strike,if=buff.bloodsurge.up
+	if BuffPresent(bloodsurge_buff) Spell(wild_strike)
+	#shattering_throw,if=cooldown.colossus_smash.remains>5
+	if SpellCooldown(colossus_smash) > 5 Spell(shattering_throw)
+	#shockwave,if=enabled
+	if TalentPoints(shockwave_talent) Spell(shockwave)
+	#heroic_throw,if=debuff.colossus_smash.down&rage<60
+	if target.DebuffExpires(colossus_smash_debuff) and Rage() < 60 Spell(heroic_throw)
+	#wild_strike,if=debuff.colossus_smash.up
+	if target.DebuffPresent(colossus_smash_debuff) Spell(wild_strike)
+	#battle_shout,if=rage<70
+	if Rage() < 70 Spell(battle_shout)
+	#impending_victory,if=enabled&cooldown.colossus_smash.remains>=1.5
+	if TalentPoints(impending_victory_talent) and SpellCooldown(colossus_smash) >= 1.5 Spell(impending_victory)
+	#wild_strike,if=cooldown.colossus_smash.remains>=2&rage>=70
+	if SpellCooldown(colossus_smash) >= 2 and Rage() >= 70 Spell(wild_strike)
+}
+
+AddFunction FuryDefaultActions
+{
+	#auto_attack
+	#mogu_power_potion,if=(target.health.pct<20&buff.recklessness.up)|target.time_to_die<=25
+	if { target.HealthPercent() < 20 and BuffPresent(recklessness_buff) } or target.TimeToDie() <= 25 UsePotionStrength()
+	#recklessness,if=!talent.bloodbath.enabled&((cooldown.colossus_smash.remains<2|debuff.colossus_smash.remains>=5)&(target.time_to_die>(192*buff.cooldown_reduction.value)|target.health.pct<20))|buff.bloodbath.up&(target.time_to_die>(192*buff.cooldown_reduction.value)|target.health.pct<20)|target.time_to_die<=12
+	if not TalentPoints(bloodbath_talent) and { { SpellCooldown(colossus_smash) < 2 or target.DebuffRemains(colossus_smash_debuff) >= 5 } and { target.TimeToDie() > { 192 * BuffAmount(cooldown_reduction_strength_buff) } or target.HealthPercent() < 20 } } or BuffPresent(bloodbath_buff) and { target.TimeToDie() > { 192 * BuffAmount(cooldown_reduction_strength_buff) } or target.HealthPercent() < 20 } or target.TimeToDie() <= 12 Spell(recklessness)
+	#avatar,if=enabled&(buff.recklessness.up|target.time_to_die<=25)
+	if TalentPoints(avatar_talent) and { BuffPresent(recklessness_buff) or target.TimeToDie() <= 25 } Spell(avatar)
+	#skull_banner,if=buff.skull_banner.down&(((cooldown.colossus_smash.remains<2|debuff.colossus_smash.remains>=5)&target.time_to_die>192&buff.cooldown_reduction.up)|buff.recklessness.up)
+	if BuffExpires(skull_banner_buff) and { { { SpellCooldown(colossus_smash) < 2 or target.DebuffRemains(colossus_smash_debuff) >= 5 } and target.TimeToDie() > 192 and BuffPresent(cooldown_reduction_strength_buff) } or BuffPresent(recklessness_buff) } Spell(skull_banner)
+	#use_item,slot=hands,if=!talent.bloodbath.enabled&debuff.colossus_smash.up|buff.bloodbath.up
+	if not TalentPoints(bloodbath_talent) and target.DebuffPresent(colossus_smash_debuff) or BuffPresent(bloodbath_buff) UseItemActions()
+	#blood_fury,if=buff.cooldown_reduction.down&(buff.bloodbath.up|(!talent.bloodbath.enabled&debuff.colossus_smash.up))|buff.cooldown_reduction.up&buff.recklessness.up
+	if BuffExpires(cooldown_reduction_strength_buff) and { BuffPresent(bloodbath_buff) or { not TalentPoints(bloodbath_talent) and target.DebuffPresent(colossus_smash_debuff) } } or BuffPresent(cooldown_reduction_strength_buff) and BuffPresent(recklessness_buff) Spell(blood_fury)
+	#berserking,if=buff.cooldown_reduction.down&(buff.bloodbath.up|(!talent.bloodbath.enabled&debuff.colossus_smash.up))|buff.cooldown_reduction.up&buff.recklessness.up
+	if BuffExpires(cooldown_reduction_strength_buff) and { BuffPresent(bloodbath_buff) or { not TalentPoints(bloodbath_talent) and target.DebuffPresent(colossus_smash_debuff) } } or BuffPresent(cooldown_reduction_strength_buff) and BuffPresent(recklessness_buff) Spell(berserking)
+	#arcane_torrent,if=buff.cooldown_reduction.down&(buff.bloodbath.up|(!talent.bloodbath.enabled&debuff.colossus_smash.up))|buff.cooldown_reduction.up&buff.recklessness.up
+	if BuffExpires(cooldown_reduction_strength_buff) and { BuffPresent(bloodbath_buff) or { not TalentPoints(bloodbath_talent) and target.DebuffPresent(colossus_smash_debuff) } } or BuffPresent(cooldown_reduction_strength_buff) and BuffPresent(recklessness_buff) Spell(arcane_torrent)
+	#run_action_list,name=single_target,if=active_enemies=1
+	if Enemies() == 1 FurySingleTargetActions()
+	#run_action_list,name=two_targets,if=active_enemies=2
+	if Enemies() == 2 FuryTwoTargetsActions()
+	#run_action_list,name=three_targets,if=active_enemies=3
+	if Enemies() == 3 FuryThreeTargetsActions()
+	#run_action_list,name=aoe,if=active_enemies>3
+	if Enemies() > 3 FuryAoeActions()
+}
+
+AddFunction FuryPrecombatActions
+{
+	#elixir,type=mad_hozen
+	#food,type=black_pepper_ribs_and_shrimp
+	#snapshot_stats
+	#stance,choose=battle
+	if not Stance(warrior_battle_stance) Spell(battle_stance)
+	#battle_shout
+	Spell(battle_shout)
+	#mogu_power_potion
+	UsePotionStrength()
+}
+
+AddFunction FuryTwoTargetsActions
+{
+	#bloodbath,if=enabled&((!talent.bladestorm.enabled&(cooldown.colossus_smash.remains<2|debuff.colossus_smash.remains>=5|target.time_to_die<=20))|(talent.bladestorm.enabled))
+	if TalentPoints(bloodbath_talent) and { { not TalentPoints(bladestorm_talent) and { SpellCooldown(colossus_smash) < 2 or target.DebuffRemains(colossus_smash_debuff) >= 5 or target.TimeToDie() <= 20 } } or { TalentPoints(bladestorm_talent) } } Spell(bloodbath)
+	#berserker_rage,if=(talent.bladestorm.enabled&(buff.bloodbath.up|!talent.bloodbath.enabled)&!cooldown.bladestorm.remains&(!talent.storm_bolt.enabled|(talent.storm_bolt.enabled&!debuff.colossus_smash.up)))|(!talent.bladestorm.enabled&buff.enrage.remains<1&cooldown.bloodthirst.remains>1)
+	if { TalentPoints(bladestorm_talent) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } and not SpellCooldown(bladestorm) and { not TalentPoints(storm_bolt_talent) or { TalentPoints(storm_bolt_talent) and not target.DebuffPresent(colossus_smash_debuff) } } } or { not TalentPoints(bladestorm_talent) and BuffRemains(enrage_buff) < 1 and SpellCooldown(bloodthirst) > 1 } Spell(berserker_rage)
+	#cleave,if=(rage>=60&debuff.colossus_smash.up)|rage>110
+	if { Rage() >= 60 and target.DebuffPresent(colossus_smash_debuff) } or Rage() > 110 Spell(cleave)
+	#heroic_leap,if=buff.enrage.up&(debuff.colossus_smash.up&buff.cooldown_reduction.up|!buff.cooldown_reduction.up)
+	if BuffPresent(enrage_buff) and { target.DebuffPresent(colossus_smash_debuff) and BuffPresent(cooldown_reduction_strength_buff) or not BuffPresent(cooldown_reduction_strength_buff) } Spell(heroic_leap)
+	#bladestorm,if=enabled&(buff.bloodbath.up|!talent.bloodbath.enabled)&(!talent.storm_bolt.enabled|(talent.storm_bolt.enabled&!debuff.colossus_smash.up))
+	if TalentPoints(bladestorm_talent) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } and { not TalentPoints(storm_bolt_talent) or { TalentPoints(storm_bolt_talent) and not target.DebuffPresent(colossus_smash_debuff) } } Spell(bladestorm)
+	#dragon_roar,if=enabled&(!debuff.colossus_smash.up&(buff.bloodbath.up|!talent.bloodbath.enabled))
+	if TalentPoints(dragon_roar_talent) and { not target.DebuffPresent(colossus_smash_debuff) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } } Spell(dragon_roar)
+	#colossus_smash
+	Spell(colossus_smash)
+	#bloodthirst,cycle_targets=1,if=dot.deep_wounds.remains<5
+	if target.DebuffRemains(deep_wounds_debuff) < 5 Spell(bloodthirst)
+	#storm_bolt,if=enabled&debuff.colossus_smash.up
+	if TalentPoints(storm_bolt_talent) and target.DebuffPresent(colossus_smash_debuff) Spell(storm_bolt)
+	#bloodthirst
+	Spell(bloodthirst)
+	#wait,sec=cooldown.bloodthirst.remains,if=!(target.health.pct<20&debuff.colossus_smash.up&rage>=30&buff.enrage.up)&cooldown.bloodthirst.remains<=1
+	if not { target.HealthPercent() < 20 and target.DebuffPresent(colossus_smash_debuff) and Rage() >= 30 and BuffPresent(enrage_buff) } and SpellCooldown(bloodthirst) <= 1 wait Spell(bloodthirst)
+	#raging_blow,if=buff.meat_cleaver.up
+	if BuffPresent(meat_cleaver_buff) Spell(raging_blow)
+	#whirlwind,if=!buff.meat_cleaver.up
+	if not BuffPresent(meat_cleaver_buff) Spell(whirlwind)
+	#shockwave,if=enabled
+	if TalentPoints(shockwave_talent) Spell(shockwave)
+	#execute
+	Spell(execute)
+	#battle_shout
+	Spell(battle_shout)
+	#heroic_throw
+	Spell(heroic_throw)
+}
+
+AddFunction FuryThreeTargetsActions
+{
+	#bloodbath,if=enabled
+	if TalentPoints(bloodbath_talent) Spell(bloodbath)
+	#berserker_rage,if=(talent.bladestorm.enabled&(buff.bloodbath.up|!talent.bloodbath.enabled)&!cooldown.bladestorm.remains)|(!talent.bladestorm.enabled&buff.enrage.remains<1&cooldown.bloodthirst.remains>1)
+	if { TalentPoints(bladestorm_talent) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } and not SpellCooldown(bladestorm) } or { not TalentPoints(bladestorm_talent) and BuffRemains(enrage_buff) < 1 and SpellCooldown(bloodthirst) > 1 } Spell(berserker_rage)
+	#cleave,if=(rage>=70&debuff.colossus_smash.up)|rage>90
+	if { Rage() >= 70 and target.DebuffPresent(colossus_smash_debuff) } or Rage() > 90 Spell(cleave)
+	#heroic_leap,if=buff.enrage.up&(debuff.colossus_smash.up&buff.cooldown_reduction.up|!buff.cooldown_reduction.up)
+	if BuffPresent(enrage_buff) and { target.DebuffPresent(colossus_smash_debuff) and BuffPresent(cooldown_reduction_strength_buff) or not BuffPresent(cooldown_reduction_strength_buff) } Spell(heroic_leap)
+	#bladestorm,if=enabled&(buff.bloodbath.up|!talent.bloodbath.enabled)
+	if TalentPoints(bladestorm_talent) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } Spell(bladestorm)
+	#dragon_roar,if=enabled&!debuff.colossus_smash.up&(buff.bloodbath.up|!talent.bloodbath.enabled)
+	if TalentPoints(dragon_roar_talent) and not target.DebuffPresent(colossus_smash_debuff) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } Spell(dragon_roar)
+	#bloodthirst,cycle_targets=1,if=!dot.deep_wounds.ticking
+	if not target.DebuffPresent(deep_wounds_debuff) Spell(bloodthirst)
+	#colossus_smash
+	Spell(colossus_smash)
+	#storm_bolt,if=enabled&debuff.colossus_smash.up
+	if TalentPoints(storm_bolt_talent) and target.DebuffPresent(colossus_smash_debuff) Spell(storm_bolt)
+	#raging_blow,if=buff.meat_cleaver.stack=2
+	if BuffStacks(meat_cleaver_buff) == 2 Spell(raging_blow)
+	#whirlwind
+	Spell(whirlwind)
+	#shockwave,if=enabled
+	if TalentPoints(shockwave_talent) Spell(shockwave)
+	#raging_blow
+	Spell(raging_blow)
+	#battle_shout
+	Spell(battle_shout)
+	#heroic_throw
+	Spell(heroic_throw)
+}
+
+AddFunction FuryAoeActions
+{
+	#bloodbath,if=enabled
+	if TalentPoints(bloodbath_talent) Spell(bloodbath)
+	#berserker_rage,if=(talent.bladestorm.enabled&(buff.bloodbath.up|!talent.bloodbath.enabled)&!cooldown.bladestorm.remains)|(!talent.bladestorm.enabled&buff.enrage.remains<1&cooldown.bloodthirst.remains>1)
+	if { TalentPoints(bladestorm_talent) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } and not SpellCooldown(bladestorm) } or { not TalentPoints(bladestorm_talent) and BuffRemains(enrage_buff) < 1 and SpellCooldown(bloodthirst) > 1 } Spell(berserker_rage)
+	#cleave,if=rage>90
+	if Rage() > 90 Spell(cleave)
+	#heroic_leap,if=buff.enrage.up
+	if BuffPresent(enrage_buff) Spell(heroic_leap)
+	#bladestorm,if=enabled&(buff.bloodbath.up|!talent.bloodbath.enabled)
+	if TalentPoints(bladestorm_talent) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } Spell(bladestorm)
+	#bloodthirst,cycle_targets=1,if=!dot.deep_wounds.ticking&buff.enrage.down
+	if not target.DebuffPresent(deep_wounds_debuff) and BuffExpires(enrage_buff) Spell(bloodthirst)
+	#raging_blow,if=buff.meat_cleaver.stack=3
+	if BuffStacks(meat_cleaver_buff) == 3 Spell(raging_blow)
+	#whirlwind
+	Spell(whirlwind)
+	#dragon_roar,if=enabled&debuff.colossus_smash.down&(buff.bloodbath.up|!talent.bloodbath.enabled)
+	if TalentPoints(dragon_roar_talent) and target.DebuffExpires(colossus_smash_debuff) and { BuffPresent(bloodbath_buff) or not TalentPoints(bloodbath_talent) } Spell(dragon_roar)
+	#bloodthirst,cycle_targets=1,if=!dot.deep_wounds.ticking
+	if not target.DebuffPresent(deep_wounds_debuff) Spell(bloodthirst)
+	#colossus_smash
+	Spell(colossus_smash)
+	#storm_bolt,if=enabled
+	if TalentPoints(storm_bolt_talent) Spell(storm_bolt)
+	#shockwave,if=enabled
+	if TalentPoints(shockwave_talent) Spell(shockwave)
+	#battle_shout
+	Spell(battle_shout)
+}
+
+AddIcon mastery=fury help=main
+{
+	if InCombat(no) FuryPrecombatActions()
+	FuryDefaultActions()
+}
+
+### Required symbols
+# arcane_torrent
+# avatar
+# avatar_talent
+# battle_shout
+# berserker_rage
+# berserking
+# bladestorm
+# bladestorm_talent
+# blood_fury
+# bloodbath
+# bloodbath_buff
+# bloodbath_talent
+# bloodsurge_buff
+# bloodthirst
+# cleave
+# colossus_smash
+# colossus_smash_debuff
+# cooldown_reduction_strength_buff
+# deep_wounds_debuff
+# dragon_roar
+# dragon_roar_talent
+# enrage_buff
+# execute
+# heroic_leap
+# heroic_strike
+# heroic_throw
+# impending_victory
+# impending_victory_talent
+# meat_cleaver_buff
+# mogu_power_potion
+# raging_blow
+# raging_blow_buff
+# recklessness
+# recklessness_buff
+# shattering_throw
+# shockwave
+# shockwave_talent
+# skull_banner
+# skull_banner_buff
+# storm_bolt
+# storm_bolt_talent
+# trinket_proc_strength_buff
+# whirlwind
+# wild_strike
+]]
+	OvaleScripts:RegisterScript("WARRIOR", name, desc, code, "reference")
+end
\ No newline at end of file
diff --git a/scripts/simulationcraft_warrior_protection_t16h.lua b/scripts/simulationcraft_warrior_protection_t16h.lua
new file mode 100644
index 0000000..a294ff7
--- /dev/null
+++ b/scripts/simulationcraft_warrior_protection_t16h.lua
@@ -0,0 +1,154 @@
+local _, Ovale = ...
+local OvaleScripts = Ovale.OvaleScripts
+
+do
+	local name = "SimulationCraft: Warrior_Protection_T16H"
+	local desc = "[5.4] SimulationCraft: Warrior_Protection_T16H"
+	local code = [[
+# Based on SimulationCraft profile "Warrior_Protection_T16H".
+#	class=warrior
+#	spec=protection
+#	talents=http://us.battle.net/wow/en/tool/talent-calculator#Zb!.00110
+#	glyphs=unending_rage/hold_the_line/heavy_repercussions
+
+Include(ovale_items)
+Include(ovale_racials)
+Include(ovale_warrior_spells)
+
+AddFunction ProtectionDpsCdsActions
+{
+	#avatar,if=enabled
+	if TalentPoints(avatar_talent) Spell(avatar)
+	#bloodbath,if=enabled
+	if TalentPoints(bloodbath_talent) Spell(bloodbath)
+	#blood_fury
+	Spell(blood_fury)
+	#berserking
+	Spell(berserking)
+	#arcane_torrent
+	Spell(arcane_torrent)
+	#dragon_roar,if=enabled
+	if TalentPoints(dragon_roar_talent) Spell(dragon_roar)
+	#shattering_throw
+	Spell(shattering_throw)
+	#skull_banner
+	Spell(skull_banner)
+	#recklessness
+	Spell(recklessness)
+	#storm_bolt,if=enabled
+	if TalentPoints(storm_bolt_talent) Spell(storm_bolt)
+	#shockwave,if=enabled
+	if TalentPoints(shockwave_talent) Spell(shockwave)
+	#bladestorm,if=enabled
+	if TalentPoints(bladestorm_talent) Spell(bladestorm)
+	#run_action_list,name=normal_rotation
+	ProtectionNormalRotationActions()
+}
+
+AddFunction ProtectionNormalRotationActions
+{
+	#shield_slam
+	Spell(shield_slam)
+	#revenge
+	Spell(revenge)
+	#battle_shout,if=rage<=rage.max-20
+	if Rage() <= MaxRage() -20 Spell(battle_shout)
+	#thunder_clap,if=glyph.resonating_power.enabled|target.debuff.weakened_blows.down
+	if Glyph(glyph_of_resonating_power) or target.DebuffExpires(weakened_blows_debuff) Spell(thunder_clap)
+	#demoralizing_shout
+	Spell(demoralizing_shout)
+	#impending_victory,if=enabled
+	if TalentPoints(impending_victory_talent) Spell(impending_victory)
+	#victory_rush,if=!talent.impending_victory.enabled
+	if not TalentPoints(impending_victory_talent) Spell(victory_rush)
+	#devastate
+	Spell(devastate)
+}
+
+AddFunction ProtectionDefaultActions
+{
+	#auto_attack
+	#mountains_potion,if=incoming_damage_2500ms>health.max*0.6&(buff.shield_wall.down&buff.last_stand.down)
+	if IncomingDamage(2.500) > MaxHealth() * 0.6 and { BuffExpires(shield_wall_buff) and BuffExpires(last_stand_buff) } Spell(mountains_potion)
+	#use_item,slot=trinket2
+	UseItemActions()
+	#heroic_strike,if=buff.ultimatum.up|buff.glyph_incite.up
+	if BuffPresent(ultimatum_buff) or BuffPresent(glyph_incite_buff) Spell(heroic_strike)
+	#berserker_rage,if=buff.enrage.down&rage<=rage.max-10
+	if BuffExpires(enrage_buff) and Rage() <= MaxRage() -10 Spell(berserker_rage)
+	#shield_block
+	Spell(shield_block)
+	#shield_barrier,if=incoming_damage_1500ms>health.max*0.3|rage>rage.max-20
+	if IncomingDamage(1.500) > MaxHealth() * 0.3 or Rage() > MaxRage() -20 Spell(shield_barrier)
+	#shield_wall,if=incoming_damage_2500ms>health.max*0.6
+	if IncomingDamage(2.500) > MaxHealth() * 0.6 Spell(shield_wall)
+	#run_action_list,name=dps_cds,if=buff.vengeance.value>health.max*0.20
+	if BuffAmount(vengeance_buff) > MaxHealth() * 0.2 ProtectionDpsCdsActions()
+	#run_action_list,name=normal_rotation
+	ProtectionNormalRotationActions()
+}
+
+AddFunction ProtectionPrecombatActions
+{
+	#flask,type=earth
+	#food,type=chun_tian_spring_rolls
+	#snapshot_stats
+	#stance,choose=defensive
+	if not Stance(warrior_defensive_stance) Spell(defensive_stance)
+	#battle_shout
+	Spell(battle_shout)
+	#mountains_potion
+	Spell(mountains_potion)
+}
+
+AddIcon mastery=protection help=main
+{
+	if InCombat(no) ProtectionPrecombatActions()
+	ProtectionDefaultActions()
+}
+
+### Required symbols
+# arcane_torrent
+# avatar
+# avatar_talent
+# battle_shout
+# berserker_rage
+# berserking
+# bladestorm
+# bladestorm_talent
+# blood_fury
+# bloodbath
+# bloodbath_talent
+# demoralizing_shout
+# devastate
+# dragon_roar
+# dragon_roar_talent
+# enrage_buff
+# glyph_incite_buff
+# glyph_of_resonating_power
+# heroic_strike
+# impending_victory
+# impending_victory_talent
+# last_stand_buff
+# mountains_potion
+# recklessness
+# revenge
+# shattering_throw
+# shield_barrier
+# shield_block
+# shield_slam
+# shield_wall
+# shield_wall_buff
+# shockwave
+# shockwave_talent
+# skull_banner
+# storm_bolt
+# storm_bolt_talent
+# thunder_clap
+# ultimatum_buff
+# vengeance_buff
+# victory_rush
+# weakened_blows_debuff
+]]
+	OvaleScripts:RegisterScript("WARRIOR", name, desc, code, "reference")
+end
\ No newline at end of file