diff --git a/Mods/vcmi/Content/config/english.json b/Mods/vcmi/Content/config/english.json
index 1d8f6a831..b2021e5e7 100644
--- a/Mods/vcmi/Content/config/english.json
+++ b/Mods/vcmi/Content/config/english.json
@@ -607,11 +607,6 @@
 	
 	"mapObject.core.hillFort.object.description" : "Upgrades creatures. Levels 1 - 4 are less expensive than in associated town.",
 	
-	"core.spellSchools.0": "Air",
-	"core.spellSchools.1": "Fire",
-	"core.spellSchools.2": "Water",
-	"core.spellSchools.3": "Earth",
-
 	"core.bonus.ADDITIONAL_ATTACK.name": "Double Strike",
 	"core.bonus.ADDITIONAL_ATTACK.description": "Attacks twice",
 	"core.bonus.ADDITIONAL_RETALIATION.name": "Additional retaliations",
@@ -734,8 +729,6 @@
 	"core.bonus.SPELL_AFTER_ATTACK.description": "Has a ${val}% chance to cast ${subtype.spell} after it attacks",
 	"core.bonus.SPELL_BEFORE_ATTACK.name": "Cast Before Attack",
 	"core.bonus.SPELL_BEFORE_ATTACK.description": "Has a ${val}% chance to cast ${subtype.spell} before it attacks",
-	"core.bonus.SPELL_DAMAGE_REDUCTION.name": "Spell Resistance",
-	"core.bonus.SPELL_DAMAGE_REDUCTION.description": "Damage from spells reduced by ${val}%.",
 	"core.bonus.SPELL_IMMUNITY.name": "Spell immunity",
 	"core.bonus.SPELL_IMMUNITY.description": "Immune to ${subtype.spell}",
 	"core.bonus.SPELL_LIKE_ATTACK.name": "Spell-like attack",
@@ -768,10 +761,26 @@
 	"core.bonus.MECHANICAL.description": "Immunity to many effects, repairable",
 	"core.bonus.PRISM_HEX_ATTACK_BREATH.name": "Prism Breath",
 	"core.bonus.PRISM_HEX_ATTACK_BREATH.description": "Prism Breath Attack (three directions)",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.name": "Spell Resistance",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.name.air": "Air Spells Resistance",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.name.fire": "Fire Spells Resistance",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.name.water": "Water Spells Resistance",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.name.earth": "Earth Spells Resistance",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.description": "Damage from all spells reduced by ${val}%.",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.description.air": "Damage from all Air spells reduced by ${val}%.",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.description.fire": "Damage from all Fire spells reduced by ${val}%.",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.description.water": "Damage from all Water spells reduced by ${val}%.",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.description.earth": "Damage from all Earth spells reduced by ${val}%.",
 	"core.bonus.SPELL_SCHOOL_IMMUNITY.name": "Spell immunity",
-	"core.bonus.SPELL_SCHOOL_IMMUNITY.description": "Immune to all spell schools",
-	"core.bonus.SPELL_SCHOOL_IMMUNITY.name.specific": "${subtype.spellSchool} immunity",
-	"core.bonus.SPELL_SCHOOL_IMMUNITY.description.specific": "Immune to ${subtype.spellSchool} school",
+	"core.bonus.SPELL_SCHOOL_IMMUNITY.name.air": "Air immunity",
+	"core.bonus.SPELL_SCHOOL_IMMUNITY.name.fire": "Fire immunity",
+	"core.bonus.SPELL_SCHOOL_IMMUNITY.name.water": "Water immunity",
+	"core.bonus.SPELL_SCHOOL_IMMUNITY.name.earth": "Earth immunity",
+	"core.bonus.SPELL_SCHOOL_IMMUNITY.description": "This unit is immune to all spells",
+	"core.bonus.SPELL_SCHOOL_IMMUNITY.description.air": "This unit is immune to all Air school spells",
+	"core.bonus.SPELL_SCHOOL_IMMUNITY.description.fire": "This unit is immune to all Fire school spells",
+	"core.bonus.SPELL_SCHOOL_IMMUNITY.description.water": "This unit is immune to all Water school spells",
+	"core.bonus.SPELL_SCHOOL_IMMUNITY.description.earth": "This unit is immune to all Earth school spells",
 	"core.bonus.OPENING_BATTLE_SPELL.name": "Starts with spell",
 	"core.bonus.OPENING_BATTLE_SPELL.description": "Casts ${subtype.spell} on battle start"
 }
diff --git a/Mods/vcmi/Content/config/german.json b/Mods/vcmi/Content/config/german.json
index 6a31e0fb6..dd7329c1b 100644
--- a/Mods/vcmi/Content/config/german.json
+++ b/Mods/vcmi/Content/config/german.json
@@ -606,12 +606,7 @@
 	"core.seerhut.quest.reachDate.visit.5" : "Geschlossen bis %s.",
 	
 	"mapObject.core.hillFort.object.description" : "Aufwertungen von Kreaturen. Die Stufen 1 - 4 sind billiger als in der zugehörigen Stadt.",
