--- a/net/minecraft/world/level/block/EndGatewayBlock.java
+++ b/net/minecraft/world/level/block/EndGatewayBlock.java
@@ -111,16 +_,42 @@
             if (portalPosition == null) {
                 return null;
             } else {
-                return entity instanceof ThrownEnderpearl
-                    ? new TeleportTransition(level, portalPosition, Vec3.ZERO, 0.0F, 0.0F, Set.of(), TeleportTransition.PLACE_PORTAL_TICKET, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.END_GATEWAY) // CraftBukkit
-                    : new TeleportTransition(
-                        level, portalPosition, Vec3.ZERO, 0.0F, 0.0F, Relative.union(Relative.DELTA, Relative.ROTATION), TeleportTransition.PLACE_PORTAL_TICKET, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.END_GATEWAY // CraftBukkit
-                    );
+                return getTeleportTransition(level, entity, portalPosition); // Folia - region threading
             }
         } else {
             return null;
         }
     }
+
+    // Folia start - region threading
+    public static TeleportTransition getTeleportTransition(ServerLevel level, Entity entity, Vec3 portalPosition) {
+                return entity instanceof ThrownEnderpearl
+                        ? new TeleportTransition(level, portalPosition, Vec3.ZERO, 0.0F, 0.0F, Set.of(), TeleportTransition.PLACE_PORTAL_TICKET, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.END_GATEWAY) // CraftBukkit
+                        : new TeleportTransition(
+                        level, portalPosition, Vec3.ZERO, 0.0F, 0.0F, Relative.union(Relative.DELTA, Relative.ROTATION), TeleportTransition.PLACE_PORTAL_TICKET, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.END_GATEWAY // CraftBukkit
+                );
+    }
+
+    @Override
+    public boolean portalAsync(ServerLevel sourceWorld, Entity portalTarget, BlockPos portalPos) {
+        if (!ca.spottedleaf.moonrise.common.util.TickThread.isTickThreadFor(portalTarget)) {
+            return false;
+        }
+        if (!ca.spottedleaf.moonrise.common.util.TickThread.isTickThreadFor(sourceWorld, portalPos)) {
+            return false;
+        }
+
+        BlockEntity tile = sourceWorld.getBlockEntity(portalPos);
+
+        if (!(tile instanceof TheEndGatewayBlockEntity endGateway)) {
+            return false;
+        }
+
+        return TheEndGatewayBlockEntity.teleportRegionThreading(
+            sourceWorld, portalPos, portalTarget, endGateway, TeleportTransition.PLACE_PORTAL_TICKET
+        );
+    }
+    // Folia end - region threading
 
     @Override
     protected RenderShape getRenderShape(BlockState state) {
