diff --git a/src/main/java/org/violetmoon/quark/addons/oddities/block/MagnetBlock.java b/src/main/java/org/violetmoon/quark/addons/oddities/block/MagnetBlock.java
index 5becac7ef9..e2ed0baddf 100644
--- a/src/main/java/org/violetmoon/quark/addons/oddities/block/MagnetBlock.java
+++ b/src/main/java/org/violetmoon/quark/addons/oddities/block/MagnetBlock.java
@@ -36,8 +36,6 @@
 import net.minecraft.world.level.block.state.properties.BooleanProperty;
 import net.minecraft.world.level.block.state.properties.DirectionProperty;
 import net.minecraft.world.level.material.PushReaction;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
 public class MagnetBlock extends QuarkBlock implements EntityBlock {
 
@@ -50,7 +48,6 @@ public MagnetBlock(ZetaModule module) {
 	}
 
 	@Override
-	@OnlyIn(Dist.CLIENT)
 	public void appendHoverText(@Nonnull ItemStack stack, @Nullable BlockGetter worldIn, @Nonnull List<Component> tooltip, @Nonnull TooltipFlag flagIn) {
 		if (stack.getHoverName().getString().equals("Q"))
 			tooltip.add(Component.literal("haha yes"));
diff --git a/src/main/java/org/violetmoon/quark/addons/oddities/block/MatrixEnchantingTableBlock.java b/src/main/java/org/violetmoon/quark/addons/oddities/block/MatrixEnchantingTableBlock.java
index 44089d3633..0913f554e0 100644
--- a/src/main/java/org/violetmoon/quark/addons/oddities/block/MatrixEnchantingTableBlock.java
+++ b/src/main/java/org/violetmoon/quark/addons/oddities/block/MatrixEnchantingTableBlock.java
@@ -38,8 +38,6 @@
 import net.minecraft.world.level.block.entity.BlockEntityType;
 import net.minecraft.world.level.block.state.BlockState;
 import net.minecraft.world.phys.BlockHitResult;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 import net.minecraftforge.network.NetworkHooks;
 
 public class MatrixEnchantingTableBlock extends EnchantmentTableBlock implements IQuarkBlock {
@@ -110,7 +108,6 @@ public InteractionResult use(@Nonnull BlockState state, Level worldIn, @Nonnull
 	}
 
 	@Override
-	@OnlyIn(Dist.CLIENT)
 	public void animateTick(@Nonnull BlockState stateIn, @Nonnull Level worldIn, @Nonnull BlockPos pos, @Nonnull RandomSource rand) {
 		boolean enabled = Quark.ZETA.modules.isEnabled(MatrixEnchantingModule.class);
 		boolean showInfluences = enabled && MatrixEnchantingModule.allowInfluencing;
diff --git a/src/main/java/org/violetmoon/quark/addons/oddities/block/be/MagnetizedBlockBlockEntity.java b/src/main/java/org/violetmoon/quark/addons/oddities/block/be/MagnetizedBlockBlockEntity.java
index e875ddb6f4..ff63989e1e 100644
--- a/src/main/java/org/violetmoon/quark/addons/oddities/block/be/MagnetizedBlockBlockEntity.java
+++ b/src/main/java/org/violetmoon/quark/addons/oddities/block/be/MagnetizedBlockBlockEntity.java
@@ -20,8 +20,6 @@
 import net.minecraft.world.phys.Vec3;
 import net.minecraft.world.phys.shapes.Shapes;
 import net.minecraft.world.phys.shapes.VoxelShape;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
 import javax.annotation.Nonnull;
 
@@ -64,17 +62,14 @@ public float getProgress(float ticks) {
 		return Mth.lerp(ticks, this.lastProgress, this.progress);
 	}
 
-	@OnlyIn(Dist.CLIENT)
 	public float getOffsetX(float ticks) {
 		return this.magnetFacing.getStepX() * this.getExtendedProgress(this.getProgress(ticks));
 	}
 
-	@OnlyIn(Dist.CLIENT)
 	public float getOffsetY(float ticks) {
 		return this.magnetFacing.getStepY() * this.getExtendedProgress(this.getProgress(ticks));
 	}
 
-	@OnlyIn(Dist.CLIENT)
 	public float getOffsetZ(float ticks) {
 		return this.magnetFacing.getStepZ() * this.getExtendedProgress(this.getProgress(ticks));
 	}
diff --git a/src/main/java/org/violetmoon/quark/addons/oddities/block/pipe/EncasedPipeBlock.java b/src/main/java/org/violetmoon/quark/addons/oddities/block/pipe/EncasedPipeBlock.java
index bf80eeb8c8..fb699e6283 100644
--- a/src/main/java/org/violetmoon/quark/addons/oddities/block/pipe/EncasedPipeBlock.java
+++ b/src/main/java/org/violetmoon/quark/addons/oddities/block/pipe/EncasedPipeBlock.java
@@ -15,8 +15,6 @@
 import net.minecraft.world.phys.shapes.CollisionContext;
 import net.minecraft.world.phys.shapes.Shapes;
 import net.minecraft.world.phys.shapes.VoxelShape;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
 public class EncasedPipeBlock extends BasePipeBlock {
 
@@ -30,7 +28,6 @@ public boolean allowsFullConnection(ConnectionType conn) {
 	}
 	
 	@Override
-	@OnlyIn(Dist.CLIENT)
 	public boolean skipRendering(@Nonnull BlockState state, BlockState adjacentBlockState, @Nonnull Direction side) {
 		return adjacentBlockState.is(this) || adjacentBlockState.is(Blocks.GLASS) || super.skipRendering(state, adjacentBlockState, side);
 	}
@@ -42,7 +39,6 @@ public VoxelShape getVisualShape(@Nonnull BlockState state, @Nonnull BlockGetter
 	}
 
 	@Override
-	@OnlyIn(Dist.CLIENT)
 	public float getShadeBrightness(@Nonnull BlockState state, @Nonnull BlockGetter worldIn, @Nonnull BlockPos pos) {
 		return 1.0F;
 	}
diff --git a/src/main/java/org/violetmoon/quark/addons/oddities/client/model/BackpackModel.java b/src/main/java/org/violetmoon/quark/addons/oddities/client/model/BackpackModel.java
index 4476c24118..3fa2f9da97 100644
--- a/src/main/java/org/violetmoon/quark/addons/oddities/client/model/BackpackModel.java
+++ b/src/main/java/org/violetmoon/quark/addons/oddities/client/model/BackpackModel.java
@@ -6,10 +6,7 @@
 import net.minecraft.client.model.geom.builders.CubeListBuilder;
 import net.minecraft.client.model.geom.builders.LayerDefinition;
 import net.minecraft.client.model.geom.builders.PartDefinition;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
-@OnlyIn(Dist.CLIENT)
 public class BackpackModel {
 
 	public static LayerDefinition createBodyLayer() {
diff --git a/src/main/java/org/violetmoon/quark/addons/oddities/client/model/TinyPotatoModel.java b/src/main/java/org/violetmoon/quark/addons/oddities/client/model/TinyPotatoModel.java
index 0efe3e0bdb..37ca4c0be3 100644
--- a/src/main/java/org/violetmoon/quark/addons/oddities/client/model/TinyPotatoModel.java
+++ b/src/main/java/org/violetmoon/quark/addons/oddities/client/model/TinyPotatoModel.java
@@ -19,10 +19,7 @@
 import net.minecraft.world.entity.LivingEntity;
 import net.minecraft.world.item.ItemStack;
 import net.minecraft.world.level.block.state.BlockState;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
-@OnlyIn(Dist.CLIENT)
 public record TinyPotatoModel(BakedModel originalModel) implements BakedModel {
 
 	@Override
diff --git a/src/main/java/org/violetmoon/quark/addons/oddities/client/render/be/MagnetizedBlockRenderer.java b/src/main/java/org/violetmoon/quark/addons/oddities/client/render/be/MagnetizedBlockRenderer.java
index 7ed7c3a4e1..0b0173c11f 100644
--- a/src/main/java/org/violetmoon/quark/addons/oddities/client/render/be/MagnetizedBlockRenderer.java
+++ b/src/main/java/org/violetmoon/quark/addons/oddities/client/render/be/MagnetizedBlockRenderer.java
@@ -20,11 +20,8 @@
 import net.minecraft.world.level.block.piston.PistonHeadBlock;
 import net.minecraft.world.level.block.state.BlockState;
 import net.minecraft.world.phys.Vec3;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 import net.minecraftforge.client.ForgeHooksClient;
 
-@OnlyIn(Dist.CLIENT)
 public class MagnetizedBlockRenderer implements BlockEntityRenderer<MagnetizedBlockBlockEntity> {
 
 	private BlockRenderDispatcher blockRenderer = Minecraft.getInstance().getBlockRenderer();
diff --git a/src/main/java/org/violetmoon/quark/addons/oddities/client/render/be/TinyPotatoRenderer.java b/src/main/java/org/violetmoon/quark/addons/oddities/client/render/be/TinyPotatoRenderer.java
index 1887e31c99..7e3cdf73e3 100644
--- a/src/main/java/org/violetmoon/quark/addons/oddities/client/render/be/TinyPotatoRenderer.java
+++ b/src/main/java/org/violetmoon/quark/addons/oddities/client/render/be/TinyPotatoRenderer.java
@@ -24,8 +24,6 @@
 import net.minecraft.world.level.block.state.properties.BlockStateProperties;
 import net.minecraft.world.phys.BlockHitResult;
 import net.minecraft.world.phys.HitResult;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
 import javax.annotation.Nonnull;
 
@@ -42,7 +40,6 @@
 import java.util.Map;
 import java.util.regex.Pattern;
 
-@OnlyIn(Dist.CLIENT)
 public class TinyPotatoRenderer implements BlockEntityRenderer<TinyPotatoBlockEntity> {
 	public static final String DEFAULT = "default";
 	public static final String HALLOWEEN = "halloween";
diff --git a/src/main/java/org/violetmoon/quark/addons/oddities/client/render/entity/TotemOfHoldingRenderer.java b/src/main/java/org/violetmoon/quark/addons/oddities/client/render/entity/TotemOfHoldingRenderer.java
index 7a839408db..db73037be8 100644
--- a/src/main/java/org/violetmoon/quark/addons/oddities/client/render/entity/TotemOfHoldingRenderer.java
+++ b/src/main/java/org/violetmoon/quark/addons/oddities/client/render/entity/TotemOfHoldingRenderer.java
@@ -23,14 +23,7 @@
 import net.minecraft.resources.ResourceLocation;
 import net.minecraft.world.phys.EntityHitResult;
 import net.minecraft.world.phys.HitResult;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
-/**
- * @author WireSegal
- * Created at 2:01 PM on 3/30/20.
- */
-@OnlyIn(Dist.CLIENT)
 public class TotemOfHoldingRenderer extends EntityRenderer<TotemOfHoldingEntity> {
 
 	private static final ModelResourceLocation LOCATION_MODEL = new ModelResourceLocation(Quark.MOD_ID, "extra/totem_of_holding", "inventory");
diff --git a/src/main/java/org/violetmoon/quark/addons/oddities/item/BackpackItem.java b/src/main/java/org/violetmoon/quark/addons/oddities/item/BackpackItem.java
index a4a95cc700..c841a864ad 100644
--- a/src/main/java/org/violetmoon/quark/addons/oddities/item/BackpackItem.java
+++ b/src/main/java/org/violetmoon/quark/addons/oddities/item/BackpackItem.java
@@ -45,8 +45,6 @@
 import net.minecraft.world.item.enchantment.EnchantmentHelper;
 import net.minecraft.world.item.enchantment.Enchantments;
 import net.minecraft.world.level.Level;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 import net.minecraftforge.common.capabilities.ForgeCapabilities;
 import net.minecraftforge.common.capabilities.ICapabilityProvider;
 import net.minecraftforge.common.util.LazyOptional;
diff --git a/src/main/java/org/violetmoon/quark/api/event/UsageTickerEvent.java b/src/main/java/org/violetmoon/quark/api/event/UsageTickerEvent.java
index 5069823e1f..cab6145f35 100644
--- a/src/main/java/org/violetmoon/quark/api/event/UsageTickerEvent.java
+++ b/src/main/java/org/violetmoon/quark/api/event/UsageTickerEvent.java
@@ -3,13 +3,10 @@
 import net.minecraft.world.entity.EquipmentSlot;
 import net.minecraft.world.entity.player.Player;
 import net.minecraft.world.item.ItemStack;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 import net.minecraftforge.eventbus.api.Cancelable;
 import net.minecraftforge.eventbus.api.Event;
 
 @Cancelable
-@OnlyIn(Dist.CLIENT)
 public class UsageTickerEvent extends Event {
 
 	public final EquipmentSlot slot;
diff --git a/src/main/java/org/violetmoon/quark/base/block/QuarkGlassBlock.java b/src/main/java/org/violetmoon/quark/base/block/QuarkGlassBlock.java
index 5a57dab2a8..a01450e309 100644
--- a/src/main/java/org/violetmoon/quark/base/block/QuarkGlassBlock.java
+++ b/src/main/java/org/violetmoon/quark/base/block/QuarkGlassBlock.java
@@ -15,8 +15,6 @@
 import net.minecraft.world.phys.shapes.CollisionContext;
 import net.minecraft.world.phys.shapes.Shapes;
 import net.minecraft.world.phys.shapes.VoxelShape;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
 /**
  * @author WireSegal
@@ -36,7 +34,6 @@ public QuarkGlassBlock(String regname, ZetaModule module, CreativeModeTab creati
 	}
 
 	@Override
-	@OnlyIn(Dist.CLIENT)
 	public boolean skipRendering(@Nonnull BlockState state, BlockState adjacentBlockState, @Nonnull Direction side) {
 		return adjacentBlockState.is(this) || super.skipRendering(state, adjacentBlockState, side);
 	}
@@ -48,7 +45,6 @@ public VoxelShape getVisualShape(@Nonnull BlockState state, @Nonnull BlockGetter
 	}
 
 	@Override
-	@OnlyIn(Dist.CLIENT)
 	public float getShadeBrightness(@Nonnull BlockState state, @Nonnull BlockGetter worldIn, @Nonnull BlockPos pos) {
 		return 1.0F;
 	}
diff --git a/src/main/java/org/violetmoon/quark/base/client/render/QuarkArmorModel.java b/src/main/java/org/violetmoon/quark/base/client/render/QuarkArmorModel.java
index 82abc81a75..bae339c2e9 100644
--- a/src/main/java/org/violetmoon/quark/base/client/render/QuarkArmorModel.java
+++ b/src/main/java/org/violetmoon/quark/base/client/render/QuarkArmorModel.java
@@ -15,12 +15,9 @@
 import net.minecraft.world.entity.EquipmentSlot;
 import net.minecraft.world.entity.LivingEntity;
 import net.minecraft.world.entity.decoration.ArmorStand;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
 import javax.annotation.Nonnull;
 
-@OnlyIn(Dist.CLIENT)
 public class QuarkArmorModel extends HumanoidModel<LivingEntity> {
 
 	protected final EquipmentSlot slot;
diff --git a/src/main/java/org/violetmoon/quark/base/config/SyncedFlagHandler.java b/src/main/java/org/violetmoon/quark/base/config/SyncedFlagHandler.java
index a9e947e87d..f9cb4f556b 100644
--- a/src/main/java/org/violetmoon/quark/base/config/SyncedFlagHandler.java
+++ b/src/main/java/org/violetmoon/quark/base/config/SyncedFlagHandler.java
@@ -12,7 +12,6 @@
 import org.violetmoon.quark.base.network.QuarkNetwork;
 import org.violetmoon.quark.base.network.message.structural.S2CUpdateFlag;
 import org.violetmoon.zeta.event.bus.LoadEvent;
-import org.violetmoon.zeta.event.bus.PlayEvent;
 import org.violetmoon.zeta.event.load.ZConfigChanged;
 
 public class SyncedFlagHandler {
diff --git a/src/main/java/org/violetmoon/quark/base/item/QuarkMusicDiscItem.java b/src/main/java/org/violetmoon/quark/base/item/QuarkMusicDiscItem.java
index cba2be906f..c9099becc1 100644
--- a/src/main/java/org/violetmoon/quark/base/item/QuarkMusicDiscItem.java
+++ b/src/main/java/org/violetmoon/quark/base/item/QuarkMusicDiscItem.java
@@ -11,8 +11,6 @@
 import net.minecraft.sounds.SoundEvent;
 import net.minecraft.sounds.SoundSource;
 import net.minecraft.world.item.*;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
 import javax.annotation.Nonnull;
 
@@ -27,8 +25,8 @@
 public class QuarkMusicDiscItem extends RecordItem implements IZetaItem {
 
 	private final ZetaModule module;
-	private final boolean isAmbient;
-	private final Supplier<SoundEvent> soundSupplier;
+	public final boolean isAmbient;
+	public final Supplier<SoundEvent> soundSupplier;
 
 	private BooleanSupplier enabledSupplier = () -> true;
 
@@ -63,25 +61,4 @@ public boolean doesConditionApply() {
 		return enabledSupplier.getAsBoolean();
 	}
 
-	@OnlyIn(Dist.CLIENT)
-	public boolean playAmbientSound(BlockPos pos) {
-		if(isAmbient) {
-			Minecraft mc = Minecraft.getInstance();
-			SoundManager soundEngine = mc.getSoundManager();
-			LevelRenderer render = mc.levelRenderer;
-
-			SimpleSoundInstance simplesound = new SimpleSoundInstance(soundSupplier.get().getLocation(), SoundSource.RECORDS, (float) AmbientDiscsModule.volume, 1.0F, SoundInstance.createUnseededRandom(), true, 0, SoundInstance.Attenuation.LINEAR, pos.getX(), pos.getY(), pos.getZ(), false);
-
-			render.playingRecords.put(pos, simplesound);
-			soundEngine.play(simplesound);
-
-			if(mc.level != null)
-				mc.level.addParticle(ParticleTypes.NOTE,pos.getX() + Math.random(), pos.getY() + 1.1, pos.getZ() + Math.random(), Math.random(), 0, 0);
-
-			return true;
-		}
-
-		return false;
-	}
-
 }
diff --git a/src/main/java/org/violetmoon/quark/base/proxy/ClientProxy.java b/src/main/java/org/violetmoon/quark/base/proxy/ClientProxy.java
index bd133cac56..852babcf3d 100644
--- a/src/main/java/org/violetmoon/quark/base/proxy/ClientProxy.java
+++ b/src/main/java/org/violetmoon/quark/base/proxy/ClientProxy.java
@@ -10,8 +10,6 @@
 import net.minecraft.world.entity.player.Player;
 import net.minecraft.world.level.Level;
 import net.minecraft.world.phys.BlockHitResult;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 import net.minecraftforge.client.ConfigScreenHandler.ConfigScreenFactory;
 import net.minecraftforge.fml.ModLoadingContext;
 
@@ -37,9 +35,7 @@
 import org.violetmoon.quark.base.network.message.structural.C2SUpdateFlag;
 import org.violetmoon.quark.mixin.client.accessor.AccessorMultiPlayerGameMode;
 import org.violetmoon.zeta.client.TopLayerTooltipHandler;
-import org.violetmoon.zeta.registry.RenderLayerRegistry;
 
-@OnlyIn(Dist.CLIENT)
 public class ClientProxy extends CommonProxy {
 
 	public static boolean jingleBellsMotherfucker = false;
diff --git a/src/main/java/org/violetmoon/quark/base/proxy/CommonProxy.java b/src/main/java/org/violetmoon/quark/base/proxy/CommonProxy.java
index 0e8e61d6a0..a44df398d0 100644
--- a/src/main/java/org/violetmoon/quark/base/proxy/CommonProxy.java
+++ b/src/main/java/org/violetmoon/quark/base/proxy/CommonProxy.java
@@ -123,7 +123,7 @@ public void start() {
 
 	@LoadEvent
 	public void setup(ZCommonSetup event) {
-		handleQuarkConfigChange();
+		event.enqueueWork(this::handleQuarkConfigChange);
 	}
 
 	//TODO find a better place for this little one-off thing, lol
diff --git a/src/main/java/org/violetmoon/quark/content/automation/block/RedstoneRandomizerBlock.java b/src/main/java/org/violetmoon/quark/content/automation/block/RedstoneRandomizerBlock.java
index 7457404238..f307ae90b5 100644
--- a/src/main/java/org/violetmoon/quark/content/automation/block/RedstoneRandomizerBlock.java
+++ b/src/main/java/org/violetmoon/quark/content/automation/block/RedstoneRandomizerBlock.java
@@ -32,8 +32,6 @@
 import net.minecraft.world.phys.shapes.CollisionContext;
 import net.minecraft.world.phys.shapes.VoxelShape;
 import net.minecraft.world.ticks.TickPriority;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 import net.minecraftforge.event.ForgeEventFactory;
 
 /**
@@ -189,7 +187,6 @@ public static void notifyNeighbors(Block block, Level world, BlockPos pos, Block
 		world.updateNeighborsAtExceptFromFacing(neighborPos, block, face);
 	}
 
-	@OnlyIn(Dist.CLIENT)
 	@Override
 	public void animateTick(BlockState stateIn, @Nonnull Level worldIn, @Nonnull BlockPos pos, @Nonnull RandomSource rand) {
 		if (stateIn.getValue(POWERED) != RandomizerPowerState.OFF) {
diff --git a/src/main/java/org/violetmoon/quark/content/building/client/render/entity/GlassItemFrameRenderer.java b/src/main/java/org/violetmoon/quark/content/building/client/render/entity/GlassItemFrameRenderer.java
index 3a8e3ee417..1d48010bcc 100644
--- a/src/main/java/org/violetmoon/quark/content/building/client/render/entity/GlassItemFrameRenderer.java
+++ b/src/main/java/org/violetmoon/quark/content/building/client/render/entity/GlassItemFrameRenderer.java
@@ -41,14 +41,10 @@
 import net.minecraft.world.item.MapItem;
 import net.minecraft.world.item.ShieldItem;
 import net.minecraft.world.level.block.Blocks;
-import net.minecraft.world.level.block.StandingSignBlock;
 import net.minecraft.world.level.block.entity.BannerBlockEntity;
 import net.minecraft.world.level.block.entity.BannerPattern;
-import net.minecraft.world.level.block.state.BlockState;
 import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
 import net.minecraft.world.phys.Vec3;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 import net.minecraftforge.client.event.RenderItemInFrameEvent;
 import net.minecraftforge.common.MinecraftForge;
 
@@ -57,7 +53,6 @@
  * Created at 11:58 AM on 8/25/19.
  */
 
-@OnlyIn(Dist.CLIENT)
 public class GlassItemFrameRenderer extends EntityRenderer<GlassItemFrame> {
 
 	private static final ModelResourceLocation LOCATION_MODEL = new ModelResourceLocation(new ResourceLocation(Quark.MOD_ID, "extra/glass_item_frame"), "inventory");
diff --git a/src/main/java/org/violetmoon/quark/content/building/module/VariantChestsModule.java b/src/main/java/org/violetmoon/quark/content/building/module/VariantChestsModule.java
index 6fbb5bd4e3..c30c280fe1 100644
--- a/src/main/java/org/violetmoon/quark/content/building/module/VariantChestsModule.java
+++ b/src/main/java/org/violetmoon/quark/content/building/module/VariantChestsModule.java
@@ -128,19 +128,6 @@ public void loadComplete(ZLoadComplete e) {
 		ILootrIntegration.INSTANCE.loadComplete();
 	}
 
-	@LoadEvent
-	public final void clientSetup(ZClientSetup event) {
-		BlockEntityRenderers.register(chestTEType, VariantChestRenderer::new);
-		BlockEntityRenderers.register(trappedChestTEType, VariantChestRenderer::new);
-
-		ILootrIntegration.INSTANCE.clientSetup();
-
-		for(Block b : chests)
-			QuarkClient.ZETA_CLIENT.setBlockEntityWithoutLevelRenderer(b.asItem(), new SimpleWithoutLevelRenderer(chestTEType, b.defaultBlockState()));
-		for(Block b : trappedChests)
-			QuarkClient.ZETA_CLIENT.setBlockEntityWithoutLevelRenderer(b.asItem(), new SimpleWithoutLevelRenderer(trappedChestTEType, b.defaultBlockState()));
-	}
-
 	@LoadEvent
 	public final void configChanged(ZConfigChanged event) {
 		staticEnabled = enabled;
@@ -252,15 +239,6 @@ public static <T extends BlockEntity> BlockEntityType<T> registerChests(BlockEnt
 		return BlockEntityType.Builder.<T>of(factory, blockTypes.toArray(new Block[0])).build(null);
 	}
 
-	@LoadEvent
-	public void textureStitch(ZPreTextureStitch event) {
-		if (event.getAtlas().location().toString().equals("minecraft:textures/atlas/chest.png")) {
-			for (Block b : allChests)
-				VariantChestRenderer.accept(event, b);
-			ILootrIntegration.INSTANCE.stitch(event);
-		}
-	}
-
 	@PlayEvent
 	public void onClickEntity(ZPlayerInteract.EntityInteractSpecific event) {
 		Entity target = event.getTarget();
@@ -336,4 +314,31 @@ public interface ChestConstructor {
 	public interface CompatChestConstructor {
 		Block createChest(String type, String mod, ZetaModule module, Supplier<BlockEntityType<? extends ChestBlockEntity>> supplier, BlockBehaviour.Properties props);
 	}
+
+	@ZetaLoadModule(clientReplacement = true)
+	public static class Client extends VariantChestsModule {
+
+		@LoadEvent
+		public final void clientSetup(ZClientSetup event) {
+			BlockEntityRenderers.register(chestTEType, VariantChestRenderer::new);
+			BlockEntityRenderers.register(trappedChestTEType, VariantChestRenderer::new);
+
+			ILootrIntegration.INSTANCE.clientSetup();
+
+			for(Block b : chests)
+				QuarkClient.ZETA_CLIENT.setBlockEntityWithoutLevelRenderer(b.asItem(), new SimpleWithoutLevelRenderer(chestTEType, b.defaultBlockState()));
+			for(Block b : trappedChests)
+				QuarkClient.ZETA_CLIENT.setBlockEntityWithoutLevelRenderer(b.asItem(), new SimpleWithoutLevelRenderer(trappedChestTEType, b.defaultBlockState()));
+		}
+
+		@LoadEvent
+		public void textureStitch(ZPreTextureStitch event) {
+			if (event.getAtlas().location().toString().equals("minecraft:textures/atlas/chest.png")) {
+				for (Block b : allChests)
+					VariantChestRenderer.accept(event, b);
+				ILootrIntegration.INSTANCE.stitch(event);
+			}
+		}
+
+	}
 }
diff --git a/src/main/java/org/violetmoon/quark/content/building/recipe/MixedExclusionRecipe.java b/src/main/java/org/violetmoon/quark/content/building/recipe/MixedExclusionRecipe.java
index a1a07a583c..e3a12292fe 100644
--- a/src/main/java/org/violetmoon/quark/content/building/recipe/MixedExclusionRecipe.java
+++ b/src/main/java/org/violetmoon/quark/content/building/recipe/MixedExclusionRecipe.java
@@ -21,7 +21,7 @@
 
 public class MixedExclusionRecipe implements CraftingRecipe, IShapedRecipe<CraftingContainer> {
 
-	public static final Serializer SERIALIZER = new Serializer();
+	public static final RecipeSerializer<MixedExclusionRecipe> SERIALIZER = new Serializer();
 
 	private final ResourceLocation res;
 	private NonNullList<Ingredient> ingredients;
diff --git a/src/main/java/org/violetmoon/quark/content/experimental/client/tooltip/VariantsComponent.java b/src/main/java/org/violetmoon/quark/content/experimental/client/tooltip/VariantsComponent.java
index 117416802a..bb476ddf81 100644
--- a/src/main/java/org/violetmoon/quark/content/experimental/client/tooltip/VariantsComponent.java
+++ b/src/main/java/org/violetmoon/quark/content/experimental/client/tooltip/VariantsComponent.java
@@ -16,10 +16,7 @@
 import net.minecraft.world.item.Item;
 import net.minecraft.world.item.ItemStack;
 import net.minecraft.world.level.block.Block;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
-@OnlyIn(Dist.CLIENT)
 public class VariantsComponent implements ClientTooltipComponent, TooltipComponent {
 
 	final ItemStack stack;
diff --git a/src/main/java/org/violetmoon/quark/content/experimental/module/VariantSelectorModule.java b/src/main/java/org/violetmoon/quark/content/experimental/module/VariantSelectorModule.java
index 1dd40a40c8..182759bccc 100644
--- a/src/main/java/org/violetmoon/quark/content/experimental/module/VariantSelectorModule.java
+++ b/src/main/java/org/violetmoon/quark/content/experimental/module/VariantSelectorModule.java
@@ -28,8 +28,6 @@
 import net.minecraft.world.level.block.state.BlockState;
 import net.minecraft.world.phys.BlockHitResult;
 import net.minecraft.world.phys.HitResult;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 import org.lwjgl.glfw.GLFW;
 import org.lwjgl.opengl.GL11;
 import org.violetmoon.quark.base.Quark;
@@ -56,7 +54,6 @@
 import org.violetmoon.zeta.module.ZetaLoadModule;
 import org.violetmoon.zeta.module.ZetaModule;
 
-import java.util.Arrays;
 import java.util.List;
 
 @ZetaLoadModule(category = "experimental", enabledByDefault = false,
@@ -142,23 +139,6 @@ public static Block getVariantOrOriginal(Block block, String variant) {
 		return getVariantForBlock(block, variant);
 	}
 
-	public static ItemStack modifyHeldItemStack(AbstractClientPlayer player, ItemStack stack) {
-		if(!staticEnabled || !overrideHeldItemRender)
-			return stack;
-
-		Minecraft mc = Minecraft.getInstance();
-		if(player == mc.player && stack.getItem() instanceof BlockItem bi) {
-			Block block = bi.getBlock();
-			if(clientVariant != null && !clientVariant.isEmpty()) {
-				Block variant = variants.getBlockForVariant(block, clientVariant);
-				if(variant != null && variant != block)
-					return new ItemStack(variant);
-			}
-		}
-
-		return stack;
-	}
-
 	@PlayEvent
 	public void addEntityToWorld(ZEntityJoinLevel event) {
 		Entity entity = event.getEntity();
@@ -196,9 +176,25 @@ public static BlockState modifyBlockPlacementState(BlockState state, BlockPlaceC
 
 	@ZetaLoadModule(clientReplacement = true)
 	public static class Client extends VariantSelectorModule {
-		@OnlyIn(Dist.CLIENT)
 		private static KeyMapping variantSelectorKey;
 
+		public static ItemStack modifyHeldItemStack(AbstractClientPlayer player, ItemStack stack) {
+			if(!staticEnabled || !overrideHeldItemRender)
+				return stack;
+
+			Minecraft mc = Minecraft.getInstance();
+			if(player == mc.player && stack.getItem() instanceof BlockItem bi) {
+				Block block = bi.getBlock();
+				if(clientVariant != null && !clientVariant.isEmpty()) {
+					Block variant = variants.getBlockForVariant(block, clientVariant);
+					if(variant != null && variant != block)
+						return new ItemStack(variant);
+				}
+			}
+
+			return stack;
+		}
+
 		@LoadEvent
 		public void registerKeybinds(ZKeyMapping event) {
 			variantSelectorKey = event.init("quark.keybind.variant_selector", "r", QuarkClient.MISC_GROUP);
diff --git a/src/main/java/org/violetmoon/quark/content/mobs/client/layer/StonelingItemLayer.java b/src/main/java/org/violetmoon/quark/content/mobs/client/layer/StonelingItemLayer.java
index d0cc49d7ec..a12560ed94 100755
--- a/src/main/java/org/violetmoon/quark/content/mobs/client/layer/StonelingItemLayer.java
+++ b/src/main/java/org/violetmoon/quark/content/mobs/client/layer/StonelingItemLayer.java
@@ -21,15 +21,12 @@
 import net.minecraft.client.renderer.texture.OverlayTexture;
 import net.minecraft.world.item.BlockItem;
 import net.minecraft.world.item.ItemStack;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
 import javax.annotation.Nonnull;
 
 import org.violetmoon.quark.content.mobs.client.model.StonelingModel;
 import org.violetmoon.quark.content.mobs.entity.Stoneling;
 
-@OnlyIn(Dist.CLIENT)
 public class StonelingItemLayer extends RenderLayer<Stoneling, StonelingModel> {
 
 	public StonelingItemLayer(RenderLayerParent<Stoneling, StonelingModel> renderer) {
diff --git a/src/main/java/org/violetmoon/quark/content/mobs/client/layer/forgotten/ForgottenClothingLayer.java b/src/main/java/org/violetmoon/quark/content/mobs/client/layer/forgotten/ForgottenClothingLayer.java
index c22f395183..e2c00daa20 100644
--- a/src/main/java/org/violetmoon/quark/content/mobs/client/layer/forgotten/ForgottenClothingLayer.java
+++ b/src/main/java/org/violetmoon/quark/content/mobs/client/layer/forgotten/ForgottenClothingLayer.java
@@ -12,14 +12,11 @@
 import net.minecraft.resources.ResourceLocation;
 import net.minecraft.world.entity.Mob;
 import net.minecraft.world.entity.monster.RangedAttackMob;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
 import javax.annotation.Nonnull;
 
 import org.violetmoon.quark.base.Quark;
 
-@OnlyIn(Dist.CLIENT)
 public class ForgottenClothingLayer<T extends Mob & RangedAttackMob, M extends EntityModel<T>> extends RenderLayer<T, M> {
 
 	private static final ResourceLocation TEXTURE = new ResourceLocation(Quark.MOD_ID, "textures/model/entity/forgotten/overlay.png");
diff --git a/src/main/java/org/violetmoon/quark/content/mobs/client/layer/forgotten/ForgottenEyesLayer.java b/src/main/java/org/violetmoon/quark/content/mobs/client/layer/forgotten/ForgottenEyesLayer.java
index 06bb07bb76..397b913de4 100644
--- a/src/main/java/org/violetmoon/quark/content/mobs/client/layer/forgotten/ForgottenEyesLayer.java
+++ b/src/main/java/org/violetmoon/quark/content/mobs/client/layer/forgotten/ForgottenEyesLayer.java
@@ -6,14 +6,11 @@
 import net.minecraft.client.renderer.entity.layers.EyesLayer;
 import net.minecraft.resources.ResourceLocation;
 import net.minecraft.world.entity.monster.Skeleton;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
 import javax.annotation.Nonnull;
 
 import org.violetmoon.quark.base.Quark;
 
-@OnlyIn(Dist.CLIENT)
 public class ForgottenEyesLayer<T extends Skeleton, M extends SkeletonModel<T>> extends EyesLayer<T, M> {
 
 	private static final ResourceLocation TEXTURE = new ResourceLocation(Quark.MOD_ID, "textures/model/entity/forgotten/eye.png");
diff --git a/src/main/java/org/violetmoon/quark/content/mobs/client/layer/forgotten/ForgottenSheathedItemLayer.java b/src/main/java/org/violetmoon/quark/content/mobs/client/layer/forgotten/ForgottenSheathedItemLayer.java
index b572a5824f..ae523e00b2 100644
--- a/src/main/java/org/violetmoon/quark/content/mobs/client/layer/forgotten/ForgottenSheathedItemLayer.java
+++ b/src/main/java/org/violetmoon/quark/content/mobs/client/layer/forgotten/ForgottenSheathedItemLayer.java
@@ -14,10 +14,7 @@
 import net.minecraft.client.renderer.entity.RenderLayerParent;
 import net.minecraft.client.renderer.entity.layers.RenderLayer;
 import net.minecraft.world.item.ItemStack;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
-@OnlyIn(Dist.CLIENT)
 public class ForgottenSheathedItemLayer<M extends EntityModel<Forgotten>> extends RenderLayer<Forgotten, M> {
 
 	private final ItemInHandRenderer itemInHandRenderer;
diff --git a/src/main/java/org/violetmoon/quark/content/mobs/client/model/ForgottenHatModel.java b/src/main/java/org/violetmoon/quark/content/mobs/client/model/ForgottenHatModel.java
index 8cf064e9e7..6867ffb0d6 100644
--- a/src/main/java/org/violetmoon/quark/content/mobs/client/model/ForgottenHatModel.java
+++ b/src/main/java/org/violetmoon/quark/content/mobs/client/model/ForgottenHatModel.java
@@ -7,10 +7,7 @@
 import net.minecraft.client.model.geom.builders.CubeListBuilder;
 import net.minecraft.client.model.geom.builders.LayerDefinition;
 import net.minecraft.client.model.geom.builders.PartDefinition;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
-@OnlyIn(Dist.CLIENT)
 public class ForgottenHatModel {
 
 	public static LayerDefinition createBodyLayer() {
diff --git a/src/main/java/org/violetmoon/quark/content/mobs/client/render/entity/StonelingRenderer.java b/src/main/java/org/violetmoon/quark/content/mobs/client/render/entity/StonelingRenderer.java
index 230af12458..87c9de0399 100755
--- a/src/main/java/org/violetmoon/quark/content/mobs/client/render/entity/StonelingRenderer.java
+++ b/src/main/java/org/violetmoon/quark/content/mobs/client/render/entity/StonelingRenderer.java
@@ -11,10 +11,7 @@
 import net.minecraft.client.renderer.entity.EntityRendererProvider;
 import net.minecraft.client.renderer.entity.MobRenderer;
 import net.minecraft.resources.ResourceLocation;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
-@OnlyIn(Dist.CLIENT)
 public class StonelingRenderer extends MobRenderer<Stoneling, StonelingModel> {
 
 	public StonelingRenderer(EntityRendererProvider.Context context) {
diff --git a/src/main/java/org/violetmoon/quark/content/mobs/item/DiamondHeartItem.java b/src/main/java/org/violetmoon/quark/content/mobs/item/DiamondHeartItem.java
index a6cabd5e32..598c5522f7 100755
--- a/src/main/java/org/violetmoon/quark/content/mobs/item/DiamondHeartItem.java
+++ b/src/main/java/org/violetmoon/quark/content/mobs/item/DiamondHeartItem.java
@@ -17,8 +17,6 @@
 import net.minecraft.world.level.block.Blocks;
 import net.minecraft.world.level.block.LevelEvent;
 import net.minecraft.world.level.block.state.BlockState;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
 import javax.annotation.Nonnull;
 
@@ -91,7 +89,6 @@ public Rarity getRarity(@Nonnull ItemStack stack) {
 	}
 
 	@Override
-	@OnlyIn(Dist.CLIENT)
 	public boolean isFoil(@Nonnull ItemStack stack) {
 		return true;
 	}
diff --git a/src/main/java/org/violetmoon/quark/content/mobs/item/ForgottenHatItem.java b/src/main/java/org/violetmoon/quark/content/mobs/item/ForgottenHatItem.java
index f4ebd77d10..bf479bd3d3 100644
--- a/src/main/java/org/violetmoon/quark/content/mobs/item/ForgottenHatItem.java
+++ b/src/main/java/org/violetmoon/quark/content/mobs/item/ForgottenHatItem.java
@@ -3,31 +3,24 @@
 import com.google.common.collect.ImmutableMultimap;
 import com.google.common.collect.ImmutableMultimap.Builder;
 import com.google.common.collect.Multimap;
-import net.minecraft.client.model.HumanoidModel;
 import net.minecraft.core.NonNullList;
 import net.minecraft.world.entity.Entity;
 import net.minecraft.world.entity.EquipmentSlot;
-import net.minecraft.world.entity.LivingEntity;
 import net.minecraft.world.entity.ai.attributes.Attribute;
 import net.minecraft.world.entity.ai.attributes.AttributeModifier;
 import net.minecraft.world.entity.ai.attributes.Attributes;
 import net.minecraft.world.item.*;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
-import net.minecraftforge.client.extensions.common.IClientItemExtensions;
 import net.minecraftforge.common.ForgeMod;
 
 import javax.annotation.Nonnull;
 
 import org.violetmoon.quark.base.Quark;
-import org.violetmoon.quark.base.client.handler.ModelHandler;
 import org.violetmoon.zeta.item.IZetaItem;
 import org.violetmoon.zeta.item.ZetaArmorItem;
 import org.violetmoon.zeta.module.ZetaModule;
 
 import java.util.UUID;
 import java.util.function.BooleanSupplier;
-import java.util.function.Consumer;
 
 public class ForgottenHatItem extends ZetaArmorItem implements IZetaItem {
 
diff --git a/src/main/java/org/violetmoon/quark/content/tools/client/render/GlintRenderTypes.java b/src/main/java/org/violetmoon/quark/content/tools/client/render/GlintRenderTypes.java
index e555ebe23e..8627dff30c 100644
--- a/src/main/java/org/violetmoon/quark/content/tools/client/render/GlintRenderTypes.java
+++ b/src/main/java/org/violetmoon/quark/content/tools/client/render/GlintRenderTypes.java
@@ -8,8 +8,6 @@
 import net.minecraft.client.renderer.RenderType;
 import net.minecraft.resources.ResourceLocation;
 import net.minecraft.world.item.DyeColor;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -18,7 +16,6 @@
 import org.violetmoon.quark.base.Quark;
 import org.violetmoon.quark.content.tools.module.ColorRunesModule;
 
-@OnlyIn(Dist.CLIENT)
 public class GlintRenderTypes extends RenderType {
 	private GlintRenderTypes(String name, VertexFormat vf, VertexFormat.Mode mode, int bufSize, boolean affectsCrumbling, boolean sortOnUpload, Runnable setup, Runnable clean) {
 		super(name, vf, mode, bufSize, affectsCrumbling, sortOnUpload, setup, clean);
diff --git a/src/main/java/org/violetmoon/quark/content/tools/client/tooltip/SeedPouchClientTooltipComponent.java b/src/main/java/org/violetmoon/quark/content/tools/client/tooltip/SeedPouchClientTooltipComponent.java
index e541e6030c..72e764a1de 100644
--- a/src/main/java/org/violetmoon/quark/content/tools/client/tooltip/SeedPouchClientTooltipComponent.java
+++ b/src/main/java/org/violetmoon/quark/content/tools/client/tooltip/SeedPouchClientTooltipComponent.java
@@ -1,7 +1,5 @@
 package org.violetmoon.quark.content.tools.client.tooltip;
 
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 import org.apache.commons.lang3.tuple.Pair;
 import org.violetmoon.quark.content.tools.item.SeedPouchItem;
 
@@ -15,7 +13,6 @@
 
 import javax.annotation.Nonnull;
 
-@OnlyIn(Dist.CLIENT)
 public class SeedPouchClientTooltipComponent implements ClientTooltipComponent {
 
 	private final ItemStack stack;
diff --git a/src/main/java/org/violetmoon/quark/content/tools/entity/ParrotEgg.java b/src/main/java/org/violetmoon/quark/content/tools/entity/ParrotEgg.java
index eadf6e20f9..a738d590dd 100644
--- a/src/main/java/org/violetmoon/quark/content/tools/entity/ParrotEgg.java
+++ b/src/main/java/org/violetmoon/quark/content/tools/entity/ParrotEgg.java
@@ -16,8 +16,6 @@
 import net.minecraft.world.phys.EntityHitResult;
 import net.minecraft.world.phys.HitResult;
 import net.minecraft.world.phys.Vec3;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
 import javax.annotation.Nonnull;
 
@@ -63,7 +61,6 @@ protected Item getDefaultItem() {
 	}
 
 	@Override
-	@OnlyIn(Dist.CLIENT)
 	public void handleEntityEvent(byte id) {
 		if(id == EVENT_BREAK) {
 			Vec3 pos = position();
diff --git a/src/main/java/org/violetmoon/quark/content/tools/entity/rang/AbstractPickarang.java b/src/main/java/org/violetmoon/quark/content/tools/entity/rang/AbstractPickarang.java
index 7516b20489..5c876f464f 100755
--- a/src/main/java/org/violetmoon/quark/content/tools/entity/rang/AbstractPickarang.java
+++ b/src/main/java/org/violetmoon/quark/content/tools/entity/rang/AbstractPickarang.java
@@ -42,8 +42,6 @@
 import net.minecraft.world.phys.HitResult;
 import net.minecraft.world.phys.HitResult.Type;
 import net.minecraft.world.phys.Vec3;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 import net.minecraftforge.common.ForgeHooks;
 import net.minecraftforge.common.ForgeMod;
 import net.minecraftforge.event.ForgeEventFactory;
@@ -92,7 +90,6 @@ public AbstractPickarang(EntityType<? extends AbstractPickarang<?>> type, Level
 	}
 
 	@Override
-	@OnlyIn(Dist.CLIENT)
 	public boolean shouldRenderAtSqrDistance(double distance) {
 		double d0 = this.getBoundingBox().getSize() * 4.0D;
 		if (Double.isNaN(d0)) d0 = 4.0D;
@@ -123,7 +120,6 @@ public void shoot(double x, double y, double z, float velocity, float inaccuracy
 	}
 
 	@Override
-	@OnlyIn(Dist.CLIENT)
 	public void lerpMotion(double x, double y, double z) {
 		this.setDeltaMovement(x, y, z);
 		if (this.xRotO == 0.0F && this.yRotO == 0.0F) {
diff --git a/src/main/java/org/violetmoon/quark/content/tools/item/AncientTomeItem.java b/src/main/java/org/violetmoon/quark/content/tools/item/AncientTomeItem.java
index c03ee448e7..d3d6c3db68 100644
--- a/src/main/java/org/violetmoon/quark/content/tools/item/AncientTomeItem.java
+++ b/src/main/java/org/violetmoon/quark/content/tools/item/AncientTomeItem.java
@@ -8,8 +8,6 @@
 import net.minecraft.world.item.enchantment.Enchantment;
 import net.minecraft.world.item.enchantment.EnchantmentInstance;
 import net.minecraft.world.level.Level;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
 import javax.annotation.Nonnull;
 
@@ -70,7 +68,6 @@ public static Component getFullTooltipText(Enchantment ench) {
 	}
 
 	@Override
-	@OnlyIn(Dist.CLIENT)
 	public void appendHoverText(@Nonnull ItemStack stack, Level worldIn, @Nonnull List<Component> tooltip, @Nonnull TooltipFlag flagIn) {
 		super.appendHoverText(stack, worldIn, tooltip, flagIn);
 
diff --git a/src/main/java/org/violetmoon/quark/content/tools/item/SeedPouchItem.java b/src/main/java/org/violetmoon/quark/content/tools/item/SeedPouchItem.java
index 514ec1f4b6..ba6c337cdc 100644
--- a/src/main/java/org/violetmoon/quark/content/tools/item/SeedPouchItem.java
+++ b/src/main/java/org/violetmoon/quark/content/tools/item/SeedPouchItem.java
@@ -22,8 +22,6 @@
 import net.minecraft.world.item.ItemStack;
 import net.minecraft.world.item.context.UseOnContext;
 import net.minecraft.world.phys.BlockHitResult;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 import org.apache.commons.lang3.tuple.Pair;
 import org.violetmoon.quark.api.ITrowelable;
 import org.violetmoon.quark.api.IUsageTickerOverride;
@@ -155,7 +153,6 @@ public int getBarColor(@Nonnull ItemStack stack) {
 		return BAR_COLOR;
 	}
 
-	@OnlyIn(Dist.CLIENT)
 	public static float itemFraction(ItemStack stack, ClientLevel world, LivingEntity entityIn, int i) {
 		if(entityIn instanceof Player player) {
 			if(player.containerMenu != null) {
diff --git a/src/main/java/org/violetmoon/quark/content/tools/module/AmbientDiscsModule.java b/src/main/java/org/violetmoon/quark/content/tools/module/AmbientDiscsModule.java
index e1cf344293..87e454211a 100644
--- a/src/main/java/org/violetmoon/quark/content/tools/module/AmbientDiscsModule.java
+++ b/src/main/java/org/violetmoon/quark/content/tools/module/AmbientDiscsModule.java
@@ -3,6 +3,9 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import net.minecraft.client.resources.sounds.SimpleSoundInstance;
+import net.minecraft.core.particles.ParticleTypes;
+import net.minecraft.sounds.SoundSource;
 import org.violetmoon.quark.base.config.Config;
 import org.violetmoon.quark.base.handler.QuarkSounds;
 import org.violetmoon.quark.base.item.QuarkMusicDiscItem;
@@ -60,7 +63,9 @@ public void onMobDeath(ZLivingDeath event) {
 		}
 	}
 
-	public static class Client {
+	@ZetaLoadModule(clientReplacement = true)
+	public static class Client extends AmbientDiscsModule {
+
 		public static void onJukeboxLoad(JukeboxBlockEntity tile) {
 			Minecraft mc = Minecraft.getInstance();
 			LevelRenderer render = mc.levelRenderer;
@@ -74,9 +79,30 @@ public static void onJukeboxLoad(JukeboxBlockEntity tile) {
 				} else {
 					ItemStack stack = tile.getRecord();
 					if(stack.getItem() instanceof QuarkMusicDiscItem disc)
-						disc.playAmbientSound(pos);
+						playAmbientSound(disc, pos);
 				}
 			}
 		}
+
+		public static boolean playAmbientSound(QuarkMusicDiscItem disc, BlockPos pos) {
+			if(disc.isAmbient) {
+				Minecraft mc = Minecraft.getInstance();
+				SoundManager soundEngine = mc.getSoundManager();
+				LevelRenderer render = mc.levelRenderer;
+
+				SimpleSoundInstance simplesound = new SimpleSoundInstance(disc.soundSupplier.get().getLocation(), SoundSource.RECORDS, (float) AmbientDiscsModule.volume, 1.0F, SoundInstance.createUnseededRandom(), true, 0, SoundInstance.Attenuation.LINEAR, pos.getX(), pos.getY(), pos.getZ(), false);
+
+				render.playingRecords.put(pos, simplesound);
+				soundEngine.play(simplesound);
+
+				if(mc.level != null)
+					mc.level.addParticle(ParticleTypes.NOTE,pos.getX() + Math.random(), pos.getY() + 1.1, pos.getZ() + Math.random(), Math.random(), 0, 0);
+
+				return true;
+			}
+
+			return false;
+		}
+
 	}
 }
diff --git a/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/CustomEmote.java b/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/CustomEmote.java
index 50d449d49e..a72337c9e9 100644
--- a/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/CustomEmote.java
+++ b/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/CustomEmote.java
@@ -4,10 +4,7 @@
 
 import net.minecraft.client.model.HumanoidModel;
 import net.minecraft.world.entity.player.Player;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
-@OnlyIn(Dist.CLIENT)
 public class CustomEmote extends TemplateSourcedEmote {
 
 	public CustomEmote(EmoteDescriptor desc, Player player, HumanoidModel<?> model, HumanoidModel<?> armorModel, HumanoidModel<?> armorLegsModel) {
diff --git a/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/CustomEmoteDescriptor.java b/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/CustomEmoteDescriptor.java
index 3c852d79ba..9c4b38a83f 100644
--- a/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/CustomEmoteDescriptor.java
+++ b/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/CustomEmoteDescriptor.java
@@ -4,10 +4,7 @@
 
 import net.minecraft.resources.ResourceLocation;
 import net.minecraft.server.packs.PackType;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
-@OnlyIn(Dist.CLIENT)
 public class CustomEmoteDescriptor extends EmoteDescriptor {
 
 	public CustomEmoteDescriptor(String name, String regName, int index) {
diff --git a/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/CustomEmoteIconResourcePack.java b/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/CustomEmoteIconResourcePack.java
index 381ee82ef4..1a274d5cf1 100644
--- a/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/CustomEmoteIconResourcePack.java
+++ b/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/CustomEmoteIconResourcePack.java
@@ -23,10 +23,7 @@
 import net.minecraft.resources.ResourceLocation;
 import net.minecraft.server.packs.AbstractPackResources;
 import net.minecraft.server.packs.PackType;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
-@OnlyIn(Dist.CLIENT)
 public class CustomEmoteIconResourcePack extends AbstractPackResources {
 
 	private final List<String> verifiedNames = new ArrayList<>();
@@ -125,7 +122,4 @@ public String getName() {
 		return "quark-emote-pack";
 	}
 
-
-
-
 }
diff --git a/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/CustomEmoteTemplate.java b/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/CustomEmoteTemplate.java
index 8be21f21c5..999b0216ed 100644
--- a/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/CustomEmoteTemplate.java
+++ b/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/CustomEmoteTemplate.java
@@ -7,10 +7,6 @@
 
 import org.violetmoon.quark.content.tweaks.module.EmotesModule;
 
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
-
-@OnlyIn(Dist.CLIENT)
 public class CustomEmoteTemplate extends EmoteTemplate {
 
 	private String name;
diff --git a/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/EmoteBase.java b/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/EmoteBase.java
index 5d8958e8ae..feaf56ef78 100644
--- a/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/EmoteBase.java
+++ b/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/EmoteBase.java
@@ -16,10 +16,7 @@
 import aurelienribon.tweenengine.TweenManager;
 import net.minecraft.client.model.HumanoidModel;
 import net.minecraft.world.entity.player.Player;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
-@OnlyIn(Dist.CLIENT)
 public abstract class EmoteBase {
 
 	public static final float PI_F = (float) Math.PI;
diff --git a/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/EmoteDescriptor.java b/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/EmoteDescriptor.java
index f75a64d940..7dada05822 100644
--- a/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/EmoteDescriptor.java
+++ b/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/EmoteDescriptor.java
@@ -4,10 +4,7 @@
 import net.minecraft.client.resources.language.I18n;
 import net.minecraft.resources.ResourceLocation;
 import net.minecraft.world.entity.player.Player;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
-@OnlyIn(Dist.CLIENT)
 public class EmoteDescriptor {
 
 	public static final ResourceLocation TIER_1 = new ResourceLocation("quark", "textures/emote/patreon_t1.png");
@@ -46,8 +43,7 @@ public void updateTier(EmoteTemplate template) {
 	public String getTranslationKey() {
 		return "quark.emote." + name;
 	}
-	
-	@OnlyIn(Dist.CLIENT)
+
 	public String getLocalizedName() {
 		return I18n.get(getTranslationKey());
 	}
diff --git a/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/EmoteSound.java b/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/EmoteSound.java
index b7d596f6da..fb13636e18 100644
--- a/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/EmoteSound.java
+++ b/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/EmoteSound.java
@@ -21,10 +21,7 @@
 import net.minecraft.sounds.SoundSource;
 import net.minecraft.world.entity.player.Player;
 import net.minecraft.world.phys.Vec3;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
-@OnlyIn(Dist.CLIENT)
 public class EmoteSound extends AbstractSoundInstance implements TickableSoundInstance {
 
 	protected boolean donePlaying;
diff --git a/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/EmoteState.java b/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/EmoteState.java
index 9886ea2667..5cda33cf81 100644
--- a/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/EmoteState.java
+++ b/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/EmoteState.java
@@ -15,10 +15,7 @@
 
 import net.minecraft.client.model.HumanoidModel;
 import net.minecraft.world.entity.player.Player;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
-@OnlyIn(Dist.CLIENT)
 public class EmoteState {
 
 	private float[] states = new float[0];
diff --git a/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/EmoteTemplate.java b/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/EmoteTemplate.java
index 170bcca880..41a741316d 100644
--- a/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/EmoteTemplate.java
+++ b/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/EmoteTemplate.java
@@ -6,8 +6,6 @@
 import net.minecraft.client.model.HumanoidModel;
 import net.minecraft.resources.ResourceLocation;
 import net.minecraft.world.entity.player.Player;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
 import java.io.BufferedReader;
 import java.io.FileNotFoundException;
@@ -19,7 +17,6 @@
 
 import org.violetmoon.quark.base.Quark;
 
-@OnlyIn(Dist.CLIENT)
 public class EmoteTemplate {
 
 	private static final Map<String, Integer> parts = new HashMap<>();
diff --git a/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/ModelAccessor.java b/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/ModelAccessor.java
index 064bdce56b..776a998f2f 100644
--- a/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/ModelAccessor.java
+++ b/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/ModelAccessor.java
@@ -13,15 +13,12 @@
 import net.minecraft.client.model.HumanoidModel;
 import net.minecraft.client.model.PlayerModel;
 import net.minecraft.client.model.geom.ModelPart;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
 import java.util.Map;
 import java.util.WeakHashMap;
 
 import aurelienribon.tweenengine.TweenAccessor;
 
-@OnlyIn(Dist.CLIENT)
 public class ModelAccessor implements TweenAccessor<HumanoidModel<?>> {
 
 	public static final ModelAccessor INSTANCE = new ModelAccessor();
diff --git a/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/TemplateSourcedEmote.java b/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/TemplateSourcedEmote.java
index 7ce7845909..793b4cbc1c 100644
--- a/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/TemplateSourcedEmote.java
+++ b/src/main/java/org/violetmoon/quark/content/tweaks/client/emote/TemplateSourcedEmote.java
@@ -7,10 +7,7 @@
 import cpw.mods.modlauncher.api.IEnvironment;
 import net.minecraft.client.model.HumanoidModel;
 import net.minecraft.world.entity.player.Player;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
-@OnlyIn(Dist.CLIENT)
 public class TemplateSourcedEmote extends EmoteBase {
 
 	private static final boolean DEOBF = Launcher.INSTANCE.environment().getProperty(IEnvironment.Keys.NAMING.get()).orElse("").equals("mcp");
diff --git a/src/main/java/org/violetmoon/quark/content/tweaks/client/item/ClockTimeGetter.java b/src/main/java/org/violetmoon/quark/content/tweaks/client/item/ClockTimeGetter.java
deleted file mode 100644
index e43a7f9fc0..0000000000
--- a/src/main/java/org/violetmoon/quark/content/tweaks/client/item/ClockTimeGetter.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package org.violetmoon.quark.content.tweaks.client.item;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-
-import org.violetmoon.zeta.util.ItemNBTHelper;
-
-import net.minecraft.client.multiplayer.ClientLevel;
-import net.minecraft.client.renderer.item.ItemPropertyFunction;
-import net.minecraft.util.Mth;
-import net.minecraft.world.entity.Entity;
-import net.minecraft.world.entity.LivingEntity;
-import net.minecraft.world.item.ItemStack;
-import net.minecraft.world.level.Level;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
-
-public class ClockTimeGetter {
-
-	private static final String TAG_CALCULATED = "quark:clock_calculated";
-	
-	public static void tickClock(ItemStack stack) {
-		boolean calculated = isCalculated(stack);
-		if(!calculated)
-			ItemNBTHelper.setBoolean(stack, TAG_CALCULATED, true);
-	}
-
-	static boolean isCalculated(ItemStack stack) {
-		return stack.hasTag() && ItemNBTHelper.getBoolean(stack, TAG_CALCULATED, false);
-	}
-	
-	@OnlyIn(Dist.CLIENT)
-	public static class Impl implements ItemPropertyFunction {
-		
-		private double rotation;
-		private double rota;
-		private long lastUpdateTick;
-		
-		@Override
-		@OnlyIn(Dist.CLIENT)
-		public float call(@Nonnull ItemStack stack, @Nullable ClientLevel worldIn, @Nullable LivingEntity entityIn, int id) {
-			if(!isCalculated(stack))
-				return 0F;
-			
-			boolean carried = entityIn != null;
-			Entity entity = carried ? entityIn : stack.getFrame();
-
-			if(worldIn == null && entity != null && entity.level instanceof ClientLevel)
-				worldIn = (ClientLevel) entity.level;
-
-			if(worldIn == null)
-				return 0F;
-			else {
-				double angle;
-
-				if (worldIn.dimensionType().natural())
-					angle = worldIn.getTimeOfDay(1F); // getCelestrialAngleByTime
-				else
-					angle = Math.random();
-
-				angle = wobble(worldIn, angle);
-				return (float) angle;
-			}
-		}
-		
-		private double wobble(Level world, double time) {
-			long gameTime = world.getGameTime();
-			if(gameTime != lastUpdateTick) {
-				lastUpdateTick = gameTime;
-				double d0 = time - rotation;
-				d0 = Mth.positiveModulo(d0 + 0.5D, 1.0D) - 0.5D;
-				rota += d0 * 0.1D;
-				rota *= 0.9D;
-				rotation = Mth.positiveModulo(rotation + rota, 1.0D);
-			}
-
-			return rotation;
-		}
-		
-	}
-
-}
diff --git a/src/main/java/org/violetmoon/quark/content/tweaks/client/item/ClockTimePropertyFunction.java b/src/main/java/org/violetmoon/quark/content/tweaks/client/item/ClockTimePropertyFunction.java
new file mode 100644
index 0000000000..8b65669afa
--- /dev/null
+++ b/src/main/java/org/violetmoon/quark/content/tweaks/client/item/ClockTimePropertyFunction.java
@@ -0,0 +1,65 @@
+package org.violetmoon.quark.content.tweaks.client.item;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.client.multiplayer.ClientLevel;
+import net.minecraft.client.renderer.item.ItemPropertyFunction;
+import net.minecraft.util.Mth;
+import net.minecraft.world.entity.Entity;
+import net.minecraft.world.entity.LivingEntity;
+import net.minecraft.world.item.ItemStack;
+import net.minecraft.world.level.Level;
+import net.minecraftforge.api.distmarker.Dist;
+import net.minecraftforge.api.distmarker.OnlyIn;
+import org.violetmoon.quark.content.tweaks.module.CompassesWorkEverywhereModule;
+
+@OnlyIn(Dist.CLIENT)
+public class ClockTimePropertyFunction implements ItemPropertyFunction {
+
+	private double rotation;
+	private double rota;
+	private long lastUpdateTick;
+
+	@Override
+	@OnlyIn(Dist.CLIENT)
+	public float call(@Nonnull ItemStack stack, @Nullable ClientLevel worldIn, @Nullable LivingEntity entityIn, int id) {
+		if(!CompassesWorkEverywhereModule.isClockCalculated(stack))
+			return 0F;
+
+		boolean carried = entityIn != null;
+		Entity entity = carried ? entityIn : stack.getFrame();
+
+		if(worldIn == null && entity != null && entity.level instanceof ClientLevel)
+			worldIn = (ClientLevel) entity.level;
+
+		if(worldIn == null)
+			return 0F;
+		else {
+			double angle;
+
+			if(worldIn.dimensionType().natural())
+				angle = worldIn.getTimeOfDay(1F); // getCelestrialAngleByTime
+			else
+				angle = Math.random();
+
+			angle = wobble(worldIn, angle);
+			return (float) angle;
+		}
+	}
+
+	private double wobble(Level world, double time) {
+		long gameTime = world.getGameTime();
+		if(gameTime != lastUpdateTick) {
+			lastUpdateTick = gameTime;
+			double d0 = time - rotation;
+			d0 = Mth.positiveModulo(d0 + 0.5D, 1.0D) - 0.5D;
+			rota += d0 * 0.1D;
+			rota *= 0.9D;
+			rotation = Mth.positiveModulo(rotation + rota, 1.0D);
+		}
+
+		return rotation;
+	}
+
+}
diff --git a/src/main/java/org/violetmoon/quark/content/tweaks/client/item/CompassAngleGetter.java b/src/main/java/org/violetmoon/quark/content/tweaks/client/item/CompassAngleGetter.java
deleted file mode 100644
index e876a9c562..0000000000
--- a/src/main/java/org/violetmoon/quark/content/tweaks/client/item/CompassAngleGetter.java
+++ /dev/null
@@ -1,203 +0,0 @@
-package org.violetmoon.quark.content.tweaks.client.item;
-
-import net.minecraft.client.multiplayer.ClientLevel;
-import net.minecraft.client.renderer.item.ItemPropertyFunction;
-import net.minecraft.core.BlockPos;
-import net.minecraft.nbt.CompoundTag;
-import net.minecraft.nbt.NbtUtils;
-import net.minecraft.resources.ResourceKey;
-import net.minecraft.resources.ResourceLocation;
-import net.minecraft.util.Mth;
-import net.minecraft.world.entity.Entity;
-import net.minecraft.world.entity.LivingEntity;
-import net.minecraft.world.entity.decoration.ItemFrame;
-import net.minecraft.world.entity.player.Player;
-import net.minecraft.world.item.CompassItem;
-import net.minecraft.world.item.ItemStack;
-import net.minecraft.world.level.Level;
-import net.minecraft.world.level.block.Blocks;
-import net.minecraft.world.level.dimension.LevelStem;
-import net.minecraft.world.phys.Vec3;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-
-import org.violetmoon.quark.content.tweaks.module.CompassesWorkEverywhereModule;
-import org.violetmoon.zeta.util.ItemNBTHelper;
-
-import java.util.Optional;
-
-public class CompassAngleGetter {
-
-	private static final String TAG_CALCULATED = "quark:compass_calculated";
-	private static final String TAG_WAS_IN_NETHER = "quark:compass_in_nether";
-	private static final String TAG_POSITION_SET = "quark:compass_position_set";
-	private static final String TAG_NETHER_TARGET_X = "quark:nether_x";
-	private static final String TAG_NETHER_TARGET_Z = "quark:nether_z";
-
-	public static void tickCompass(Player player, ItemStack stack) {
-		boolean calculated = isCalculated(stack);
-		boolean nether = player.level.dimension().location().equals(LevelStem.NETHER.location());
-
-		if(calculated) {
-			boolean wasInNether = ItemNBTHelper.getBoolean(stack, TAG_WAS_IN_NETHER, false);
-			BlockPos pos = player.blockPosition();
-			boolean isInPortal = player.level.getBlockState(pos).getBlock() == Blocks.NETHER_PORTAL;
-
-			if(nether && !wasInNether && isInPortal) {
-				ItemNBTHelper.setInt(stack, TAG_NETHER_TARGET_X, pos.getX());
-				ItemNBTHelper.setInt(stack, TAG_NETHER_TARGET_Z, pos.getZ());
-				ItemNBTHelper.setBoolean(stack, TAG_WAS_IN_NETHER, true);
-				ItemNBTHelper.setBoolean(stack, TAG_POSITION_SET, true);
-			} else if(!nether && wasInNether) {
-				ItemNBTHelper.setBoolean(stack, TAG_WAS_IN_NETHER, false);
-				ItemNBTHelper.setBoolean(stack, TAG_POSITION_SET, false);
-			}
-		} else {
-			ItemNBTHelper.setBoolean(stack, TAG_CALCULATED, true);
-			ItemNBTHelper.setBoolean(stack, TAG_WAS_IN_NETHER, nether);
-		}
-	}
-
-	static boolean isCalculated(ItemStack stack) {
-		return stack.hasTag() && ItemNBTHelper.getBoolean(stack, TAG_CALCULATED, false);
-	}
-
-	@OnlyIn(Dist.CLIENT)
-	public static class Impl implements ItemPropertyFunction {
-
-		private final Angle normalAngle = new Angle();
-		private final Angle unknownAngle = new Angle();
-
-		@Override
-		@OnlyIn(Dist.CLIENT)
-		public float call(@Nonnull ItemStack stack, @Nullable ClientLevel worldIn, @Nullable LivingEntity entityIn, int id) {
-			if(entityIn == null && !stack.isFramed())
-				return 0F;
-
-			if(CompassesWorkEverywhereModule.enableCompassNerf && (!stack.hasTag() || !ItemNBTHelper.getBoolean(stack, TAG_CALCULATED, false)))
-				return 0F;
-
-			boolean carried = entityIn != null;
-			Entity entity = carried ? entityIn : stack.getFrame();
-
-			if (entity == null)
-				return 0;
-
-			if(worldIn == null && entity != null && entity.level instanceof ClientLevel level)
-				worldIn = level;
-
-			double angle;
-
-			boolean calculate = false;
-			BlockPos target = new BlockPos(0, 0, 0);
-
-			ResourceLocation dimension = worldIn.dimension().location();
-			boolean isLodestone = CompassItem.isLodestoneCompass(stack);
-			BlockPos lodestonePos = isLodestone ? this.getLodestonePosition(worldIn, stack.getOrCreateTag()) : null;
-
-			if(lodestonePos != null) {
-				calculate = true;
-				target = lodestonePos;
-			} else if (!isLodestone) {
-				if (dimension.equals(LevelStem.END.location()) && CompassesWorkEverywhereModule.enableEnd)
-					calculate = true;
-				else if (dimension.equals(LevelStem.NETHER.location()) && isCalculated(stack) && CompassesWorkEverywhereModule.enableNether) {
-					boolean set = ItemNBTHelper.getBoolean(stack, TAG_POSITION_SET, false);
-					if (set) {
-						int x = ItemNBTHelper.getInt(stack, TAG_NETHER_TARGET_X, 0);
-						int z = ItemNBTHelper.getInt(stack, TAG_NETHER_TARGET_Z, 0);
-						calculate = true;
-						target = new BlockPos(x, 0, z);
-					}
-				} else if (worldIn.dimensionType().natural()) {
-					calculate = true;
-					target = getWorldSpawn(worldIn);
-				}
-			}
-
-			long gameTime = worldIn.getGameTime();
-			if(calculate && target != null) {
-				double d1 = carried ? entity.getYRot() : getFrameRotation((ItemFrame)entity);
-				d1 = Mth.positiveModulo(d1 / 360.0D, 1.0D);
-				double d2 = getAngleToPosition(entity, target) / (Math.PI * 2D);
-
-				if(carried) {
-					if(normalAngle.needsUpdate(gameTime))
-						normalAngle.wobble(gameTime, 0.5D - (d1 - 0.25D));
-						angle = d2 + normalAngle.rotation;
-				} else angle = 0.5D - (d1 - 0.25D - d2);
-			} else {
-				if(unknownAngle.needsUpdate(gameTime))
-					unknownAngle.wobble(gameTime, Math.random());
-
-				angle = unknownAngle.rotation + shift(id);
-			}
-
-			return Mth.positiveModulo((float) angle, 1.0F);
-		}
-
-
-		private double getFrameRotation(ItemFrame frame) {
-			return Mth.wrapDegrees(180 + frame.getDirection().toYRot());
-		}
-
-		private double getAngleToPosition(Entity entity, BlockPos blockpos) {
-			Vec3 pos = entity.position();
-			return Math.atan2(blockpos.getZ() - pos.z, blockpos.getX() - pos.x);
-		}
-
-		// Magic number cribbed from vanilla
-		private float shift(int id) {
-			return (id * 1327217883) / (float) Integer.MAX_VALUE;
-		}
-
-		// vanilla copy from here on out
-
-		@Nullable
-		private BlockPos getLodestonePosition(Level world, CompoundTag tag) {
-			boolean flag = tag.contains("LodestonePos");
-			boolean flag1 = tag.contains("LodestoneDimension");
-			if (flag && flag1) {
-				Optional<ResourceKey<Level>> optional = CompassItem.getLodestoneDimension(tag);
-				if (optional.isPresent() && world.dimension().equals(optional.get())) {
-					return NbtUtils.readBlockPos(tag.getCompound("LodestonePos"));
-				}
-			}
-
-			return null;
-		}
-
-		@Nullable
-		private BlockPos getWorldSpawn(ClientLevel world) {
-			return world.dimensionType().natural() ? world.getSharedSpawnPos() : null;
-		}
-
-		@OnlyIn(Dist.CLIENT)
-		private static class Angle {
-			private double rotation;
-			private double rota;
-			private long lastUpdateTick;
-
-			private boolean needsUpdate(long tick) {
-				return lastUpdateTick != tick;
-			}
-
-			private void wobble(long gameTime, double angle) {
-				lastUpdateTick = gameTime;
-				double d0 = angle - rotation;
-				d0 = Mth.positiveModulo(d0 + 0.5D, 1.0D) - 0.5D;
-				rota += d0 * 0.1D;
-				rota *= 0.8D;
-				rotation = Mth.positiveModulo(rotation + rota, 1.0D);
-			}
-		}
-
-	}
-
-
-
-
-}
diff --git a/src/main/java/org/violetmoon/quark/content/tweaks/client/item/CompassAnglePropertyFunction.java b/src/main/java/org/violetmoon/quark/content/tweaks/client/item/CompassAnglePropertyFunction.java
new file mode 100644
index 0000000000..ad0eb1521a
--- /dev/null
+++ b/src/main/java/org/violetmoon/quark/content/tweaks/client/item/CompassAnglePropertyFunction.java
@@ -0,0 +1,159 @@
+package org.violetmoon.quark.content.tweaks.client.item;
+
+import java.util.Optional;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.client.multiplayer.ClientLevel;
+import net.minecraft.client.renderer.item.ItemPropertyFunction;
+import net.minecraft.core.BlockPos;
+import net.minecraft.nbt.CompoundTag;
+import net.minecraft.nbt.NbtUtils;
+import net.minecraft.resources.ResourceKey;
+import net.minecraft.resources.ResourceLocation;
+import net.minecraft.util.Mth;
+import net.minecraft.world.entity.Entity;
+import net.minecraft.world.entity.LivingEntity;
+import net.minecraft.world.entity.decoration.ItemFrame;
+import net.minecraft.world.item.CompassItem;
+import net.minecraft.world.item.ItemStack;
+import net.minecraft.world.level.Level;
+import net.minecraft.world.level.dimension.LevelStem;
+import net.minecraft.world.phys.Vec3;
+import net.minecraftforge.api.distmarker.Dist;
+import net.minecraftforge.api.distmarker.OnlyIn;
+import org.violetmoon.quark.content.tweaks.module.CompassesWorkEverywhereModule;
+import org.violetmoon.zeta.util.ItemNBTHelper;
+
+@OnlyIn(Dist.CLIENT)
+public class CompassAnglePropertyFunction implements ItemPropertyFunction {
+
+	private final Angle normalAngle = new Angle();
+	private final Angle unknownAngle = new Angle();
+
+	@Override
+	@OnlyIn(Dist.CLIENT)
+	public float call(@Nonnull ItemStack stack, @Nullable ClientLevel worldIn, @Nullable LivingEntity entityIn, int id) {
+		if(entityIn == null && !stack.isFramed())
+			return 0F;
+
+		if(CompassesWorkEverywhereModule.enableCompassNerf && (!stack.hasTag() || !ItemNBTHelper.getBoolean(stack, CompassesWorkEverywhereModule.TAG_COMPASS_CALCULATED, false)))
+			return 0F;
+
+		boolean carried = entityIn != null;
+		Entity entity = carried ? entityIn : stack.getFrame();
+
+		if(entity == null)
+			return 0;
+
+		if(worldIn == null && entity != null && entity.level instanceof ClientLevel level)
+			worldIn = level;
+
+		double angle;
+
+		boolean calculate = false;
+		BlockPos target = new BlockPos(0, 0, 0);
+
+		ResourceLocation dimension = worldIn.dimension().location();
+		boolean isLodestone = CompassItem.isLodestoneCompass(stack);
+		BlockPos lodestonePos = isLodestone ? this.getLodestonePosition(worldIn, stack.getOrCreateTag()) : null;
+
+		if(lodestonePos != null) {
+			calculate = true;
+			target = lodestonePos;
+		} else if(!isLodestone) {
+			if(dimension.equals(LevelStem.END.location()) && CompassesWorkEverywhereModule.enableEnd)
+				calculate = true;
+			else if(dimension.equals(LevelStem.NETHER.location()) && CompassesWorkEverywhereModule.isCompassCalculated(stack) && CompassesWorkEverywhereModule.enableNether) {
+				boolean set = ItemNBTHelper.getBoolean(stack, CompassesWorkEverywhereModule.TAG_POSITION_SET, false);
+				if(set) {
+					int x = ItemNBTHelper.getInt(stack, CompassesWorkEverywhereModule.TAG_NETHER_TARGET_X, 0);
+					int z = ItemNBTHelper.getInt(stack, CompassesWorkEverywhereModule.TAG_NETHER_TARGET_Z, 0);
+					calculate = true;
+					target = new BlockPos(x, 0, z);
+				}
+			} else if(worldIn.dimensionType().natural()) {
+				calculate = true;
+				target = getWorldSpawn(worldIn);
+			}
+		}
+
+		long gameTime = worldIn.getGameTime();
+		if(calculate && target != null) {
+			double d1 = carried ? entity.getYRot() : getFrameRotation((ItemFrame) entity);
+			d1 = Mth.positiveModulo(d1 / 360.0D, 1.0D);
+			double d2 = getAngleToPosition(entity, target) / (Math.PI * 2D);
+
+			if(carried) {
+				if(normalAngle.needsUpdate(gameTime))
+					normalAngle.wobble(gameTime, 0.5D - (d1 - 0.25D));
+				angle = d2 + normalAngle.rotation;
+			} else angle = 0.5D - (d1 - 0.25D - d2);
+		} else {
+			if(unknownAngle.needsUpdate(gameTime))
+				unknownAngle.wobble(gameTime, Math.random());
+
+			angle = unknownAngle.rotation + shift(id);
+		}
+
+		return Mth.positiveModulo((float) angle, 1.0F);
+	}
+
+
+	private double getFrameRotation(ItemFrame frame) {
+		return Mth.wrapDegrees(180 + frame.getDirection().toYRot());
+	}
+
+	private double getAngleToPosition(Entity entity, BlockPos blockpos) {
+		Vec3 pos = entity.position();
+		return Math.atan2(blockpos.getZ() - pos.z, blockpos.getX() - pos.x);
+	}
+
+	// Magic number cribbed from vanilla
+	private float shift(int id) {
+		return (id * 1327217883) / (float) Integer.MAX_VALUE;
+	}
+
+	// vanilla copy from here on out
+
+	@Nullable
+	private BlockPos getLodestonePosition(Level world, CompoundTag tag) {
+		boolean flag = tag.contains("LodestonePos");
+		boolean flag1 = tag.contains("LodestoneDimension");
+		if(flag && flag1) {
+			Optional<ResourceKey<Level>> optional = CompassItem.getLodestoneDimension(tag);
+			if(optional.isPresent() && world.dimension().equals(optional.get())) {
+				return NbtUtils.readBlockPos(tag.getCompound("LodestonePos"));
+			}
+		}
+
+		return null;
+	}
+
+	@Nullable
+	private BlockPos getWorldSpawn(ClientLevel world) {
+		return world.dimensionType().natural() ? world.getSharedSpawnPos() : null;
+	}
+
+	@OnlyIn(Dist.CLIENT)
+	private static class Angle {
+		private double rotation;
+		private double rota;
+		private long lastUpdateTick;
+
+		private boolean needsUpdate(long tick) {
+			return lastUpdateTick != tick;
+		}
+
+		private void wobble(long gameTime, double angle) {
+			lastUpdateTick = gameTime;
+			double d0 = angle - rotation;
+			d0 = Mth.positiveModulo(d0 + 0.5D, 1.0D) - 0.5D;
+			rota += d0 * 0.1D;
+			rota *= 0.8D;
+			rotation = Mth.positiveModulo(rotation + rota, 1.0D);
+		}
+	}
+
+}
diff --git a/src/main/java/org/violetmoon/quark/content/tweaks/client/render/entity/DyedItemFrameRenderer.java b/src/main/java/org/violetmoon/quark/content/tweaks/client/render/entity/DyedItemFrameRenderer.java
index 6d06dba290..ce5553c043 100644
--- a/src/main/java/org/violetmoon/quark/content/tweaks/client/render/entity/DyedItemFrameRenderer.java
+++ b/src/main/java/org/violetmoon/quark/content/tweaks/client/render/entity/DyedItemFrameRenderer.java
@@ -27,11 +27,8 @@
 import net.minecraft.world.level.block.state.BlockState;
 import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
 import net.minecraft.world.phys.Vec3;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
 // yes this shit again
-@OnlyIn(Dist.CLIENT)
 public class DyedItemFrameRenderer extends EntityRenderer<DyedItemFrame> {
 
 	private static final ModelResourceLocation FRAME_LOCATION = new ModelResourceLocation(Quark.MOD_ID, "extra/dyed_item_frame", "inventory");
diff --git a/src/main/java/org/violetmoon/quark/content/tweaks/module/CompassesWorkEverywhereModule.java b/src/main/java/org/violetmoon/quark/content/tweaks/module/CompassesWorkEverywhereModule.java
index d6ff05d107..3d86de9933 100644
--- a/src/main/java/org/violetmoon/quark/content/tweaks/module/CompassesWorkEverywhereModule.java
+++ b/src/main/java/org/violetmoon/quark/content/tweaks/module/CompassesWorkEverywhereModule.java
@@ -1,8 +1,12 @@
 package org.violetmoon.quark.content.tweaks.module;
 
+import net.minecraft.core.BlockPos;
+import net.minecraft.world.entity.player.Player;
+import net.minecraft.world.level.block.Blocks;
+import net.minecraft.world.level.dimension.LevelStem;
 import org.violetmoon.quark.base.config.Config;
-import org.violetmoon.quark.content.tweaks.client.item.ClockTimeGetter;
-import org.violetmoon.quark.content.tweaks.client.item.CompassAngleGetter;
+import org.violetmoon.quark.content.tweaks.client.item.ClockTimePropertyFunction;
+import org.violetmoon.quark.content.tweaks.client.item.CompassAnglePropertyFunction;
 import org.violetmoon.zeta.client.event.load.ZClientSetup;
 import org.violetmoon.zeta.event.bus.LoadEvent;
 import org.violetmoon.zeta.event.bus.PlayEvent;
@@ -20,10 +24,12 @@
 import net.minecraft.world.item.Item;
 import net.minecraft.world.item.ItemStack;
 import net.minecraft.world.item.Items;
+import org.violetmoon.zeta.util.ItemNBTHelper;
 
 @ZetaLoadModule(category = "tweaks")
 public class CompassesWorkEverywhereModule extends ZetaModule {
 
+
 	@Config public static boolean enableCompassNerf = true;
 	@Config(flag = "clock_nerf") 
 	public static boolean enableClockNerf = true;
@@ -60,12 +66,58 @@ public void onUpdate(ZPlayerTick.Start event) {
 		for(int i = 0; i < inventory.getContainerSize(); i++) {
 			ItemStack stack = inventory.getItem(i);
 			if(stack.getItem() == Items.COMPASS)
-				CompassAngleGetter.tickCompass(event.getPlayer(), stack);
+				tickCompass(event.getPlayer(), stack);
 			else if(stack.getItem() == Items.CLOCK)
-				ClockTimeGetter.tickClock(stack);
+				tickClock(stack);
+		}
+	}
+
+	public static final String TAG_CLOCK_CALCULATED = "quark:clock_calculated";
+
+	public static void tickClock(ItemStack stack) {
+		boolean calculated = isClockCalculated(stack);
+		if(!calculated)
+			ItemNBTHelper.setBoolean(stack, TAG_CLOCK_CALCULATED, true);
+	}
+
+	public static boolean isClockCalculated(ItemStack stack) {
+		return stack.hasTag() && ItemNBTHelper.getBoolean(stack, TAG_CLOCK_CALCULATED, false);
+	}
+
+	public static final String TAG_COMPASS_CALCULATED = "quark:compass_calculated";
+	public static final String TAG_WAS_IN_NETHER = "quark:compass_in_nether";
+	public static final String TAG_POSITION_SET = "quark:compass_position_set";
+	public static final String TAG_NETHER_TARGET_X = "quark:nether_x";
+	public static final String TAG_NETHER_TARGET_Z = "quark:nether_z";
+
+	public static void tickCompass(Player player, ItemStack stack) {
+		boolean calculated = isCompassCalculated(stack);
+		boolean nether = player.level.dimension().location().equals(LevelStem.NETHER.location());
+
+		if(calculated) {
+			boolean wasInNether = ItemNBTHelper.getBoolean(stack, TAG_WAS_IN_NETHER, false);
+			BlockPos pos = player.blockPosition();
+			boolean isInPortal = player.level.getBlockState(pos).getBlock() == Blocks.NETHER_PORTAL;
+
+			if(nether && !wasInNether && isInPortal) {
+				ItemNBTHelper.setInt(stack, TAG_NETHER_TARGET_X, pos.getX());
+				ItemNBTHelper.setInt(stack, TAG_NETHER_TARGET_Z, pos.getZ());
+				ItemNBTHelper.setBoolean(stack, TAG_WAS_IN_NETHER, true);
+				ItemNBTHelper.setBoolean(stack, TAG_POSITION_SET, true);
+			} else if(!nether && wasInNether) {
+				ItemNBTHelper.setBoolean(stack, TAG_WAS_IN_NETHER, false);
+				ItemNBTHelper.setBoolean(stack, TAG_POSITION_SET, false);
+			}
+		} else {
+			ItemNBTHelper.setBoolean(stack, TAG_COMPASS_CALCULATED, true);
+			ItemNBTHelper.setBoolean(stack, TAG_WAS_IN_NETHER, nether);
 		}
 	}
 
+	public static boolean isCompassCalculated(ItemStack stack) {
+		return stack.hasTag() && ItemNBTHelper.getBoolean(stack, TAG_COMPASS_CALCULATED, false);
+	}
+
 	@ZetaLoadModule(clientReplacement = true)
 	public static class Client extends CompassesWorkEverywhereModule {
 
@@ -76,10 +128,10 @@ public void clientSetup(ZClientSetup e) {
 					return;
 
 				if(enableCompassNerf || enableNether || enableEnd)
-					ItemProperties.register(Items.COMPASS, new ResourceLocation("angle"), new CompassAngleGetter.Impl());
+					ItemProperties.register(Items.COMPASS, new ResourceLocation("angle"), new CompassAnglePropertyFunction());
 
 				if(enableClockNerf)
-					ItemProperties.register(Items.CLOCK, new ResourceLocation("time"), new ClockTimeGetter.Impl());
+					ItemProperties.register(Items.CLOCK, new ResourceLocation("time"), new ClockTimePropertyFunction());
 			});
 		}
 
diff --git a/src/main/java/org/violetmoon/quark/content/world/block/GlowLichenGrowthBlock.java b/src/main/java/org/violetmoon/quark/content/world/block/GlowLichenGrowthBlock.java
index a222938b12..cca5273351 100644
--- a/src/main/java/org/violetmoon/quark/content/world/block/GlowLichenGrowthBlock.java
+++ b/src/main/java/org/violetmoon/quark/content/world/block/GlowLichenGrowthBlock.java
@@ -25,8 +25,6 @@
 import net.minecraft.world.level.block.state.BlockState;
 import net.minecraft.world.phys.shapes.CollisionContext;
 import net.minecraft.world.phys.shapes.VoxelShape;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
 public class GlowLichenGrowthBlock extends QuarkBushBlock implements BonemealableBlock {
 
@@ -40,7 +38,6 @@ public GlowLichenGrowthBlock(ZetaModule module) {
 	}
 
 	@Override
-	@OnlyIn(Dist.CLIENT)
 	public void animateTick(@Nonnull BlockState stateIn, @Nonnull Level worldIn, @Nonnull BlockPos pos, @Nonnull RandomSource rand) {
 		super.animateTick(stateIn, worldIn, pos, rand);
 
diff --git a/src/main/java/org/violetmoon/quark/content/world/block/GlowShroomBlock.java b/src/main/java/org/violetmoon/quark/content/world/block/GlowShroomBlock.java
index 91785b3f20..aad378268a 100644
--- a/src/main/java/org/violetmoon/quark/content/world/block/GlowShroomBlock.java
+++ b/src/main/java/org/violetmoon/quark/content/world/block/GlowShroomBlock.java
@@ -18,8 +18,6 @@
 import net.minecraft.world.level.block.state.BlockState;
 import net.minecraft.world.phys.shapes.CollisionContext;
 import net.minecraft.world.phys.shapes.VoxelShape;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
 public class GlowShroomBlock extends QuarkBushBlock implements BonemealableBlock {
 
@@ -33,7 +31,6 @@ public GlowShroomBlock(ZetaModule module) {
 	}
 
 	@Override
-	@OnlyIn(Dist.CLIENT)
 	public void animateTick(@Nonnull BlockState stateIn, @Nonnull Level worldIn, @Nonnull BlockPos pos, @Nonnull RandomSource rand) {
 		super.animateTick(stateIn, worldIn, pos, rand);
 
diff --git a/src/main/java/org/violetmoon/quark/content/world/block/HugeGlowShroomBlock.java b/src/main/java/org/violetmoon/quark/content/world/block/HugeGlowShroomBlock.java
index d559b1d793..394b3c0daa 100644
--- a/src/main/java/org/violetmoon/quark/content/world/block/HugeGlowShroomBlock.java
+++ b/src/main/java/org/violetmoon/quark/content/world/block/HugeGlowShroomBlock.java
@@ -23,8 +23,6 @@
 import net.minecraft.world.level.block.Blocks;
 import net.minecraft.world.level.block.HugeMushroomBlock;
 import net.minecraft.world.level.block.state.BlockState;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
 
 public class HugeGlowShroomBlock extends HugeMushroomBlock implements IQuarkBlock {
 
@@ -61,7 +59,6 @@ public int getFireSpreadSpeedZeta(BlockState state, BlockGetter world, BlockPos
 	}
 
 	@Override
-	@OnlyIn(Dist.CLIENT)
 	public void animateTick(@Nonnull BlockState stateIn, @Nonnull Level worldIn, @Nonnull BlockPos pos, @Nonnull RandomSource rand) {
 		super.animateTick(stateIn, worldIn, pos, rand);
 
diff --git a/src/main/java/org/violetmoon/quark/mixin/client/ItemInHandRendererMixin.java b/src/main/java/org/violetmoon/quark/mixin/client/ItemInHandRendererMixin.java
index c6cffdfd9c..27d5823a06 100644
--- a/src/main/java/org/violetmoon/quark/mixin/client/ItemInHandRendererMixin.java
+++ b/src/main/java/org/violetmoon/quark/mixin/client/ItemInHandRendererMixin.java
@@ -14,7 +14,7 @@ public class ItemInHandRendererMixin {
 
 	@ModifyVariable(method = "renderArmWithItem", at = @At("HEAD"), argsOnly = true)
 	private ItemStack renderArmWithItem(ItemStack stack, AbstractClientPlayer player) {
-		return VariantSelectorModule.modifyHeldItemStack(player, stack);
+		return VariantSelectorModule.Client.modifyHeldItemStack(player, stack);
 	}
 
 
diff --git a/src/main/java/org/violetmoon/quark/mixin/client/LevelRendererMixin.java b/src/main/java/org/violetmoon/quark/mixin/client/LevelRendererMixin.java
index 360e04add6..160340ee08 100644
--- a/src/main/java/org/violetmoon/quark/mixin/client/LevelRendererMixin.java
+++ b/src/main/java/org/violetmoon/quark/mixin/client/LevelRendererMixin.java
@@ -9,6 +9,7 @@
 import org.spongepowered.asm.mixin.injection.Inject;
 import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 import org.violetmoon.quark.base.item.QuarkMusicDiscItem;
+import org.violetmoon.quark.content.tools.module.AmbientDiscsModule;
 
 @Mixin(LevelRenderer.class)
 public class LevelRendererMixin {
@@ -18,7 +19,7 @@ public class LevelRendererMixin {
 			at = @At(value = "JUMP", ordinal = 1),
 			cancellable = true)
 	public void playStreamingMusic(SoundEvent soundIn, BlockPos pos, RecordItem musicDiscItem, CallbackInfo info) {
-		if(musicDiscItem instanceof QuarkMusicDiscItem quarkDisc && quarkDisc.playAmbientSound(pos))
+		if(musicDiscItem instanceof QuarkMusicDiscItem quarkDisc && AmbientDiscsModule.Client.playAmbientSound(quarkDisc, pos))
 			info.cancel();
 	}
 
diff --git a/src/main/java/org/violetmoon/zeta/Zeta.java b/src/main/java/org/violetmoon/zeta/Zeta.java
index 6e57da896a..16320d4cba 100644
--- a/src/main/java/org/violetmoon/zeta/Zeta.java
+++ b/src/main/java/org/violetmoon/zeta/Zeta.java
@@ -55,6 +55,7 @@ public Zeta(String modid, Logger log, ZetaSide side) {
 		this.capabilityManager = createCapabilityManager();
 
 		loadBus.subscribe(craftingExtensions)
+			.subscribe(dyeables)
 			.subscribe(brewingRegistry);
 	}
 
@@ -110,7 +111,7 @@ public RenderLayerRegistry createRenderLayerRegistry() {
 	}
 	public abstract CraftingExtensionsRegistry createCraftingExtensionsRegistry();
 	public DyeablesRegistry createDyeablesRegistry() {
-		return new DyeablesRegistry(this);
+		return new DyeablesRegistry();
 	}
 	public abstract BrewingRegistry createBrewingRegistry();
 	public abstract ZetaNetworkHandler createNetworkHandler(String modid, int protocolVersion);
diff --git a/src/main/java/org/violetmoon/zeta/registry/DyeablesRegistry.java b/src/main/java/org/violetmoon/zeta/registry/DyeablesRegistry.java
index 2f757e21ce..243e03ff70 100644
--- a/src/main/java/org/violetmoon/zeta/registry/DyeablesRegistry.java
+++ b/src/main/java/org/violetmoon/zeta/registry/DyeablesRegistry.java
@@ -30,16 +30,10 @@
  * @see org.violetmoon.zeta.client.ClientRegistryExtension
  */
 public class DyeablesRegistry {
-	protected final Zeta z;
 
 	public final Map<Item, Supplier<Boolean>> dyeableConditions = new HashMap<>();
 	public final DyeableLeatherItem SURROGATE = new DyeableLeatherItem() {}; //Simply an accessor for various DyeableLeatherItem default methods
 
-	public DyeablesRegistry(Zeta z) {
-		this.z = z;
-		z.loadBus.subscribe(this);
-	}
-
 	@LoadEvent
 	public void register(ZRegister event) {
 		ResourceLocation id = event.getRegistry().newResourceLocation("dye_item");
diff --git a/src/main/java/org/violetmoon/zeta/registry/ZetaRegistry.java b/src/main/java/org/violetmoon/zeta/registry/ZetaRegistry.java
index 2cfb23c174..02018f2064 100644
--- a/src/main/java/org/violetmoon/zeta/registry/ZetaRegistry.java
+++ b/src/main/java/org/violetmoon/zeta/registry/ZetaRegistry.java
@@ -8,6 +8,7 @@
 import java.util.function.BiConsumer;
 import java.util.function.BooleanSupplier;
 import java.util.function.Supplier;
+import java.util.stream.Collectors;
 
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.Multimap;
@@ -149,6 +150,11 @@ public void clearDeferCache(ResourceLocation resourceLocation) {
 		defers.removeAll(resourceLocation);
 	}
 
+	public void assertAllRegistered() {
+		if(!defers.isEmpty())
+			throw new IllegalStateException("Some defers were not registered: " + defers.keys().stream().map(ResourceLocation::toString).collect(Collectors.joining(", ")));
+	}
+
 	public void finalizeBlockColors(BiConsumer<Block, String> consumer) {
 		blocksToColorProviderName.forEach(consumer);
 		blocksToColorProviderName.clear();
diff --git a/src/main/java/org/violetmoon/zetaimplforge/ForgeZeta.java b/src/main/java/org/violetmoon/zetaimplforge/ForgeZeta.java
index 88d4551f5a..70e8187c49 100644
--- a/src/main/java/org/violetmoon/zetaimplforge/ForgeZeta.java
+++ b/src/main/java/org/violetmoon/zetaimplforge/ForgeZeta.java
@@ -224,6 +224,7 @@ public void registerHighest(RegisterEvent e) {
 			return;
 
 		loadBus.fire(new ZRegister(this));
+		registry.assertAllRegistered();
 		loadBus.fire(new ZRegister.Post());
 
 		registerDone = true;