diff --git a/L2J_DataPack_BETA/dist/game/data/adminCommands.xml b/L2J_DataPack_BETA/dist/game/data/adminCommands.xml
index 64e328674599e10d31463871b9e932ea715cbf88..d1be0ba3d87a8d710543f5a4df22ebab4848f03b 100644
--- a/L2J_DataPack_BETA/dist/game/data/adminCommands.xml
+++ b/L2J_DataPack_BETA/dist/game/data/adminCommands.xml
@@ -467,6 +467,7 @@
 	<!-- ADMIN QUEST -->
 	<admin command="admin_quest_reload" accessLevel="7" />
 	<admin command="admin_script_load" accessLevel="7" />
+	<admin command="admin_script_unload" accessLevel="7" />
 
 	<!-- ADMIN REPAIR CHAR -->
 	<admin command="admin_restore" accessLevel="7" />
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/actionhandlers/L2NpcAction.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/actionhandlers/L2NpcAction.java
index c05711004d39df9086c9fc2bd2859a112c4ad3c5..d731d76b0288fe09d4e967a8d72a2ba93338db0b 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/actionhandlers/L2NpcAction.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/actionhandlers/L2NpcAction.java
@@ -14,6 +14,8 @@
  */
 package handlers.actionhandlers;
 
+import java.util.List;
+
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.handler.IActionHandler;
@@ -24,6 +26,7 @@ import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.entity.L2Event;
 import com.l2jserver.gameserver.model.quest.Quest;
+import com.l2jserver.gameserver.model.quest.Quest.QuestEventType;
 import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
 import com.l2jserver.gameserver.network.serverpackets.MyTargetSelected;
 import com.l2jserver.gameserver.network.serverpackets.StatusUpdate;
@@ -123,29 +126,37 @@ public class L2NpcAction implements IActionHandler
 				}
 				else
 				{
-					if (((L2Npc)target).hasRandomAnimation())
-						((L2Npc)target).onRandomAnimation(Rnd.get(8));
+					L2Npc npc = (L2Npc) target;
+					if (npc.hasRandomAnimation())
+						npc.onRandomAnimation(Rnd.get(8));
 					
 					// Open a chat window on client with the text of the L2Npc
-					if (((L2Npc)target).isEventMob)
+					if (npc.isEventMob)
 					{
 						L2Event.showEventHtml(activeChar, String.valueOf(target.getObjectId()));
 					}
 					else
 					{
-						Quest[] qlsa = ((L2Npc)target).getTemplate().getEventQuests(Quest.QuestEventType.QUEST_START);
-						if ((qlsa != null) && qlsa.length > 0)
+						List<Quest> qlsa = npc.getTemplate().getEventQuests(QuestEventType.QUEST_START);
+						List<Quest> qlst = npc.getTemplate().getEventQuests(QuestEventType.ON_FIRST_TALK);
+						
+						if ((qlsa != null) && !qlsa.isEmpty())
+						{
 							activeChar.setLastQuestNpcObject(target.getObjectId());
-						Quest[] qlst = ((L2Npc)target).getTemplate().getEventQuests(Quest.QuestEventType.ON_FIRST_TALK);
-						if ((qlst != null) && qlst.length == 1)
-							qlst[0].notifyFirstTalk((L2Npc)target, activeChar);
+						}
+						
+						if ((qlst != null) && qlst.size() == 1)
+						{
+							qlst.get(0).notifyFirstTalk(npc, activeChar);
+						}
 						else
-							((L2Npc)target).showChatWindow(activeChar);
+						{
+							npc.showChatWindow(activeChar);
+						}
 					}
-					if(Config.PLAYER_MOVEMENT_BLOCK_TIME > 0
-							&& !activeChar.isGM())
-							activeChar.updateNotMoveUntil();
-
+					
+					if (Config.PLAYER_MOVEMENT_BLOCK_TIME > 0 && !activeChar.isGM())
+						activeChar.updateNotMoveUntil();
 				}
 			}
 		}
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/admincommandhandlers/AdminEditNpc.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/admincommandhandlers/AdminEditNpc.java
index f8ed3e420c05c3c61ee9c2130dfd007508bfb465..3b2ad245684493c090c06b0e1dddcdb5d6da4584 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/admincommandhandlers/AdminEditNpc.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/admincommandhandlers/AdminEditNpc.java
@@ -14,13 +14,13 @@
  */
 package handlers.admincommandhandlers;
 
-import gnu.trove.iterator.TIntObjectIterator;
-import gnu.trove.map.hash.TIntObjectHashMap;
-
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
+import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.StringTokenizer;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -1392,10 +1392,7 @@ public class AdminEditNpc implements IAdminCommandHandler
 			return;
 		}
 		
-		TIntObjectHashMap<L2Skill> skills = new TIntObjectHashMap<L2Skill>();
-		if (npcData.getSkills() != null)
-			skills = npcData.getSkills();
-		
+		Map<Integer, L2Skill> skills = new HashMap<>(npcData.getSkills());		
 		int _skillsize = skills.size();
 		
 		int MaxSkillsPerPage = PAGE_LIMIT;
@@ -1440,39 +1437,40 @@ public class AdminEditNpc implements IAdminCommandHandler
 			}
 		}
 		replyMSG.append("</tr></table><table width=\"100%\" border=0><tr><td>Skill name [skill id-skill lvl]</td><td>Delete</td></tr>");
-		TIntObjectIterator<L2Skill> skillite = skills.iterator();
+		Iterator<L2Skill> skillite = skills.values().iterator();
 		
 		for (int i = 0; i < SkillsStart; i++)
 		{
 			if (skillite.hasNext())
-				skillite.advance();
+				skillite.next();
 		}
 		
 		int cnt = SkillsStart;
