diff --git a/src/main/java/com/l2jserver/datapack/quests/Q00214_TrialOfTheScholar/Q00214_TrialOfTheScholar.java b/src/main/java/com/l2jserver/datapack/quests/Q00214_TrialOfTheScholar/Q00214_TrialOfTheScholar.java
index 4eefc7cae78eb694b21589d80e1866d735baf348..a8cf71d49e44f171b93e8cb7d75d21e604d79bdd 100644
--- a/src/main/java/com/l2jserver/datapack/quests/Q00214_TrialOfTheScholar/Q00214_TrialOfTheScholar.java
+++ b/src/main/java/com/l2jserver/datapack/quests/Q00214_TrialOfTheScholar/Q00214_TrialOfTheScholar.java
@@ -22,7 +22,9 @@ import com.l2jserver.gameserver.enums.audio.Sound;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.base.ClassId;
+import com.l2jserver.gameserver.model.holders.QuestItemChanceHolder;
 import com.l2jserver.gameserver.model.quest.Quest;
+import com.l2jserver.gameserver.model.quest.QuestDroplist;
 import com.l2jserver.gameserver.model.quest.QuestState;
 import com.l2jserver.gameserver.network.serverpackets.SocialAction;
 import com.l2jserver.gameserver.util.Util;
@@ -47,6 +49,17 @@ public final class Q00214_TrialOfTheScholar extends Quest {
 	private static final int ELDER_CRONOS = 30610;
 	private static final int DRUNKARD_TRIFF = 30611;
 	private static final int ELDER_CASIAN = 30612;
+	// Monsters
+	private static final int MONSTER_EYE_DESTROYER = 20068;
+	private static final int MEDUSA = 20158;
+	private static final int GHOUL = 20201;
+	private static final int SHACKLE1 = 20235;
+	private static final int BREKA_ORC_SHAMAN = 20269;
+	private static final int SHACKLE2 = 20279;
+	private static final int FETTERED_SOUL = 20552;
+	private static final int GRANDIS = 20554;
+	private static final int ENCHANTED_GARGOYLE = 20567;
+	private static final int LETO_LIZARDMAN_WARRIOR = 20580;
 	// Items
 	private static final int MIRIENS_1ST_SIGIL = 2675;
 	private static final int MIRIENS_2ND_SIGIL = 2676;
@@ -60,7 +73,6 @@ public final class Q00214_TrialOfTheScholar extends Quest {
 	private static final int CRERAS_PAINTING1 = 2684;
 	private static final int CRERAS_PAINTING2 = 2685;
 	private static final int CRERAS_PAINTING3 = 2686;
-	private static final int BROWN_SCROLL_SCRAP = 2687;
 	private static final int CRYSTAL_OF_PURITY1 = 2688;
 	private static final int HIGH_PRIESTS_SIGIL = 2689;
 	private static final int GRAND_MAGISTER_SIGIL = 2690;
@@ -68,9 +80,6 @@ public final class Q00214_TrialOfTheScholar extends Quest {
 	private static final int SYLVAINS_LETTER = 2692;
 	private static final int SYMBOL_OF_SYLVAIN = 2693;
 	private static final int JUREKS_LIST = 2694;
-	private static final int MONSTER_EYE_DESTROYER_SKIN = 2695;
-	private static final int SHAMANS_NECKLACE = 2696;
-	private static final int SHACKLES_SCALP = 2697;
 	private static final int SYMBOL_OF_JUREK = 2698;
 	private static final int CRONOS_LETTER = 2699;
 	private static final int DIETERS_KEY = 2700;
@@ -88,25 +97,31 @@ public final class Q00214_TrialOfTheScholar extends Quest {
 	private static final int STRONG_LIGUOR = 2713;
 	private static final int CRYSTAL_OF_PURITY2 = 2714;
 	private static final int CASIANS_LIST = 2715;
-	private static final int GHOULS_SKIN = 2716;
-	private static final int MEDUSAS_BLOOD = 2717;
-	private static final int FETTERED_SOULS_ICHOR = 2718;
-	private static final int ENCHANTED_GARGOYLES_NAIL = 2719;
 	private static final int SYMBOL_OF_CRONOS = 2720;
+	private static final QuestItemChanceHolder BROWN_SCROLL_SCRAP = new QuestItemChanceHolder(2687, 5L);
+	private static final QuestItemChanceHolder MONSTER_EYE_DESTROYER_SKIN = new QuestItemChanceHolder(2695, 5L);
+	private static final QuestItemChanceHolder SHAMANS_NECKLACE = new QuestItemChanceHolder(2696, 5L);
+	private static final QuestItemChanceHolder SHACKLES_SCALP = new QuestItemChanceHolder(2697, 2L);
+	private static final QuestItemChanceHolder GHOULS_SKIN = new QuestItemChanceHolder(2716, 10L);
+	private static final QuestItemChanceHolder MEDUSAS_BLOOD = new QuestItemChanceHolder(2717, 12L);
+	private static final QuestItemChanceHolder FETTERED_SOULS_ICHOR = new QuestItemChanceHolder(2718, 5L);
+	private static final QuestItemChanceHolder ENCHANTED_GARGOYLES_NAIL = new QuestItemChanceHolder(2719, 5L);
+	// Droplists
+	private static final QuestDroplist DROPLIST_JUREK = QuestDroplist.builder()
+			.addSingleDrop(MONSTER_EYE_DESTROYER, MONSTER_EYE_DESTROYER_SKIN)
+			.addSingleDrop(SHACKLE1, SHACKLES_SCALP)
+			.addSingleDrop(SHACKLE2, SHACKLES_SCALP)
+			.addSingleDrop(BREKA_ORC_SHAMAN, SHAMANS_NECKLACE)
+			.build();
+	private static final QuestDroplist DROPLIST_CASIAN = QuestDroplist.builder()
+			.addSingleDrop(MEDUSA, MEDUSAS_BLOOD)
+			.addSingleDrop(GHOUL, GHOULS_SKIN)
+			.addSingleDrop(FETTERED_SOUL, FETTERED_SOULS_ICHOR)
+			.addSingleDrop(ENCHANTED_GARGOYLE, ENCHANTED_GARGOYLES_NAIL)
+			.build();
 	// Reward
 	private static final int MARK_OF_SCHOLAR = 2674;
 	private static final int DIMENSIONAL_DIAMOND = 7562;
-	// Monsters
-	private static final int MONSTER_EYE_DESTREOYER = 20068;
-	private static final int MEDUSA = 20158;
-	private static final int GHOUL = 20201;
-	private static final int SHACKLE1 = 20235;
-	private static final int BREKA_ORC_SHAMAN = 20269;
-	private static final int SHACKLE2 = 20279;
-	private static final int FETTERED_SOUL = 20552;
-	private static final int GRANDIS = 20554;
-	private static final int ENCHANTED_GARGOYLE = 20567;
-	private static final int LETO_LIZARDMAN_WARRIOR = 20580;
 	// Misc
 	private static final int MIN_LVL = 35;
 	private static final int LEVEL = 36;
@@ -115,8 +130,8 @@ public final class Q00214_TrialOfTheScholar extends Quest {
 		super(214, Q00214_TrialOfTheScholar.class.getSimpleName(), "Trial Of The Scholar");
 		addStartNpc(MAGISTER_MIRIEN);
 		addTalkId(MAGISTER_MIRIEN, HIGH_PRIEST_SYLVAIN, CAPTAIN_LUCAS, WAREHOUSE_KEEPER_VALKON, MAGISTER_DIETER, GRAND_MAGISTER_JUREK, TRADER_EDROC, WAREHOUSE_KEEPER_RAUT, BLACKSMITH_POITAN, MARIA, ASTROLOGER_CRETA, ELDER_CRONOS, DRUNKARD_TRIFF, ELDER_CASIAN);
-		addKillId(MONSTER_EYE_DESTREOYER, MEDUSA, GHOUL, SHACKLE1, BREKA_ORC_SHAMAN, SHACKLE2, FETTERED_SOUL, GRANDIS, ENCHANTED_GARGOYLE, LETO_LIZARDMAN_WARRIOR);
-		registerQuestItems(MIRIENS_1ST_SIGIL, MIRIENS_2ND_SIGIL, MIRIENS_3RD_SIGIL, MIRIENS_INSTRUCTION, MARIAS_1ST_LETTER, MARIAS_2ND_LETTER, LUCASS_LETTER, LUCILLAS_HANDBAG, CRETAS_1ST_LETTER, CRERAS_PAINTING1, CRERAS_PAINTING1, CRERAS_PAINTING3, BROWN_SCROLL_SCRAP, CRYSTAL_OF_PURITY1, HIGH_PRIESTS_SIGIL, GRAND_MAGISTER_SIGIL, CRONOS_SIGIL, SYLVAINS_LETTER, SYMBOL_OF_SYLVAIN, JUREKS_LIST, MONSTER_EYE_DESTROYER_SKIN, SHAMANS_NECKLACE, SHACKLES_SCALP, SYMBOL_OF_JUREK, CRONOS_LETTER, DIETERS_KEY, CRETAS_2ND_LETTER, DIETERS_LETTER, DIETERS_DIARY, RAUTS_LETTER_ENVELOPE, TRIFFS_RING, SCRIPTURE_CHAPTER_1, SCRIPTURE_CHAPTER_2, SCRIPTURE_CHAPTER_3, SCRIPTURE_CHAPTER_4, VALKONS_REQUEST, POITANS_NOTES, STRONG_LIGUOR, CRYSTAL_OF_PURITY2, CASIANS_LIST, GHOULS_SKIN, MEDUSAS_BLOOD, FETTERED_SOULS_ICHOR, ENCHANTED_GARGOYLES_NAIL, SYMBOL_OF_CRONOS);
+		addKillId(MONSTER_EYE_DESTROYER, MEDUSA, GHOUL, SHACKLE1, BREKA_ORC_SHAMAN, SHACKLE2, FETTERED_SOUL, GRANDIS, ENCHANTED_GARGOYLE, LETO_LIZARDMAN_WARRIOR);
+		registerQuestItems(MIRIENS_1ST_SIGIL, MIRIENS_2ND_SIGIL, MIRIENS_3RD_SIGIL, MIRIENS_INSTRUCTION, MARIAS_1ST_LETTER, MARIAS_2ND_LETTER, LUCASS_LETTER, LUCILLAS_HANDBAG, CRETAS_1ST_LETTER, CRERAS_PAINTING1, CRERAS_PAINTING1, CRERAS_PAINTING3, BROWN_SCROLL_SCRAP.getId(), CRYSTAL_OF_PURITY1, HIGH_PRIESTS_SIGIL, GRAND_MAGISTER_SIGIL, CRONOS_SIGIL, SYLVAINS_LETTER, SYMBOL_OF_SYLVAIN, JUREKS_LIST, MONSTER_EYE_DESTROYER_SKIN.getId(), SHAMANS_NECKLACE.getId(), SHACKLES_SCALP.getId(), SYMBOL_OF_JUREK, CRONOS_LETTER, DIETERS_KEY, CRETAS_2ND_LETTER, DIETERS_LETTER, DIETERS_DIARY, RAUTS_LETTER_ENVELOPE, TRIFFS_RING, SCRIPTURE_CHAPTER_1, SCRIPTURE_CHAPTER_2, SCRIPTURE_CHAPTER_3, SCRIPTURE_CHAPTER_4, VALKONS_REQUEST, POITANS_NOTES, STRONG_LIGUOR, CRYSTAL_OF_PURITY2, CASIANS_LIST, GHOULS_SKIN.getId(), MEDUSAS_BLOOD.getId(), FETTERED_SOULS_ICHOR.getId(), ENCHANTED_GARGOYLES_NAIL.getId(), SYMBOL_OF_CRONOS);
 	}
 	
 	@Override
@@ -274,7 +289,7 @@ public final class Q00214_TrialOfTheScholar extends Quest {
 			case "30608-14.html": {
 				if (hasQuestItems(player, CRERAS_PAINTING3)) {
 					takeItems(player, CRERAS_PAINTING3, 1);
-					takeItems(player, BROWN_SCROLL_SCRAP, -1);
+					takeItems(player, BROWN_SCROLL_SCRAP.getId(), -1);
 					giveItems(player, CRYSTAL_OF_PURITY1, 1);
 					qs.setCond(13, true);
 					htmltext = event;
@@ -349,10 +364,10 @@ public final class Q00214_TrialOfTheScholar extends Quest {
 				giveItems(player, SCRIPTURE_CHAPTER_4, 1);
 				takeItems(player, POITANS_NOTES, 1);
 				takeItems(player, CASIANS_LIST, 1);
-				takeItems(player, GHOULS_SKIN, -1);
-				takeItems(player, MEDUSAS_BLOOD, -1);
-				takeItems(player, FETTERED_SOULS_ICHOR, -1);
-				takeItems(player, ENCHANTED_GARGOYLES_NAIL, -1);
+				takeItems(player, GHOULS_SKIN.getId(), -1);
+				takeItems(player, MEDUSAS_BLOOD.getId(), -1);
+				takeItems(player, FETTERED_SOULS_ICHOR.getId(), -1);
+				takeItems(player, ENCHANTED_GARGOYLES_NAIL.getId(), -1);
 				qs.setCond(30, true);
 				htmltext = event;
 				break;
@@ -365,102 +380,30 @@ public final class Q00214_TrialOfTheScholar extends Quest {
 	public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon) {
 		final QuestState qs = getQuestState(killer, false);
 		if ((qs != null) && qs.isStarted() && Util.checkIfInRange(1500, npc, killer, true)) {
-			switch (npc.getId()) {
-				case MONSTER_EYE_DESTREOYER: {
-					if (hasQuestItems(killer, MIRIENS_2ND_SIGIL, GRAND_MAGISTER_SIGIL, JUREKS_LIST) && (getQuestItemsCount(killer, MONSTER_EYE_DESTROYER_SKIN) < 5)) {
-						giveItems(killer, MONSTER_EYE_DESTROYER_SKIN, 1);
-						if ((getQuestItemsCount(killer, MONSTER_EYE_DESTROYER_SKIN) == 5) && (getQuestItemsCount(killer, SHAMANS_NECKLACE) >= 5) && (getQuestItemsCount(killer, SHACKLES_SCALP) >= 2)) {
-							qs.setCond(17, true);
-						} else {
-							playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET);
-						}
-					}
-					break;
-				}
-				case MEDUSA: {
-					if (hasQuestItems(killer, TRIFFS_RING, POITANS_NOTES, CASIANS_LIST) && (getQuestItemsCount(killer, MEDUSAS_BLOOD) < 12)) {
-						giveItems(killer, MEDUSAS_BLOOD, 1);
-						if (getQuestItemsCount(killer, MEDUSAS_BLOOD) == 12) {
+			if (DROPLIST_JUREK.get(npc) != null && hasQuestItems(qs.getPlayer(), MIRIENS_2ND_SIGIL, GRAND_MAGISTER_SIGIL, JUREKS_LIST)) {
+				if (giveItemRandomly(qs.getPlayer(), npc, DROPLIST_JUREK.get(npc), true)
+						&& hasItemsAtLimit(qs.getPlayer(), MONSTER_EYE_DESTROYER_SKIN, SHAMANS_NECKLACE, SHACKLES_SCALP)) {
+					qs.setCond(17);
+				}
+			} else if (DROPLIST_CASIAN.get(npc) != null && hasQuestItems(qs.getPlayer(), TRIFFS_RING, POITANS_NOTES, CASIANS_LIST)) {
+				if (giveItemRandomly(qs.getPlayer(), npc, DROPLIST_CASIAN.get(npc), true)
+						&& hasItemsAtLimit(qs.getPlayer(), MEDUSAS_BLOOD, GHOULS_SKIN, FETTERED_SOULS_ICHOR, ENCHANTED_GARGOYLES_NAIL)) {
+					qs.setCond(29);
+				}
+			} else {
+				switch (npc.getId()) {
+					case GRANDIS -> {
+						if (hasQuestItems(killer, MIRIENS_3RD_SIGIL, CRONOS_SIGIL, TRIFFS_RING) && !hasQuestItems(killer, SCRIPTURE_CHAPTER_3)) {
+							giveItems(killer, SCRIPTURE_CHAPTER_3, 1);
 							playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE);
-						} else {
-							playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET);
 						}
 					}
-					break;
-				}
-				case GHOUL: {
-					if (hasQuestItems(killer, TRIFFS_RING, POITANS_NOTES, CASIANS_LIST) && (getQuestItemsCount(killer, GHOULS_SKIN) < 10)) {
-						giveItems(killer, GHOULS_SKIN, 1);
-						if (getQuestItemsCount(killer, GHOULS_SKIN) == 10) {
-							qs.setCond(29, true);
-						} else {
-							playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET);
+					case LETO_LIZARDMAN_WARRIOR -> {
+						if (hasQuestItems(killer, MIRIENS_1ST_SIGIL, HIGH_PRIESTS_SIGIL, CRERAS_PAINTING3)
+								&& giveItemRandomly(qs.getPlayer(), npc, BROWN_SCROLL_SCRAP, true)) {
+							qs.setCond(12);
 						}
 					}
-					break;
-				}
-				case SHACKLE1:
-				case SHACKLE2: {
-					if (hasQuestItems(killer, MIRIENS_2ND_SIGIL, GRAND_MAGISTER_SIGIL, JUREKS_LIST) && (getQuestItemsCount(killer, SHACKLES_SCALP) < 2)) {
-						giveItems(killer, SHACKLES_SCALP, 1);
-						if ((getQuestItemsCount(killer, MONSTER_EYE_DESTROYER_SKIN) >= 5) && (getQuestItemsCount(killer, SHAMANS_NECKLACE) >= 5) && (getQuestItemsCount(killer, SHACKLES_SCALP) == 2)) {
-							qs.setCond(17, true);
-						} else {
-							playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET);
-						}
-					}
-					break;
-				}
-				case BREKA_ORC_SHAMAN: {
-					if (hasQuestItems(killer, MIRIENS_2ND_SIGIL, GRAND_MAGISTER_SIGIL, JUREKS_LIST) && (getQuestItemsCount(killer, SHAMANS_NECKLACE) < 5)) {
-						giveItems(killer, SHAMANS_NECKLACE, 1);
-						if ((getQuestItemsCount(killer, MONSTER_EYE_DESTROYER_SKIN) >= 5) && (getQuestItemsCount(killer, SHAMANS_NECKLACE) == 5) && (getQuestItemsCount(killer, SHACKLES_SCALP) >= 2)) {
-							qs.setCond(17, true);
-						} else {
-							playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET);
-						}
-					}
-					break;
-				}
-				case FETTERED_SOUL: {
-					if (hasQuestItems(killer, TRIFFS_RING, POITANS_NOTES, CASIANS_LIST) && (getQuestItemsCount(killer, FETTERED_SOULS_ICHOR) < 5)) {
-						giveItems(killer, FETTERED_SOULS_ICHOR, 1);
-						if (getQuestItemsCount(killer, FETTERED_SOULS_ICHOR) >= 5) {
-							playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE);
-						} else {
-							playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET);
-						}
-					}
-					break;
-				}
-				case GRANDIS: {
-					if (hasQuestItems(killer, MIRIENS_3RD_SIGIL, CRONOS_SIGIL, TRIFFS_RING) && !hasQuestItems(killer, SCRIPTURE_CHAPTER_3)) {
-						giveItems(killer, SCRIPTURE_CHAPTER_3, 1);
-						playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE);
-					}
-					break;
-				}
-				case ENCHANTED_GARGOYLE: {
-					if (hasQuestItems(killer, TRIFFS_RING, POITANS_NOTES, CASIANS_LIST) && (getQuestItemsCount(killer, ENCHANTED_GARGOYLES_NAIL) < 5)) {
-						giveItems(killer, ENCHANTED_GARGOYLES_NAIL, 1);
-						if (getQuestItemsCount(killer, ENCHANTED_GARGOYLES_NAIL) >= 5) {
-							playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE);
-						} else {
-							playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET);
-						}
-					}
-					break;
-				}
-				case LETO_LIZARDMAN_WARRIOR: {
-					if (hasQuestItems(killer, MIRIENS_1ST_SIGIL, HIGH_PRIESTS_SIGIL, CRERAS_PAINTING3) && (getQuestItemsCount(killer, BROWN_SCROLL_SCRAP) < 5)) {
-						giveItems(killer, BROWN_SCROLL_SCRAP, 1);
-						if (getQuestItemsCount(killer, BROWN_SCROLL_SCRAP) == 5) {
-							qs.setCond(12, true);
-						} else {
-							playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET);
-						}
-					}
-					break;
 				}
 			}
 		}
@@ -555,7 +498,7 @@ public final class Q00214_TrialOfTheScholar extends Quest {
 						} else if (hasQuestItems(player, CRERAS_PAINTING2)) {
 							htmltext = "30071-03.html";
 						} else if (hasQuestItems(player, CRERAS_PAINTING3)) {
-							if (getQuestItemsCount(player, BROWN_SCROLL_SCRAP) < 5) {
+							if (!hasItemsAtLimit(player, BROWN_SCROLL_SCRAP)) {
 								htmltext = "30071-05.html";
 							} else {
 								htmltext = "30071-06.html";
@@ -611,14 +554,14 @@ public final class Q00214_TrialOfTheScholar extends Quest {
 						if (!hasAtLeastOneQuestItem(player, GRAND_MAGISTER_SIGIL, SYMBOL_OF_JUREK)) {
 							htmltext = "30115-01.html";
 						} else if (hasQuestItems(player, JUREKS_LIST)) {
-							if ((getQuestItemsCount(player, MONSTER_EYE_DESTROYER_SKIN) + getQuestItemsCount(player, SHAMANS_NECKLACE) + getQuestItemsCount(player, SHACKLES_SCALP)) < 12) {
+							if (!hasItemsAtLimit(qs.getPlayer(), MONSTER_EYE_DESTROYER_SKIN, SHAMANS_NECKLACE, SHACKLES_SCALP)) {
 								htmltext = "30115-04.html";
 							} else {
 								takeItems(player, GRAND_MAGISTER_SIGIL, 1);
 								takeItems(player, JUREKS_LIST, 1);
-								takeItems(player, MONSTER_EYE_DESTROYER_SKIN, -1);
-								takeItems(player, SHAMANS_NECKLACE, -1);
-								takeItems(player, SHACKLES_SCALP, -1);
+								takeItems(player, MONSTER_EYE_DESTROYER_SKIN.getId(), -1);
+								takeItems(player, SHAMANS_NECKLACE.getId(), -1);
+								takeItems(player, SHACKLES_SCALP.getId(), -1);
 								giveItems(player, SYMBOL_OF_JUREK, 1);
 								qs.setCond(18, true);
 								htmltext = "30115-05.html";
@@ -695,7 +638,7 @@ public final class Q00214_TrialOfTheScholar extends Quest {
 						} else if (hasQuestItems(player, CRERAS_PAINTING2)) {
 							htmltext = "30608-11.html";
 						} else if (hasQuestItems(player, CRERAS_PAINTING3)) {
-							if (getQuestItemsCount(player, BROWN_SCROLL_SCRAP) < 5) {
+							if (!hasItemsAtLimit(player, BROWN_SCROLL_SCRAP)) {
 								qs.setCond(11, true);
 								htmltext = "30608-12.html";
 							} else {
@@ -772,7 +715,7 @@ public final class Q00214_TrialOfTheScholar extends Quest {
 								htmltext = "30612-01.html";
 							}
 						} else {
-							if ((getQuestItemsCount(player, GHOULS_SKIN) + getQuestItemsCount(player, MEDUSAS_BLOOD) + getQuestItemsCount(player, FETTERED_SOULS_ICHOR) + getQuestItemsCount(player, ENCHANTED_GARGOYLES_NAIL)) < 32) {
+							if (!hasItemsAtLimit(player, GHOULS_SKIN, MEDUSAS_BLOOD, FETTERED_SOULS_ICHOR, ENCHANTED_GARGOYLES_NAIL)) {
 								htmltext = "30612-05.html";
 							} else {
 								htmltext = "30612-06.html";
diff --git a/src/main/java/com/l2jserver/datapack/quests/Q00219_TestimonyOfFate/Q00219_TestimonyOfFate.java b/src/main/java/com/l2jserver/datapack/quests/Q00219_TestimonyOfFate/Q00219_TestimonyOfFate.java
index d5f9e7c7dc54607bd86a4e561753a5e08af45199..01b9f5e7a276efc25992d169ca2a543c497c262b 100644
--- a/src/main/java/com/l2jserver/datapack/quests/Q00219_TestimonyOfFate/Q00219_TestimonyOfFate.java
+++ b/src/main/java/com/l2jserver/datapack/quests/Q00219_TestimonyOfFate/Q00219_TestimonyOfFate.java
@@ -23,7 +23,9 @@ import com.l2jserver.gameserver.enums.Race;
 import com.l2jserver.gameserver.enums.audio.Sound;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.holders.QuestItemChanceHolder;
 import com.l2jserver.gameserver.model.quest.Quest;
+import com.l2jserver.gameserver.model.quest.QuestDroplist;
 import com.l2jserver.gameserver.model.quest.QuestState;
 import com.l2jserver.gameserver.network.serverpackets.SocialAction;
 import com.l2jserver.gameserver.util.Util;
@@ -44,17 +46,27 @@ public final class Q00219_TestimonyOfFate extends Quest {
 	private static final int BROTHER_METHEUS = 30614;
 	private static final int BLOODY_PIXY = 31845;
 	private static final int BLIGHT_TREANT = 31850;
+	// Monster
+	private static final int HANGMAN_TREE = 20144;
+	private static final int MARSH_STAKATO = 20157;
+	private static final int MEDUSA = 20158;
+	private static final int TYRANT = 20192;
+	private static final int TYRANT_KINGPIN = 20193;
+	private static final int DEAD_SEEKER = 20202;
+	private static final int MARSH_STAKATO_WORKER = 20230;
+	private static final int MARSH_STAKATO_SOLDIER = 20232;
+	private static final int MARSH_SPIDER = 20233;
+	private static final int MARSH_STAKATO_DRONE = 20234;
+	private static final int BREKA_ORC_OVERLORD = 20270;
+	private static final int GRANDIS = 20554;
+	private static final int LETO_LIZARDMAN_OVERLORD = 20582;
+	private static final int KARUL_BUGBEAR = 20600;
 	// Items
 	private static final int KAIRAS_LETTER = 3173;
 	private static final int METHEUSS_FUNERAL_JAR = 3174;
 	private static final int KASANDRAS_REMAINS = 3175;
 	private static final int HERBALISM_TEXTBOOK = 3176;
 	private static final int IXIAS_LIST = 3177;
-	private static final int MEDUSAS_ICHOR = 3178;
-	private static final int MARSH_SPIDER_FLUIDS = 3179;
-	private static final int DEAD_SEEKER_DUNG = 3180;
-	private static final int TYRANTS_BLOOD = 3181;
-	private static final int NIGHTSHADE_ROOT = 3182;
 	private static final int BELLADONNA = 3183;
 	private static final int ALDERS_SKULL1 = 3184;
 	private static final int ALDERS_SKULL2 = 3185;
@@ -75,24 +87,22 @@ public final class Q00219_TestimonyOfFate extends Quest {
 	private static final int BLACK_WILLOW_LEAF = 3200;
 	private static final int BLIGHT_TREANT_SAP = 3201;
 	private static final int ARKENIAS_LETTER = 3202;
+	private static final QuestItemChanceHolder MEDUSAS_ICHOR = new QuestItemChanceHolder(3178, 10L);
+	private static final QuestItemChanceHolder MARSH_SPIDER_FLUIDS = new QuestItemChanceHolder(3179, 10L);
+	private static final QuestItemChanceHolder DEAD_SEEKER_DUNG = new QuestItemChanceHolder(3180, 10L);
+	private static final QuestItemChanceHolder TYRANTS_BLOOD = new QuestItemChanceHolder(3181, 10L);
+	private static final QuestItemChanceHolder NIGHTSHADE_ROOT = new QuestItemChanceHolder(3182, 10L);
+	// Droplist
+	private static final QuestDroplist DROPLIST = QuestDroplist.builder()
+			.bulkAddSingleDrop(NIGHTSHADE_ROOT).withNpcs(MARSH_STAKATO, MARSH_STAKATO_WORKER, MARSH_STAKATO_SOLDIER, MARSH_STAKATO_DRONE).withRequiredItems(IXIAS_LIST).build()
+			.addSingleDrop(MEDUSA, MEDUSAS_ICHOR).withRequiredItems(IXIAS_LIST)
+			.bulkAddSingleDrop(TYRANTS_BLOOD).withNpcs(TYRANT, TYRANT_KINGPIN).withRequiredItems(IXIAS_LIST).build()
+			.addSingleDrop(DEAD_SEEKER, DEAD_SEEKER_DUNG).withRequiredItems(IXIAS_LIST)
+			.addSingleDrop(MARSH_SPIDER, MARSH_SPIDER_FLUIDS).withRequiredItems(IXIAS_LIST)
+			.build();
 	// Reward
 	private static final int MARK_OF_FATE = 3172;
 	private static final int DIMENSIONAL_DIAMOND = 7562;
-	// Monster
-	private static final int HANGMAN_TREE = 20144;
-	private static final int MARSH_STAKATO = 20157;
-	private static final int MEDUSA = 20158;
-	private static final int TYRANT = 20192;
-	private static final int TYRANT_KINGPIN = 20193;
-	private static final int DEAD_SEEKER = 20202;
-	private static final int MARSH_STAKATO_WORKER = 20230;
-	private static final int MARSH_STAKATO_SOLDIER = 20232;
-	private static final int MARSH_SPIDER = 20233;
-	private static final int MARSH_STAKATO_DRONE = 20234;
-	private static final int BREKA_ORC_OVERLORD = 20270;
-	private static final int GRANDIS = 20554;
-	private static final int LETO_LIZARDMAN_OVERLORD = 20582;
-	private static final int KARUL_BUGBEAR = 20600;
 	// Quest Monster
 	private static final int BLACK_WILLOW_LURKER = 27079;
 	// Misc
@@ -103,7 +113,7 @@ public final class Q00219_TestimonyOfFate extends Quest {
 		addStartNpc(MAGISTER_KAIRA);
 		addTalkId(MAGISTER_KAIRA, MAGISTER_ROA, WAREHOUSE_KEEPER_NORMAN, TETRARCH_THIFIELL, ARKENIA, MASTER_IXIA, ALDERS_SPIRIT, BROTHER_METHEUS, BLOODY_PIXY, BLIGHT_TREANT);
 		addKillId(HANGMAN_TREE, MARSH_STAKATO, MEDUSA, TYRANT, TYRANT_KINGPIN, DEAD_SEEKER, MARSH_STAKATO_WORKER, MARSH_STAKATO_SOLDIER, MARSH_SPIDER, MARSH_STAKATO_DRONE, BREKA_ORC_OVERLORD, GRANDIS, LETO_LIZARDMAN_OVERLORD, KARUL_BUGBEAR, BLACK_WILLOW_LURKER);
-		registerQuestItems(KAIRAS_LETTER, METHEUSS_FUNERAL_JAR, KASANDRAS_REMAINS, HERBALISM_TEXTBOOK, IXIAS_LIST, MEDUSAS_ICHOR, MARSH_SPIDER_FLUIDS, DEAD_SEEKER_DUNG, TYRANTS_BLOOD, NIGHTSHADE_ROOT, BELLADONNA, ALDERS_SKULL1, ALDERS_SKULL2, ALDERS_RECEIPT, REVELATIONS_MANUSCRIPT, KAIRAS_RECOMMENDATION, KAIRAS_INSTRUCTIONS, PALUS_CHARM, THIFIELLS_LETTER, ARKENIAS_NOTE, PIXY_GARNET, GRANDISS_SKULL, KARUL_BUGBEAR_SKULL, BREKA_OVERLORD_SKULL, LETO_OVERLORD_SKULL, RED_FAIRY_DUST, TIMIRIRAN_SEED, BLACK_WILLOW_LEAF, BLIGHT_TREANT_SAP, ARKENIAS_LETTER);
+		registerQuestItems(KAIRAS_LETTER, METHEUSS_FUNERAL_JAR, KASANDRAS_REMAINS, HERBALISM_TEXTBOOK, IXIAS_LIST, MEDUSAS_ICHOR.getId(), MARSH_SPIDER_FLUIDS.getId(), DEAD_SEEKER_DUNG.getId(), TYRANTS_BLOOD.getId(), NIGHTSHADE_ROOT.getId(), BELLADONNA, ALDERS_SKULL1, ALDERS_SKULL2, ALDERS_RECEIPT, REVELATIONS_MANUSCRIPT, KAIRAS_RECOMMENDATION, KAIRAS_INSTRUCTIONS, PALUS_CHARM, THIFIELLS_LETTER, ARKENIAS_NOTE, PIXY_GARNET, GRANDISS_SKULL, KARUL_BUGBEAR_SKULL, BREKA_OVERLORD_SKULL, LETO_OVERLORD_SKULL, RED_FAIRY_DUST, TIMIRIRAN_SEED, BLACK_WILLOW_LEAF, BLIGHT_TREANT_SAP, ARKENIAS_LETTER);
 	}
 	
 	@Override
@@ -194,136 +204,58 @@ public final class Q00219_TestimonyOfFate extends Quest {
 	@Override
 	public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon) {
 		final QuestState qs = getQuestState(killer, false);
-		if ((qs != null) && qs.isStarted() && Util.checkIfInRange(1500, npc, killer, true)) {
+		if ((qs != null) && qs.isStarted() && Util.checkIfInRange(1500, npc, qs.getPlayer(), true)) {
+			if (DROPLIST.get(npc) != null && hasQuestItems(qs.getPlayer(), DROPLIST.get(npc).requiredItems())) {
+				if (giveItemRandomly(qs.getPlayer(), npc, DROPLIST.get(npc), true)
+						&& hasItemsAtLimit(qs.getPlayer(), MEDUSAS_ICHOR, MARSH_SPIDER_FLUIDS, DEAD_SEEKER_DUNG, TYRANTS_BLOOD, NIGHTSHADE_ROOT)) {
+					qs.setCond(7);
+				}
+			}
 			switch (npc.getId()) {
-				case HANGMAN_TREE: {
+				case HANGMAN_TREE -> {
 					if (hasQuestItems(killer, METHEUSS_FUNERAL_JAR) && !hasQuestItems(killer, KASANDRAS_REMAINS)) {
 						takeItems(killer, METHEUSS_FUNERAL_JAR, 1);
 						giveItems(killer, KASANDRAS_REMAINS, 1);
 						qs.setCond(3, true);
 					}
 				}
-				case MARSH_STAKATO:
-				case MARSH_STAKATO_WORKER:
-				case MARSH_STAKATO_SOLDIER:
-				case MARSH_STAKATO_DRONE: {
-					if (hasQuestItems(killer, IXIAS_LIST) && (getQuestItemsCount(killer, NIGHTSHADE_ROOT) < 10)) {
-						if (getQuestItemsCount(killer, NIGHTSHADE_ROOT) == 9) {
-							giveItems(killer, NIGHTSHADE_ROOT, 1);
-							playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE);
-							if ((getQuestItemsCount(killer, MEDUSAS_ICHOR) >= 10) && (getQuestItemsCount(killer, MARSH_SPIDER_FLUIDS) >= 10) && (getQuestItemsCount(killer, DEAD_SEEKER_DUNG) >= 10) && (getQuestItemsCount(killer, TYRANTS_BLOOD) >= 10)) {
-								qs.setCond(7);
-							}
-						} else {
-							giveItems(killer, NIGHTSHADE_ROOT, 1);
-							playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET);
-						}
-					}
-					break;
-				}
-				case MEDUSA: {
-					if (hasQuestItems(killer, IXIAS_LIST) && (getQuestItemsCount(killer, MEDUSAS_ICHOR) < 10)) {
-						if (getQuestItemsCount(killer, MEDUSAS_ICHOR) == 9) {
-							giveItems(killer, MEDUSAS_ICHOR, 1);
-							playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE);
-							if ((getQuestItemsCount(killer, MARSH_SPIDER_FLUIDS) >= 10) && (getQuestItemsCount(killer, DEAD_SEEKER_DUNG) >= 10) && (getQuestItemsCount(killer, TYRANTS_BLOOD) >= 10) && (getQuestItemsCount(killer, NIGHTSHADE_ROOT) >= 10)) {
-								qs.setCond(7);
-							}
-						} else {
-							giveItems(killer, MEDUSAS_ICHOR, 1);
-							playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET);
-						}
-					}
-					break;
-				}
-				case TYRANT:
-				case TYRANT_KINGPIN: {
-					if (hasQuestItems(killer, IXIAS_LIST) && (getQuestItemsCount(killer, TYRANTS_BLOOD) < 10)) {
-						if (getQuestItemsCount(killer, TYRANTS_BLOOD) == 9) {
-							giveItems(killer, TYRANTS_BLOOD, 1);
-							playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE);
-							if ((getQuestItemsCount(killer, MEDUSAS_ICHOR) >= 10) && (getQuestItemsCount(killer, MARSH_SPIDER_FLUIDS) >= 10) && (getQuestItemsCount(killer, DEAD_SEEKER_DUNG) >= 10) && (getQuestItemsCount(killer, NIGHTSHADE_ROOT) >= 10)) {
-								qs.setCond(7);
-							}
-						} else {
-							giveItems(killer, TYRANTS_BLOOD, 1);
-							playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET);
-						}
-					}
-					break;
-				}
-				case DEAD_SEEKER: {
-					if (hasQuestItems(killer, IXIAS_LIST) && (getQuestItemsCount(killer, DEAD_SEEKER_DUNG) < 10)) {
-						if (getQuestItemsCount(killer, DEAD_SEEKER_DUNG) == 9) {
-							giveItems(killer, DEAD_SEEKER_DUNG, 1);
-							playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE);
-							if ((getQuestItemsCount(killer, MEDUSAS_ICHOR) >= 10) && (getQuestItemsCount(killer, MARSH_SPIDER_FLUIDS) >= 10) && (getQuestItemsCount(killer, TYRANTS_BLOOD) >= 10) && (getQuestItemsCount(killer, NIGHTSHADE_ROOT) >= 10)) {
-								qs.setCond(7);
-							}
-						} else {
-							giveItems(killer, DEAD_SEEKER_DUNG, 1);
-							playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET);
-						}
-					}
-					break;
-				}
-				case MARSH_SPIDER: {
-					if (hasQuestItems(killer, IXIAS_LIST) && (getQuestItemsCount(killer, MARSH_SPIDER_FLUIDS) < 10)) {
-						if (getQuestItemsCount(killer, MARSH_SPIDER_FLUIDS) == 9) {
-							giveItems(killer, MARSH_SPIDER_FLUIDS, 1);
-							playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE);
-							if ((getQuestItemsCount(killer, MEDUSAS_ICHOR) >= 10) && (getQuestItemsCount(killer, DEAD_SEEKER_DUNG) >= 10) && (getQuestItemsCount(killer, TYRANTS_BLOOD) >= 10) && (getQuestItemsCount(killer, NIGHTSHADE_ROOT) >= 10)) {
-								qs.setCond(7);
-							}
-						} else {
-							giveItems(killer, MARSH_SPIDER_FLUIDS, 1);
-							playSound(killer, Sound.ITEMSOUND_QUEST_ITEMGET);
-						}
-					}
-					break;
-				}
-				case BREKA_ORC_OVERLORD: {
+				case BREKA_ORC_OVERLORD -> {
 					if (hasQuestItems(killer, PALUS_CHARM, ARKENIAS_NOTE, PIXY_GARNET) && !hasQuestItems(killer, RED_FAIRY_DUST, BREKA_OVERLORD_SKULL)) {
 						if (!hasQuestItems(killer, BREKA_OVERLORD_SKULL)) {
 							giveItems(killer, BREKA_OVERLORD_SKULL, 1);
 							playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE);
 						}
 					}
-					break;
 				}
-				case GRANDIS: {
+				case GRANDIS -> {
 					if (hasQuestItems(killer, PALUS_CHARM, ARKENIAS_NOTE, PIXY_GARNET) && !hasQuestItems(killer, RED_FAIRY_DUST, GRANDISS_SKULL)) {
 						if (!hasQuestItems(killer, GRANDISS_SKULL)) {
 							giveItems(killer, GRANDISS_SKULL, 1);
 							playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE);
 						}
 					}
-					break;
 				}
-				case LETO_LIZARDMAN_OVERLORD: {
+				case LETO_LIZARDMAN_OVERLORD -> {
 					if (hasQuestItems(killer, PALUS_CHARM, ARKENIAS_NOTE, PIXY_GARNET) && !hasQuestItems(killer, RED_FAIRY_DUST, LETO_OVERLORD_SKULL)) {
 						if (!hasQuestItems(killer, LETO_OVERLORD_SKULL)) {
 							giveItems(killer, LETO_OVERLORD_SKULL, 1);
 							playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE);
 						}
 					}
-					break;
 				}
-				case KARUL_BUGBEAR: {
+				case KARUL_BUGBEAR -> {
 					if (hasQuestItems(killer, PALUS_CHARM, ARKENIAS_NOTE, PIXY_GARNET) && !hasQuestItems(killer, RED_FAIRY_DUST, KARUL_BUGBEAR_SKULL)) {
 						if (!hasQuestItems(killer, KARUL_BUGBEAR_SKULL)) {
 							giveItems(killer, KARUL_BUGBEAR_SKULL, 1);
 							playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE);
 						}
 					}
-					break;
 				}
-				case BLACK_WILLOW_LURKER: {
+				case BLACK_WILLOW_LURKER -> {
 					if (hasQuestItems(killer, PALUS_CHARM, ARKENIAS_NOTE, TIMIRIRAN_SEED) && !hasQuestItems(killer, BLIGHT_TREANT_SAP, BLACK_WILLOW_LEAF)) {
 						giveItems(killer, BLACK_WILLOW_LEAF, 1);
 						playSound(killer, Sound.ITEMSOUND_QUEST_MIDDLE);
 					}
-					break;
 				}
 			}
 		}
@@ -414,14 +346,13 @@ public final class Q00219_TestimonyOfFate extends Quest {
 						qs.setCond(6, true);
 						htmltext = "30463-01.html";
 					} else if (hasQuestItems(player, IXIAS_LIST)) {
-						if ((getQuestItemsCount(player, MEDUSAS_ICHOR) >= 10) && (getQuestItemsCount(player, MARSH_SPIDER_FLUIDS) >= 10) && (getQuestItemsCount(player, DEAD_SEEKER_DUNG) >= 10) && (getQuestItemsCount(player, TYRANTS_BLOOD) >= 10)
-							&& (getQuestItemsCount(player, NIGHTSHADE_ROOT) >= 10)) {
+						if (hasItemsAtLimit(player, MEDUSAS_ICHOR, MARSH_SPIDER_FLUIDS, DEAD_SEEKER_DUNG, TYRANTS_BLOOD, NIGHTSHADE_ROOT)) {
 							takeItems(player, IXIAS_LIST, 1);
-							takeItems(player, MEDUSAS_ICHOR, -1);
-							takeItems(player, MARSH_SPIDER_FLUIDS, -1);
-							takeItems(player, DEAD_SEEKER_DUNG, -1);
-							takeItems(player, TYRANTS_BLOOD, -1);
-							takeItems(player, NIGHTSHADE_ROOT, -1);
+							takeItems(player, MEDUSAS_ICHOR.getId(), -1);
+							takeItems(player, MARSH_SPIDER_FLUIDS.getId(), -1);
+							takeItems(player, DEAD_SEEKER_DUNG.getId(), -1);
+							takeItems(player, TYRANTS_BLOOD.getId(), -1);
+							takeItems(player, NIGHTSHADE_ROOT.getId(), -1);
 							giveItems(player, BELLADONNA, 1);
 							qs.setCond(8, true);
 							htmltext = "30463-03.html";
@@ -543,4 +474,4 @@ public final class Q00219_TestimonyOfFate extends Quest {
 		}
 		return htmltext;
 	}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/l2jserver/datapack/quests/Q00228_TestOfMagus/Q00228_TestOfMagus.java b/src/main/java/com/l2jserver/datapack/quests/Q00228_TestOfMagus/Q00228_TestOfMagus.java
index a3b3372ca742ff385bc95062b546c80ce1c31742..c21679bfcfad32847c9cab71c52a5ece5d7cdddc 100644
--- a/src/main/java/com/l2jserver/datapack/quests/Q00228_TestOfMagus/Q00228_TestOfMagus.java
+++ b/src/main/java/com/l2jserver/datapack/quests/Q00228_TestOfMagus/Q00228_TestOfMagus.java
@@ -25,7 +25,6 @@ import com.l2jserver.gameserver.model.base.ClassId;
 import com.l2jserver.gameserver.model.holders.QuestItemChanceHolder;
 import com.l2jserver.gameserver.model.quest.Quest;
 import com.l2jserver.gameserver.model.quest.QuestDroplist;
-import com.l2jserver.gameserver.model.quest.QuestDroplist.QuestDropInfo;
 import com.l2jserver.gameserver.model.quest.QuestState;
 import com.l2jserver.gameserver.network.NpcStringId;
 import com.l2jserver.gameserver.network.clientpackets.Say2;
@@ -33,9 +32,6 @@ import com.l2jserver.gameserver.network.serverpackets.NpcSay;
 import com.l2jserver.gameserver.network.serverpackets.SocialAction;
 import com.l2jserver.gameserver.util.Util;
 
-import java.util.HashMap;
-import java.util.Map;
-
 /**
  * Test Of Magus (228)
  * @author ivantotov
@@ -92,35 +88,17 @@ public final class Q00228_TestOfMagus extends Quest {
 	private static final QuestItemChanceHolder ENCHANTED_IRON_GOLEM_SCRAP = new QuestItemChanceHolder(2855, 10L);
 	// Droplist
 	private static final QuestDroplist DROPLIST = QuestDroplist.builder()
-			.addSingleDrop(HARPY, HARPYS_FEATHER)
+			.addSingleDrop(HARPY, HARPYS_FEATHER).withRequiredItems(SCORE_OF_ELEMENTS, SYLPH_CHARM)
 			.bulkAddSingleDrop(DAZZLING_DROP)
-				.withNpcs(MARSH_STAKATO, MARSH_STAKATO_WORKER, TOAD_LORD, MARSH_STAKATO_SOLDIER, MARSH_STAKATO_DRONE).build()
-			.addSingleDrop(WYRM, WYRMS_WINGBONE)
-			.addSingleDrop(WINDSUS, WINDSUS_MANE)
-			.addSingleDrop(ENCHANTED_MONSTEREYE, ENCHANTED_MONSTER_EYE_SHELL)
-			.addSingleDrop(ENCHANTED_STOLEN_GOLEM, ENCHANTED_GOLEM_POWDER)
-			.addSingleDrop(ENCHANTED_IRON_GOLEM, ENCHANTED_IRON_GOLEM_SCRAP)
-			.addSingleDrop(GHOST_FIRE, FLAME_CRYSTAL)
+				.withNpcs(MARSH_STAKATO, MARSH_STAKATO_WORKER, TOAD_LORD, MARSH_STAKATO_SOLDIER, MARSH_STAKATO_DRONE)
+				.withRequiredItems(SCORE_OF_ELEMENTS, UNDINE_CHARM).build()
+			.addSingleDrop(WYRM, WYRMS_WINGBONE).withRequiredItems(SCORE_OF_ELEMENTS, SYLPH_CHARM)
+			.addSingleDrop(WINDSUS, WINDSUS_MANE).withRequiredItems(SCORE_OF_ELEMENTS, SYLPH_CHARM)
+			.addSingleDrop(ENCHANTED_MONSTEREYE, ENCHANTED_MONSTER_EYE_SHELL).withRequiredItems(SCORE_OF_ELEMENTS, SERPENT_CHARM)
+			.addSingleDrop(ENCHANTED_STOLEN_GOLEM, ENCHANTED_GOLEM_POWDER).withRequiredItems(SCORE_OF_ELEMENTS, SERPENT_CHARM)
+			.addSingleDrop(ENCHANTED_IRON_GOLEM, ENCHANTED_IRON_GOLEM_SCRAP).withRequiredItems(SCORE_OF_ELEMENTS, SERPENT_CHARM)
+			.addSingleDrop(GHOST_FIRE, FLAME_CRYSTAL).withRequiredItems(SCORE_OF_ELEMENTS, SALAMANDER_CHARM)
 			.build();
-	private static final int[] SYLPH_REQUIRED_ITEMS = { SCORE_OF_ELEMENTS, SYLPH_CHARM };
-	private static final int[] UNDINE_REQUIRED_ITEMS = { SCORE_OF_ELEMENTS, UNDINE_CHARM };
-	private static final int[] SERPENT_REQUIRED_ITEMS = { SCORE_OF_ELEMENTS, SERPENT_CHARM };
-	private static final int[] SALAMANDER_REQUIRED_ITEMS = { SCORE_OF_ELEMENTS, SALAMANDER_CHARM };
-	private static final Map<Integer, int[]> MOBS_REQUIRED_ITEMS = new HashMap<>();
-	static {
-		MOBS_REQUIRED_ITEMS.put(HARPY, SYLPH_REQUIRED_ITEMS);
-		MOBS_REQUIRED_ITEMS.put(MARSH_STAKATO, UNDINE_REQUIRED_ITEMS);
-		MOBS_REQUIRED_ITEMS.put(MARSH_STAKATO_WORKER, UNDINE_REQUIRED_ITEMS);
-		MOBS_REQUIRED_ITEMS.put(TOAD_LORD, UNDINE_REQUIRED_ITEMS);
-		MOBS_REQUIRED_ITEMS.put(MARSH_STAKATO_SOLDIER, UNDINE_REQUIRED_ITEMS);
-		MOBS_REQUIRED_ITEMS.put(MARSH_STAKATO_DRONE, UNDINE_REQUIRED_ITEMS);
-		MOBS_REQUIRED_ITEMS.put(WYRM, SYLPH_REQUIRED_ITEMS);
-		MOBS_REQUIRED_ITEMS.put(WINDSUS, SYLPH_REQUIRED_ITEMS);
-		MOBS_REQUIRED_ITEMS.put(ENCHANTED_MONSTEREYE, SERPENT_REQUIRED_ITEMS);
-		MOBS_REQUIRED_ITEMS.put(ENCHANTED_STOLEN_GOLEM, SERPENT_REQUIRED_ITEMS);
-		MOBS_REQUIRED_ITEMS.put(ENCHANTED_IRON_GOLEM, SERPENT_REQUIRED_ITEMS);
-		MOBS_REQUIRED_ITEMS.put(GHOST_FIRE, SALAMANDER_REQUIRED_ITEMS);
-	}
 	// Reward
 	private static final int MARK_OF_MAGUS = 2840;
 	private static final int DIMENSIONAL_DIAMOND = 7562;
@@ -210,9 +188,8 @@ public final class Q00228_TestOfMagus extends Quest {
 	public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon) {
 		final QuestState qs = getQuestState(killer, false);
 		if ((qs != null) && qs.isStarted() && Util.checkIfInRange(1500, npc, qs.getPlayer(), true)) {
-			QuestDropInfo dropInfo = DROPLIST.get(npc);
-			if (dropInfo != null && hasQuestItems(qs.getPlayer(), MOBS_REQUIRED_ITEMS.get(npc.getId()))) {
-				giveItemRandomly(qs.getPlayer(), npc, dropInfo, true);
+			if (DROPLIST.get(npc) != null && hasQuestItems(qs.getPlayer(), DROPLIST.get(npc).requiredItems())) {
+				giveItemRandomly(qs.getPlayer(), npc, DROPLIST.get(npc), true);
 			} else {
 				switch (npc.getId()) {
 					case SINGING_FLOWER_PHANTASM -> {
diff --git a/src/main/java/com/l2jserver/datapack/quests/Q00412_PathOfTheDarkWizard/Q00412_PathOfTheDarkWizard.java b/src/main/java/com/l2jserver/datapack/quests/Q00412_PathOfTheDarkWizard/Q00412_PathOfTheDarkWizard.java
index 7f2508a10161914273f49abc227f158b4ec7f2d3..55025493e972687d3f6d4513ce75b25490c76151 100644
--- a/src/main/java/com/l2jserver/datapack/quests/Q00412_PathOfTheDarkWizard/Q00412_PathOfTheDarkWizard.java
+++ b/src/main/java/com/l2jserver/datapack/quests/Q00412_PathOfTheDarkWizard/Q00412_PathOfTheDarkWizard.java
@@ -28,8 +28,6 @@ import com.l2jserver.gameserver.model.quest.QuestState;
 import com.l2jserver.gameserver.network.serverpackets.SocialAction;
 import com.l2jserver.gameserver.util.Util;
 
-import java.util.Map;
-
 /**
  * Path Of The Dark Wizard (412)
  * @author ivantotov
@@ -59,16 +57,10 @@ public final class Q00412_PathOfTheDarkWizard extends Quest {
 	private static final QuestItemChanceHolder HEART_OF_LUNACY = new QuestItemChanceHolder(1260, 50.0, 3L);
 	// Droplist
 	private static final QuestDroplist DROPLIST = QuestDroplist.builder()
-			.addSingleDrop(MARSH_ZOMBIE, FAMILYS_REMAINS)
-			.bulkAddSingleDrop(KNEE_BONE).withNpcs(MISERY_SKELETON, SKELETON_HUNTER, SKELETON_HUNTER_ARCHER).build()
-			.addSingleDrop(SKELETON_SCOUT, HEART_OF_LUNACY)
+			.addSingleDrop(MARSH_ZOMBIE, FAMILYS_REMAINS).withRequiredItems(LUCKY_KEY)
+			.bulkAddSingleDrop(KNEE_BONE).withNpcs(MISERY_SKELETON, SKELETON_HUNTER, SKELETON_HUNTER_ARCHER).withRequiredItems(CANDLE).build()
+			.addSingleDrop(SKELETON_SCOUT, HEART_OF_LUNACY).withRequiredItems(HUB_SCENT)
 			.build();
-	private static final Map<Integer, Integer> MOBS_REQUIRED_ITEM = Map.of(
-			MARSH_ZOMBIE, LUCKY_KEY,
-			MISERY_SKELETON, CANDLE,
-			SKELETON_HUNTER, CANDLE,
-			SKELETON_HUNTER_ARCHER, CANDLE,
-			SKELETON_SCOUT, HUB_SCENT);
 	// Reward
 	private static final int JEWEL_OF_DARKNESS = 1261;
 	// Misc
@@ -158,7 +150,7 @@ public final class Q00412_PathOfTheDarkWizard extends Quest {
 	public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon) {
 		final QuestState qs = getQuestState(killer, false);
 		if ((qs != null) && qs.isStarted() && Util.checkIfInRange(1500, npc, qs.getPlayer(), true)) {
-			if (hasQuestItems(qs.getPlayer(), MOBS_REQUIRED_ITEM.get(npc.getId()))) {
+			if (hasQuestItems(qs.getPlayer(), DROPLIST.get(npc).requiredItems())) {
 				giveItemRandomly(qs.getPlayer(), npc, DROPLIST.get(npc), true);
 			}
 		}
diff --git a/src/main/java/com/l2jserver/datapack/quests/Q00419_GetAPet/Q00419_GetAPet.java b/src/main/java/com/l2jserver/datapack/quests/Q00419_GetAPet/Q00419_GetAPet.java
index a9d3b35fd006e38f557f61366ddc3c273f8852c7..d7d7336d59077fe33f4b3736d146f5de1caf83ae 100644
--- a/src/main/java/com/l2jserver/datapack/quests/Q00419_GetAPet/Q00419_GetAPet.java
+++ b/src/main/java/com/l2jserver/datapack/quests/Q00419_GetAPet/Q00419_GetAPet.java
@@ -18,11 +18,7 @@
  */
 package com.l2jserver.datapack.quests.Q00419_GetAPet;
 
-import java.util.HashMap;
-import java.util.Map;
-
 import com.l2jserver.gameserver.enums.Race;
-import com.l2jserver.gameserver.enums.audio.Sound;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.holders.QuestItemChanceHolder;
@@ -31,6 +27,9 @@ import com.l2jserver.gameserver.model.quest.QuestDroplist;
 import com.l2jserver.gameserver.model.quest.QuestState;
 import com.l2jserver.gameserver.util.Util;
 
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * Get A Pet (419)
  * @author ivantotov
@@ -73,40 +72,22 @@ public final class Q00419_GetAPet extends Quest {
 	private static final QuestItemChanceHolder BLOODY_RED_CLAW = new QuestItemChanceHolder(10165, 50L);
 	// Droplist
 	private static final QuestDroplist DROPLIST = QuestDroplist.builder()
-			.addSingleDrop(LESSER_DARK_HORROR, BLOODY_NAIL, 60.0)
-			.addSingleDrop(PROWLER, BLOODY_NAIL, 100.0)
-			.addSingleDrop(GIANT_SPIDER, BLOODY_FANG, 60.0)
-			.addSingleDrop(DARK_HORROR, BLOODY_NAIL, 75.0)
-			.addSingleDrop(TALON_SPIDER, BLOODY_FANG, 75.0)
-			.addSingleDrop(BLADE_SPIDER, BLOODY_FANG, 100.0)
-			.addSingleDrop(HOOK_SPIDER, BLOODY_CLAW, 75.0)
-			.addSingleDrop(HUNTER_TARANTULA, BLOODY_TARANTULA_NAIL, 75.0)
-			.addSingleDrop(CRIMSON_SPIDER, BLOODY_CLAW, 60.0)
-			.addSingleDrop(PINCER_SPIDER, BLOODY_CLAW, 100.0)
-			.addSingleDrop(KASHA_SPIDER, BLOODY_KASHA_FANG, 60.0)
-			.addSingleDrop(KASHA_FANG_SPIDER, BLOODY_KASHA_FANG, 75.0)
-			.addSingleDrop(KASHA_BLADE_SPIDER, BLOODY_KASHA_FANG, 100.0)
-			.addSingleDrop(PLUNDER_TARANTULA, BLOODY_TARANTULA_NAIL, 100.0)
-			.addSingleDrop(CRIMSON_SPIDER2, BLOODY_RED_CLAW, 75.0)
+			.addSingleDrop(LESSER_DARK_HORROR, BLOODY_NAIL, 60.0).withRequiredItems(ANIMAL_SLAYERS_3RD_LIST)
+			.addSingleDrop(PROWLER, BLOODY_NAIL, 100.0).withRequiredItems(ANIMAL_SLAYERS_3RD_LIST)
+			.addSingleDrop(GIANT_SPIDER, BLOODY_FANG, 60.0).withRequiredItems(ANIMAL_SLAYERS_1ST_LIST)
+			.addSingleDrop(DARK_HORROR, BLOODY_NAIL, 75.0).withRequiredItems(ANIMAL_SLAYERS_3RD_LIST)
+			.addSingleDrop(TALON_SPIDER, BLOODY_FANG, 75.0).withRequiredItems(ANIMAL_SLAYERS_1ST_LIST)
+			.addSingleDrop(BLADE_SPIDER, BLOODY_FANG, 100.0).withRequiredItems(ANIMAL_SLAYERS_1ST_LIST)
+			.addSingleDrop(HOOK_SPIDER, BLOODY_CLAW, 75.0).withRequiredItems(ANIMAL_SLAYERS_2ND_LIST)
+			.addSingleDrop(HUNTER_TARANTULA, BLOODY_TARANTULA_NAIL, 75.0).withRequiredItems(ANIMAL_SLAYERS_5TH_LIST)
+			.addSingleDrop(CRIMSON_SPIDER, BLOODY_CLAW, 60.0).withRequiredItems(ANIMAL_SLAYERS_2ND_LIST)
+			.addSingleDrop(PINCER_SPIDER, BLOODY_CLAW, 100.0).withRequiredItems(ANIMAL_SLAYERS_2ND_LIST)
+			.addSingleDrop(KASHA_SPIDER, BLOODY_KASHA_FANG, 60.0).withRequiredItems(ANIMAL_SLAYERS_4TH_LIST)
+			.addSingleDrop(KASHA_FANG_SPIDER, BLOODY_KASHA_FANG, 75.0).withRequiredItems(ANIMAL_SLAYERS_4TH_LIST)
+			.addSingleDrop(KASHA_BLADE_SPIDER, BLOODY_KASHA_FANG, 100.0).withRequiredItems(ANIMAL_SLAYERS_4TH_LIST)
+			.addSingleDrop(PLUNDER_TARANTULA, BLOODY_TARANTULA_NAIL, 100.0).withRequiredItems(ANIMAL_SLAYERS_5TH_LIST)
+			.addSingleDrop(CRIMSON_SPIDER2, BLOODY_RED_CLAW, 75.0).withRequiredItems(ANIMAL_SLAYERS_LIST)
 			.build();
-	private static final Map<Integer, Integer> MOBS_REQUIRED_ITEM = new HashMap<>();
-	static {
-		MOBS_REQUIRED_ITEM.put(LESSER_DARK_HORROR, ANIMAL_SLAYERS_3RD_LIST);
-		MOBS_REQUIRED_ITEM.put(PROWLER, ANIMAL_SLAYERS_3RD_LIST);
-		MOBS_REQUIRED_ITEM.put(GIANT_SPIDER, ANIMAL_SLAYERS_1ST_LIST);
-		MOBS_REQUIRED_ITEM.put(DARK_HORROR, ANIMAL_SLAYERS_3RD_LIST);
-		MOBS_REQUIRED_ITEM.put(TALON_SPIDER, ANIMAL_SLAYERS_1ST_LIST);
-		MOBS_REQUIRED_ITEM.put(BLADE_SPIDER, ANIMAL_SLAYERS_1ST_LIST);
-		MOBS_REQUIRED_ITEM.put(HOOK_SPIDER, ANIMAL_SLAYERS_2ND_LIST);
-		MOBS_REQUIRED_ITEM.put(HUNTER_TARANTULA, ANIMAL_SLAYERS_5TH_LIST);
-		MOBS_REQUIRED_ITEM.put(CRIMSON_SPIDER, ANIMAL_SLAYERS_2ND_LIST);
-		MOBS_REQUIRED_ITEM.put(PINCER_SPIDER, ANIMAL_SLAYERS_2ND_LIST);
-		MOBS_REQUIRED_ITEM.put(KASHA_SPIDER, ANIMAL_SLAYERS_4TH_LIST);
-		MOBS_REQUIRED_ITEM.put(KASHA_FANG_SPIDER, ANIMAL_SLAYERS_4TH_LIST);
-		MOBS_REQUIRED_ITEM.put(KASHA_BLADE_SPIDER, ANIMAL_SLAYERS_4TH_LIST);
-		MOBS_REQUIRED_ITEM.put(PLUNDER_TARANTULA, ANIMAL_SLAYERS_5TH_LIST);
-		MOBS_REQUIRED_ITEM.put(CRIMSON_SPIDER2, ANIMAL_SLAYERS_LIST);
-	}
 	// Reward
 	private static final int WOLF_COLLAR = 2375;
 	// Misc
@@ -353,7 +334,7 @@ public final class Q00419_GetAPet extends Quest {
 	public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon) {
 		final QuestState qs = getQuestState(killer, false);
 		if ((qs != null) && qs.isStarted() && Util.checkIfInRange(1500, npc, qs.getPlayer(), true)) {
-			if (hasQuestItems(qs.getPlayer(), MOBS_REQUIRED_ITEM.get(npc.getId()))) {
+			if (hasQuestItems(qs.getPlayer(), DROPLIST.get(npc).requiredItems())) {
 				giveItemRandomly(qs.getPlayer(), npc, DROPLIST.get(npc), true);
 			}
 		}