-	
-	"core.spellSchools.0": "Luft",
-	"core.spellSchools.1": "Feuer",
-	"core.spellSchools.2": "Wasser",
-	"core.spellSchools.3": "Erde",
-	
+
 	"core.bonus.ADDITIONAL_ATTACK.name": "Doppelschlag",
 	"core.bonus.ADDITIONAL_ATTACK.description": "Greift zweimal an",
 	"core.bonus.ADDITIONAL_RETALIATION.name": "Zusätzliche Vergeltungsmaßnahmen",
@@ -734,8 +729,6 @@
 	"core.bonus.SPELL_AFTER_ATTACK.description": "${val}%, um ${subtype.spell} nach dem Angriff zu wirken",
 	"core.bonus.SPELL_BEFORE_ATTACK.name": "Zauber vor Angriff",
 	"core.bonus.SPELL_BEFORE_ATTACK.description": "${val}% um ${subtype.spell} vor dem Angriff zu wirken",
-	"core.bonus.SPELL_DAMAGE_REDUCTION.name": "Zauberwiderstand",
-	"core.bonus.SPELL_DAMAGE_REDUCTION.description": "Schaden von Zaubern reduziert ${val}%.",
 	"core.bonus.SPELL_IMMUNITY.name": "Zauberimmunität",
 	"core.bonus.SPELL_IMMUNITY.description": "Immun gegen ${subtype.spell}",
 	"core.bonus.SPELL_LIKE_ATTACK.name": "zauberähnlicher Angriff",
@@ -770,8 +763,24 @@
 	"core.bonus.PRISM_HEX_ATTACK_BREATH.description": "Prisma-Atem-Angriff (drei Richtungen)",
 	"core.bonus.SPELL_SCHOOL_IMMUNITY.name": "Zauber-Immunität",
 	"core.bonus.SPELL_SCHOOL_IMMUNITY.description": "Immunität gegen alle Zauber-Schulen",
-	"core.bonus.SPELL_SCHOOL_IMMUNITY.name.specific": "${subtype.spellSchool}-Immunität",
-	"core.bonus.SPELL_SCHOOL_IMMUNITY.description.specific": "Immunität gegen Zauber der ${subtype.spellSchool}-Schule",
+	"core.bonus.SPELL_SCHOOL_IMMUNITY.name.air": "Luft-Immunität",
+	"core.bonus.SPELL_SCHOOL_IMMUNITY.name.fire": "Feuer-Immunität",
+	"core.bonus.SPELL_SCHOOL_IMMUNITY.name.water": "Wasser-Immunität",
+	"core.bonus.SPELL_SCHOOL_IMMUNITY.name.earth": "Erde-Immunität",
+	"core.bonus.SPELL_SCHOOL_IMMUNITY.description.air": "Immunität gegen Zauber der Luft-Schule",
+	"core.bonus.SPELL_SCHOOL_IMMUNITY.description.fire": "Immunität gegen Zauber der Feuer-Schule",
+	"core.bonus.SPELL_SCHOOL_IMMUNITY.description.water": "Immunität gegen Zauber der Wasser-Schule",
+	"core.bonus.SPELL_SCHOOL_IMMUNITY.description.earth": "Immunität gegen Zauber der Erde-Schule",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.name": "Zauberwiderstand",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.name.air": "Luft-Zauberwiderstand",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.name.fire": "Feuer-Zauberwiderstand",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.name.water": "Wasser-Zauberwiderstand",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.name.earth": "Erde-Zauberwiderstand",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.description": "Schaden von allen Zaubern um ${val}% reduziert.",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.description.air": "Schaden von Luft-Zaubern um ${val}% reduziert.",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.description.fire": "Schaden von Feuer-Zaubern um ${val}% reduziert.",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.description.water": "Schaden von Wasser-Zaubern um ${val}% reduziert.",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.description.earth": "Schaden von Erde-Zaubern um ${val}% reduziert.",
 	"core.bonus.OPENING_BATTLE_SPELL.name": "Startet mit Zauber",
 	"core.bonus.OPENING_BATTLE_SPELL.description": "Wirkt ${subtype.spell} beim Start des Kampfes"
 }
diff --git a/Mods/vcmi/Content/config/ukrainian.json b/Mods/vcmi/Content/config/ukrainian.json
index e806e15f7..224c64c93 100644
--- a/Mods/vcmi/Content/config/ukrainian.json
+++ b/Mods/vcmi/Content/config/ukrainian.json
@@ -722,8 +722,6 @@
 	"core.bonus.SPELL_AFTER_ATTACK.description" : "Застосовує ${subtype.spell} з вірогідністю ${val}% після атаки",
 	"core.bonus.SPELL_BEFORE_ATTACK.name" : "закляття перед атакою",
 	"core.bonus.SPELL_BEFORE_ATTACK.description" : "Застосовує ${subtype.spell} з вірогідністю ${val}% перед атакою",
