--- a/net/minecraft/world/level/block/FrostedIceBlock.java
+++ b/net/minecraft/world/level/block/FrostedIceBlock.java
@@ -32,19 +32,21 @@
 
     @Override
     public void tick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) {
+        if (!world.paperConfig().environment.frostedIce.enabled) return; // Paper - add ability to disable frosted ice
         if ((random.nextInt(3) == 0 || this.fewerNeigboursThan(world, pos, 4)) && world.getMaxLocalRawBrightness(pos) > 11 - state.getValue(AGE) - state.getLightBlock(world, pos) && this.slightlyMelt(state, world, pos)) {
             BlockPos.MutableBlockPos mutableBlockPos = new BlockPos.MutableBlockPos();
 
             for(Direction direction : Direction.values()) {
                 mutableBlockPos.setWithOffset(pos, direction);
-                BlockState blockState = world.getBlockState(mutableBlockPos);
+                BlockState blockState = world.getBlockStateIfLoaded(mutableBlockPos); // Paper
+                if (blockState == null) { continue; } // Paper
                 if (blockState.is(this) && !this.slightlyMelt(blockState, world, mutableBlockPos)) {
-                    world.scheduleTick(mutableBlockPos, this, Mth.nextInt(random, 20, 40));
+                    world.scheduleTick(mutableBlockPos, this, Mth.nextInt(random, world.paperConfig().environment.frostedIce.delay.min, world.paperConfig().environment.frostedIce.delay.max)); // Paper - use configurable min/max delay
                 }
             }
 
         } else {
-            world.scheduleTick(pos, this, Mth.nextInt(random, 20, 40));
+            world.scheduleTick(pos, this, Mth.nextInt(random, world.paperConfig().environment.frostedIce.delay.min, world.paperConfig().environment.frostedIce.delay.max)); // Paper - use configurable min/max delay
         }
     }
 
@@ -74,7 +76,10 @@
 
         for(Direction direction : Direction.values()) {
             mutableBlockPos.setWithOffset(pos, direction);
-            if (world.getBlockState(mutableBlockPos).is(this)) {
+            // Paper start
+            BlockState blockState = world.getBlockStateIfLoaded(mutableBlockPos);
+            if (blockState != null && blockState.is(this)) {
+                // Paper end
                 ++i;
                 if (i >= maxNeighbors) {
                     return false;
