--- a/net/minecraft/server/commands/PlaceCommand.java
+++ b/net/minecraft/server/commands/PlaceCommand.java
@@ -233,36 +_,79 @@
         );
     }
 
+    // Folia start - region threading
+    private static void sendMessage(CommandSourceStack src, CommandSyntaxException ex) {
+        src.sendFailure((Component)ex.getRawMessage());
+    }
+    // Folia end - region threading
+
     public static int placeFeature(CommandSourceStack source, Holder.Reference<ConfiguredFeature<?, ?>> feature, BlockPos pos) throws CommandSyntaxException {
         ServerLevel level = source.getLevel();
         ConfiguredFeature<?, ?> configuredFeature = feature.value();
         ChunkPos chunkPos = new ChunkPos(pos);
         checkLoaded(level, new ChunkPos(chunkPos.x - 1, chunkPos.z - 1), new ChunkPos(chunkPos.x + 1, chunkPos.z + 1));
+        // Folia start - region threading
+        level.moonrise$loadChunksAsync(
+                pos, 16, net.minecraft.world.level.chunk.status.ChunkStatus.FULL,
+                ca.spottedleaf.concurrentutil.util.Priority.NORMAL,
+                (chunks) -> {
+                    try {
+                        // Folia end - region threading
         if (!configuredFeature.place(level, level.getChunkSource().getGenerator(), level.getRandom(), pos)) {
             throw ERROR_FEATURE_FAILED.create();
         } else {
             String string = feature.key().location().toString();
             source.sendSuccess(() -> Component.translatable("commands.place.feature.success", string, pos.getX(), pos.getY(), pos.getZ()), true);
-            return 1;
+            return; // Folia - region threading
         }
+        // Folia start - region threading
+                } catch (CommandSyntaxException ex) {
+                    sendMessage(source, ex);
+                }
+            }
+        );
+        return 1;
+        // Folia end - region threading
     }
 
     public static int placeJigsaw(CommandSourceStack source, Holder<StructureTemplatePool> templatePool, ResourceLocation target, int maxDepth, BlockPos pos) throws CommandSyntaxException {
         ServerLevel level = source.getLevel();
         ChunkPos chunkPos = new ChunkPos(pos);
         checkLoaded(level, chunkPos, chunkPos);
+        // Folia start - region threading
+        level.moonrise$loadChunksAsync(
+                pos, 16, net.minecraft.world.level.chunk.status.ChunkStatus.FULL,
+                ca.spottedleaf.concurrentutil.util.Priority.NORMAL,
+                (chunks) -> {
+                    try {
+                        // Folia end - region threading
         if (!JigsawPlacement.generateJigsaw(level, templatePool, target, maxDepth, pos, false)) {
             throw ERROR_JIGSAW_FAILED.create();
         } else {
             source.sendSuccess(() -> Component.translatable("commands.place.jigsaw.success", pos.getX(), pos.getY(), pos.getZ()), true);
-            return 1;
+            return; // Folia - region threading
         }
+        // Folia start - region threading
+                } catch (CommandSyntaxException ex) {
+                    sendMessage(source, ex);
+                }
+            }
+        );
+        return 1;
+        // Folia end - region threading
     }
 
     public static int placeStructure(CommandSourceStack source, Holder.Reference<Structure> structure, BlockPos pos) throws CommandSyntaxException {
         ServerLevel level = source.getLevel();
         Structure structure1 = structure.value();
         ChunkGenerator generator = level.getChunkSource().getGenerator();
+        // Folia start - region threading
+        level.moonrise$loadChunksAsync(
+                pos, 16, net.minecraft.world.level.chunk.status.ChunkStatus.FULL,
+                ca.spottedleaf.concurrentutil.util.Priority.NORMAL,
+                (chunks) -> {
+                    try {
+                        // Folia end - region threading
         StructureStart structureStart = structure1.generate(
             structure,
             level.dimension(),
@@ -305,14 +_,29 @@
                 );
             String string = structure.key().location().toString();
             source.sendSuccess(() -> Component.translatable("commands.place.structure.success", string, pos.getX(), pos.getY(), pos.getZ()), true);
-            return 1;
+            return; // Folia - region threading
         }
+        // Folia start - region threading
+                } catch (CommandSyntaxException ex) {
+                    sendMessage(source, ex);
+                }
+            }
+        );
+        return 1;
+        // Folia end - region threading
     }
 
     public static int placeTemplate(
         CommandSourceStack source, ResourceLocation template, BlockPos pos, Rotation rotation, Mirror mirror, float integrity, int seed
     ) throws CommandSyntaxException {
         ServerLevel level = source.getLevel();
+        // Folia start - region threading
+        level.moonrise$loadChunksAsync(
+                pos, 16, net.minecraft.world.level.chunk.status.ChunkStatus.FULL,
+                ca.spottedleaf.concurrentutil.util.Priority.NORMAL,
+                (chunks) -> {
+                    try {
+                        // Folia end - region threading
         StructureTemplateManager structureManager = level.getStructureManager();
 
         Optional<StructureTemplate> optional;
@@ -340,9 +_,17 @@
                     () -> Component.translatable("commands.place.template.success", Component.translationArg(template), pos.getX(), pos.getY(), pos.getZ()),
                     true
                 );
-                return 1;
+                return; // Folia - region threading
             }
         }
+        // Folia start - region threading
+                } catch (CommandSyntaxException ex) {
+                    sendMessage(source, ex);
+                }
+            }
+        );
+        return 1;
+        // Folia end - region threading
     }
 
     private static void checkLoaded(ServerLevel level, ChunkPos start, ChunkPos end) throws CommandSyntaxException {