-	"core.bonus.SPELL_DAMAGE_REDUCTION.name" : "Стійкість до заклять",
-	"core.bonus.SPELL_DAMAGE_REDUCTION.description" : "Шкода від заклять зменшується на ${val}%.",
 	"core.bonus.SPELL_IMMUNITY.name" : "Імунітет до заклять",
 	"core.bonus.SPELL_IMMUNITY.description" : "Імунітет до ${subtype.spell}",
 	"core.bonus.SPELL_LIKE_ATTACK.name" : "Атака, схожа на закляття",
@@ -762,6 +760,26 @@
 	"core.bonus.MECHANICAL.name" : "Механічний",
 	"core.bonus.PRISM_HEX_ATTACK_BREATH.description" : "Атака подихом у трьох напрямах",
 	"core.bonus.PRISM_HEX_ATTACK_BREATH.name" : "Призматична атака",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.name": "Стійкість до заклять",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.name.air": "Стійкість до Повітря",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.name.fire": "Стійкість до Вогню",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.name.water": "Стійкість до Води",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.name.earth": "Стійкість до Землі",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.description": "Шкода від усіх заклять зменшується на ${val}%.",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.description.air": "Шкода від усіх заклять школи Повітря зменшується на ${val}%.",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.description.fire": "Шкода від усіх заклять школи Вогню зменшується на ${val}%.",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.description.water": "Шкода від усіх заклять школи Води зменшується на ${val}%.",
+	"core.bonus.SPELL_DAMAGE_REDUCTION.description.earth": "Шкода від усіх заклять школи Землі зменшується на ${val}%.",
+	"core.bonus.SPELL_SCHOOL_IMMUNITY.name": "Імунітет до усіх заклять",
+	"core.bonus.SPELL_SCHOOL_IMMUNITY.name.air": "Імунітет до Повітря",
+	"core.bonus.SPELL_SCHOOL_IMMUNITY.name.fire": "Імунітет до Вогню",
+	"core.bonus.SPELL_SCHOOL_IMMUNITY.name.water": "Імунітет до Води",
+	"core.bonus.SPELL_SCHOOL_IMMUNITY.name.earth": "Імунітет до Землі",
+	"core.bonus.SPELL_SCHOOL_IMMUNITY.description": "На цей загін не діють жодні заклинання",
+	"core.bonus.SPELL_SCHOOL_IMMUNITY.description.air": "На цей загін не діють жодні закляття школи Повітря",
+	"core.bonus.SPELL_SCHOOL_IMMUNITY.description.fire": "На цей загін не діють жодні закляття школи Вогню",
+	"core.bonus.SPELL_SCHOOL_IMMUNITY.description.water": "На цей загін не діють жодні закляття школи Води",
+	"core.bonus.SPELL_SCHOOL_IMMUNITY.description.earth": "На цей загін не діють жодні закляття школи Землі",
 	"core.bonus.REVENGE.description" : "Завдає додаткової шкоди залежно від втраченого здоров'я в бою",
 	"core.bonus.REVENGE.name" : "Помста"
 }
diff --git a/lib/CBonusTypeHandler.cpp b/lib/CBonusTypeHandler.cpp
index 1b4e0afdf..62ce7f76e 100644
--- a/lib/CBonusTypeHandler.cpp
+++ b/lib/CBonusTypeHandler.cpp
@@ -75,21 +75,13 @@ std::string CBonusTypeHandler::bonusToString(const std::shared_ptr<Bonus> & bonu
 	std::string textID = description ? bt.getDescriptionTextID() : bt.getNameTextID();
 	std::string text = VLC->generaltexth->translate(textID);
 
-	if (bonus->subtype.as<SpellSchool>().hasValue())
+	auto school = bonus->subtype.as<SpellSchool>();
+	if (school.hasValue() && school != SpellSchool::ANY)
 	{
-		auto school = bonus->subtype.as<SpellSchool>();
-		if(school != SpellSchool::ANY)
-		{
-			auto specificTextID = description ? bt.getDescriptionTextID() + ".specific" : bt.getNameTextID() + ".specific";
-			auto specificText = VLC->generaltexth->translate(specificTextID);
-
-			if(specificText.find("${subtype.spellSchool}") != std::string::npos)
-			{
-				auto schoolName = VLC->generaltexth->translate(TextIdentifier("core.spellSchools", school).get());
-				boost::algorithm::replace_all(specificText, "${subtype.spellSchool}", schoolName);
-				text = specificText;
-			}
-		}
+		std::string schoolName = school.encode(school.getNum());
+		std::string baseTextID = description ? bt.getDescriptionTextID() : bt.getNameTextID();
+		std::string fullTextID = baseTextID + '.' + schoolName;
+		text = VLC->generaltexth->translate(fullTextID);
 	}
 
 	if (text.find("${val}") != std::string::npos)