diff --git a/src/main/java/com/l2jserver/datapack/ai/individual/QueenAnt.java b/src/main/java/com/l2jserver/datapack/ai/individual/QueenAnt.java
index 5d57d77ad13d0014797b07a5cbb2ad6d66db3e80..d6371555ba91f8e3a3f6601e4be1273ac6dc3519 100644
--- a/src/main/java/com/l2jserver/datapack/ai/individual/QueenAnt.java
+++ b/src/main/java/com/l2jserver/datapack/ai/individual/QueenAnt.java
@@ -19,34 +19,38 @@
 package com.l2jserver.datapack.ai.individual;
 
 import static com.l2jserver.gameserver.config.Configuration.grandBoss;
-import static com.l2jserver.gameserver.config.Configuration.npc;
 
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import com.l2jserver.datapack.ai.npc.AbstractNpcAI;
 import com.l2jserver.gameserver.ai.CtrlIntention;
+import com.l2jserver.gameserver.enums.MountType;
 import com.l2jserver.gameserver.enums.audio.Music;
 import com.l2jserver.gameserver.instancemanager.GrandBossManager;
+import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.Location;
 import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
+import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Npc;
-import com.l2jserver.gameserver.model.actor.L2Playable;
 import com.l2jserver.gameserver.model.actor.instance.L2GrandBossInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.holders.SkillHolder;
-import com.l2jserver.gameserver.model.skills.CommonSkill;
+import com.l2jserver.gameserver.model.skills.AttributeType;
 import com.l2jserver.gameserver.model.skills.Skill;
