diff --git a/src/engine/gameManager/LootManager.java b/src/engine/gameManager/LootManager.java
index 3c090f3e..56c0f699 100644
--- a/src/engine/gameManager/LootManager.java
+++ b/src/engine/gameManager/LootManager.java
@@ -490,7 +490,7 @@ public enum LootManager {
 
         //roll 1-100 for the gen table selection
 
-        int genRoll = ThreadLocalRandom.current().nextInt(1, 100 + 1);
+        int genRoll = ThreadLocalRandom.current().nextInt(94, 100) + 1;
         GenTableEntry selectedRow = GenTableEntry.rollTable(tableID, genRoll, LootManager.NORMAL_DROP_RATE);
 
         if(selectedRow == null)
@@ -654,14 +654,18 @@ public enum LootManager {
     }
 
     public static void DropPresent(Mob mob){
-        int random = ThreadLocalRandom.current().nextInt(ItemBase.AnniverseryGifts.size() - 1);
-        int presentID = ItemBase.AnniverseryGifts.get(random);
-        ItemBase presentBase = ItemBase.getItemBase(presentID);
-        if(presentBase != null){
-            MobLoot lootItem = new MobLoot(mob, presentBase, true);
-            mob.getCharItemManager().addItemToInventory(lootItem);
-        }
+        int random = 971049 + ThreadLocalRandom.current().nextInt(24);
+        if (random > 971071)
+            random = 971071;
+
+        int baseLoot = rollRandomItem(random);
+        ItemBase contract = ItemBase.getItemBase(baseLoot);
+        if (contract != null) {
+            MobLoot toAdd = new MobLoot(mob, contract, true);
 
+            if (toAdd != null)
+                mob.getCharItemManager().addItemToInventory(toAdd);
+        }
     }
 
     public static void GenerateStrongholdLoot(Mob mob, boolean commander) {
@@ -680,20 +684,13 @@ public enum LootManager {
             MobLoot goldAmount = new MobLoot(mob, gold);
             mob.getCharItemManager().addItemToInventory(goldAmount);
         }
+        if (ThreadLocalRandom.current().nextInt(100) < 65)
+            DropPresent(mob);
 
-        int random = 3211 + ThreadLocalRandom.current().nextInt(6);
-        if(random > 3216)
-            random = 3216;
-
-        int baseLoot = rollRandomItem(random);
-        ItemBase contract = ItemBase.getItemBase(baseLoot);
-        if (contract != null) {
-            MobLoot toAdd = new MobLoot(mob, contract, true);
-
-            if (toAdd != null)
-                mob.getCharItemManager().addItemToInventory(toAdd);
+        if (commander) {
 
-            if (commander) {
+            //chance for glass
+            if (ThreadLocalRandom.current().nextInt(100) < 75) {
                 int glassID = rollRandomItem(126);
                 ItemBase glassItem = ItemBase.getItemBase(glassID);
                 if (glassItem != null) {
@@ -702,16 +699,22 @@ public enum LootManager {
                     if (toAdd2 != null)
                         mob.getCharItemManager().addItemToInventory(toAdd2);
                 }
+            }
 
+            //chance for disc
+            if (ThreadLocalRandom.current().nextInt(100) < 75) {
                 int discID = rollRandomItem(3202);
                 ItemBase discItem = ItemBase.getItemBase(discID);
-                if (glassItem != null) {
+                if (discItem != null) {
                     MobLoot toAdd3 = new MobLoot(mob, discItem, true);
 
                     if (toAdd3 != null)
                         mob.getCharItemManager().addItemToInventory(toAdd3);
                 }
+            }
 
+            //chance for stat rune
+            if (ThreadLocalRandom.current().nextInt(100) < 75) {
                 int runeID = rollRandomItem(3201);
                 ItemBase runeItem = ItemBase.getItemBase(runeID);
                 if (runeItem != null) {
@@ -721,7 +724,6 @@ public enum LootManager {
                         mob.getCharItemManager().addItemToInventory(toAdd4);
                 }
             }
-
         }
     }
 }
diff --git a/src/engine/gameManager/StrongholdManager.java b/src/engine/gameManager/StrongholdManager.java
new file mode 100644
index 00000000..7205a1c0
--- /dev/null
+++ b/src/engine/gameManager/StrongholdManager.java
@@ -0,0 +1,256 @@
+package engine.gameManager;
+
+import engine.Enum;
+import engine.InterestManagement.InterestManager;
+import engine.InterestManagement.WorldGrid;
+import engine.math.Vector3f;
+import engine.math.Vector3fImmutable;
+import engine.objects.*;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.concurrent.ThreadLocalRandom;
+
+public class StrongholdManager {
+
+    public static void processStrongholds() {
+        //end all current stronghold activities
+        ArrayList<Mine> mines = Mine.getMines();
+        for(Mine mine : mines){
+            if (mine.isStronghold)
+                StrongholdManager.EndStronghold(mine);
+        }
+
+        //process strongholds selecting 2 randomly to become active
+        int count = 0;
+        while (count < 2) {
+            int random = ThreadLocalRandom.current().nextInt(1, mines.size()) - 1;
+            Mine mine = mines.get(random);
+            if (mine != null) {
+                if (!mine.isActive && !mine.isStronghold) {
+                    StartStronghold(mine);
+                    count++;
+                }
+            }
+        }
+    }
+
+    public static void StartStronghold(Mine mine){
+
+        //remove buildings
+        Building tower = BuildingManager.getBuilding(mine.getBuildingID());
+        if(tower == null)
+            return;
+
+        mine.isStronghold = true;
+        mine.strongholdMobs = new ArrayList<>();
+        mine.oldBuildings = new HashMap<>();
+
+        Zone mineZone = ZoneManager.findSmallestZone(tower.loc);
+        for(Building building : mineZone.zoneBuildingSet){
+            mine.oldBuildings.put(building.getObjectUUID(),building.meshUUID);
+            building.setMeshUUID(407650);
+            building.setMeshScale(new Vector3f(0,0,0));
+            InterestManager.setObjectDirty(building);
+            WorldGrid.updateObject(building);
+        }
+
+        //update tower to become stronghold mesh
+        tower.setMeshUUID(getStrongholdMeshID(mine.getParentZone()));
+        tower.setMeshScale(new Vector3f(1,1,1));
+        InterestManager.setObjectDirty(tower);
+        WorldGrid.updateObject(tower);
+
+        //create elite mobs
+        for(int i = 0; i < 10; i++){
+            Mob guard = Mob.createMob(getStrongholdGuardianID(mine.getParentZone()), Vector3fImmutable.getRandomPointOnCircle(tower.loc,30), Guild.getErrantGuild(),true,mineZone,null,0, "Elite Guardian",65);
+            if(guard != null){
+                guard.equipmentSetID = getStrongholdMobEquipSetID(guard.getMobBaseID());
+                guard.runAfterLoad();
+                guard.setLevel((short)65);
+                guard.setResists(new Resists("Elite"));
+                guard.healthMax  = 12500;
+                guard.setHealth(guard.healthMax);
+                guard.spawnTime = 1000000000;
+                guard.BehaviourType = Enum.MobBehaviourType.Aggro;
+                guard.maxDamageHandOne = 1550;
+                guard.minDamageHandOne = 750;
+                guard.atrHandOne = 1800;
+                guard.defenseRating = 2200;
+                InterestManager.setObjectDirty(guard);
+                mine.strongholdMobs.add(guard);
+                LootManager.GenerateStrongholdLoot(guard,false);
+            }
+            if(guard!= null && guard.level < 60)
+                guard.despawn();
+        }
+        //create stronghold commander
+        Mob commander = Mob.createMob(getStrongholdCommanderID(mine.getParentZone()), tower.loc,Guild.getErrantGuild(),true,mineZone,null,0, "Guardian Commander",75);
+        if(commander != null){
+            commander.equipmentSetID = getStrongholdMobEquipSetID(commander.getMobBaseID());
+            commander.runAfterLoad();
+            commander.setLevel((short)75);
+            commander.setResists(new Resists("Elite"));
+            commander.healthMax = 50000;
+            commander.setHealth(commander.healthMax);
+            commander.spawnTime = 1000000000;
+            commander.BehaviourType = Enum.MobBehaviourType.Aggro;
+            commander.maxDamageHandOne = 3500;
+            commander.minDamageHandOne = 1500;
+            commander.atrHandOne = 3500;
+            commander.defenseRating = 3500;
+            commander.mobPowers.clear();
+            commander.mobPowers.put(563107033,40); //grounding shot
+            commander.mobPowers.put(429032838,40); // gravechill
+            commander.mobPowers.put(429413547,40); // grasp of thurin
+            commander.StrongholdCommander = true;
+            InterestManager.setObjectDirty(commander);
+            mine.strongholdMobs.add(commander);
+            LootManager.GenerateStrongholdLoot(commander,true);
+        }
+
+        mine.setActive(true);
+        tower.setProtectionState(Enum.ProtectionState.PROTECTED);
+    }
+
+    public static void EndStronghold(Mine mine){
+
+        //restore the buildings
+        Building tower = BuildingManager.getBuilding(mine.getBuildingID());
+        if(tower == null)
+            return;
+
+        mine.isStronghold = false;
+
+        //get rid of the mobs
+        for(Mob mob : mine.strongholdMobs) {
+            mob.despawn();
+            mob.removeFromCache();
+        }
+
+        //restore the buildings
+        Zone mineZone = ZoneManager.findSmallestZone(tower.loc);
+        for(Building building : mineZone.zoneBuildingSet){
+            if(mine.oldBuildings.containsKey(building.getObjectUUID())) {
+                building.setMeshUUID(mine.oldBuildings.get(building.getObjectUUID()));
+                building.setMeshScale(new Vector3f(1, 1, 1));
+            }
+        }
+
+        //update tower to become Mine Tower again
+        tower.setMeshUUID(1500100);
+
+        mine.setActive(false);
+        tower.setProtectionState(Enum.ProtectionState.NPC);
+    }
+
+    public static int getStrongholdMeshID(Zone parent){
+        while(!parent.isMacroZone()){
+            parent = parent.getParent();
+            if(parent.getName().toLowerCase().equals("seafloor")){
+                return 0;
+            }
+        }
+        switch(parent.getObjectUUID()){
+            case 197:
+            case 234:
+            case 178:
+            case 122:
+                return 814000; //Frost Giant Hall (ICE)
+            case 968:
+            case 951:
+            case 313:
+            case 331:
+                return 5001500; // Lich Queens Keep (UNDEAD)
+            case 785:
+            case 761:
+            case 717:
+            case 737:
+                return 1306600; // Temple of the Dragon (DESERT)
+            case 353:
+            case 371:
+            case 388:
+            case 532:
+                return 564600; // Undead Lord's Keep (SWAMP)
+        }
+        return 456100; // small stockade
+    }
+
+    public static int getStrongholdGuardianID(Zone parent){
+        switch(parent.getObjectUUID()){
+            case 197:
+            case 234:
+            case 178:
+            case 122:
+                return 13528; // Mountain Giant Raider Axe
+            case 968:
+            case 951:
+            case 313:
+            case 331:
+                return 13643; // Vampire Spear Warrior
+            case 785:
+            case 761:
+            case 717:
+            case 737:
+                return 13802; // Desert Orc Warrior
+            case 353:
+            case 371:
+            case 388:
+            case 532:
+                return 12728; // Kolthoss Warrior
+        }
+        return 13434; // human sword and board warrior
+    }
+
+    public static int getStrongholdCommanderID(Zone parent){
+        switch(parent.getObjectUUID()){
+            case 197: // Storm Giant Crossbow
+            case 234: // Storm Giant Crossbow
+            case 178: // Storm Giant Crossbow
+            case 122: // Storm Giant Crossbow
+                return 13515;
+            case 968: // Skeleton Bird Archer
+            case 951: // Skeleton Bird Archer
+            case 313: // Skeleton Bird Archer
+            case 331: // Skeleton Bird Archer
+                return 14280;
+            case 785:
+            case 761:
+            case 717:
+            case 737:
+                return 13789; // Desert Orc Xbow
+            case 353:
+            case 371:
+            case 388:
+            case 532:
+                return 12724; // xbow kolthoss
+        }
+        return 13433;
+    }
+
+    public static int getStrongholdMobEquipSetID(int mobbaseUUID){
+        switch(mobbaseUUID){
+            case 14280:
+                return 10790;
+            case 13643:
+                return 6317;
+            case 13515:
+                return 7820;
+            case 13528:
+                return 5966;
+            case 13802:
+                return 9043;
+            case 13789:
+                return 9035;
+            case 12728:
+                return 6826;
+            case 12724:
+                return 9471;
+            case 13434:
+                return 6327;
+            case 13433:
+                return 6900;
+        }
+        return 0;
+    }
+}
diff --git a/src/engine/mobileAI/MobAI.java b/src/engine/mobileAI/MobAI.java
index 01c1fa96..0160ef8b 100644
--- a/src/engine/mobileAI/MobAI.java
+++ b/src/engine/mobileAI/MobAI.java
@@ -400,7 +400,7 @@ public class MobAI {
 
                 PerformActionMsg msg;
 
-                if (!mobPower.isHarmful() || mobPower.targetSelf) {
+                if (!mob.StrongholdCommander && (!mobPower.isHarmful() || mobPower.targetSelf)) {
                     PowersManager.useMobPower(mob, mob, mobPower, powerRank);
                     msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, mob);
                 } else {
diff --git a/src/engine/objects/AbstractCharacter.java b/src/engine/objects/AbstractCharacter.java
index 8e09249c..21a5f3b4 100644
--- a/src/engine/objects/AbstractCharacter.java
+++ b/src/engine/objects/AbstractCharacter.java
@@ -91,17 +91,17 @@ public abstract class AbstractCharacter extends AbstractWorldObject {
     protected Resists resists = new Resists("Genric");
     protected ConcurrentHashMap<String, JobContainer> timers;
     protected ConcurrentHashMap<String, Long> timestamps;
-    protected int atrHandOne;
+    public int atrHandOne;
     protected int atrHandTwo;
-    protected int minDamageHandOne;
-    protected int maxDamageHandOne;
+    public int minDamageHandOne;
+    public int maxDamageHandOne;
     protected int minDamageHandTwo;
     protected int maxDamageHandTwo;
     protected float rangeHandOne;
     protected float rangeHandTwo;
     protected float speedHandOne;
     protected float speedHandTwo;
-    protected int defenseRating;
+    public int defenseRating;
     protected boolean isActive; // <-Do not use this for deleting character!
     protected float altitude = 0; // 0=on terrain, 1=tier 1, 2=tier 2, etc.
     protected ConcurrentHashMap<Integer, JobContainer> recycleTimers;
diff --git a/src/engine/objects/Mine.java b/src/engine/objects/Mine.java
index b14754ee..cc24fe7e 100644
--- a/src/engine/objects/Mine.java
+++ b/src/engine/objects/Mine.java
@@ -658,106 +658,4 @@ public class Mine extends AbstractGameObject {
 
         _playerMemory.removeAll(toRemove);
     }
-
-    public void StartStronghold(){
-
-        //remove buildings
-        Building tower = BuildingManager.getBuilding(this.buildingID);
-        if(tower == null)
-            return;
-
-        this.isStronghold = true;
-        this.strongholdMobs = new ArrayList<>();
-        this.oldBuildings = new HashMap<>();
-
-        Zone mineZone = ZoneManager.findSmallestZone(tower.loc);
-        for(Building building : mineZone.zoneBuildingSet){
-            oldBuildings.put(building.getObjectUUID(),building.meshUUID);
-            building.setMeshUUID(407650);
-            building.setMeshScale(new Vector3f(0,0,0));
-            InterestManager.setObjectDirty(building);
-            WorldGrid.updateObject(building);
-        }
-
-        //update tower to become stronghold mesh
-        tower.setMeshUUID(423600);
-        tower.setMeshScale(new Vector3f(1,1,1));
-        InterestManager.setObjectDirty(tower);
-        WorldGrid.updateObject(tower);
-
-        //create elite mobs
-        for(int i = 0; i < 10; i++){
-            Mob guard = Mob.createMob(14315, Vector3fImmutable.getRandomPointOnCircle(tower.loc,30),Guild.getErrantGuild(),true,mineZone,null,0, "Elite Guardian",65);
-            if(guard != null){
-                guard.setLevel((short)65);
-                guard.setResists(new Resists("Elite"));
-                guard.healthMax *= 2;
-                guard.setHealth(guard.healthMax);
-                guard.spawnTime = 1000000000;
-                guard.BehaviourType = Enum.MobBehaviourType.Aggro;
-                guard.maxDamageHandOne *= 2;
-                guard.minDamageHandOne *= 2;
-                guard.atrHandOne *= 2;
-                guard.defenseRating *= 2;
-                InterestManager.setObjectDirty(guard);
-                this.strongholdMobs.add(guard);
-                LootManager.GenerateStrongholdLoot(guard,false);
-            }
-            if(guard!= null && guard.level < 60)
-                guard.despawn();
-        }
-        //create stronghold commander
-        Mob commander = Mob.createMob(14293, tower.loc,Guild.getErrantGuild(),true,mineZone,null,0, "Guardian Commander",75);
-        if(commander != null){
-            commander.setLevel((short)75);
-            commander.setResists(new Resists("Elite"));
-            commander.healthMax = 50000;
-            commander.setHealth(commander.healthMax);
-            commander.spawnTime = 1000000000;
-            commander.BehaviourType = Enum.MobBehaviourType.Aggro;
-            commander.maxDamageHandOne = 1500;
-            commander.minDamageHandOne = 3500;
-            commander.atrHandOne = 3500;
-            commander.defenseRating = 3500;
-            commander.mobPowers.put(429413547,40);
-            commander.mobPowers.put(429032838,40);
-            commander.mobPowers.put(57584498,40);
-            InterestManager.setObjectDirty(commander);
-            this.strongholdMobs.add(commander);
-            LootManager.GenerateStrongholdLoot(commander,true);
-        }
-
-        this.setActive(true);
-        tower.setProtectionState(Enum.ProtectionState.PROTECTED);
-    }
-    public void EndStronghold(){
-
-        //restore the buildings
-        Building tower = BuildingManager.getBuilding(this.buildingID);
-        if(tower == null)
-            return;
-
-        this.isStronghold = false;
-
-        //get rid of the mobs
-        for(Mob mob : this.strongholdMobs) {
-            mob.despawn();
-            mob.removeFromCache();
-        }
-
-        //restore the buildings
-        Zone mineZone = ZoneManager.findSmallestZone(tower.loc);
-        for(Building building : mineZone.zoneBuildingSet){
-            if(this.oldBuildings.containsKey(building.getObjectUUID())) {
-                building.setMeshUUID(this.oldBuildings.get(building.getObjectUUID()));
-                building.setMeshScale(new Vector3f(1, 1, 1));
-            }
-        }
-
-        //update tower to become Mine Tower again
-        tower.setMeshUUID(1500100);
-
-        this.setActive(false);
-        tower.setProtectionState(Enum.ProtectionState.NPC);
-    }
 }
diff --git a/src/engine/objects/Mob.java b/src/engine/objects/Mob.java
index 6871a2c9..8e2181b5 100644
--- a/src/engine/objects/Mob.java
+++ b/src/engine/objects/Mob.java
@@ -101,6 +101,7 @@ public class Mob extends AbstractIntelligenceAgent {
     private DeferredPowerJob weaponPower;
     private DateTime upgradeDateTime = null;
     private boolean lootSync = false;
+    public boolean StrongholdCommander = false;
 
 
     /**
diff --git a/src/engine/workthreads/HalfHourlyJobThread.java b/src/engine/workthreads/HalfHourlyJobThread.java
index 0c0f4dc4..e3bb4e75 100644
--- a/src/engine/workthreads/HalfHourlyJobThread.java
+++ b/src/engine/workthreads/HalfHourlyJobThread.java
@@ -26,6 +26,7 @@ import java.util.ArrayList;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ThreadLocalRandom;
 
+import static engine.gameManager.StrongholdManager.EndStronghold;
 import static engine.server.MBServerStatics.MINE_LATE_WINDOW;
 
 public class HalfHourlyJobThread implements Runnable {
@@ -43,12 +44,8 @@ public class HalfHourlyJobThread implements Runnable {
 
             for (Mine mine : mines) {
                 try {
-
-                    if(mine.isStronghold)
-                        mine.EndStronghold();
-
                     //handle mines opening on server reboot weird time interval
-                    if(LocalDateTime.now().isAfter(LocalDateTime.now().withHour(mine.openHour).withMinute(mine.openMinute))) {
+                    if (LocalDateTime.now().isAfter(LocalDateTime.now().withHour(mine.openHour).withMinute(mine.openMinute))) {
                         if (LocalDateTime.now().isBefore(LocalDateTime.now().withHour(mine.openHour).withMinute(mine.openMinute).plusMinutes(30))) {
                             HalfHourlyJobThread.mineWindowOpen(mine);
                             continue;
@@ -64,7 +61,7 @@ public class HalfHourlyJobThread implements Runnable {
 
                     // Close the mine if it reaches this far
                     LocalDateTime openTime = LocalDateTime.now().withHour(mine.openHour).withMinute(mine.openMinute);
-                    if(LocalDateTime.now().plusMinutes(1).isAfter(openTime.plusMinutes(30)))
+                    if (LocalDateTime.now().plusMinutes(1).isAfter(openTime.plusMinutes(30)))
                         mineWindowClose(mine);
 
                 } catch (Exception e) {
@@ -72,19 +69,7 @@ public class HalfHourlyJobThread implements Runnable {
                 }
             }
 
-            //process stronghold
-            int count = 0;
-            while(count < 2){
-                int random = ThreadLocalRandom.current().nextInt(1,mines.size()) - 1;
-                Mine mine = mines.get(random);
-                if(mine != null){
-                    if(!mine.isActive){
-                        mine.StartStronghold();
-                        count ++;
-                    }
-                }
-            }
-
+            StrongholdManager.processStrongholds();
         } catch (Exception e) {
             Logger.error(e.toString());
         }