diff --git a/src/engine/ai/MobileFSM.java b/src/engine/ai/MobileFSM.java
index 7b9ad4e9..c43cc826 100644
--- a/src/engine/ai/MobileFSM.java
+++ b/src/engine/ai/MobileFSM.java
@@ -305,10 +305,13 @@ public class MobileFSM {
     public static void DetermineAction(Mob mob) {
         if (mob == null)
             return;
-        if (mob.despawned && mob.getMobBase().getLoadID() == 13171) {
-            //trebuchet spawn handler
-            CheckForRespawn(mob);
+        if (mob.playerAgroMap.isEmpty() && !mob.isPlayerGuard)
+            //no players loaded, no need to proceed
             return;
+        else{
+            if(mob.isPlayerGuard && mob.guardedCity._playerMemory.size() < 1 && mob.playerAgroMap.isEmpty())
+                //guards use aggro map and players in their local city zone
+                return;
         }
         if (mob.despawned && mob.isPlayerGuard) {
             //override for guards
@@ -331,9 +334,6 @@ public class MobileFSM {
             CheckForRespawn(mob);
             return;
         }
-        if (mob.playerAgroMap.isEmpty() && mob.isPlayerGuard == false)
-            //no players loaded, no need to proceed
-            return;
         if (mob.isCombat() && mob.getCombatTarget() == null) {
             mob.setCombat(false);
             UpdateStateMsg rwss = new UpdateStateMsg();
@@ -492,21 +492,19 @@ public class MobileFSM {
         if (mob.isPlayerGuard() && !mob.despawned) {
             City current = ZoneManager.getCityAtLocation(mob.getLoc());
             if (current == null || current.equals(mob.getGuild().getOwnedCity()) == false || mob.playerAgroMap.isEmpty()) {
-                PowersBase recall = PowersManager.getPowerByToken(-1994153779);
-                PowersManager.useMobPower(mob, mob, recall, 40);
+                MovementManager.translocate(mob,mob.getBindLoc(),null);
                 mob.setCombatTarget(null);
                 if(mob.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardCaptain.ordinal() && mob.isAlive()){
                     //guard captain pulls his minions home with him
                     for (Entry<Mob, Integer> minion : mob.siegeMinionMap.entrySet()) {
-                        PowersManager.useMobPower(minion.getKey(), minion.getKey(), recall, 40);
+                        MovementManager.translocate(minion.getKey(),mob.getBindLoc(),null);
                         minion.getKey().setCombatTarget(null);
                     }
                 }
             }
         }
          else if(MovementUtilities.inRangeOfBindLocation(mob) == false) {
-            PowersBase recall = PowersManager.getPowerByToken(-1994153779);
-            PowersManager.useMobPower(mob, mob, recall, 40);
+            MovementManager.translocate(mob,mob.getBindLoc(),null);
             mob.setCombatTarget(null);
         }
     }
diff --git a/src/engine/ai/MobileFSMManager.java b/src/engine/ai/MobileFSMManager.java
index f8b0fd52..3073e877 100644
--- a/src/engine/ai/MobileFSMManager.java
+++ b/src/engine/ai/MobileFSMManager.java
@@ -8,6 +8,7 @@
 
 
 package engine.ai;
+import engine.gameManager.SessionManager;
 import engine.gameManager.ZoneManager;
 import engine.objects.Mob;
 import engine.objects.Zone;
@@ -88,7 +89,7 @@ public class MobileFSMManager {
 					for (Mob mob : zone.zoneMobSet) {
 
 						try {
-							if (mob != null)
+							if (mob != null && SessionManager.getActivePlayerCharacterCount() > 0)
 								MobileFSM.DetermineAction(mob);
 						} catch (Exception e) {
 							Logger.error("Mob: " + mob.getName() + " UUID: " + mob.getObjectUUID() + " ERROR: " + e);
diff --git a/src/engine/objects/City.java b/src/engine/objects/City.java
index dbb31856..084ab55d 100644
--- a/src/engine/objects/City.java
+++ b/src/engine/objects/City.java
@@ -87,7 +87,7 @@ public class City extends AbstractWorldObject {
 
 	// Players who have entered the city (used for adding and removing affects)
 
-	private final HashSet<Integer> _playerMemory = new HashSet<>();
+	public final HashSet<Integer> _playerMemory = new HashSet<>();
 
 	public volatile boolean protectionEnforced = true;
 	private String hash;
diff --git a/src/engine/objects/Mob.java b/src/engine/objects/Mob.java
index 2106344b..db848361 100644
--- a/src/engine/objects/Mob.java
+++ b/src/engine/objects/Mob.java
@@ -99,6 +99,7 @@ public class Mob extends AbstractIntelligenceAgent {
     private DeferredPowerJob weaponPower;
     private DateTime upgradeDateTime = null;
     private boolean lootSync = false;
+    public City guardedCity;
 
     /**
      * No Id Constructor
@@ -806,6 +807,7 @@ public class Mob extends AbstractIntelligenceAgent {
         mob.npcOwner = guardCaptain;
         mob.spawnTime = (int)(-2.500 * guardCaptain.building.getRank() + 22.5) * 60;
         mob.BehaviourType = Enum.MobBehaviourType.GuardMinion;
+        mob.guardedCity = guardCaptain.guardedCity;
         mob.parentZone = parent;
         parent.zoneMobSet.add(mob);
         return mob;
@@ -1987,6 +1989,7 @@ public class Mob extends AbstractIntelligenceAgent {
                 else {
                     this.BehaviourType = MobBehaviourType.GuardCaptain;
                     this.spawnTime = 900;
+                    this.guardedCity = ZoneManager.getCityAtLocation(this.bindLoc);
                 }
 
             this.deathTime = 0;