diff --git a/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeModificationContextImpl.java b/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeModificationContextImpl.java
index f7a34ecf4..6ea545040 100644
--- a/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeModificationContextImpl.java
+++ b/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeModificationContextImpl.java
@@ -103,6 +103,10 @@ public class BiomeModificationContextImpl implements BiomeModificationContext {
 		spawnSettings.freeze();
 	}
 
+	boolean shouldRebuildFeatures() {
+		return generationSettings.rebuildFeatures;
+	}
+
 	private class WeatherContextImpl implements WeatherContext {
 		@Override
 		public void setPrecipitation(boolean hasPrecipitation) {
@@ -194,7 +198,7 @@ public class BiomeModificationContextImpl implements BiomeModificationContext {
 		private final Registry<PlacedFeature> features = registries.get(RegistryKeys.PLACED_FEATURE);
 		private final GenerationSettings generationSettings = biome.getGenerationSettings();
 
-		private boolean rebuildFlowerFeatures;
+		boolean rebuildFeatures;
 
 		/**
 		 * Unfreeze the immutable lists found in the generation settings, and make sure they're filled up to every
@@ -204,7 +208,7 @@ public class BiomeModificationContextImpl implements BiomeModificationContext {
 			unfreezeCarvers();
 			unfreezeFeatures();
 
-			rebuildFlowerFeatures = false;
+			rebuildFeatures = false;
 		}
 
 		private void unfreezeCarvers() {
@@ -225,7 +229,7 @@ public class BiomeModificationContextImpl implements BiomeModificationContext {
 			freezeCarvers();
 			freezeFeatures();
 
-			if (rebuildFlowerFeatures) {
+			if (rebuildFeatures) {
 				rebuildFlowerFeatures();
 			}
 		}
@@ -267,7 +271,7 @@ public class BiomeModificationContextImpl implements BiomeModificationContext {
 
 			if (features.removeIf(feature -> feature.value() == placedFeature)) {
 				featureSteps.set(stepIndex, RegistryEntryList.of(features));
-				rebuildFlowerFeatures = true;
+				rebuildFeatures = true;
 
 				return true;
 			}
@@ -288,7 +292,7 @@ public class BiomeModificationContextImpl implements BiomeModificationContext {
 			featureSteps.set(index, plus(featureSteps.get(index), getEntry(features, entry)));
 
 			// Ensure the list of flower features is up-to-date
-			rebuildFlowerFeatures = true;
+			rebuildFeatures = true;
 		}
 
 		@Override
diff --git a/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeModificationImpl.java b/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeModificationImpl.java
index 6e8735aef..8afc5c889 100644
--- a/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeModificationImpl.java
+++ b/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeModificationImpl.java
@@ -26,6 +26,7 @@ import java.util.function.Consumer;
 import java.util.function.Predicate;
 
 import com.google.common.base.Stopwatch;
+import com.google.common.base.Suppliers;
 import org.jetbrains.annotations.TestOnly;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -36,6 +37,7 @@ import net.minecraft.registry.RegistryKey;
 import net.minecraft.registry.RegistryKeys;
 import net.minecraft.util.Identifier;
 import net.minecraft.world.biome.Biome;
+import net.minecraft.world.gen.feature.util.PlacedFeatureIndexer;
 
 import net.fabricmc.fabric.api.biome.v1.BiomeModificationContext;
 import net.fabricmc.fabric.api.biome.v1.BiomeSelectionContext;
@@ -152,6 +154,18 @@ public class BiomeModificationImpl {
 			// Re-freeze and apply certain cleanup actions
 			if (modificationContext != null) {
 				modificationContext.freeze();
+
+				if (modificationContext.shouldRebuildFeatures()) {
+					impl.get(RegistryKeys.DIMENSION).stream().forEach(dimensionOptions -> {
+						dimensionOptions.chunkGenerator().indexedFeaturesListSupplier = Suppliers.memoize(
+							() -> PlacedFeatureIndexer.collectIndexedFeatures(
+									List.copyOf(dimensionOptions.chunkGenerator().getBiomeSource().getBiomes()),
+									(biomeEntry) -> (biomeEntry.value().generationSettings).getFeatures(),
+									true
+							)
+						);
+					});
+				}
 			}
 		}
 
diff --git a/fabric-biome-api-v1/src/main/resources/fabric-biome-api-v1.accesswidener b/fabric-biome-api-v1/src/main/resources/fabric-biome-api-v1.accesswidener
index 6009599f0..84dfaba87 100644
--- a/fabric-biome-api-v1/src/main/resources/fabric-biome-api-v1.accesswidener
+++ b/fabric-biome-api-v1/src/main/resources/fabric-biome-api-v1.accesswidener
@@ -55,3 +55,7 @@ accessible field net/minecraft/world/biome/GenerationSettings flowerFeatures Lja
 mutable field net/minecraft/world/biome/GenerationSettings flowerFeatures Ljava/util/function/Supplier;
 accessible field net/minecraft/world/biome/GenerationSettings allowedFeatures Ljava/util/function/Supplier;
 mutable field net/minecraft/world/biome/GenerationSettings allowedFeatures Ljava/util/function/Supplier;
+
+# ChunkGenerator
+accessible field net/minecraft/world/gen/chunk/ChunkGenerator indexedFeaturesListSupplier Ljava/util/function/Supplier;
+mutable field net/minecraft/world/gen/chunk/ChunkGenerator indexedFeaturesListSupplier Ljava/util/function/Supplier;