diff --git a/src/engine/Enum.java b/src/engine/Enum.java
index 180ecbda..ccd2db53 100644
--- a/src/engine/Enum.java
+++ b/src/engine/Enum.java
@@ -2636,8 +2636,9 @@ public class Enum {
 		TEMPLEGUARD(1575,1652, MinionClass.MELEE,"Guard","Temple"),
 		TEMPLEMAGE(1577, 1656, MinionClass.MAGE,"Confessor","Temple"),
 		UNDEADGUARD(980100,1674,MinionClass.MELEE,"Guard","Undead"),
-		UNDEADMAGE(980102,1675,MinionClass.MAGE,"Adept","Undead");
-		
+		UNDEADMAGE(980102,1675,MinionClass.MAGE,"Adept","Undead"),
+		WEREWOLFGUARD(980104,0,MinionClass.MELEE,"Guard","Werewolf"),
+		WEREBEARGUARD(980103,0,MinionClass.MELEE,"Guard","Werebear");
 		private final int captainContractID;
 		private final int equipSetID;
 		private final MinionClass minionClass;
diff --git a/src/engine/ai/MobileFSM.java b/src/engine/ai/MobileFSM.java
index 6023032e..caae9949 100644
--- a/src/engine/ai/MobileFSM.java
+++ b/src/engine/ai/MobileFSM.java
@@ -199,7 +199,7 @@ public class MobileFSM {
             mob.destination = mob.patrolPoints.get(mob.lastPatrolPointIndex);
             MovementUtilities.aiMove(mob, mob.destination, true);
             mob.lastPatrolPointIndex += 1;
-            if (mob.isPlayerGuard()) {
+            if (mob.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardCaptain.ordinal()) {
                 for (Entry<Mob, Integer> minion : mob.siegeMinionMap.entrySet()) {
                     //make sure mob is out of combat stance
                     if (minion.getKey().isCombat() && minion.getKey().getCombatTarget() == null) {
@@ -320,6 +320,12 @@ public class MobileFSM {
         if (mob.playerAgroMap.isEmpty())
             //no players loaded, no need to proceed
             return;
+        if (mob.isCombat() && mob.getCombatTarget() == null) {
+            mob.setCombat(false);
+            UpdateStateMsg rwss = new UpdateStateMsg();
+            rwss.setPlayer(mob);
+            DispatchMessage.sendToAllInRange(mob, rwss);
+        }
         CheckToSendMobHome(mob);
         mob.updateLocation();
         switch (mob.BehaviourType) {
@@ -378,10 +384,16 @@ public class MobileFSM {
             return;
         mob.updateLocation();
         if (mob.BehaviourType != Enum.MobBehaviourType.Pet1) {
-            if (mob.getCombatTarget() == null)
+            if (mob.getCombatTarget() == null) {
+                if (mob.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardMinion.ordinal()) {
+                    if (mob.npcOwner.isAlive() == true) {
+                        return;
+                    }
+                }
                 Patrol(mob);
-            else
+            }else {
                 chaseTarget(mob);
+            }
         } else {
             //pet logic
             if (!mob.playerAgroMap.containsKey(mob.getOwner().getObjectUUID())) {
@@ -505,11 +517,6 @@ public class MobileFSM {
             CheckForAttack(mob);
     }
     public static void GuardMinionLogic(Mob mob) {
-        if (mob.despawned || !mob.isAlive()) {
-            if (System.currentTimeMillis() > mob.deathTime + (mob.spawnTime * 1000))
-                mob.respawn();
-            return;
-        }
         if (!mob.npcOwner.isAlive() && mob.getCombatTarget() == null) {
             CheckForPlayerGuardAggro(mob);
             return;
diff --git a/src/engine/gameManager/BuildingManager.java b/src/engine/gameManager/BuildingManager.java
index 1f2141e8..9a3c79b4 100644
--- a/src/engine/gameManager/BuildingManager.java
+++ b/src/engine/gameManager/BuildingManager.java
@@ -297,7 +297,7 @@ public enum BuildingManager {
             for (AbstractCharacter slottedNPC : building.getHirelings().keySet()) {
 
                 if (slottedNPC.getObjectType() == Enum.GameObjectType.NPC)
-                    ((NPC) slottedNPC).remove();
+                    ((NPC)slottedNPC).remove();
                 else if (slottedNPC.getObjectType() == Enum.GameObjectType.Mob)
                     NPCManager.removeMobileFromBuilding(((Mob) slottedNPC), building);
             }
@@ -475,7 +475,7 @@ public enum BuildingManager {
 
         NPC npc = null;
 
-        npc = NPC.createNPC(pirateName, NpcID.getObjectUUID(), NpcLoc, null, false, zone, (short) rank, building);
+        npc = NPC.createNPC(pirateName, NpcID.getObjectUUID(), NpcLoc, null, false, zone, (short)rank, building);
 
         if (npc == null)
             return false;
@@ -508,7 +508,7 @@ public enum BuildingManager {
 
         if (NPC.ISWallArcher(contract)) {
 
-            mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), true, zone, building, contract.getContractID(), pirateName, rank * 10);
+            mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), true, zone, building, contract.getContractID(), pirateName, rank);
 
             if (mob == null)
                 return false;
diff --git a/src/engine/objects/Mob.java b/src/engine/objects/Mob.java
index abe71aa8..2b2603a4 100644
--- a/src/engine/objects/Mob.java
+++ b/src/engine/objects/Mob.java
@@ -67,7 +67,6 @@ public class Mob extends AbstractIntelligenceAgent {
     public boolean isPlayerGuard = false;
     public AbstractCharacter npcOwner;
     public long deathTime = 0;
-    public String nameOverride = "";
     public int equipmentSetID = 0;
     public int runeSet = 0;
     public int bootySet = 0;
@@ -120,7 +119,9 @@ public class Mob extends AbstractIntelligenceAgent {
 
         if (contractID == 0) this.contract = null;
         else this.contract = DbManager.ContractQueries.GET_CONTRACT(contractID);
-
+        if(building != null && building.getOwner()!= null){
+            this.lastName = "the " + contract.getName();
+        }
         clearStatic();
     }
 
@@ -253,13 +254,16 @@ public class Mob extends AbstractIntelligenceAgent {
 
             this.notEnemy = EnumBitSet.asEnumBitSet(rs.getLong("notEnemy"), Enum.MonsterType.class);
             this.enemy = EnumBitSet.asEnumBitSet(rs.getLong("enemy"), Enum.MonsterType.class);
-
+            this.firstName = rs.getString("mob_name");
+            if(this.firstName.isEmpty()){
+                this.firstName = this.mobBase.getFirstName();
+            }
             if (this.contract != null) {
                 this.equipmentSetID = this.contract.getEquipmentSet();
-                this.nameOverride = this.getContract().getName();
+                this.lastName = this.getContract().getName();
             } else {
                 this.equipmentSetID = rs.getInt("equipmentSet");
-                this.nameOverride = rs.getString("mob_name");
+
             }
 
             if (rs.getString("fsm").length() > 1) this.BehaviourType = MobBehaviourType.valueOf(rs.getString("fsm"));
@@ -328,14 +332,11 @@ public class Mob extends AbstractIntelligenceAgent {
         writer.putInt(0xFF665EC3); //Spi
         writer.putInt(0);
 
-        if (!mob.nameOverride.isEmpty()) {
-            writer.putString(mob.nameOverride);
-            writer.putInt(0);
-        } else {
+
             writer.putString(mob.firstName);
             writer.putString(mob.lastName);
 
-        }
+
 
         writer.putInt(0);
         writer.putInt(0);
@@ -706,10 +707,8 @@ public class Mob extends AbstractIntelligenceAgent {
                 else if (guardCaptain.getRank() == 6) rank = MBServerStatics.VETERAN;
                 else rank = MBServerStatics.ELITE;
 
-                if (rank.isEmpty())
-                    mob.nameOverride = pirateName + " " + minionType.getRace() + " " + minionType.getName();
-                else
-                    mob.nameOverride = pirateName + " " + minionType.getRace() + " " + rank + " " + minionType.getName();
+                mob.firstName = NPC.getPirateName(mob.getMobBaseID());
+                mob.lastName = rank + " " + minionType.getRace() + " " + minionType.getName();
             }
         }
 
@@ -717,6 +716,7 @@ public class Mob extends AbstractIntelligenceAgent {
 
         // mob.setMob();
         mob.isPlayerGuard = true;
+
         DbManager.addToCache(mob);
 
         RuneBase guardRune = RuneBase.getRuneBase(252621);
@@ -762,7 +762,8 @@ public class Mob extends AbstractIntelligenceAgent {
         mob.spawnTime = 900;
         mob.npcOwner = guardCaptain;
         mob.BehaviourType = Enum.MobBehaviourType.GuardMinion;
-
+        //add mob to zone set of captain
+        guardCaptain.getParentZone().zoneMobSet.add(mob);
         return mob;
     }
 
@@ -887,11 +888,6 @@ public class Mob extends AbstractIntelligenceAgent {
             this.mana.set(this.manaMax);
             this.stamina.set(this.staminaMax);
 
-            if (!this.nameOverride.isEmpty())
-                this.firstName = this.nameOverride;
-            else
-                this.firstName = this.mobBase.getFirstName();
-
             if (isPet)
                 this.setObjectTypeMask(MBServerStatics.MASK_PET | this.getTypeMasks());
 
@@ -916,7 +912,10 @@ public class Mob extends AbstractIntelligenceAgent {
         this.charItemManager.load();
 
         //load AI for general mobs.
-
+        if(this.contract != null && NPC.ISWallArcher(this.contract)){
+            this.BehaviourType = MobBehaviourType.GuardWallArcher;
+            this.isPlayerGuard = true;
+        }
         if (isPet || isSiege || (isGuard && this.contract == null)) this.currentID = (--Mob.staticID);
         else this.currentID = this.dbID;
 
@@ -1281,7 +1280,6 @@ public class Mob extends AbstractIntelligenceAgent {
 
     public void respawn() {
         //Commenting out Mob ID rotation.
-
         this.despawned = false;
         this.playerAgroMap.clear();
         this.setCombatTarget(null);
@@ -1300,7 +1298,7 @@ public class Mob extends AbstractIntelligenceAgent {
         this.recalculateStats();
 
         this.setHealth(this.healthMax);
-
+        this.region = BuildingManager.GetRegion(this.building, bindLoc.x, bindLoc.y, bindLoc.z);
         if (!this.isSiege && !this.isPlayerGuard && contract == null) loadInventory();
 
     }
@@ -1987,7 +1985,7 @@ public class Mob extends AbstractIntelligenceAgent {
     }
 
     public String getNameOverride() {
-        return nameOverride;
+        return firstName + "  " + lastName;
     }
 
     public void processUpgradeMob(PlayerCharacter player) {
diff --git a/src/engine/objects/NPC.java b/src/engine/objects/NPC.java
index 6971a3eb..a705e08b 100644
--- a/src/engine/objects/NPC.java
+++ b/src/engine/objects/NPC.java
@@ -87,7 +87,6 @@ public class NPC extends AbstractCharacter {
 	public ArrayList<ProducedItem> forgedItems = new ArrayList<>();
 
 	public HashMap<Integer, MobEquipment> equip = null;
-	private String nameOverride = "";
 	private int equipmentSetID = 0;
 	public int runeSetID = 0;
 
@@ -240,8 +239,10 @@ public class NPC extends AbstractCharacter {
 			if (this.upgradeDateTime != null)
 				submitUpgradeJob();
 
-			this.name = this.contract.getName();
-			this.nameOverride = rs.getString("npc_name");
+			this.name = rs.getString("npc_name");
+			if(this.building != null && this.building.getOwner().getObjectType().equals(GameObjectType.PlayerCharacter)){
+				this.name += " the " + this.contract.getName();
+			}
 
 		}catch(Exception e){
 			Logger.error(e);
@@ -620,23 +621,8 @@ public class NPC extends AbstractCharacter {
 		writer.putInt(0xFF665EC3); //Spi
 		writer.putInt(0);
 
-		if (!npc.nameOverride.isEmpty()){
-			writer.putString(npc.nameOverride);
-			writer.putInt(0);
-		}else
-			if (npc.contract != null) {
-
-				if (npc.contract.isTrainer()) {
-					writer.putString(npc.name + ", " + npc.contract.getName());
-					writer.putString("");
-				} else {
-					writer.putString(npc.name);
-					writer.putString(npc.contract.getName());
-				}
-			} else {
-				writer.putString(npc.name);
-				writer.putString("");
-			}
+		writer.putString(npc.name);
+		writer.putString("");
 
 		writer.putInt(0);
 		writer.putInt(0);
@@ -1473,7 +1459,7 @@ public class NPC extends AbstractCharacter {
 	}
 
 	public String getNameOverride() {
-		return nameOverride;
+		return name;
 	}
 
 	public static NPCProfits GetNPCProfits(NPC npc){