+		L2Skill sk;
 		while (skillite.hasNext())
 		{
 			cnt++;
 			if (cnt > SkillsEnd)
 				break;
 			
-			skillite.advance();
+			sk = skillite.next();
 			replyMSG.append("<tr><td width=240><a action=\"bypass -h admin_edit_skill_npc ");
 			replyMSG.append(npcData.getNpcId());
 			replyMSG.append(" ");
-			replyMSG.append(skillite.value().getId());
+			replyMSG.append(sk.getId());
 			replyMSG.append("\">");
-			if (skillite.value().getSkillType() == L2SkillType.NOTDONE)
-				replyMSG.append("<font color=\"777777\">" + skillite.value().getName() + "</font>");
+			if (sk.getSkillType() == L2SkillType.NOTDONE)
+				replyMSG.append("<font color=\"777777\">" + sk.getName() + "</font>");
 			else
-				replyMSG.append(skillite.value().getName());
+				replyMSG.append(sk.getName());
 			replyMSG.append(" [");
-			replyMSG.append(skillite.value().getId());
+			replyMSG.append(sk.getId());
 			replyMSG.append("-");
-			replyMSG.append(skillite.value().getLevel());
+			replyMSG.append(sk.getLevel());
 			replyMSG.append("]</a></td><td width=60><a action=\"bypass -h admin_del_skill_npc ");
 			replyMSG.append(npcData.getNpcId());
 			replyMSG.append(" ");
-			replyMSG.append(skillite.key());
+			replyMSG.append(sk.getId());
 			replyMSG.append("\">Delete</a></td></tr>");
 		}
 		replyMSG.append("</table><br><center><button value=\"Add Skill\" action=\"bypass -h admin_add_skill_npc ");
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/admincommandhandlers/AdminQuest.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/admincommandhandlers/AdminQuest.java
index 85e6e674d21c4730bc075fe6deb0848d1d27b23b..32fe9e614b3b16701fb61eb6b1b27d45e0848dc7 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/admincommandhandlers/AdminQuest.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/admincommandhandlers/AdminQuest.java
@@ -21,14 +21,17 @@ import javax.script.ScriptException;
 import com.l2jserver.gameserver.handler.IAdminCommandHandler;
 import com.l2jserver.gameserver.instancemanager.QuestManager;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.quest.Quest;
 import com.l2jserver.gameserver.scripting.L2ScriptEngineManager;
+import com.l2jserver.gameserver.util.Util;
 
 public class AdminQuest implements IAdminCommandHandler
 {
 	private static final String[] ADMIN_COMMANDS =
 	{
 		"admin_quest_reload",
-		"admin_script_load"
+		"admin_script_load",
+		"admin_script_unload",
 	};
 	
 	@Override
@@ -124,6 +127,34 @@ public class AdminQuest implements IAdminCommandHandler
 			}
 			
 		}
+		else if (command.startsWith("admin_script_unload"))
+		{
+			String[] parts = command.split(" ");
+			if (parts.length < 2)
+			{
+				activeChar.sendMessage("Example: //script_unload questName/questId");
+			}
+			else
+			{
+				Quest q = Util.isDigit(parts[1]) ? QuestManager.getInstance().getQuest(Integer.parseInt(parts[1])) : QuestManager.getInstance().getQuest(parts[1]);
+				
+				if (q != null)
+				{
+					if (q.unload())
+					{
+						activeChar.sendMessage("Script Successfully Unloaded [" + q.getName() + "/" + q.getQuestIntId() + "]");
+					}
+					else
+					{
+						activeChar.sendMessage("Failed unloading [" + q.getName() + "/" + q.getQuestIntId() + "].");
+					}
+				}
+				else
+				{
+					activeChar.sendMessage("The quest [" + parts[1] + "] was not found!.");
+				}
+			}
+		}
 		return true;
 	}
 	
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/bypasshandlers/QuestLink.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/bypasshandlers/QuestLink.java
index ecdc7c3bf9433aeb27224db32b093f638b34bf86..9c0dd5a3d9531067dd72413ff011e7db85127a38 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/bypasshandlers/QuestLink.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/bypasshandlers/QuestLink.java
@@ -26,6 +26,7 @@ import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.quest.Quest;
+import com.l2jserver.gameserver.model.quest.Quest.QuestEventType;
 import com.l2jserver.gameserver.model.quest.QuestState;
 import com.l2jserver.gameserver.model.quest.State;
 import com.l2jserver.gameserver.network.SystemMessageId;
@@ -170,9 +171,9 @@ public class QuestLink implements IBypassHandler
 					}
 				}
 				// check for start point
-				Quest[] qlst = npc.getTemplate().getEventQuests(Quest.QuestEventType.QUEST_START);
+				List<Quest> qlst = npc.getTemplate().getEventQuests(Quest.QuestEventType.QUEST_START);
 				
-				if ((qlst != null) && (qlst.length > 0))
+				if ((qlst != null) && !qlst.isEmpty())
 				{
 					for (Quest temp : qlst)
 					{
@@ -237,7 +238,7 @@ public class QuestLink implements IBypassHandler
 		List<Quest> options = new FastList<Quest>();
 		
 		QuestState[] awaits = player.getQuestsForTalk(npc.getTemplate().getNpcId());
-		Quest[] starts = npc.getTemplate().getEventQuests(Quest.QuestEventType.QUEST_START);
+		List<Quest> starts = npc.getTemplate().getEventQuests(QuestEventType.QUEST_START);
 		
 		// Quests are limited between 1 and 999 because those are the quests that are supported by the client.
 		// By limiting them there, we are allowed to create custom quests at higher IDs without interfering