+import com.l2jserver.gameserver.model.zone.L2ZoneType;
 import com.l2jserver.gameserver.model.zone.type.L2BossZone;
 import com.l2jserver.gameserver.network.serverpackets.MagicSkillUse;
 
 /**
- * Queen Ant's AI
+ * Queen Ant AI
  * @author Emperorc
+ * @author Maneco2
  */
 public final class QueenAnt extends AbstractNpcAI {
+	// NPCs
 	private static final int QUEEN = 29001;
 	private static final int LARVA = 29002;
 	private static final int NURSE = 29003;
@@ -61,57 +65,62 @@ public final class QueenAnt extends AbstractNpcAI {
 		ROYAL
 	};
 	
-	private static final Location OUST_LOC_1 = new Location(-19480, 187344, -5600);
-	private static final Location OUST_LOC_2 = new Location(-17928, 180912, -5520);
-	private static final Location OUST_LOC_3 = new Location(-23808, 182368, -5600);
-	
+	// Queen Ant Location
 	private static final int QUEEN_X = -21610;
 	private static final int QUEEN_Y = 181594;
 	private static final int QUEEN_Z = -5734;
-	
-	// QUEEN Status Tracking :
-	private static final byte ALIVE = 0; // Queen Ant is spawned.
-	private static final byte DEAD = 1; // Queen Ant has been killed.
-	
+	// Larva Location
+	private static final Location LARVA_LOCATION = new Location(-21600, 179482, -5846, getRandom(360));
+	// Zones
+	private static final int ZONE = 12012;
+	private static final Location TELE_LOCATION_1 = new Location(-19480, 187344, -5600);
+	private static final Location TELE_LOCATION_2 = new Location(-17928, 180912, -5520);
+	private static final Location TELE_LOCATION_3 = new Location(-23808, 182368, -5600);
+	// Skills
+	private static final SkillHolder RAID_CURSE = new SkillHolder(4215); // Raid Curse - Silence
+	private static final SkillHolder RAID_CURSE_2 = new SkillHolder(4515); // Raid Curse - Stone
+	private static final SkillHolder QUEEN_ANT_BRANDISH = new SkillHolder(4017); // Queen Ant Brandish
+	private static final SkillHolder DECREASE_SPEED_1 = new SkillHolder(4018); // Decrease Speed
+	private static final SkillHolder DECREASE_SPEED_2 = new SkillHolder(4019); // Decrease Speed
+	private static final SkillHolder HEAL_QUEEN_ANT_1 = new SkillHolder(4020); // Heal Queen Ant1
+	private static final SkillHolder HEAL_QUEEN_ANT_2 = new SkillHolder(4024); // Heal Queen Ant2
+	private static final SkillHolder ANTI_STRIDER = new SkillHolder(4258); // Hinder Strider
+	// Variables
 	private static L2BossZone _zone;
-	
-	private static SkillHolder HEAL1 = new SkillHolder(4020, 1);
-	private static SkillHolder HEAL2 = new SkillHolder(4024, 1);
-	
+	private static final String ATTACK_FLAG = "ATTACK_FLAG";
 	private L2MonsterInstance _queen = null;
 	private L2MonsterInstance _larva = null;
 	private final List<L2MonsterInstance> _nurses = new CopyOnWriteArrayList<>();
+	// Status
+	private static final int ALIVE = 0;
+	private static final int DEAD = 1;
 	
 	public QueenAnt() {
 		super(QueenAnt.class.getSimpleName(), "ai/individual");
-		addSpawnId(MOBS);
 		addKillId(MOBS);
-		addAggroRangeEnterId(MOBS);
-		addFactionCallId(NURSE);
+		addSpawnId(MOBS);
+		addExitZoneId(ZONE);
+		addEnterZoneId(ZONE);
+		addSkillSeeId(QUEEN);
+		addMoveFinishedId(QUEEN);
+		addAttackId(QUEEN, NURSE, GUARD, ROYAL);
 		
 		_zone = GrandBossManager.getInstance().getZone(QUEEN_X, QUEEN_Y, QUEEN_Z);
-		StatsSet info = GrandBossManager.getInstance().getStatsSet(QUEEN);
-		int status = GrandBossManager.getInstance().getBossStatus(QUEEN);
-		if (status == DEAD) {
-			// load the unlock date and time for queen ant from DB
-			long temp = info.getLong("respawn_time") - System.currentTimeMillis();
-			// if queen ant is locked until a certain time, mark it so and start the unlock timer
-			// the unlock time has not yet expired.
-			if (temp > 0) {
-				startQuestTimer("queen_unlock", temp, null, null);
+		final StatsSet info = GrandBossManager.getInstance().getStatsSet(QUEEN);
+		if (GrandBossManager.getInstance().getBossStatus(QUEEN) == DEAD) {
+			final long remain = info.getLong("respawn_time") - System.currentTimeMillis();
+			if (remain > 0) {
+				startQuestTimer("QUEEN_UNLOCK", remain, null, null);
 			} else {
-				// the time has already expired while the server was offline. Immediately spawn queen ant.
-				L2GrandBossInstance queen = (L2GrandBossInstance) addSpawn(QUEEN, QUEEN_X, QUEEN_Y, QUEEN_Z, 0, false, 0);
-				GrandBossManager.getInstance().setBossStatus(QUEEN, ALIVE);
-				spawnBoss(queen);
+				notifyEvent("QUEEN_UNLOCK", null, null);
 			}
 		} else {
+			int hp = info.getInt("currentHP");
+			int mp = info.getInt("currentMP");
 			int loc_x = info.getInt("loc_x");
 			int loc_y = info.getInt("loc_y");
 			int loc_z = info.getInt("loc_z");
 			int heading = info.getInt("heading");
-			int hp = info.getInt("currentHP");
-			int mp = info.getInt("currentMP");
 			if (!_zone.isInsideZone(loc_x, loc_y, loc_z)) {
 				loc_x = QUEEN_X;
 				loc_y = QUEEN_Y;
@@ -123,183 +132,246 @@ public final class QueenAnt extends AbstractNpcAI {
 		}
 	}
 	
-	private void spawnBoss(L2GrandBossInstance npc) {
-		GrandBossManager.getInstance().addBoss(npc);
-		if (getRandom(100) < 33) {
-			_zone.movePlayersTo(OUST_LOC_1);
-		} else if (getRandom(100) < 50) {
-			_zone.movePlayersTo(OUST_LOC_2);
-		} else {
-			_zone.movePlayersTo(OUST_LOC_3);
-		}
-		GrandBossManager.getInstance().addBoss(npc);
-		startQuestTimer("action", 10000, npc, null, true);
-		startQuestTimer("heal", 1000, null, null, true);
-		npc.broadcastPacket(Music.BS01_A_10000.getPacket());
-		_queen = npc;
-		_larva = (L2MonsterInstance) addSpawn(LARVA, -21600, 179482, -5846, getRandom(360), false, 0);
-	}
-	
 	@Override
 	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) {
-		if (event.equalsIgnoreCase("heal")) {
-			boolean notCasting;
-			final boolean larvaNeedHeal = (_larva != null) && (_larva.getCurrentHp() < _larva.getMaxHp());
-			final boolean queenNeedHeal = (_queen != null) && (_queen.getCurrentHp() < _queen.getMaxHp());
-			for (L2MonsterInstance nurse : _nurses) {
-				if ((nurse == null) || nurse.isDead() || nurse.isCastingNow()) {
-					continue;
+		switch (event) {
+			case "CHECK_ZONE": {
+				if (npc != null) {
+					addMoveToDesire(npc, new Location(-21610, 181594, -5734, 0), 0);
+					if (_zone.isInsideZone(npc)) {
+						cancelQuestTimers("CHECK_ZONE");
+					}
+				}
+				break;
+			}
+			case "CORE_AI": {
+				if ((npc != null) && (npc.isCoreAIDisabled()) && (_zone.isInsideZone(npc))) {
+					((L2Attackable) npc).clearAggroList();
+					npc.disableCoreAI(false);
+					npc.setIsImmobilized(false);
+					npc.getVariables().set(ATTACK_FLAG, false);
 				}
-				
-				notCasting = nurse.getAI().getIntention() != CtrlIntention.AI_INTENTION_CAST;
-				if (larvaNeedHeal) {
-					if ((nurse.getTarget() != _larva) || notCasting) {
-						nurse.setTarget(_larva);
-						nurse.useMagic(getRandomBoolean() ? HEAL1.getSkill() : HEAL2.getSkill());
+				break;
+			}
+			case "CORE_MOVEMENT": {
+				if (npc != null) {
+					final L2Object obj = npc.getTarget();
+					if ((obj != null) && (obj.isPlayer()) && (_zone.isInsideZone(obj))) {
+						_queen.setIsImmobilized(false);
 					}
-					continue;
+					npc.getVariables().set(ATTACK_FLAG, false);
 				}
-				if (queenNeedHeal) {
-					if (nurse.getLeader() == _larva) {
-						continue;
+				break;
+			}
+			case "HEAL": {
+				if ((npc != null) && (!npc.isCastingNow())) {
+					if ((_larva != null) && (_queen != null)) {
+						if (_larva.getCurrentHp() < _larva.getMaxHp()) {
+							if (npc.calculateDistance(_larva, false, false) < 2500) {
+								addSkillCastDesire(npc, _larva, getRandomBoolean() ? HEAL_QUEEN_ANT_1 : HEAL_QUEEN_ANT_2, 100L);
+							} else {
+								addMoveToDesire(npc, LARVA_LOCATION, 0);
+							}
+						} else if (_queen.getCurrentHp() < _queen.getMaxHp()) {
+							addSkillCastDesire(npc, _queen, HEAL_QUEEN_ANT_1, 1000000L);
+						}
 					}
-					
-					if ((nurse.getTarget() != _queen) || notCasting) {
-						nurse.setTarget(_queen);
-						nurse.useMagic(HEAL1.getSkill());
+					if ((!npc.isMoving()) && (npc.getAI().getIntention() == CtrlIntention.AI_INTENTION_ATTACK)) {
+						((L2Attackable) npc).clearAggroList();
+						npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE);
 					}
-					continue;
 				}
-				// if nurse not casting - remove target
-				if (notCasting && (nurse.getTarget() != null)) {
-					nurse.setTarget(null);
+				break;
+			}
+			case "ACTION": {
+				if ((getRandom(100) < 30) && (npc != null) && (!npc.isInCombat())) {
+					if (getRandom(100) < 50) {
+						npc.broadcastSocialAction(3);
+					} else {
+						npc.broadcastSocialAction(4);
+					}
 				}
+				break;
 			}
-		} else if (event.equalsIgnoreCase("action") && (npc != null)) {
-			if (getRandom(3) == 0) {
-				if (getRandom(2) == 0) {
-					npc.broadcastSocialAction(3);
+			case "QUEEN_UNLOCK": {
+				L2GrandBossInstance queen = (L2GrandBossInstance) addSpawn(QUEEN, QUEEN_X, QUEEN_Y, QUEEN_Z, 0, false, 0);
+				GrandBossManager.getInstance().setBossStatus(QUEEN, ALIVE);
+				spawnBoss(queen);
+				break;
+			}
+			case "RAID_CURSE": {
+				if ((player != null) && (!_zone.isInsideZone(player))) {
+					cancelQuestTimers("RAID_CURSE");
+				} else if ((player != null) && (!player.isDead()) && (_zone.isInsideZone(player)) && (_queen != null) && (!_queen.isDead())) {
+					if ((player.getLevel() - _queen.getLevel()) > 8) {
+						if (player.isMageClass()) {
+							if (!player.isAffectedBySkill(RAID_CURSE.getSkillId())) {
+								_queen.broadcastPacket(new MagicSkillUse(_queen, player, RAID_CURSE.getSkillId(), 1, 300, 0));
+								RAID_CURSE.getSkill().applyEffects(_queen, player);
+							}
+						} else {
+							if (!player.isAffectedBySkill(RAID_CURSE_2.getSkillId())) {
+								_queen.broadcastPacket(new MagicSkillUse(_queen, player, RAID_CURSE_2.getSkillId(), 1, 300, 0));
+								RAID_CURSE_2.getSkill().applyEffects(_queen, player);
+							}
+						}
+					}
+				}
+				break;
+			}
+			case "RESPAWN_QUEEN": {
+				if (GrandBossManager.getInstance().getBossStatus(QUEEN) == DEAD) {
+					GrandBossManager.getInstance().getStatsSet(QUEEN).set("respawn_time", 0);
+					cancelQuestTimers("QUEEN_UNLOCK");
+					notifyEvent("QUEEN_UNLOCK", null, null);
 				} else {
-					npc.broadcastSocialAction(4);
+					player.sendMessage(getClass().getSimpleName() + ": You cant respawn Queen Ant while Queen Ant is alive!");
 				}
+				break;
 			}
-		} else if (event.equalsIgnoreCase("queen_unlock")) {
-			L2GrandBossInstance queen = (L2GrandBossInstance) addSpawn(QUEEN, QUEEN_X, QUEEN_Y, QUEEN_Z, 0, false, 0);
-			GrandBossManager.getInstance().setBossStatus(QUEEN, ALIVE);
-			spawnBoss(queen);
 		}
 		return super.onAdvEvent(event, npc, player);
 	}
 	
+	@Override
+	public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon, Skill skill) {
+		if ((_zone.isInsideZone(npc)) && (npc != null) && (_queen != null) && (!npc.isCastingNow()) && (!npc.isCoreAIDisabled())) {
+			switch (npc.getId()) {
+				case QUEEN: {
+					if ((attacker.getMountType() == MountType.STRIDER) && !attacker.isAffectedBySkill(ANTI_STRIDER.getSkillId())) {
+						if (npc.checkDoCastConditions(ANTI_STRIDER.getSkill())) {
+							addSkillCastDesire(npc, attacker, ANTI_STRIDER, 1000000L);
+						}
+					} else if ((skill != null) && (skill.getAttributeType() == AttributeType.FIRE) && (getRandom(100) < 70)) {
+						addSkillCastDesire(npc, attacker, DECREASE_SPEED_1, 1000000L);
+					} else if ((npc.calculateDistance(attacker, false, false) > 500) && (getRandom(100) < 10)) {
+						addSkillCastDesire(npc, attacker, DECREASE_SPEED_2, 1000000L);
+					} else if ((npc.calculateDistance(attacker, false, false) > 150) && (getRandom(100) < 10)) {
+						if ((npc.calculateDistance(attacker, false, false) < 500) && (getRandom(100) < 80)) {
+							addSkillCastDesire(npc, attacker, DECREASE_SPEED_1, 1000000L);
+						} else {
+							addSkillCastDesire(npc, attacker, DECREASE_SPEED_2, 1000000L);
+						}
+					} else if ((npc.calculateDistance(attacker, false, false) < 250) && (getRandom(100) < 5)) {
+						addSkillCastDesire(npc, attacker, QUEEN_ANT_BRANDISH, 1000000L);
+					}
+					break;
+				}
+				case NURSE:
+				case ROYAL: {
+					if ((_queen.calculateDistance(attacker, false, false) > 500) && (getRandom(100) < 5)) {
+						addSkillCastDesire(_queen, attacker, DECREASE_SPEED_2, 1000000L);
+					} else if ((_queen.calculateDistance(attacker, false, false) > 150) && (getRandom(100) < 5)) {
+						if (getRandom(100) < 80) {
+							addSkillCastDesire(_queen, attacker, DECREASE_SPEED_1, 1000000L);
+						} else {
+							addSkillCastDesire(_queen, attacker, DECREASE_SPEED_2, 1000000L);
+						}
+					} else if ((_queen.calculateDistance(attacker, false, false) < 250) && (getRandom(100) < 2)) {
+						addSkillCastDesire(_queen, attacker, QUEEN_ANT_BRANDISH, 1000000L);
+					}
+					break;
+				}
+				case GUARD: {
+					if (attacker.isPlayer()) {
+						if ((_queen.calculateDistance(attacker, false, false) > 500) && (getRandom(100) < 3)) {
+							addSkillCastDesire(_queen, attacker, DECREASE_SPEED_2, 1000000L);
+						} else if ((_queen.calculateDistance(attacker, false, false) > 150) && (getRandom(100) < 3)) {
+							if (getRandom(100) < 80) {
+								addSkillCastDesire(_queen, attacker, DECREASE_SPEED_1, 1000000L);
+							} else {
+								addSkillCastDesire(_queen, attacker, DECREASE_SPEED_2, 1000000L);
+							}
+						} else if ((_queen.calculateDistance(attacker, false, false) < 250) && (getRandom(100) < 2)) {
+							addSkillCastDesire(_queen, attacker, QUEEN_ANT_BRANDISH, 1000000L);
+						}
+					}
+					break;
+				}
+			}
+		}
+		if ((!npc.getVariables().getBoolean(ATTACK_FLAG, false)) && !npc.isCoreAIDisabled()) {
+			if (npc.calculateDistance(attacker, false, false) > 150) {
+				_queen.setIsImmobilized(true);
+			}
+			npc.getVariables().set(ATTACK_FLAG, true);
+			startQuestTimer("CORE_MOVEMENT", 5000, npc, null);
+		}
+		return super.onAttack(npc, attacker, damage, isSummon, skill);
+	}
+	
+	@Override
+	public String onSkillSee(L2Npc npc, L2PcInstance player, Skill skill, L2Object[] targets, boolean isSummon) {
+		if ((skill.getEffectPoint() > 0) && (getRandom(100) < 15)) {
+			if ((_zone.isInsideZone(npc)) && (npc != null) && (!npc.isCastingNow()) && (!npc.isCoreAIDisabled())) {
+				addSkillCastDesire(npc, player, DECREASE_SPEED_1, 1000000L);
+			}
+		}
+		return super.onSkillSee(npc, player, skill, targets, isSummon);
+	}
+	
 	@Override
 	public String onSpawn(L2Npc npc) {
 		final L2MonsterInstance mob = (L2MonsterInstance) npc;
 		switch (npc.getId()) {
-			case LARVA:
-				mob.setIsImmobilized(true);
+			case QUEEN: {
+				startQuestTimer("ACTION", 10000, npc, null, true);
+				break;
+			}
+			case LARVA: {
 				mob.setIsMortal(false);
 				mob.setIsRaidMinion(true);
+				mob.setIsImmobilized(true);
 				break;
-			case NURSE:
+			}
+			case NURSE: {
+				_nurses.add(mob);
 				mob.disableCoreAI(true);
 				mob.setIsRaidMinion(true);
-				_nurses.add(mob);
+				startQuestTimer("HEAL", 2000, mob, null, true);
 				break;
+			}
 			case ROYAL:
-			case GUARD:
+			case GUARD: {
 				mob.setIsRaidMinion(true);
 				break;
+			}
 		}
 		
 		return super.onSpawn(npc);
 	}
 	
 	@Override
-	public String onFactionCall(L2Npc npc, L2Npc caller, L2PcInstance attacker, boolean isSummon) {
-		if ((caller == null) || (npc == null)) {
-			return super.onFactionCall(npc, caller, attacker, isSummon);
-		}
-		
-		if (!npc.isCastingNow() && (npc.getAI().getIntention() != CtrlIntention.AI_INTENTION_CAST)) {
-			if (caller.getCurrentHp() < caller.getMaxHp()) {
-				npc.setTarget(caller);
-				((L2Attackable) npc).useMagic(HEAL1.getSkill());
-			}
-		}
-		return null;
-	}
-	
-	@Override
-	public String onAggroRangeEnter(L2Npc npc, L2PcInstance player, boolean isSummon) {
-		if ((npc == null) || (player.isGM() && player.isInvisible())) {
-			return null;
-		}
-		
-		final boolean isMage;
-		final L2Playable character;
-		if (isSummon) {
-			isMage = false;
-			character = player.getSummon();
-		} else {
-			isMage = player.isMageClass();
-			character = player;
-		}
-		
-		if (character == null) {
-			return null;
-		}
-		
-		if (npc().raidCurse() && ((character.getLevel() - npc.getLevel()) > 8)) {
-			Skill curse = null;
-			if (isMage) {
-				if (!character.isMuted() && (getRandom(4) == 0)) {
-					curse = CommonSkill.RAID_CURSE.getSkill();
-				}
-			} else {
-				if (!character.isParalyzed() && (getRandom(4) == 0)) {
-					curse = CommonSkill.RAID_CURSE2.getSkill();
-				}
-			}
-			
-			if (curse != null) {
-				npc.broadcastPacket(new MagicSkillUse(npc, character, curse.getId(), curse.getLevel(), 300, 0));
-				curse.applyEffects(npc, character);
-			}
-			
-			((L2Attackable) npc).stopHating(character); // for calling again
-			return null;
-		}
-		
-		return super.onAggroRangeEnter(npc, player, isSummon);
+	public String onEnterZone(L2Character character, L2ZoneType zone) {
+		final L2PcInstance player = character.getActingPlayer();
+		notifyEvent("RAID_CURSE", _queen, player);
+		startQuestTimer("RAID_CURSE", 3000, _queen, player, true);
+		return super.onEnterZone(character, zone);
 	}
 	
 	@Override
 	public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon) {
-		int npcId = npc.getId();
-		if (npcId == QUEEN) {
+		if (npc.getId() == QUEEN) {
+			cancelQuestTimers("HEAL");
+			cancelQuestTimers("ACTION");
 			npc.broadcastPacket(Music.BS02_D_10000.getPacket());
 			GrandBossManager.getInstance().setBossStatus(QUEEN, DEAD);
-			// Calculate Min and Max respawn times randomly.
-			long respawnTime = grandBoss().getIntervalOfQueenAntSpawn() + getRandom(-grandBoss().getRandomOfQueenAntSpawn(), grandBoss().getRandomOfQueenAntSpawn());
-			respawnTime *= 3600000;
-			startQuestTimer("queen_unlock", respawnTime, null, null);
-			cancelQuestTimer("action", npc, null);
-			cancelQuestTimer("heal", null, null);
-			// also save the respawn time so that the info is maintained past reboots
-			StatsSet info = GrandBossManager.getInstance().getStatsSet(QUEEN);
-			info.set("respawn_time", System.currentTimeMillis() + respawnTime);
-			GrandBossManager.getInstance().setStatsSet(QUEEN, info);
+			final long respawnTime = (grandBoss().getIntervalOfQueenAntSpawn() + getRandom(-grandBoss().getRandomOfQueenAntSpawn(), grandBoss().getRandomOfQueenAntSpawn())) * 3600000;
+			GrandBossManager.getInstance().getStatsSet(QUEEN).set("respawn_time", (System.currentTimeMillis() + respawnTime));
+			startQuestTimer("QUEEN_UNLOCK", respawnTime, null, null);
 			_nurses.clear();
-			_larva.deleteMe();
-			_larva = null;
 			_queen = null;
+			if (_larva != null) {
+				_larva.deleteMe();
+				_larva = null;
+			}
 		} else if ((_queen != null) && !_queen.isAlikeDead()) {
-			if (npcId == ROYAL) {
+			if (npc.getId() == ROYAL) {
 				L2MonsterInstance mob = (L2MonsterInstance) npc;
 				if (mob.getLeader() != null) {
 					mob.getLeader().getMinionList().onMinionDie(mob, (280 + getRandom(40)) * 1000);
 				}
-			} else if (npcId == NURSE) {
+			} else if (npc.getId() == NURSE) {
 				L2MonsterInstance mob = (L2MonsterInstance) npc;
 				_nurses.remove(mob);
 				if (mob.getLeader() != null) {
@@ -307,6 +379,36 @@ public final class QueenAnt extends AbstractNpcAI {
 				}
 			}
 		}
+		
 		return super.onKill(npc, killer, isSummon);
 	}
+	
+	@Override
+	public String onExitZone(L2Character character, L2ZoneType zone) {
+		if ((character.isAttackable()) && (character.isRaid()) && (!_zone.isInsideZone(_queen)) && (_queen != null)) {
+			_queen.disableCoreAI(true);
+			_queen.setIsImmobilized(false);
+			startQuestTimer("CHECK_ZONE", 1000, _queen, null, true);
+		}
+		return super.onExitZone(character, zone);
+	}
+	
+	@Override
+	public void onMoveFinished(L2Npc npc) {
+		startQuestTimer("CORE_AI", 100, npc, null);
+	}
+	
+	private void spawnBoss(L2GrandBossInstance npc) {
+		if (getRandom(100) < 33) {
+			_zone.movePlayersTo(TELE_LOCATION_1);
+		} else if (getRandom(100) < 50) {
+			_zone.movePlayersTo(TELE_LOCATION_2);
+		} else {
+			_zone.movePlayersTo(TELE_LOCATION_3);
+		}
+		GrandBossManager.getInstance().addBoss(npc);
+		npc.broadcastPacket(Music.BS01_A_10000.getPacket());
+		_queen = npc;
+		_larva = (L2MonsterInstance) addSpawn(LARVA, LARVA_LOCATION, false, 0);
+	}
 }
diff --git a/src/main/java/com/l2jserver/datapack/handlers/admincommandhandlers/AdminGrandBoss.java b/src/main/java/com/l2jserver/datapack/handlers/admincommandhandlers/AdminGrandBoss.java
index ea68d6d56621ab4442ad430d64e134dba66618e3..8bcb95adde146e452f198521d58c8c37a79315ca 100644
--- a/src/main/java/com/l2jserver/datapack/handlers/admincommandhandlers/AdminGrandBoss.java
+++ b/src/main/java/com/l2jserver/datapack/handlers/admincommandhandlers/AdminGrandBoss.java
@@ -22,6 +22,7 @@ import java.text.SimpleDateFormat;
 import java.util.Arrays;
 import java.util.StringTokenizer;
 
+import com.l2jserver.datapack.ai.individual.QueenAnt;
 import com.l2jserver.datapack.ai.individual.Antharas.Antharas;
 import com.l2jserver.datapack.ai.individual.Baium.Baium;
 import com.l2jserver.gameserver.cache.HtmCache;
@@ -78,7 +79,7 @@ public class AdminGrandBoss implements IAdminCommandHandler {
 					final int grandBossId = Integer.parseInt(st.nextToken());
 					
 					if (grandBossId == ANTHARAS) {
-						antharasAi().notifyEvent("SKIP_WAITING", null, activeChar);
+						getAntharasAI().notifyEvent("SKIP_WAITING", null, activeChar);
 						manageHtml(activeChar, grandBossId);
 					} else {
 						activeChar.sendMessage("Wrong ID!");
@@ -94,12 +95,17 @@ public class AdminGrandBoss implements IAdminCommandHandler {
 					
 					switch (grandBossId) {
 						case ANTHARAS: {
-							antharasAi().notifyEvent("RESPAWN_ANTHARAS", null, activeChar);
+							getAntharasAI().notifyEvent("RESPAWN_ANTHARAS", null, activeChar);
 							manageHtml(activeChar, grandBossId);
 							break;
 						}
 						case BAIUM: {
-							baiumAi().notifyEvent("RESPAWN_BAIUM", null, activeChar);
+							getBaiumAI().notifyEvent("RESPAWN_BAIUM", null, activeChar);
+							manageHtml(activeChar, grandBossId);
+							break;
+						}
+						case QUEENANT: {
+							getQueenAntAI().notifyEvent("RESPAWN_QUEEN", null, activeChar);
 							manageHtml(activeChar, grandBossId);
 							break;
 						}
@@ -118,11 +124,11 @@ public class AdminGrandBoss implements IAdminCommandHandler {
 					
 					switch (grandBossId) {
 						case ANTHARAS: {
-							antharasAi().notifyEvent("DESPAWN_MINIONS", null, activeChar);
+							getAntharasAI().notifyEvent("DESPAWN_MINIONS", null, activeChar);
 							break;
 						}
 						case BAIUM: {
-							baiumAi().notifyEvent("DESPAWN_MINIONS", null, activeChar);
+							getBaiumAI().notifyEvent("DESPAWN_MINIONS", null, activeChar);
 							break;
 						}
 						default: {
@@ -140,12 +146,12 @@ public class AdminGrandBoss implements IAdminCommandHandler {
 					
 					switch (grandBossId) {
 						case ANTHARAS: {
-							antharasAi().notifyEvent("ABORT_FIGHT", null, activeChar);
+							getAntharasAI().notifyEvent("ABORT_FIGHT", null, activeChar);
 							manageHtml(activeChar, grandBossId);
 							break;
 						}
 						case BAIUM: {
-							baiumAi().notifyEvent("ABORT_FIGHT", null, activeChar);
+							getBaiumAI().notifyEvent("ABORT_FIGHT", null, activeChar);
 							manageHtml(activeChar, grandBossId);
 							break;
 						}
@@ -255,14 +261,18 @@ public class AdminGrandBoss implements IAdminCommandHandler {
 		}
 	}
 	
-	private Quest antharasAi() {
+	private Quest getAntharasAI() {
 		return QuestManager.getInstance().getQuest(Antharas.class.getSimpleName());
 	}
 	
-	private Quest baiumAi() {
+	private Quest getBaiumAI() {
 		return QuestManager.getInstance().getQuest(Baium.class.getSimpleName());
 	}
 	
+	private Quest getQueenAntAI() {
+		return QuestManager.getInstance().getQuest(QueenAnt.class.getSimpleName());
+	}
+	
 	@Override
 	public String[] getAdminCommandList() {
 		return ADMIN_COMMANDS;
diff --git a/src/main/resources/data/html/admin/grandboss_queenant.htm b/src/main/resources/data/html/admin/grandboss_queenant.htm
index d12f2ee08c68aa82c7e170bcb5c57caea440a03a..ecc4b96f1d160404bde86d61dc6cbf08db3dee01 100644
--- a/src/main/resources/data/html/admin/grandboss_queenant.htm
+++ b/src/main/resources/data/html/admin/grandboss_queenant.htm
@@ -9,7 +9,7 @@
 </table>
 <br>
 <br>
-<font color="LEVEL">Queen ant<font><br>
+<font color="LEVEL">Queen Ant<font><br>
 	<table width="270" border="0" bgcolor="444444">
 		<tr>
 			<td>Status:</td>
@@ -22,6 +22,7 @@
 	</table>
 <br>
 <br>
+<button value="Respawn Queen Ant" action="bypass -h admin_grandboss_respawn 29001" width=200 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td><br1>
 <button value="Teleport to Queen Ant" action="bypass -h admin_move_to -21568 181764 -5722" width=200 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td><br1>
 <button value="Teleport to Queen Ant Larva" action="bypass -h admin_move_to -21598 179595 -5834" width=200 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td><br1>
 </center>