--- a/net/minecraft/server/level/ChunkMap.java
+++ b/net/minecraft/server/level/ChunkMap.java
@@ -128,8 +_,8 @@
     public final ChunkMap.DistanceManager distanceManager;
     public final AtomicInteger tickingGenerated = new AtomicInteger();  // Paper - public
     private final String storageName;
-    private final PlayerMap playerMap = new PlayerMap();
-    public final Int2ObjectMap<ChunkMap.TrackedEntity> entityMap = new Int2ObjectOpenHashMap<>();
+    //private final PlayerMap playerMap = new PlayerMap(); // Folia - region threading
+    //public final Int2ObjectMap<ChunkMap.TrackedEntity> entityMap = new Int2ObjectOpenHashMap<>(); // Folia - region threading
     private final Long2ByteMap chunkTypeCache = new Long2ByteOpenHashMap();
     // Paper - rewrite chunk system
     public int serverViewDistance;
@@ -797,12 +_,12 @@
 
     void updatePlayerStatus(ServerPlayer player, boolean track) {
         boolean flag = this.skipPlayer(player);
-        boolean flag1 = this.playerMap.ignoredOrUnknown(player);
+        //boolean flag1 = this.playerMap.ignoredOrUnknown(player); // Folia - region threading
         if (track) {
-            this.playerMap.addPlayer(player, flag);
+            //this.playerMap.addPlayer(player, flag); // Folia - region threading
             this.updatePlayerPos(player);
             if (!flag) {
-                this.distanceManager.addPlayer(SectionPos.of(player), player);
+                //this.distanceManager.addPlayer(SectionPos.of(player), player); // Folia - region threading
                 ((ca.spottedleaf.moonrise.patches.chunk_tick_iteration.ChunkTickDistanceManager)this.distanceManager).moonrise$addPlayer(player, SectionPos.of(player)); // Paper - chunk tick iteration optimisation
             }
 
@@ -810,9 +_,9 @@
             ca.spottedleaf.moonrise.common.PlatformHooks.get().addPlayerToDistanceMaps(this.level, player); // Paper - rewrite chunk system
         } else {
             SectionPos lastSectionPos = player.getLastSectionPos();
-            this.playerMap.removePlayer(player);
-            if (!flag1) {
-                this.distanceManager.removePlayer(lastSectionPos, player);
+            //this.playerMap.removePlayer(player); // Folia - region threading
+            if (true) { // Folia - region threading
+                //this.distanceManager.removePlayer(lastSectionPos, player); // Folia - region threading
                 ((ca.spottedleaf.moonrise.patches.chunk_tick_iteration.ChunkTickDistanceManager)this.distanceManager).moonrise$removePlayer(player, SectionPos.of(player)); // Paper - chunk tick iteration optimisation
             }
 
@@ -830,27 +_,13 @@
 
         SectionPos lastSectionPos = player.getLastSectionPos();
         SectionPos sectionPos = SectionPos.of(player);
-        boolean flag = this.playerMap.ignored(player);
+        //boolean flag = this.playerMap.ignored(player); // Folia - region threading
         boolean flag1 = this.skipPlayer(player);
-        boolean flag2 = lastSectionPos.asLong() != sectionPos.asLong();
-        if (flag2 || flag != flag1) {
+        //boolean flag2 = lastSectionPos.asLong() != sectionPos.asLong(); // Folia - region threading
+        if (true) { // Folia - region threading
             this.updatePlayerPos(player);
-            ((ca.spottedleaf.moonrise.patches.chunk_tick_iteration.ChunkTickDistanceManager)this.distanceManager).moonrise$updatePlayer(player, lastSectionPos, sectionPos, flag, flag1); // Paper - chunk tick iteration optimisation
-            if (!flag) {
-                this.distanceManager.removePlayer(lastSectionPos, player);
-            }
-
-            if (!flag1) {
-                this.distanceManager.addPlayer(sectionPos, player);
-            }
-
-            if (!flag && flag1) {
-                this.playerMap.ignorePlayer(player);
-            }
-
-            if (flag && !flag1) {
-                this.playerMap.unIgnorePlayer(player);
-            }
+            ((ca.spottedleaf.moonrise.patches.chunk_tick_iteration.ChunkTickDistanceManager)this.distanceManager).moonrise$updatePlayer(player, lastSectionPos, sectionPos, false, flag1); // Paper - chunk tick iteration optimisation // Folia - region threading
+            // Folia - region threading
 
             // Paper - rewrite chunk system
         }
@@ -880,9 +_,9 @@
     public void addEntity(Entity entity) {
         org.spigotmc.AsyncCatcher.catchOp("entity track"); // Spigot
         // Paper start - ignore and warn about illegal addEntity calls instead of crashing server
-        if (!entity.valid || entity.level() != this.level || this.entityMap.containsKey(entity.getId())) {
+        if (!entity.valid || entity.level() != this.level || entity.moonrise$getTrackedEntity() != null) { // Folia - region threading
             LOGGER.error("Illegal ChunkMap::addEntity for world " + this.level.getWorld().getName()
-                + ": " + entity  + (this.entityMap.containsKey(entity.getId()) ? " ALREADY CONTAINED (This would have crashed your server)" : ""), new Throwable());
+                + ": " + entity  + (entity.moonrise$getTrackedEntity() != null ? " ALREADY CONTAINED (This would have crashed your server)" : ""), new Throwable()); // Folia - region threading
             return;
         }
         // Paper end - ignore and warn about illegal addEntity calls instead of crashing server
@@ -893,22 +_,28 @@
             i = org.spigotmc.TrackingRange.getEntityTrackingRange(entity, i); // Spigot
             if (i != 0) {
                 int updateInterval = type.updateInterval();
-                if (this.entityMap.containsKey(entity.getId())) {
+                if (entity.moonrise$getTrackedEntity() != null) { // Folia - region threading
                     throw (IllegalStateException)Util.pauseInIde(new IllegalStateException("Entity is already tracked!"));
                 } else {
                     ChunkMap.TrackedEntity trackedEntity = new ChunkMap.TrackedEntity(entity, i, updateInterval, type.trackDeltas());
-                    this.entityMap.put(entity.getId(), trackedEntity);
+                    //this.entityMap.put(entity.getId(), trackedEntity); // Folia - region threading
                     // Paper start - optimise entity tracker
                     if (((ca.spottedleaf.moonrise.patches.entity_tracker.EntityTrackerEntity)entity).moonrise$getTrackedEntity() != null) {
                         throw new IllegalStateException("Entity is already tracked");
                     }
                     ((ca.spottedleaf.moonrise.patches.entity_tracker.EntityTrackerEntity)entity).moonrise$setTrackedEntity(trackedEntity);
                     // Paper end - optimise entity tracker
-                    trackedEntity.updatePlayers(this.level.players());
+                    trackedEntity.updatePlayers(this.level.getLocalPlayers()); // Folia - region threading
                     if (entity instanceof ServerPlayer serverPlayer) {
                         this.updatePlayerStatus(serverPlayer, true);
 
-                        for (ChunkMap.TrackedEntity trackedEntity1 : this.entityMap.values()) {
+                        // Folia start - region threading
+                        for (Entity possible : this.level.getCurrentWorldData().trackerEntities) {
+                            ChunkMap.TrackedEntity trackedEntity1 = possible.moonrise$getTrackedEntity();
+                            if (trackedEntity1 == null) {
+                                continue;
+                            }
+                            // Folia end - region threading
                             if (trackedEntity1.entity != serverPlayer) {
                                 trackedEntity1.updatePlayer(serverPlayer);
                             }
@@ -924,12 +_,19 @@
         if (entity instanceof ServerPlayer serverPlayer) {
             this.updatePlayerStatus(serverPlayer, false);
 
-            for (ChunkMap.TrackedEntity trackedEntity : this.entityMap.values()) {
+            // Folia start - region threading
+            for (Entity possible : this.level.getCurrentWorldData().getLocalEntities()) {
+                ChunkMap.TrackedEntity trackedEntity = possible.moonrise$getTrackedEntity();
+                if (trackedEntity == null) {
+                    continue;
+                }
+                // Folia end - region threading
                 trackedEntity.removePlayer(serverPlayer);
             }
+            // Folia end - region threading
         }
 
-        ChunkMap.TrackedEntity trackedEntity1 = this.entityMap.remove(entity.getId());
+        ChunkMap.TrackedEntity trackedEntity1 = entity.moonrise$getTrackedEntity(); // Folia - region threading
         if (trackedEntity1 != null) {
             trackedEntity1.broadcastRemoved();
         }
@@ -938,9 +_,11 @@
 
     // Paper start - optimise entity tracker
     private void newTrackerTick() {
+        final io.papermc.paper.threadedregions.RegionizedWorldData worldData = this.level.getCurrentWorldData(); // Folia - region threading
         final ca.spottedleaf.moonrise.patches.chunk_system.level.entity.server.ServerEntityLookup entityLookup = (ca.spottedleaf.moonrise.patches.chunk_system.level.entity.server.ServerEntityLookup)((ca.spottedleaf.moonrise.patches.chunk_system.level.ChunkSystemServerLevel)this.level).moonrise$getEntityLookup();;
+        final ca.spottedleaf.moonrise.common.misc.NearbyPlayers nearbyPlayers = this.level.moonrise$getNearbyPlayers(); // Folia - region threading
 
-        final ca.spottedleaf.moonrise.common.list.ReferenceList<net.minecraft.world.entity.Entity> trackerEntities = entityLookup.trackerEntities;
+        final ca.spottedleaf.moonrise.common.list.ReferenceList<net.minecraft.world.entity.Entity> trackerEntities = worldData.trackerEntities; // Folia - region threading
         final Entity[] trackerEntitiesRaw = trackerEntities.getRawDataUnchecked();
         for (int i = 0, len = trackerEntities.size(); i < len; ++i) {
             final Entity entity = trackerEntitiesRaw[i];
@@ -948,7 +_,7 @@
             if (tracker == null) {
                 continue;
             }
-            ((ca.spottedleaf.moonrise.patches.entity_tracker.EntityTrackerTrackedEntity)tracker).moonrise$tick(((ca.spottedleaf.moonrise.patches.chunk_system.entity.ChunkSystemEntity)entity).moonrise$getChunkData().nearbyPlayers);
+            ((ca.spottedleaf.moonrise.patches.entity_tracker.EntityTrackerTrackedEntity)tracker).moonrise$tick(nearbyPlayers.getChunk(entity.chunkPosition())); // Folia - region threading
             if (((ca.spottedleaf.moonrise.patches.entity_tracker.EntityTrackerTrackedEntity)tracker).moonrise$hasPlayers()
                 || ((ca.spottedleaf.moonrise.patches.chunk_system.entity.ChunkSystemEntity)entity).moonrise$getChunkStatus().isOrAfter(FullChunkStatus.ENTITY_TICKING)) {
                 tracker.serverEntity.sendChanges();
@@ -966,44 +_,18 @@
         // Paper end - optimise entity tracker
         // Paper - rewrite chunk system
 
-        List<ServerPlayer> list = Lists.newArrayList();
-        List<ServerPlayer> list1 = this.level.players();
-
-        for (ChunkMap.TrackedEntity trackedEntity : this.entityMap.values()) {
-            SectionPos sectionPos = trackedEntity.lastSectionPos;
-            SectionPos sectionPos1 = SectionPos.of(trackedEntity.entity);
-            boolean flag = !Objects.equals(sectionPos, sectionPos1);
-            if (flag) {
-                trackedEntity.updatePlayers(list1);
-                Entity entity = trackedEntity.entity;
-                if (entity instanceof ServerPlayer) {
-                    list.add((ServerPlayer)entity);
-                }
-
-                trackedEntity.lastSectionPos = sectionPos1;
-            }
-
-            if (flag || this.distanceManager.inEntityTickingRange(sectionPos1.chunk().toLong())) {
-                trackedEntity.serverEntity.sendChanges();
-            }
-        }
-
-        if (!list.isEmpty()) {
-            for (ChunkMap.TrackedEntity trackedEntity : this.entityMap.values()) {
-                trackedEntity.updatePlayers(list);
-            }
-        }
+        // Folia - region threading
     }
 
     public void broadcast(Entity entity, Packet<?> packet) {
-        ChunkMap.TrackedEntity trackedEntity = this.entityMap.get(entity.getId());
+        ChunkMap.TrackedEntity trackedEntity = entity.moonrise$getTrackedEntity(); // Folia - region threading
         if (trackedEntity != null) {
             trackedEntity.broadcast(packet);
         }
     }
 
     protected void broadcastAndSend(Entity entity, Packet<?> packet) {
-        ChunkMap.TrackedEntity trackedEntity = this.entityMap.get(entity.getId());
+        ChunkMap.TrackedEntity trackedEntity = entity.moonrise$getTrackedEntity(); // Folia - region threading
         if (trackedEntity != null) {
             trackedEntity.broadcastAndSend(packet);
         }
@@ -1231,8 +_,13 @@
                 }
                 flag = flag && this.entity.broadcastToPlayer(player) && ChunkMap.this.isChunkTracked(player, this.entity.chunkPosition().x, this.entity.chunkPosition().z);
                 // Paper end - Configurable entity tracking range by Y
+                // Folia start - region threading
+                if (flag && (this.entity instanceof ServerPlayer thisEntity) && thisEntity.broadcastedDeath) {
+                    flag = false;
+                }
+                // Folia end - region threading
                 // CraftBukkit start - respect vanish API
-                if (flag && !player.getBukkitEntity().canSee(this.entity.getBukkitEntity())) { // Paper - only consider hits
+                if (flag && (!ca.spottedleaf.moonrise.common.util.TickThread.isTickThreadFor(player) || !player.getBukkitEntity().canSee(this.entity.getBukkitEntity()))) { // Paper - only consider hits // Folia - region threading
                     flag = false;
                 }
                 // CraftBukkit end
