diff --git a/src/generated/resources/.cache/4d58d921702f57799841730d3d537abc5ea398a2 b/src/generated/resources/.cache/4d58d921702f57799841730d3d537abc5ea398a2
index 33ae072d..279134a3 100644
--- a/src/generated/resources/.cache/4d58d921702f57799841730d3d537abc5ea398a2
+++ b/src/generated/resources/.cache/4d58d921702f57799841730d3d537abc5ea398a2
@@ -1,4 +1,4 @@
-// 1.21.1	2024-12-15T19:07:20.8340143	Item Models: nautec
+// 1.21.1	2024-12-15T22:05:05.897545572	Item Models: nautec
 53692692f57914fc54eb6ebf416ce1cb7789e57b assets/nautec/models/item/air_bottle.json
 cc6ee3887ec6e0c53216dc681ac7b32b34182253 assets/nautec/models/item/anchor.json
 2e336fce57acffa1d0eb621baa30a26f665b4924 assets/nautec/models/item/aquarine_steel_axe.json
@@ -46,10 +46,10 @@ ed25e860594336997f83adfb9143324db4569abc assets/nautec/models/item/diving_boots.
 8ab1faa99a5bfcc960d471854c6416ca0a1573e3 assets/nautec/models/item/diving_leggings.json
 c085f601646336ad76e9a613649bcffc3a304c9a assets/nautec/models/item/dolphin_fin.json
 0620a4b87e92446ecf5521b595d2f1a6a9401529 assets/nautec/models/item/drowned_lungs.json
-4d2bc30dbb5e9bca7902cfeafeb133ff4facbee8 assets/nautec/models/item/eas_bucket.json
+61a7044af6e7a6c51552eb1abfa03e96aa677420 assets/nautec/models/item/eas_bucket.json
 81b061a707ce97739bf742ee8c4832e9612c3f18 assets/nautec/models/item/eas_vial.json
 7bdd896a173f2dbd2cf64ff41e82f6c5525dcf49 assets/nautec/models/item/eldritch_heart.json
-d26c5a9588cd86145f6c2e03e5fd5eabc4ed0f07 assets/nautec/models/item/etching_acid_bucket.json
+3e19378d1e8cd3808548edc4bbb93a4dfe4ade74 assets/nautec/models/item/etching_acid_bucket.json
 cb07777d8dcd1c00bea806efc2b7f64c6c13a8c3 assets/nautec/models/item/fishing_station.json
 490588573d27c343b055c02b137c221a71866aa8 assets/nautec/models/item/gear.json
 2b617afc38ea0b797aeba3ca00dfb25f33be4bd3 assets/nautec/models/item/glass_vial.json
@@ -60,16 +60,18 @@ d30193c75aab5ff8f4d4945df8689f575874c0f0 assets/nautec/models/item/laser_channel
 e2a54f360d7c345a624bfd88678359ffce2af94d assets/nautec/models/item/long_distance_laser.json
 2a5b3ee493a3b20a37c3f391ebd960de088f2b7c assets/nautec/models/item/mixer.json
 420392d152f0164245752585ea3f0e85b95b0cce assets/nautec/models/item/mutator.json
+da47351a6e7410de2b6761d4c90edf257d4620aa assets/nautec/models/item/oil_barrel.json
+8664d92d6fab3566ac9169968450df573210f227 assets/nautec/models/item/oil_bucket.json
 c30b2391537fbc383c41aebe69a6eab8b2f9bd31 assets/nautec/models/item/petri_dish.json
 888fbf8e3629b4cd0df267581ac130f534f80ac5 assets/nautec/models/item/petri_dish_bacteria.json
 e8d19ed0a058c92c28efb20a5f8887ff0b78770f assets/nautec/models/item/polished_prismarine.json
+113d63fc1bd37fbe0fb477446a06eafa25ce09b1 assets/nautec/models/item/prism_monocle.json
 8e22e42d27bc66bc91cc76fd66d0ff5457b585b1 assets/nautec/models/item/prismarine_crystal.json
 8b90a03798a28c038b1c16da2f723e90694d182b assets/nautec/models/item/prismarine_crystal_shard.json
 09882392c9745a728907f265dd968977ca0f171b assets/nautec/models/item/prismarine_laser_relay.json
 b01055cbe0dd02e958fe1063758658a9be6b753a assets/nautec/models/item/prismarine_sand.json
 e0209c5f64b38c19f4b8cc62dc90d23fd5f3bad0 assets/nautec/models/item/prismatic_battery.json
-113d63fc1bd37fbe0fb477446a06eafa25ce09b1 assets/nautec/models/item/prism_monocle.json
 0441fb5aafacad25af44cc70caad7de17d4d7762 assets/nautec/models/item/rusty_crate.json
 546756658cb53a34f117de278d075cbdd09c70ba assets/nautec/models/item/rusty_gear.json
-8af43812b6a13031c60720373e6e2aa8b3aa3367 assets/nautec/models/item/salt_water_bucket.json
+e706cc4892f1d7f29d5b1940770668d233d0bf94 assets/nautec/models/item/saltwater_bucket.json
 5d79cd8fb5d6550d2d8a61aa19dbf6f13ceecb72 assets/nautec/models/item/whisk.json
diff --git a/src/generated/resources/.cache/76a19663e3d8e02fd582710c2facdc314b5575a1 b/src/generated/resources/.cache/76a19663e3d8e02fd582710c2facdc314b5575a1
index 124a8854..b6277f46 100644
--- a/src/generated/resources/.cache/76a19663e3d8e02fd582710c2facdc314b5575a1
+++ b/src/generated/resources/.cache/76a19663e3d8e02fd582710c2facdc314b5575a1
@@ -1,4 +1,4 @@
-// 1.21.1	2024-12-15T13:39:38.353720754	Block States: nautec
+// 1.21.1	2024-12-15T22:34:29.540723671	Block States: nautec
 3f3049296b6ec6590b05af441a717618bb232b69 assets/nautec/blockstates/aquarine_steel_block.json
 414381329d7663eb1d1db8c3f42df8d9932d2cfe assets/nautec/blockstates/aquatic_catalyst.json
 920d567f0ae8731bc428c8970aac5400741ea87d assets/nautec/blockstates/augmentation_station.json
@@ -16,6 +16,7 @@ db6a852fb0c5f4ea3f9dc93c00de3525ae2c3c66 assets/nautec/blockstates/deep_sea_drai
 7fd72e44fd8677c659e8b261fcaa92b12a845b78 assets/nautec/blockstates/laser_junction.json
 ad55c3b07839453f1153e1bb0eafcfd55cd2f9e1 assets/nautec/blockstates/long_distance_laser.json
 64a25cd06f6d770e7408fbde89cfb1413550aeb5 assets/nautec/blockstates/mixer.json
+2cff0fd603426a38baa3cc8123cace04d0d5adf1 assets/nautec/blockstates/oil_barrel.json
 bc5914e8ef7efce89c87e7320a64f1f02348ac6c assets/nautec/blockstates/polished_prismarine.json
 60fb5b3f304282655d6b248eeea7e227ec8055bd assets/nautec/blockstates/prismarine_laser_relay.json
 7930832874f271dd9739dd2fd92a54954d014df8 assets/nautec/blockstates/prismarine_sand.json
@@ -57,6 +58,8 @@ bc44096b66b26bf80656c02a0e512fa19c975f52 assets/nautec/models/block/deep_sea_dra
 0c5628852a14882a978590d77c2eb5db5947f6c9 assets/nautec/models/block/deep_sea_drain_part_8_open.json
 e7497701db027ba0deb6bc9e037e68ab2daac886 assets/nautec/models/block/deep_sea_drain_wall.json
 b37caee681c78c96ef2e66c6a0d4584a47d5b1e3 assets/nautec/models/block/long_distance_laser.json
+27172c9baefa576bf8a79ccdc5b3b0ed3884af8b assets/nautec/models/block/oil_barrel.json
+72d472aea78ba1bd9deec024c16a52c5ed241876 assets/nautec/models/block/oil_barrel_horizontal.json
 670931d9593810682e11609b5c7ed2a908ef9b39 assets/nautec/models/block/polished_prismarine.json
 f5f0d62affc876c65918c16c43280cb89f629648 assets/nautec/models/block/prismarine_sand.json
 f0941592f6b903fd57c9c8b95ec434d91d1f69f2 assets/nautec/models/block/rusty_crate.json
diff --git a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e
index 708e15bc..302c48c0 100644
--- a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e
+++ b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e
@@ -1,4 +1,4 @@
-// 1.21.1	2024-11-05T21:59:37.295948882	Recipes
+// 1.21.1	2024-12-15T20:55:07.969230843	Recipes
 11639f08778ec1107c05d822f9beaa1f90e3bb32 data/minecraft/advancement/recipes/misc/cast_iron_ingot_blasting.json
 5f305b97f7366fc61918bd266d0bacfa386b16c1 data/minecraft/advancement/recipes/misc/cast_iron_nugget_to_ingot.json
 c01db9d69b288d37c769cf605b945ebf60a08e21 data/minecraft/advancement/recipes/misc/diving_chestplate.json
@@ -90,9 +90,9 @@ a4bdb97abe0834d405f7584452f78242585e02ff data/nautec/recipe/item_transformation/
 3ff56013c9c1926be24f71bdb57c93527ef7ee28 data/nautec/recipe/laser_junction.json
 11d23344db3f6e98c1520328fd6c883bccd8ca57 data/nautec/recipe/long_distance_laser.json
 4925f952a200ae56a4e1ad04a45897be4988aad4 data/nautec/recipe/mixer.json
-35a2d38352317596d0e56958db954ee65944fd30 data/nautec/recipe/mixing/dried_kelp_slime_ball_prismarine_crystals_seagrass.json
-33cb8c2e11304d00aa38c66d64e202ca4230e924 data/nautec/recipe/mixing/pufferfish_gunpowder_bone_meal.json
-e1a573744441ccee013b6f985c3872142911e29b data/nautec/recipe/mixing/raw_iron_prismarine_crystals_to_aquarine_steel_compound.json
+9374bb4c1bb1a3e8eb1312ee701560a68be7d033 data/nautec/recipe/mixing/dried_kelp_slime_ball_prismarine_crystals_seagrass.json
+b00568e1261638147c0e1f2433821bb6aa9f42b9 data/nautec/recipe/mixing/pufferfish_gunpowder_bone_meal.json
+ac8c8ef9122a3e1312b101ce23af51ae019143e5 data/nautec/recipe/mixing/raw_iron_prismarine_crystals_to_aquarine_steel_compound.json
 674df651148d747a200794f496996b82ca94e72f data/nautec/recipe/nautec_guide.json
 cd9bfbdf0f0468399cc4700d0c360b8283253c96 data/nautec/recipe/polished_prismarine.json
 4fe8f6115c759c654e132afedec76d846f0a89d5 data/nautec/recipe/prism_monocle.json
diff --git a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8
index cf6d1bce..4f3bb2a9 100644
--- a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8
+++ b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8
@@ -1,2 +1,2 @@
-// 1.21.1	2024-12-15T19:56:36.865469462	Languages: en_us
-2b776d2e529ff9f3da361d89a83dcc9c16fcd923 assets/nautec/lang/en_us.json
+// 1.21.1	2024-12-15T20:55:07.97208459	Languages: en_us
+02e2bf78f797075e71df78423d05779abc093c05 assets/nautec/lang/en_us.json
diff --git a/src/generated/resources/.cache/eb748cc26e43de416ad491bd48ccca24d169a651 b/src/generated/resources/.cache/eb748cc26e43de416ad491bd48ccca24d169a651
index 358e6fce..86875391 100644
--- a/src/generated/resources/.cache/eb748cc26e43de416ad491bd48ccca24d169a651
+++ b/src/generated/resources/.cache/eb748cc26e43de416ad491bd48ccca24d169a651
@@ -1,4 +1,4 @@
-// 1.21.1	2024-09-30T17:58:20.5863696	Books: nautec
+// 1.21.1	2024-12-15T20:55:07.9620151	Books: nautec
 6d944fd1b3f4f8d8baf18317dbdea1e50476ed05 data/nautec/modonomicon/books/nautec_guide/book.json
 ea5fe754ad19a1903e7a9d19f39e3b1488e59cfe data/nautec/modonomicon/books/nautec_guide/categories/getting_started.json
 41b01f32b9f23cf1eb5a33085b98bd30f0a1f943 data/nautec/modonomicon/books/nautec_guide/categories/laser_augmentation.json
@@ -19,7 +19,7 @@ a46ba5de3d71172e50fe191f2d6ef51327d7f188 data/nautec/modonomicon/books/nautec_gu
 513198812cfe6695951eb9e1f60fd3fcf8d36ee6 data/nautec/modonomicon/books/nautec_guide/entries/laser_augmentation/long_distance_laser.json
 c03c7b650f9ea70b95dcb4465e44d1abaa28d838 data/nautec/modonomicon/books/nautec_guide/entries/laser_augmentation/mob_augments.json
 d70be2eaf9729ca163499da6d7a33730cf7e07f2 data/nautec/modonomicon/books/nautec_guide/entries/laser_chemistry/charger.json
-86bf0538af8e99ca0d8477c0c301c0a7938dea44 data/nautec/modonomicon/books/nautec_guide/entries/laser_chemistry/chemistry_introduction.json
+bb25a50ac33f339011a5a153e21eff93381ae8b5 data/nautec/modonomicon/books/nautec_guide/entries/laser_chemistry/chemistry_introduction.json
 36ffcf02fad4cee8ac0db723f1c03bc2df14049e data/nautec/modonomicon/books/nautec_guide/entries/laser_chemistry/crystal_shards.json
 34c421cb513a6d5ac4631180a2bbd14aa09d021a data/nautec/modonomicon/books/nautec_guide/entries/laser_chemistry/drain.json
 a7779a4159c603668355d3064d5bf7b4560a3490 data/nautec/modonomicon/books/nautec_guide/entries/laser_chemistry/laser_manipulation.json
diff --git a/src/generated/resources/assets/nautec/lang/en_us.json b/src/generated/resources/assets/nautec/lang/en_us.json
index 5cf368e4..0bae53a8 100644
--- a/src/generated/resources/assets/nautec/lang/en_us.json
+++ b/src/generated/resources/assets/nautec/lang/en_us.json
@@ -151,9 +151,9 @@
   "book.nautec.nautec_guide.tooltip": "Nautec Guide Tooltip",
   "curios.identifier.battery": "Battery",
   "curios.identifier.prism_monocle": "Monocle",
-  "fluid_type.nautec.electrolyte_algae_serum": "Electrolyte Algae Serum",
+  "fluid_type.nautec.eas": "Electrolyte Algae Serum",
   "fluid_type.nautec.etching_acid": "Etching Acid",
-  "fluid_type.nautec.soap_water": "Salt Water",
+  "fluid_type.nautec.saltwater": "Salt Water",
   "item.nautec.air_bottle": "Pressurized Air Bottle",
   "item.nautec.ancient_valve": "Ancient Valve",
   "item.nautec.aquarine_steel_axe": "Aquarine Steel Axe",
@@ -198,7 +198,7 @@
   "item.nautec.prismarine_crystal_shard": "Prismarine Crystal Shard",
   "item.nautec.prismatic_battery": "Prismatic Battery",
   "item.nautec.rusty_gear": "Rusty Gear",
-  "item.nautec.salt_water_bucket": "Salt Water Bucket",
+  "item.nautec.saltwater_bucket": "Salt Water Bucket",
   "item.nautec.syringe_robot_arm": "Syringe Robot Arm",
   "item.nautec.valve": "Valve",
   "item.nautec.whisk": "Whisk",
diff --git a/src/generated/resources/assets/nautec/models/item/eas_bucket.json b/src/generated/resources/assets/nautec/models/item/eas_bucket.json
index 9736e31c..16c3d97c 100644
--- a/src/generated/resources/assets/nautec/models/item/eas_bucket.json
+++ b/src/generated/resources/assets/nautec/models/item/eas_bucket.json
@@ -1,6 +1,5 @@
 {
-  "parent": "minecraft:item/generated",
-  "textures": {
-    "layer0": "nautec:item/eas_bucket"
-  }
+  "parent": "neoforge:item/bucket",
+  "fluid": "nautec:eas",
+  "loader": "neoforge:fluid_container"
 }
\ No newline at end of file
diff --git a/src/generated/resources/assets/nautec/models/item/etching_acid_bucket.json b/src/generated/resources/assets/nautec/models/item/etching_acid_bucket.json
index 44234ba2..be5358b3 100644
--- a/src/generated/resources/assets/nautec/models/item/etching_acid_bucket.json
+++ b/src/generated/resources/assets/nautec/models/item/etching_acid_bucket.json
@@ -1,6 +1,5 @@
 {
-  "parent": "minecraft:item/generated",
-  "textures": {
-    "layer0": "nautec:item/etching_acid_bucket"
-  }
+  "parent": "neoforge:item/bucket",
+  "fluid": "nautec:etching_acid",
+  "loader": "neoforge:fluid_container"
 }
\ No newline at end of file
diff --git a/src/generated/resources/assets/nautec/models/item/salt_water_bucket.json b/src/generated/resources/assets/nautec/models/item/salt_water_bucket.json
deleted file mode 100644
index 9dfdefa1..00000000
--- a/src/generated/resources/assets/nautec/models/item/salt_water_bucket.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "parent": "minecraft:item/generated",
-  "textures": {
-    "layer0": "nautec:item/salt_water_bucket"
-  }
-}
\ No newline at end of file
diff --git a/src/generated/resources/data/nautec/modonomicon/books/nautec_guide/entries/laser_chemistry/chemistry_introduction.json b/src/generated/resources/data/nautec/modonomicon/books/nautec_guide/entries/laser_chemistry/chemistry_introduction.json
index fe97d076..9f6d6db7 100644
--- a/src/generated/resources/data/nautec/modonomicon/books/nautec_guide/entries/laser_chemistry/chemistry_introduction.json
+++ b/src/generated/resources/data/nautec/modonomicon/books/nautec_guide/entries/laser_chemistry/chemistry_introduction.json
@@ -39,7 +39,7 @@
         "type": "modonomicon:none"
       },
       "item": {
-        "item": "nautec:salt_water_bucket"
+        "item": "nautec:saltwater_bucket"
       },
       "text": "book.nautec.nautec_guide.laser_chemistry.chemistry_introduction.salt_water.text",
       "title": "book.nautec.nautec_guide.laser_chemistry.chemistry_introduction.salt_water.title"
diff --git a/src/generated/resources/data/nautec/recipe/mixing/dried_kelp_slime_ball_prismarine_crystals_seagrass.json b/src/generated/resources/data/nautec/recipe/mixing/dried_kelp_slime_ball_prismarine_crystals_seagrass.json
index 0173fd56..e124b24c 100644
--- a/src/generated/resources/data/nautec/recipe/mixing/dried_kelp_slime_ball_prismarine_crystals_seagrass.json
+++ b/src/generated/resources/data/nautec/recipe/mixing/dried_kelp_slime_ball_prismarine_crystals_seagrass.json
@@ -3,11 +3,11 @@
   "duration": 200,
   "fluid_ingredient": {
     "amount": 1000,
-    "id": "nautec:salt_water"
+    "id": "nautec:saltwater"
   },
   "fluid_result": {
     "amount": 1000,
-    "id": "nautec:electrolyte_algae_serum"
+    "id": "nautec:eas"
   },
   "ingredients": [
     {
diff --git a/src/generated/resources/data/nautec/recipe/mixing/pufferfish_gunpowder_bone_meal.json b/src/generated/resources/data/nautec/recipe/mixing/pufferfish_gunpowder_bone_meal.json
index 59a31ed1..1d3819f2 100644
--- a/src/generated/resources/data/nautec/recipe/mixing/pufferfish_gunpowder_bone_meal.json
+++ b/src/generated/resources/data/nautec/recipe/mixing/pufferfish_gunpowder_bone_meal.json
@@ -3,7 +3,7 @@
   "duration": 150,
   "fluid_ingredient": {
     "amount": 1000,
-    "id": "nautec:salt_water"
+    "id": "nautec:saltwater"
   },
   "fluid_result": {
     "amount": 1000,
diff --git a/src/generated/resources/data/nautec/recipe/mixing/raw_iron_prismarine_crystals_to_aquarine_steel_compound.json b/src/generated/resources/data/nautec/recipe/mixing/raw_iron_prismarine_crystals_to_aquarine_steel_compound.json
index d3e9029e..0a8730c6 100644
--- a/src/generated/resources/data/nautec/recipe/mixing/raw_iron_prismarine_crystals_to_aquarine_steel_compound.json
+++ b/src/generated/resources/data/nautec/recipe/mixing/raw_iron_prismarine_crystals_to_aquarine_steel_compound.json
@@ -3,7 +3,7 @@
   "duration": 100,
   "fluid_ingredient": {
     "amount": 1000,
-    "id": "nautec:salt_water"
+    "id": "nautec:saltwater"
   },
   "fluid_result": {},
   "ingredients": [
diff --git a/src/main/java/com/portingdeadmods/nautec/Nautec.java b/src/main/java/com/portingdeadmods/nautec/Nautec.java
index 30ccbd5d..6198525e 100644
--- a/src/main/java/com/portingdeadmods/nautec/Nautec.java
+++ b/src/main/java/com/portingdeadmods/nautec/Nautec.java
@@ -67,10 +67,8 @@ public Nautec(IEventBus modEventBus, ModContainer modContainer) {
 
         NTEntities.ENTITIES.register(modEventBus);
         NTItems.ITEMS.register(modEventBus);
-        NTFluids.FLUIDS.register(modEventBus);
         NTBlocks.BLOCKS.register(modEventBus);
         NTRecipes.SERIALIZERS.register(modEventBus);
-        NTFluidTypes.FLUID_TYPES.register(modEventBus);
         NTDataAttachments.ATTACHMENTS.register(modEventBus);
         NTArgumentTypes.ARGUMENT_TYPES.register(modEventBus);
         NTBlockEntityTypes.BLOCK_ENTITIES.register(modEventBus);
@@ -85,6 +83,8 @@ public Nautec(IEventBus modEventBus, ModContainer modContainer) {
         NTLootModifier.LOOT_MODIFIERS.register(modEventBus);
         NTBacteriaSerializers.SERIALIZERS.register(modEventBus);
 
+        NTFluids.HELPER.register(modEventBus);
+
         modEventBus.addListener(this::onRegisterAugments);
         modEventBus.addListener(this::registerCapabilities);
 
diff --git a/src/main/java/com/portingdeadmods/nautec/NautecClient.java b/src/main/java/com/portingdeadmods/nautec/NautecClient.java
index bee8875c..b38c029b 100644
--- a/src/main/java/com/portingdeadmods/nautec/NautecClient.java
+++ b/src/main/java/com/portingdeadmods/nautec/NautecClient.java
@@ -66,6 +66,7 @@
 import net.neoforged.neoforge.client.extensions.common.RegisterClientExtensionsEvent;
 import net.neoforged.neoforge.client.gui.ConfigurationScreen;
 import net.neoforged.neoforge.client.gui.IConfigScreenFactory;
+import net.neoforged.neoforge.client.model.DynamicFluidContainerModel;
 import net.neoforged.neoforge.fluids.FluidType;
 import net.neoforged.neoforge.fluids.capability.templates.FluidHandlerItemStack;
 import net.neoforged.neoforge.registries.DeferredHolder;
@@ -242,5 +243,6 @@ private void registerColorHandlers(RegisterColorHandlersEvent.Item event) {
             Bacteria bacteria = BacteriaHelper.getBacteria(Minecraft.getInstance().level.registryAccess(), stack.get(NTDataComponents.BACTERIA).bacteria());
             return layer == 1 ? bacteria.stats().color() : -1;
         }, NTItems.PETRI_DISH);
+        event.register(new DynamicFluidContainerModel.Colors(), NTFluids.SALT_WATER.getBucket());
     }
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/portingdeadmods/nautec/api/bacteria/Bacteria.java b/src/main/java/com/portingdeadmods/nautec/api/bacteria/Bacteria.java
index 2e6ccfbd..e749d8f7 100644
--- a/src/main/java/com/portingdeadmods/nautec/api/bacteria/Bacteria.java
+++ b/src/main/java/com/portingdeadmods/nautec/api/bacteria/Bacteria.java
@@ -26,7 +26,7 @@ public interface Bacteria {
      */
     ResourceLocation id();
 
-    BacteriaStats stats();
+    BaseBacteriaStats stats();
 
     BacteriaSerializer<?> getSerializer();
 }
diff --git a/src/main/java/com/portingdeadmods/nautec/api/bacteria/BaseBacteriaStats.java b/src/main/java/com/portingdeadmods/nautec/api/bacteria/BaseBacteriaStats.java
new file mode 100644
index 00000000..61656786
--- /dev/null
+++ b/src/main/java/com/portingdeadmods/nautec/api/bacteria/BaseBacteriaStats.java
@@ -0,0 +1,17 @@
+package com.portingdeadmods.nautec.api.bacteria;
+
+import net.minecraft.world.item.Item;
+
+public interface BaseBacteriaStats {
+    Item resource();
+
+    float growthRate();
+
+    float mutationResistance();
+
+    float productionRate();
+
+    int lifespan();
+
+    int color();
+}
diff --git a/src/main/java/com/portingdeadmods/nautec/api/fluids/FluidTemplate.java b/src/main/java/com/portingdeadmods/nautec/api/fluids/FluidTemplate.java
new file mode 100644
index 00000000..0a266bb0
--- /dev/null
+++ b/src/main/java/com/portingdeadmods/nautec/api/fluids/FluidTemplate.java
@@ -0,0 +1,11 @@
+package com.portingdeadmods.nautec.api.fluids;
+
+import net.minecraft.resources.ResourceLocation;
+
+public interface FluidTemplate {
+    ResourceLocation getStillTexture();
+
+    ResourceLocation getFlowingTexture();
+
+    ResourceLocation getOverlayTexture();
+}
diff --git a/src/main/java/com/portingdeadmods/nautec/api/fluids/NTFluid.java b/src/main/java/com/portingdeadmods/nautec/api/fluids/NTFluid.java
new file mode 100644
index 00000000..25ef6e6a
--- /dev/null
+++ b/src/main/java/com/portingdeadmods/nautec/api/fluids/NTFluid.java
@@ -0,0 +1,71 @@
+package com.portingdeadmods.nautec.api.fluids;
+import net.minecraft.core.Vec3i;
+import net.minecraft.world.item.BucketItem;
+import net.minecraft.world.item.Item;
+import net.minecraft.world.item.Items;
+import net.minecraft.world.level.block.LiquidBlock;
+import net.minecraft.world.level.block.state.BlockBehaviour;
+import net.neoforged.neoforge.fluids.BaseFlowingFluid;
+import net.neoforged.neoforge.fluids.FluidType;
+import net.neoforged.neoforge.registries.DeferredItem;
+import org.joml.Vector4i;
+
+import java.util.function.Supplier;
+
+public abstract class NTFluid {
+    public Supplier<BaseFlowingFluid.Source> stillFluid;
+    public Supplier<BaseFlowingFluid.Flowing> flowingFluid;
+
+    public Supplier<FluidType> fluidType;
+
+    public Supplier<LiquidBlock> block;
+    public Supplier<BucketItem> bucket;
+    public DeferredItem<BucketItem> deferredBucket;
+
+    protected BaseFlowingFluid.Properties properties;
+
+    protected final String name;
+
+    public NTFluid(String name) {
+        this.stillFluid = () -> new BaseFlowingFluid.Source(fluidProperties());
+        this.flowingFluid = () -> new BaseFlowingFluid.Flowing(fluidProperties());
+        this.name = name;
+    }
+
+    public BlockBehaviour.Properties blockProperties() {
+        return BlockBehaviour.Properties.of();
+    }
+
+    public BaseFlowingFluid.Properties fluidProperties() {
+        return new BaseFlowingFluid.Properties(fluidType, stillFluid, flowingFluid);
+    }
+
+    public BaseFlowingFluid.Source getStillFluid() {
+        return stillFluid.get();
+    }
+
+    public BaseFlowingFluid.Flowing getFlowingFluid() {
+        return flowingFluid.get();
+    }
+
+    public Supplier<FluidType> getFluidType() {
+        return fluidType;
+    }
+
+    public Item getBucket() {
+        return getDeferredBucket().get();
+    }
+
+    public DeferredItem<BucketItem> getDeferredBucket() {
+        return deferredBucket;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public Supplier<FluidType> registerFluidType(FluidType.Properties properties, Vector4i color, FluidTemplate template) {
+        return () -> new BaseFluidType(template.getStillTexture(), template.getFlowingTexture(), template.getOverlayTexture(), color, properties);
+    }
+}
+
diff --git a/src/main/java/com/portingdeadmods/nautec/api/multiblocks/Multiblock.java b/src/main/java/com/portingdeadmods/nautec/api/multiblocks/Multiblock.java
index d8baa288..ee4f09e7 100644
--- a/src/main/java/com/portingdeadmods/nautec/api/multiblocks/Multiblock.java
+++ b/src/main/java/com/portingdeadmods/nautec/api/multiblocks/Multiblock.java
@@ -87,8 +87,8 @@ public interface Multiblock {
     Int2ObjectMap<Block> getDefinition();
 
     /**
-     * This method provides the block entity type for the controller of your multiblock.
-     * @return the blockentity type of your controllers blockentity
+     * This method provides the block entity resource for the controller of your multiblock.
+     * @return the blockentity resource of your controllers blockentity
      */
     BlockEntityType<? extends MultiblockEntity> getMultiBlockEntityType();
 
diff --git a/src/main/java/com/portingdeadmods/nautec/client/hud/DivingSuitOverlay.java b/src/main/java/com/portingdeadmods/nautec/client/hud/DivingSuitOverlay.java
index ef4d4deb..ebeb15ab 100644
--- a/src/main/java/com/portingdeadmods/nautec/client/hud/DivingSuitOverlay.java
+++ b/src/main/java/com/portingdeadmods/nautec/client/hud/DivingSuitOverlay.java
@@ -3,19 +3,15 @@
 import com.mojang.blaze3d.systems.RenderSystem;
 import com.portingdeadmods.nautec.Nautec;
 import com.portingdeadmods.nautec.data.NTDataComponentsUtils;
-import com.portingdeadmods.nautec.registries.NTFluidTypes;
 import com.portingdeadmods.nautec.registries.NTItems;
 import net.minecraft.client.DeltaTracker;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.GuiGraphics;
 import net.minecraft.resources.ResourceLocation;
-import net.minecraft.tags.FluidTags;
 import net.minecraft.util.Mth;
 import net.minecraft.world.entity.EquipmentSlot;
 import net.minecraft.world.entity.player.Player;
-import net.minecraft.world.item.ItemStack;
 import net.minecraft.world.level.material.Fluids;
-import net.neoforged.neoforge.fluids.FluidType;
 import org.jetbrains.annotations.NotNull;
 
 
diff --git a/src/main/java/com/portingdeadmods/nautec/client/renderer/blockentities/FishingStationBERenderer.java b/src/main/java/com/portingdeadmods/nautec/client/renderer/blockentities/FishingStationBERenderer.java
index 7c7b08cc..1e5e2bc7 100644
--- a/src/main/java/com/portingdeadmods/nautec/client/renderer/blockentities/FishingStationBERenderer.java
+++ b/src/main/java/com/portingdeadmods/nautec/client/renderer/blockentities/FishingStationBERenderer.java
@@ -19,17 +19,13 @@ public FishingStationBERenderer(BlockEntityRendererProvider.Context ctx) {
         this.model.setupAnim();
     }
 
-    private int getLightLevel(Level level, BlockPos pos) {
-        return LevelRenderer.getLightColor(level, pos);
-    }
-
     @Override
     public void render(FishingStationBlockEntity blockEntity, float partialTick, PoseStack poseStack, MultiBufferSource bufferSource, int packedLight, int packedOverlay) {
         poseStack.pushPose();
         {
             poseStack.translate(0.5, 0.5, 0.5);
             poseStack.translate(1.75, -0.125, 0);
-            this.model.renderToBuffer(poseStack, FishingNetModel.MATERIAL.buffer(bufferSource, RenderType::entityCutout), getLightLevel(blockEntity.getLevel(), blockEntity.getBlockPos().above()), packedOverlay);
+            this.model.renderToBuffer(poseStack, FishingNetModel.MATERIAL.buffer(bufferSource, RenderType::entityCutout), packedLight, packedOverlay);
         }
         poseStack.popPose();
     }
diff --git a/src/main/java/com/portingdeadmods/nautec/compat/jei/NTJeiPlugin.java b/src/main/java/com/portingdeadmods/nautec/compat/jei/NTJeiPlugin.java
index 8b73c2b7..cbcff7ee 100644
--- a/src/main/java/com/portingdeadmods/nautec/compat/jei/NTJeiPlugin.java
+++ b/src/main/java/com/portingdeadmods/nautec/compat/jei/NTJeiPlugin.java
@@ -5,6 +5,7 @@
 import com.portingdeadmods.nautec.content.recipes.*;
 import com.portingdeadmods.nautec.datagen.recipeBuilder.AugmentationRecipeBuilder;
 import com.portingdeadmods.nautec.registries.NTBlocks;
+import com.portingdeadmods.nautec.registries.NTFluids;
 import com.portingdeadmods.nautec.registries.NTItems;
 import mezz.jei.api.IModPlugin;
 import mezz.jei.api.JeiPlugin;
@@ -93,7 +94,7 @@ public void registerRecipes(IRecipeRegistration registration) {
     public void registerRecipeCatalysts(IRecipeCatalystRegistration registration) {
         registration.addRecipeCatalyst(new ItemStack(NTBlocks.AQUATIC_CATALYST.get()),
                 AquaticCatalystChannelingRecipeCategory.RECIPE_TYPE);
-        registration.addRecipeCatalyst(new ItemStack(NTItems.ETCHING_ACID_BUCKET.get()),
+        registration.addRecipeCatalyst(new ItemStack(NTFluids.ETCHING_ACID.getBucket()),
                 ItemEtchingRecipeCategory.RECIPE_TYPE);
         registration.addRecipeCatalyst(new ItemStack(NTBlocks.MIXER.get()),
                 MixingRecipeCategory.RECIPE_TYPE);
diff --git a/src/main/java/com/portingdeadmods/nautec/compat/jei/categories/ItemEtchingRecipeCategory.java b/src/main/java/com/portingdeadmods/nautec/compat/jei/categories/ItemEtchingRecipeCategory.java
index 58ecbaee..8cb17040 100644
--- a/src/main/java/com/portingdeadmods/nautec/compat/jei/categories/ItemEtchingRecipeCategory.java
+++ b/src/main/java/com/portingdeadmods/nautec/compat/jei/categories/ItemEtchingRecipeCategory.java
@@ -1,7 +1,9 @@
 package com.portingdeadmods.nautec.compat.jei.categories;
 
 import com.portingdeadmods.nautec.Nautec;
+import com.portingdeadmods.nautec.api.fluids.NTFluid;
 import com.portingdeadmods.nautec.content.recipes.ItemEtchingRecipe;
+import com.portingdeadmods.nautec.registries.NTFluids;
 import com.portingdeadmods.nautec.registries.NTItems;
 import mezz.jei.api.constants.VanillaTypes;
 import mezz.jei.api.gui.builder.IRecipeLayoutBuilder;
@@ -32,7 +34,7 @@ public class ItemEtchingRecipeCategory implements IRecipeCategory<ItemEtchingRec
 
     public ItemEtchingRecipeCategory(IGuiHelper helper) {
         this.background = helper.createBlankDrawable(80, 28);
-        this.icon = helper.createDrawableIngredient(VanillaTypes.ITEM_STACK, new ItemStack(NTItems.ETCHING_ACID_BUCKET.get()));
+        this.icon = helper.createDrawableIngredient(VanillaTypes.ITEM_STACK, new ItemStack(NTFluids.ETCHING_ACID.getBucket()));
     }
 
     @Override
diff --git a/src/main/java/com/portingdeadmods/nautec/compat/modonomicon/datagen/book/nautec_guide/laser_chemistry/ChemistryIntroductionEntry.java b/src/main/java/com/portingdeadmods/nautec/compat/modonomicon/datagen/book/nautec_guide/laser_chemistry/ChemistryIntroductionEntry.java
index 213d20e9..d108517e 100644
--- a/src/main/java/com/portingdeadmods/nautec/compat/modonomicon/datagen/book/nautec_guide/laser_chemistry/ChemistryIntroductionEntry.java
+++ b/src/main/java/com/portingdeadmods/nautec/compat/modonomicon/datagen/book/nautec_guide/laser_chemistry/ChemistryIntroductionEntry.java
@@ -7,6 +7,7 @@
 import com.klikli_dev.modonomicon.api.datagen.book.page.BookSpotlightPageModel;
 import com.klikli_dev.modonomicon.api.datagen.book.page.BookTextPageModel;
 import com.mojang.datafixers.util.Pair;
+import com.portingdeadmods.nautec.registries.NTFluids;
 import com.portingdeadmods.nautec.registries.NTItems;
 
 public class ChemistryIntroductionEntry extends EntryProvider {
@@ -34,7 +35,7 @@ protected void generatePages() {
                 """);
         this.page("eas", () -> BookSpotlightPageModel.create()
                         .withTitle(this.context().pageTitle())
-                        .withItem(NTItems.EAS_BUCKET.get())
+                        .withItem(NTFluids.EAS.getBucket())
                         .withText(this.context().pageText()));
         this.pageTitle("Electrolyte Algae Serum");
         this.pageText("""
@@ -46,7 +47,7 @@ Electrolyte Algae Serum (EAS) is one of the first chemicals
 
         this.page("salt_water", () -> BookSpotlightPageModel.create()
                         .withTitle(this.context().pageTitle())
-                        .withItem(NTItems.SALT_WATER_BUCKET.get())
+                        .withItem(NTFluids.SALT_WATER.getBucket())
                         .withText(this.context().pageText()));
         this.pageTitle("Salt Water");
         this.pageText("""
@@ -75,7 +76,7 @@ protected Pair<Integer, Integer> entryBackground() {
 
     @Override
     protected BookIconModel entryIcon() {
-        return BookIconModel.create(NTItems.EAS_BUCKET.get());
+        return BookIconModel.create(NTFluids.EAS.getBucket());
     }
 
     @Override
diff --git a/src/main/java/com/portingdeadmods/nautec/content/bacteria/BacteriaStats.java b/src/main/java/com/portingdeadmods/nautec/content/bacteria/BacteriaStats.java
index 766cd44d..31fe54e3 100644
--- a/src/main/java/com/portingdeadmods/nautec/content/bacteria/BacteriaStats.java
+++ b/src/main/java/com/portingdeadmods/nautec/content/bacteria/BacteriaStats.java
@@ -2,21 +2,22 @@
 
 import com.mojang.serialization.Codec;
 import com.mojang.serialization.codecs.RecordCodecBuilder;
+import com.portingdeadmods.nautec.api.bacteria.BaseBacteriaStats;
 import com.portingdeadmods.nautec.utils.codec.CodecUtils;
 import net.minecraft.network.RegistryFriendlyByteBuf;
 import net.minecraft.network.codec.ByteBufCodecs;
 import net.minecraft.network.codec.StreamCodec;
 import net.minecraft.world.item.Item;
 
-public record BacteriaStats(Item type,
+public record BacteriaStats(Item resource,
                             float growthRate,
                             float mutationResistance,
                             float productionRate,
                             int lifespan,
-                            int color) {
+                            int color) implements BaseBacteriaStats {
     public static final Codec<BacteriaStats> CODEC = RecordCodecBuilder.create(
             instance -> instance.group(
-                    CodecUtils.ITEM_CODEC.fieldOf("type").forGetter(BacteriaStats::type),
+                    CodecUtils.ITEM_CODEC.fieldOf("type").forGetter(BacteriaStats::resource),
                     Codec.FLOAT.fieldOf("growth_rate").forGetter(BacteriaStats::growthRate),
                     Codec.FLOAT.fieldOf("mutation_resistance").forGetter(BacteriaStats::mutationResistance),
                     Codec.FLOAT.fieldOf("production_rate").forGetter(BacteriaStats::productionRate),
@@ -27,7 +28,7 @@ public record BacteriaStats(Item type,
 
     public static final StreamCodec<RegistryFriendlyByteBuf, BacteriaStats> STREAM_CODEC = StreamCodec.composite(
             CodecUtils.ITEM_STREAM_CODEC,
-            BacteriaStats::type,
+            BacteriaStats::resource,
             ByteBufCodecs.FLOAT,
             BacteriaStats::growthRate,
             ByteBufCodecs.FLOAT,
diff --git a/src/main/java/com/portingdeadmods/nautec/content/blockentities/multiblock/controller/DrainBlockEntity.java b/src/main/java/com/portingdeadmods/nautec/content/blockentities/multiblock/controller/DrainBlockEntity.java
index ec874971..d9ce4ed0 100644
--- a/src/main/java/com/portingdeadmods/nautec/content/blockentities/multiblock/controller/DrainBlockEntity.java
+++ b/src/main/java/com/portingdeadmods/nautec/content/blockentities/multiblock/controller/DrainBlockEntity.java
@@ -134,7 +134,7 @@ private void performDraining() {
             if (hasWater()) {
                 if (openAndFormed()) {
                     if (level.getBiome(worldPosition).is(BiomeTags.IS_OCEAN)) {
-                        getFluidHandler().fill(new FluidStack(NTFluids.SALT_WATER_SOURCE.get(), NTConfig.drainSaltWaterAmount), IFluidHandler.FluidAction.EXECUTE);
+                        getFluidHandler().fill(new FluidStack(NTFluids.SALT_WATER.getStillFluid(), NTConfig.drainSaltWaterAmount), IFluidHandler.FluidAction.EXECUTE);
                     }
                 }
             }
diff --git a/src/main/java/com/portingdeadmods/nautec/content/blocks/FishingStationBlock.java b/src/main/java/com/portingdeadmods/nautec/content/blocks/FishingStationBlock.java
index d378d0cd..9828c199 100644
--- a/src/main/java/com/portingdeadmods/nautec/content/blocks/FishingStationBlock.java
+++ b/src/main/java/com/portingdeadmods/nautec/content/blocks/FishingStationBlock.java
@@ -4,14 +4,34 @@
 import com.portingdeadmods.nautec.api.blockentities.ContainerBlockEntity;
 import com.portingdeadmods.nautec.api.blocks.blockentities.LaserBlock;
 import com.portingdeadmods.nautec.registries.NTBlockEntityTypes;
+import net.minecraft.core.BlockPos;
+import net.minecraft.world.level.BlockGetter;
 import net.minecraft.world.level.block.BaseEntityBlock;
+import net.minecraft.world.level.block.Block;
 import net.minecraft.world.level.block.entity.BlockEntityType;
+import net.minecraft.world.level.block.state.BlockState;
+import net.minecraft.world.phys.shapes.CollisionContext;
+import net.minecraft.world.phys.shapes.Shapes;
+import net.minecraft.world.phys.shapes.VoxelShape;
+
+import java.util.stream.Stream;
 
 public class FishingStationBlock extends LaserBlock {
+    public static final VoxelShape SHAPE = Stream.of(
+            Block.box(0, 10, 0, 16, 16, 16),
+            Block.box(4, 6, 4, 12, 10, 12),
+            Block.box(0, 0, 0, 16, 6, 16)
+    ).reduce(Shapes::or).get();
+
     public FishingStationBlock(Properties properties) {
         super(properties);
     }
 
+    @Override
+    protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) {
+        return SHAPE;
+    }
+
     @Override
     public BlockEntityType<? extends ContainerBlockEntity> getBlockEntityType() {
         return NTBlockEntityTypes.FISHING_STATION.get();
diff --git a/src/main/java/com/portingdeadmods/nautec/content/commands/arguments/AugmentTypeArgumentType.java b/src/main/java/com/portingdeadmods/nautec/content/commands/arguments/AugmentTypeArgumentType.java
index 7ec38e5c..aa4a0a4b 100644
--- a/src/main/java/com/portingdeadmods/nautec/content/commands/arguments/AugmentTypeArgumentType.java
+++ b/src/main/java/com/portingdeadmods/nautec/content/commands/arguments/AugmentTypeArgumentType.java
@@ -21,7 +21,7 @@ public class AugmentTypeArgumentType implements ArgumentType<AugmentType<?>> {
     private static final AugmentTypeArgumentType INSTANCE = new AugmentTypeArgumentType();
 
     private static final DynamicCommandExceptionType UNKNOWN_TYPE = new DynamicCommandExceptionType(
-            type -> Component.literal("Unknown augment type: " + type));
+            type -> Component.literal("Unknown augment resource: " + type));
     public static Set<String> suggestions = new HashSet<>();
 
     private AugmentTypeArgumentType() {
diff --git a/src/main/java/com/portingdeadmods/nautec/content/fluids/EASFluid.java b/src/main/java/com/portingdeadmods/nautec/content/fluids/EASFluid.java
new file mode 100644
index 00000000..740b6cb7
--- /dev/null
+++ b/src/main/java/com/portingdeadmods/nautec/content/fluids/EASFluid.java
@@ -0,0 +1,25 @@
+package com.portingdeadmods.nautec.content.fluids;
+
+import com.portingdeadmods.nautec.api.fluids.NTFluid;
+import net.minecraft.world.level.block.Blocks;
+import net.minecraft.world.level.block.state.BlockBehaviour;
+import net.neoforged.neoforge.fluids.BaseFlowingFluid;
+import net.neoforged.neoforge.fluids.FluidType;
+import org.joml.Vector4i;
+
+public class EASFluid extends NTFluid {
+    public EASFluid(String name) {
+        super(name);
+        this.fluidType = registerFluidType(FluidType.Properties.create(), new Vector4i(255, 255, 255, 255), FluidTemplates.EAS);
+    }
+
+    @Override
+    public BaseFlowingFluid.Properties fluidProperties() {
+        return super.fluidProperties().block(this.block).bucket(this.deferredBucket);
+    }
+
+    @Override
+    public BlockBehaviour.Properties blockProperties() {
+        return BlockBehaviour.Properties.ofFullCopy(Blocks.WATER);
+    }
+}
diff --git a/src/main/java/com/portingdeadmods/nautec/content/fluids/EtchingAcidFluid.java b/src/main/java/com/portingdeadmods/nautec/content/fluids/EtchingAcidFluid.java
new file mode 100644
index 00000000..089d193d
--- /dev/null
+++ b/src/main/java/com/portingdeadmods/nautec/content/fluids/EtchingAcidFluid.java
@@ -0,0 +1,25 @@
+package com.portingdeadmods.nautec.content.fluids;
+
+import com.portingdeadmods.nautec.api.fluids.NTFluid;
+import net.minecraft.world.level.block.Blocks;
+import net.minecraft.world.level.block.state.BlockBehaviour;
+import net.neoforged.neoforge.fluids.BaseFlowingFluid;
+import net.neoforged.neoforge.fluids.FluidType;
+import org.joml.Vector4i;
+
+public class EtchingAcidFluid extends NTFluid {
+    public EtchingAcidFluid(String name) {
+        super(name);
+        this.fluidType = registerFluidType(FluidType.Properties.create(), new Vector4i(255, 255, 255, 255), FluidTemplates.ETCHING_ACID);
+    }
+
+    @Override
+    public BaseFlowingFluid.Properties fluidProperties() {
+        return super.fluidProperties().block(this.block).bucket(this.deferredBucket);
+    }
+
+    @Override
+    public BlockBehaviour.Properties blockProperties() {
+        return BlockBehaviour.Properties.ofFullCopy(Blocks.LAVA);
+    }
+}
diff --git a/src/main/java/com/portingdeadmods/nautec/content/fluids/FluidTemplates.java b/src/main/java/com/portingdeadmods/nautec/content/fluids/FluidTemplates.java
new file mode 100644
index 00000000..d9c59af9
--- /dev/null
+++ b/src/main/java/com/portingdeadmods/nautec/content/fluids/FluidTemplates.java
@@ -0,0 +1,52 @@
+package com.portingdeadmods.nautec.content.fluids;
+
+import com.portingdeadmods.nautec.Nautec;
+import com.portingdeadmods.nautec.api.fluids.FluidTemplate;
+import net.minecraft.resources.ResourceLocation;
+
+public enum FluidTemplates implements FluidTemplate {
+    MOLTEN_METAL(ResourceLocation.fromNamespaceAndPath(Nautec.MODID, "fluid/molten_fluid_still"),
+            ResourceLocation.fromNamespaceAndPath(Nautec.MODID, "fluid/molten_fluid_flow"),
+            ResourceLocation.fromNamespaceAndPath(Nautec.MODID, "fluid/molten_fluid_overlay")),
+    OIL(ResourceLocation.fromNamespaceAndPath(Nautec.MODID, "fluid/oil_fluid_still"),
+            ResourceLocation.fromNamespaceAndPath(Nautec.MODID, "fluid/oil_fluid_flow"),
+            ResourceLocation.fromNamespaceAndPath(Nautec.MODID, "fluid/oil_overlay")),
+    EAS(modFluidTexture("eas_fluid"),
+            modFluidTexture("eas_fluid"),
+            ResourceLocation.fromNamespaceAndPath(Nautec.MODID, "misc/in_water")),
+    ETCHING_ACID(modFluidTexture("etching_acid"),
+            modFluidTexture("etching_acid"),
+            ResourceLocation.fromNamespaceAndPath(Nautec.MODID, "misc/in_water")),
+    WATER(ResourceLocation.parse("block/water_still"),
+            ResourceLocation.parse("block/water_flow"),
+            ResourceLocation.fromNamespaceAndPath(Nautec.MODID, "misc/in_soap_water"));
+
+    private final ResourceLocation still;
+    private final ResourceLocation flowing;
+    private final ResourceLocation overlay;
+
+    FluidTemplates(ResourceLocation still, ResourceLocation flowing, ResourceLocation overlay) {
+        this.still = still;
+        this.flowing = flowing;
+        this.overlay = overlay;
+    }
+
+    @Override
+    public ResourceLocation getStillTexture() {
+        return still;
+    }
+
+    @Override
+    public ResourceLocation getFlowingTexture() {
+        return flowing;
+    }
+
+    @Override
+    public ResourceLocation getOverlayTexture() {
+        return overlay;
+    }
+
+    private static ResourceLocation modFluidTexture(String name) {
+        return ResourceLocation.fromNamespaceAndPath(Nautec.MODID, "fluid/" + name);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/portingdeadmods/nautec/content/fluids/OilFluid.java b/src/main/java/com/portingdeadmods/nautec/content/fluids/OilFluid.java
new file mode 100644
index 00000000..dfdd936f
--- /dev/null
+++ b/src/main/java/com/portingdeadmods/nautec/content/fluids/OilFluid.java
@@ -0,0 +1,25 @@
+package com.portingdeadmods.nautec.content.fluids;
+
+import com.portingdeadmods.nautec.api.fluids.NTFluid;
+import net.minecraft.world.level.block.Blocks;
+import net.minecraft.world.level.block.state.BlockBehaviour;
+import net.neoforged.neoforge.fluids.BaseFlowingFluid;
+import net.neoforged.neoforge.fluids.FluidType;
+import org.joml.Vector4i;
+
+public class OilFluid extends NTFluid {
+    public OilFluid(String name) {
+        super(name);
+        this.fluidType = registerFluidType(FluidType.Properties.create(), new Vector4i(255, 255, 255, 255), FluidTemplates.OIL);
+    }
+
+    @Override
+    public BaseFlowingFluid.Properties fluidProperties() {
+        return super.fluidProperties().block(this.block).bucket(this.deferredBucket);
+    }
+
+    @Override
+    public BlockBehaviour.Properties blockProperties() {
+        return BlockBehaviour.Properties.ofFullCopy(Blocks.LAVA);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/portingdeadmods/nautec/content/fluids/SaltWaterFluid.java b/src/main/java/com/portingdeadmods/nautec/content/fluids/SaltWaterFluid.java
new file mode 100644
index 00000000..0cbfb468
--- /dev/null
+++ b/src/main/java/com/portingdeadmods/nautec/content/fluids/SaltWaterFluid.java
@@ -0,0 +1,25 @@
+package com.portingdeadmods.nautec.content.fluids;
+
+import com.portingdeadmods.nautec.api.fluids.NTFluid;
+import net.minecraft.world.level.block.Blocks;
+import net.minecraft.world.level.block.state.BlockBehaviour;
+import net.neoforged.neoforge.fluids.BaseFlowingFluid;
+import net.neoforged.neoforge.fluids.FluidType;
+import org.joml.Vector4i;
+
+public class SaltWaterFluid extends NTFluid {
+    public SaltWaterFluid(String name) {
+        super(name);
+        this.fluidType = registerFluidType(FluidType.Properties.create(), new Vector4i(174, 227, 227, 176), FluidTemplates.WATER);
+    }
+
+    @Override
+    public BaseFlowingFluid.Properties fluidProperties() {
+        return super.fluidProperties().block(this.block).bucket(this.deferredBucket);
+    }
+
+    @Override
+    public BlockBehaviour.Properties blockProperties() {
+        return BlockBehaviour.Properties.ofFullCopy(Blocks.WATER);
+    }
+}
diff --git a/src/main/java/com/portingdeadmods/nautec/datagen/BlockModelProvider.java b/src/main/java/com/portingdeadmods/nautec/datagen/BlockModelProvider.java
index 751d7c30..5a24d082 100644
--- a/src/main/java/com/portingdeadmods/nautec/datagen/BlockModelProvider.java
+++ b/src/main/java/com/portingdeadmods/nautec/datagen/BlockModelProvider.java
@@ -62,6 +62,18 @@ protected void registerStatesAndModels() {
         augmentationStationExtension(NTBlocks.AUGMENTATION_STATION_EXTENSION.get());
 
         simpleBlock(NTBlocks.DRAIN_WALL.get());
+
+        axisBlock(NTBlocks.OIL_BARREL.get(), models().cubeBottomTop(
+                name(NTBlocks.OIL_BARREL.get()),
+                blockTexture(NTBlocks.OIL_BARREL.get(), "_side"),
+                blockTexture(NTBlocks.OIL_BARREL.get(), "_bottom"),
+                blockTexture(NTBlocks.OIL_BARREL.get())
+        ), models().cubeBottomTop(
+                name(NTBlocks.OIL_BARREL.get()) + "_horizontal",
+                blockTexture(NTBlocks.OIL_BARREL.get(), "_side"),
+                blockTexture(NTBlocks.OIL_BARREL.get()),
+                blockTexture(NTBlocks.OIL_BARREL.get(), "_bottom")
+        ));
     }
 
     private void augmentationStationController(AugmentationStationBlock augmentationStationBlock) {
@@ -275,6 +287,11 @@ private ModelFile createActiveACModel(AquaticCatalystBlock block, Direction acti
         return builder;
     }
 
+    public ResourceLocation blockTexture(Block block, String suffix) {
+        ResourceLocation name = key(block);
+        return ResourceLocation.fromNamespaceAndPath(name.getNamespace(), ModelProvider.BLOCK_FOLDER + "/" + name.getPath() + suffix);
+    }
+
     private ResourceLocation existingModelFile(Block block) {
         ResourceLocation name = key(block);
         return ResourceLocation.fromNamespaceAndPath(name.getNamespace(), ModelProvider.BLOCK_FOLDER + "/" + name.getPath());
diff --git a/src/main/java/com/portingdeadmods/nautec/datagen/EnUsProvider.java b/src/main/java/com/portingdeadmods/nautec/datagen/EnUsProvider.java
index 1ab84e4c..f432408d 100644
--- a/src/main/java/com/portingdeadmods/nautec/datagen/EnUsProvider.java
+++ b/src/main/java/com/portingdeadmods/nautec/datagen/EnUsProvider.java
@@ -3,9 +3,8 @@
 import com.klikli_dev.modonomicon.api.datagen.AbstractModonomiconLanguageProvider;
 import com.klikli_dev.modonomicon.api.datagen.ModonomiconLanguageProvider;
 import com.portingdeadmods.nautec.Nautec;
-import com.portingdeadmods.nautec.compat.modonomicon.ModonomiconCompat;
 import com.portingdeadmods.nautec.registries.NTBlocks;
-import com.portingdeadmods.nautec.registries.NTFluidTypes;
+import com.portingdeadmods.nautec.registries.NTFluids;
 import com.portingdeadmods.nautec.utils.Utils;
 import net.minecraft.data.PackOutput;
 import net.neoforged.neoforge.fluids.FluidType;
@@ -27,16 +26,16 @@ protected void addTranslations() {
 
         add("nautec.creative_tab.main", "NauTec");
 
-        addFluidType(NTFluidTypes.SALT_WATER_FLUID_TYPE, "Salt Water");
-        addFluidType(NTFluidTypes.EAS_FLUID_TYPE, "Electrolyte Algae Serum");
-        addFluidType(NTFluidTypes.ETCHING_ACID_FLUID_TYPE, "Etching Acid");
+        addFluidType(NTFluids.SALT_WATER.getFluidType(), "Salt Water");
+        addFluidType(NTFluids.EAS.getFluidType(), "Electrolyte Algae Serum");
+        addFluidType(NTFluids.ETCHING_ACID.getFluidType(), "Etching Acid");
 
         addItem(PRISM_MONOCLE, "Prism Monocle");
         addItem(AQUARINE_STEEL_INGOT, "Aquarine Steel Ingot");
         addItem(ATLANTIC_GOLD_INGOT, "Atlantic Gold Ingot");
         addItem(ATLANTIC_GOLD_NUGGET, "Atlantic Gold Nugget");
-        addItem(SALT_WATER_BUCKET, "Salt Water Bucket");
-        addItem(EAS_BUCKET, "Electrolyte Algae Serum (EAS) Bucket");
+        addItem(NTFluids.SALT_WATER.getDeferredBucket(), "Salt Water Bucket");
+        addItem(NTFluids.EAS.getDeferredBucket(), "Electrolyte Algae Serum (EAS) Bucket");
         addItem(GLASS_VIAL, "Glass Vial");
         addItem(ELECTROLYTE_ALGAE_SERUM_VIAL, "Electrolyte Algae Serum (EAS) Vial");
         addItem(CROWBAR, "Crowbar");
diff --git a/src/main/java/com/portingdeadmods/nautec/datagen/ItemModelProvider.java b/src/main/java/com/portingdeadmods/nautec/datagen/ItemModelProvider.java
index 17f115bc..a7f06e25 100644
--- a/src/main/java/com/portingdeadmods/nautec/datagen/ItemModelProvider.java
+++ b/src/main/java/com/portingdeadmods/nautec/datagen/ItemModelProvider.java
@@ -1,16 +1,22 @@
 package com.portingdeadmods.nautec.datagen;
 
 import com.portingdeadmods.nautec.Nautec;
+import com.portingdeadmods.nautec.api.fluids.NTFluid;
 import com.portingdeadmods.nautec.registries.NTBlocks;
+import com.portingdeadmods.nautec.registries.NTFluids;
 import com.portingdeadmods.nautec.registries.NTItems;
 import net.minecraft.core.registries.BuiltInRegistries;
 import net.minecraft.data.PackOutput;
 import net.minecraft.resources.ResourceLocation;
 import net.minecraft.world.item.BlockItem;
 import net.minecraft.world.item.Item;
+import net.minecraft.world.level.ItemLike;
+import net.minecraft.world.level.material.Fluid;
 import net.neoforged.neoforge.client.model.generators.ItemModelBuilder;
 import net.neoforged.neoforge.client.model.generators.ModelFile;
+import net.neoforged.neoforge.client.model.generators.loaders.DynamicFluidContainerModelBuilder;
 import net.neoforged.neoforge.common.data.ExistingFileHelper;
+import org.jetbrains.annotations.NotNull;
 
 import java.util.Objects;
 import java.util.function.Supplier;
@@ -65,9 +71,9 @@ protected void registerModels() {
         handHeldItem(NTItems.AQUARINE_WRENCH.get());
         handHeldItem(NTItems.CROWBAR.get());
 
-        basicItem(NTItems.SALT_WATER_BUCKET.get());
-        basicItem(NTItems.EAS_BUCKET.get());
-        basicItem(NTItems.ETCHING_ACID_BUCKET.get());
+        for (NTFluid fluid : NTFluids.HELPER.getFluids()) {
+            bucket(fluid.getStillFluid());
+        }
 
         aquarineSteelTool(NTItems.AQUARINE_AXE.get());
         aquarineSteelTool(NTItems.AQUARINE_HOE.get());
@@ -86,6 +92,16 @@ protected void registerModels() {
         blockItems();
     }
 
+    private void bucket(Fluid f) {
+        withExistingParent(key(f.getBucket()).getPath(), ResourceLocation.fromNamespaceAndPath("neoforge", "item/bucket"))
+                .customLoader(DynamicFluidContainerModelBuilder::begin)
+                .fluid(f);
+    }
+
+    private static @NotNull ResourceLocation key(ItemLike item) {
+        return BuiltInRegistries.ITEM.getKey(item.asItem());
+    }
+
     private void blockItems() {
         for (Supplier<BlockItem> blockItem : NTItems.BLOCK_ITEMS) {
             parentItemBlock(blockItem.get());
diff --git a/src/main/java/com/portingdeadmods/nautec/datagen/RecipesProvider.java b/src/main/java/com/portingdeadmods/nautec/datagen/RecipesProvider.java
index 30cb2d21..fa198372 100644
--- a/src/main/java/com/portingdeadmods/nautec/datagen/RecipesProvider.java
+++ b/src/main/java/com/portingdeadmods/nautec/datagen/RecipesProvider.java
@@ -492,7 +492,7 @@ private static void divingArmorRecipes(@NotNull RecipeOutput pRecipeOutput) {
                 .duration(200)
                 .save(pRecipeOutput);
 
-        ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, NTItems.ETCHING_ACID_BUCKET)
+        ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, NTFluids.ETCHING_ACID.getBucket())
                 .requires(Items.POISONOUS_POTATO)
                 .requires(Items.GUNPOWDER)
                 .requires(Items.BONE_MEAL)
@@ -509,8 +509,8 @@ private static void chemistryRecipes(@NotNull RecipeOutput pRecipeOutput) {
                         iwcFromItemLike(Items.PRISMARINE_CRYSTALS, 1),
                         iwcFromItemLike(Items.SEAGRASS, 5))
                 .duration(200)
-                .fluidIngredient(new FluidStack(NTFluids.SALT_WATER_SOURCE.get(), 1000))
-                .fluidResult(new FluidStack(NTFluids.EAS_SOURCE.get(), 1000))
+                .fluidIngredient(new FluidStack(NTFluids.SALT_WATER.getStillFluid(), 1000))
+                .fluidResult(new FluidStack(NTFluids.EAS.getStillFluid(), 1000))
                 .save(pRecipeOutput);
 
         MixingRecipeBuilder.newRecipe(ItemStack.EMPTY)
@@ -518,15 +518,15 @@ private static void chemistryRecipes(@NotNull RecipeOutput pRecipeOutput) {
                         iwcFromItemLike(Items.GUNPOWDER, 1),
                         iwcFromItemLike(Items.BONE_MEAL, 1))
                 .duration(150)
-                .fluidIngredient(new FluidStack(NTFluids.SALT_WATER_SOURCE.get(), 1000))
-                .fluidResult(new FluidStack(NTFluids.ETCHING_ACID_SOURCE.get(), 1000))
+                .fluidIngredient(new FluidStack(NTFluids.SALT_WATER.getStillFluid(), 1000))
+                .fluidResult(new FluidStack(NTFluids.ETCHING_ACID.getStillFluid(), 1000))
                 .save(pRecipeOutput);
 
         MixingRecipeBuilder.newRecipe(NTItems.AQUARINE_STEEL_COMPOUND.toStack(5))
                 .ingredients(iwcFromItemLike(Items.RAW_IRON, 2),
                         iwcFromItemLike(Items.PRISMARINE_CRYSTALS, 1))
                 .duration(100)
-                .fluidIngredient(new FluidStack(NTFluids.SALT_WATER_SOURCE.get(), 1000))
+                .fluidIngredient(new FluidStack(NTFluids.SALT_WATER.getStillFluid(), 1000))
                 .fluidResult(FluidStack.EMPTY)
                 .save(pRecipeOutput);
     }
diff --git a/src/main/java/com/portingdeadmods/nautec/events/NTEvents.java b/src/main/java/com/portingdeadmods/nautec/events/NTEvents.java
index deb98350..fa66537f 100644
--- a/src/main/java/com/portingdeadmods/nautec/events/NTEvents.java
+++ b/src/main/java/com/portingdeadmods/nautec/events/NTEvents.java
@@ -6,6 +6,7 @@
 import com.portingdeadmods.nautec.api.augments.Augment;
 import com.portingdeadmods.nautec.api.augments.AugmentSlot;
 import com.portingdeadmods.nautec.api.augments.AugmentType;
+import com.portingdeadmods.nautec.api.fluids.NTFluid;
 import com.portingdeadmods.nautec.api.items.IPowerItem;
 import com.portingdeadmods.nautec.capabilities.NTCapabilities;
 import com.portingdeadmods.nautec.capabilities.power.IPowerStorage;
@@ -56,11 +57,11 @@ public static void onItemEntityTick(EntityTickEvent.Post event) {
             if (event.getEntity() instanceof ItemEntity itemEntity) {
                 Level level = itemEntity.level();
 
-                if (itemEntity.isInFluidType(NTFluidTypes.ETCHING_ACID_FLUID_TYPE.get())) {
+                if (itemEntity.isInFluidType(NTFluids.ETCHING_ACID.getFluidType().get())) {
                     ItemEtching.processItemEtching(itemEntity, level);
                 }
 
-                if (itemEntity.isInFluidType(NTFluidTypes.EAS_FLUID_TYPE.get()) || level.getBlockState(itemEntity.blockPosition().below()).getFluidState().is(NTFluids.EAS_SOURCE.get())) {
+                if (itemEntity.isInFluidType(NTFluids.EAS.getFluidType().get()) || level.getBlockState(itemEntity.blockPosition().below()).getFluidState().is(NTFluids.EAS.getStillFluid())) {
                     ItemInfusion.processPowerItemInfusion(itemEntity, level);
                 }
             }
diff --git a/src/main/java/com/portingdeadmods/nautec/mixin/BucketItemMixin.java b/src/main/java/com/portingdeadmods/nautec/mixin/BucketItemMixin.java
index 91c66c04..eb2c1c0c 100644
--- a/src/main/java/com/portingdeadmods/nautec/mixin/BucketItemMixin.java
+++ b/src/main/java/com/portingdeadmods/nautec/mixin/BucketItemMixin.java
@@ -1,6 +1,7 @@
 package com.portingdeadmods.nautec.mixin;
 
 import com.portingdeadmods.nautec.NTConfig;
+import com.portingdeadmods.nautec.registries.NTFluids;
 import com.portingdeadmods.nautec.registries.NTItems;
 import net.minecraft.advancements.CriteriaTriggers;
 import net.minecraft.core.BlockPos;
@@ -51,7 +52,7 @@ private void onUse(Level level, Player player, InteractionHand hand, CallbackInf
                         ItemStack filledBucket = bucketPickup.pickupBlock(player, level, blockPos, blockState);
                         if (!filledBucket.isEmpty()) {
 
-                            filledBucket = new ItemStack(NTItems.SALT_WATER_BUCKET.asItem());
+                            filledBucket = new ItemStack(NTFluids.SALT_WATER.getBucket());
                             player.awardStat(Stats.ITEM_USED.get(Items.BUCKET));
 
                             bucketPickup.getPickupSound(blockState).ifPresent(soundEvent ->
diff --git a/src/main/java/com/portingdeadmods/nautec/registries/NTBlocks.java b/src/main/java/com/portingdeadmods/nautec/registries/NTBlocks.java
index c9179655..85eceeef 100644
--- a/src/main/java/com/portingdeadmods/nautec/registries/NTBlocks.java
+++ b/src/main/java/com/portingdeadmods/nautec/registries/NTBlocks.java
@@ -35,6 +35,10 @@ public final class NTBlocks {
             BlockBehaviour.Properties.ofFullCopy(Blocks.BARREL));
     public static final DeferredBlock<CrateBlock> RUSTY_CRATE = registerBlockAndItem("rusty_crate", CrateBlock::new,
             BlockBehaviour.Properties.ofFullCopy(Blocks.BARREL));
+    public static final DeferredBlock<RotatedPillarBlock> OIL_BARREL = registerBlockAndItem("oil_barrel", RotatedPillarBlock::new,
+            BlockBehaviour.Properties.ofFullCopy(Blocks.IRON_BLOCK));
+    public static final DeferredBlock<Block> BROWN_POLYMER_BLOCK = registerBlockAndItem("brown_polymer_block", Block::new,
+            BlockBehaviour.Properties.ofFullCopy(Blocks.IRON_BLOCK));
     public static final DeferredBlock<RotatedPillarBlock> DARK_PRISMARINE_PILLAR = registerBlockAndItem("dark_prismarine_pillar", RotatedPillarBlock::new,
             BlockBehaviour.Properties.ofFullCopy(Blocks.DARK_PRISMARINE));
     public static final DeferredBlock<Block> CHISELED_DARK_PRISMARINE = registerBlockAndItem("chiseled_dark_prismarine", Block::new,
@@ -91,17 +95,6 @@ public final class NTBlocks {
             AugmentationStationExtensionBlock::new,
             BlockBehaviour.Properties.ofFullCopy(Blocks.DARK_PRISMARINE));
 
-
-    // FLUIDS
-    public static final DeferredBlock<LiquidBlock> SALT_WATER_FLUID_BLOCK = BLOCKS.register("salt_water_block",
-            () -> new LiquidBlock(NTFluids.SALT_WATER_SOURCE.get(), BlockBehaviour.Properties.ofFullCopy(Blocks.WATER)));
-
-    public static final DeferredBlock<LiquidBlock> EAS_FLUID_BLOCK = BLOCKS.register("electrolyte_algae_serum_block",
-            () -> new LiquidBlock(NTFluids.EAS_SOURCE.get(), BlockBehaviour.Properties.ofFullCopy(Blocks.WATER)));
-
-    public static final DeferredBlock<LiquidBlock> ETCHING_ACID_FLUID_BLOCK = BLOCKS.register("etching_acid_block",
-            () -> new LiquidBlock(NTFluids.ETCHING_ACID_SOURCE.get(), BlockBehaviour.Properties.ofFullCopy(Blocks.WATER)));
-
     public static final DeferredBlock<CreativePowerSourceBlock> CREATIVE_POWER_SOURCE = registerBlockAndItem("creative_power_source", CreativePowerSourceBlock::new,
             BlockBehaviour.Properties.ofFullCopy(Blocks.IRON_BLOCK), false, true);
 
diff --git a/src/main/java/com/portingdeadmods/nautec/registries/NTCreativeTabs.java b/src/main/java/com/portingdeadmods/nautec/registries/NTCreativeTabs.java
index 8f0bd997..4efb2088 100644
--- a/src/main/java/com/portingdeadmods/nautec/registries/NTCreativeTabs.java
+++ b/src/main/java/com/portingdeadmods/nautec/registries/NTCreativeTabs.java
@@ -3,6 +3,7 @@
 import com.portingdeadmods.nautec.NTRegistries;
 import com.portingdeadmods.nautec.Nautec;
 import com.portingdeadmods.nautec.api.bacteria.Bacteria;
+import com.portingdeadmods.nautec.api.fluids.NTFluid;
 import com.portingdeadmods.nautec.api.items.IBacteriaItem;
 import com.portingdeadmods.nautec.api.items.IPowerItem;
 import com.portingdeadmods.nautec.capabilities.NTCapabilities;
@@ -16,12 +17,14 @@
 import net.minecraft.core.registries.Registries;
 import net.minecraft.network.chat.Component;
 import net.minecraft.resources.ResourceKey;
+import net.minecraft.world.item.BucketItem;
 import net.minecraft.world.item.CreativeModeTab;
 import net.minecraft.world.item.Item;
 import net.minecraft.world.item.ItemStack;
 import net.minecraft.world.level.ItemLike;
 import net.minecraft.world.level.block.Blocks;
 import net.neoforged.fml.ModList;
+import net.neoforged.neoforge.registries.DeferredItem;
 import net.neoforged.neoforge.registries.DeferredRegister;
 
 import java.util.Optional;
@@ -63,11 +66,14 @@ public final class NTCreativeTabs {
                     output.accept(ModonomiconCompat.getItemStack());
                 }
 
-                output.accept(NTItems.SALT_WATER_BUCKET);
-                output.accept(NTItems.EAS_BUCKET);
-                output.accept(NTItems.ETCHING_ACID_BUCKET);
-
                 output.accept(NTBlocks.CREATIVE_POWER_SOURCE);
+
+                for (NTFluid fluid : NTFluids.HELPER.getFluids()) {
+                    DeferredItem<BucketItem> deferredBucket = fluid.getDeferredBucket();
+                    Nautec.LOGGER.debug("Bucket: {}", deferredBucket);
+                    output.accept(deferredBucket);
+                }
+
             })
             .build());
 
diff --git a/src/main/java/com/portingdeadmods/nautec/registries/NTFluidTypes.java b/src/main/java/com/portingdeadmods/nautec/registries/NTFluidTypes.java
deleted file mode 100644
index b7c5ff7d..00000000
--- a/src/main/java/com/portingdeadmods/nautec/registries/NTFluidTypes.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package com.portingdeadmods.nautec.registries;
-
-import com.portingdeadmods.nautec.Nautec;
-import com.portingdeadmods.nautec.api.fluids.BaseFluidType;
-import net.minecraft.resources.ResourceLocation;
-import net.minecraft.sounds.SoundEvents;
-import net.neoforged.neoforge.common.SoundAction;
-import net.neoforged.neoforge.fluids.FluidType;
-import net.neoforged.neoforge.registries.DeferredRegister;
-import net.neoforged.neoforge.registries.NeoForgeRegistries;
-import org.joml.Vector4i;
-
-import java.util.function.Supplier;
-
-public final class NTFluidTypes {
-
-    public static final DeferredRegister<FluidType> FLUID_TYPES =
-            DeferredRegister.create(NeoForgeRegistries.FLUID_TYPES, Nautec.MODID);
-
-    public static final Supplier<FluidType> SALT_WATER_FLUID_TYPE = register("soap_water",
-            FluidType.Properties.create().lightLevel(2).density(15).viscosity(5).sound(SoundAction.get("drink"),
-                    SoundEvents.HONEY_DRINK), new Vector4i(174, 227, 227, 176), FluidTemplate.WATER);
-
-    public static final Supplier<FluidType> EAS_FLUID_TYPE = register("electrolyte_algae_serum",
-            FluidType.Properties.create().lightLevel(2).density(30).viscosity(5).sound(SoundAction.get("drink"),
-                    SoundEvents.HONEY_DRINK), new Vector4i(255, 255, 255, 255), FluidTemplate.EAS);
-
-    public static final Supplier<FluidType> ETCHING_ACID_FLUID_TYPE = register("etching_acid",
-            FluidType.Properties.create().lightLevel(2).density(5).viscosity(1).sound(SoundAction.get("drink"),
-                    SoundEvents.HONEY_DRINK), new Vector4i(255, 255, 255, 255), FluidTemplate.ETCHING_ACID);
-
-    private static Supplier<FluidType> register(String name, FluidType.Properties properties, Vector4i color, FluidTemplate template) {
-        return FLUID_TYPES.register(name, () -> new BaseFluidType(template.still, template.flowing, template.overlay, color, properties));
-    }
-
-    public enum FluidTemplate {
-        WATER(ResourceLocation.withDefaultNamespace("block/water_still"),
-                ResourceLocation.withDefaultNamespace("block/water_flow"),
-                ResourceLocation.fromNamespaceAndPath(Nautec.MODID, "misc/in_water")),
-        EAS(modFluidTexture("eas_fluid"), modFluidTexture("eas_fluid"), ResourceLocation.fromNamespaceAndPath(Nautec.MODID, "misc/in_water")),
-
-        ETCHING_ACID(modFluidTexture("etching_acid"), modFluidTexture("etching_acid"), ResourceLocation.fromNamespaceAndPath(Nautec.MODID, "misc/in_water"));
-
-        private final ResourceLocation still;
-        private final ResourceLocation flowing;
-        private final ResourceLocation overlay;
-
-        FluidTemplate(ResourceLocation still, ResourceLocation flowing, ResourceLocation overlay) {
-            this.still = still;
-            this.flowing = flowing;
-            this.overlay = overlay;
-        }
-
-        private static ResourceLocation modFluidTexture(String name) {
-            return ResourceLocation.fromNamespaceAndPath(Nautec.MODID, "fluid/"+name);
-        }
-    }
-
-}
diff --git a/src/main/java/com/portingdeadmods/nautec/registries/NTFluids.java b/src/main/java/com/portingdeadmods/nautec/registries/NTFluids.java
index 77b8b69a..194a55b3 100644
--- a/src/main/java/com/portingdeadmods/nautec/registries/NTFluids.java
+++ b/src/main/java/com/portingdeadmods/nautec/registries/NTFluids.java
@@ -1,6 +1,11 @@
 package com.portingdeadmods.nautec.registries;
 
 import com.portingdeadmods.nautec.Nautec;
+import com.portingdeadmods.nautec.content.fluids.EASFluid;
+import com.portingdeadmods.nautec.content.fluids.EtchingAcidFluid;
+import com.portingdeadmods.nautec.content.fluids.OilFluid;
+import com.portingdeadmods.nautec.content.fluids.SaltWaterFluid;
+import com.portingdeadmods.nautec.utils.FluidRegistrationHelper;
 import net.minecraft.core.registries.Registries;
 import net.minecraft.world.level.material.FlowingFluid;
 import net.minecraft.world.level.material.Fluid;
@@ -10,36 +15,10 @@
 import java.util.function.Supplier;
 
 public final class NTFluids {
+    public static final FluidRegistrationHelper HELPER = new FluidRegistrationHelper(NTBlocks.BLOCKS, NTItems.ITEMS, Nautec.MODID);
 
-    public static final DeferredRegister<Fluid> FLUIDS = DeferredRegister.create(Registries.FLUID, Nautec.MODID);
-
-    public static final Supplier<FlowingFluid> SALT_WATER_SOURCE = FLUIDS.register("salt_water",
-            () -> new BaseFlowingFluid.Source(NTFluids.SALT_WATER_PROPERTIES));
-    public static final Supplier<FlowingFluid> SALT_WATER_FLOWING = FLUIDS.register("salt_water_flowing",
-            () -> new BaseFlowingFluid.Flowing(NTFluids.SALT_WATER_PROPERTIES));
-
-    public static final Supplier<FlowingFluid> EAS_SOURCE = FLUIDS.register("electrolyte_algae_serum",
-            () -> new BaseFlowingFluid.Source(NTFluids.EAS_PROPERTIES));
-    public static final Supplier<FlowingFluid> EAS_FLOWING = FLUIDS.register("electrolyte_algae_serum_flowing",
-            () -> new BaseFlowingFluid.Flowing(NTFluids.EAS_PROPERTIES));
-
-    public static final Supplier<FlowingFluid> ETCHING_ACID_SOURCE = FLUIDS.register("etching_acid",
-            () -> new BaseFlowingFluid.Source(NTFluids.ETCHING_ACID_PROPERTIES));
-    public static final Supplier<FlowingFluid> ETCHING_ACID_FLOWING = FLUIDS.register("etching_acid_flowing",
-            () -> new BaseFlowingFluid.Flowing(NTFluids.ETCHING_ACID_PROPERTIES));
-
-    public static final BaseFlowingFluid.Properties SALT_WATER_PROPERTIES = new BaseFlowingFluid.Properties(
-            NTFluidTypes.SALT_WATER_FLUID_TYPE, SALT_WATER_SOURCE, SALT_WATER_FLOWING)
-            .slopeFindDistance(2).levelDecreasePerBlock(2).block(NTBlocks.SALT_WATER_FLUID_BLOCK)
-            .bucket(NTItems.SALT_WATER_BUCKET);
-
-    public static final BaseFlowingFluid.Properties EAS_PROPERTIES = new BaseFlowingFluid.Properties(
-            NTFluidTypes.EAS_FLUID_TYPE, EAS_SOURCE, EAS_FLOWING)
-            .slopeFindDistance(2).levelDecreasePerBlock(2).block(NTBlocks.EAS_FLUID_BLOCK)
-            .bucket(NTItems.EAS_BUCKET);
-
-    public static final BaseFlowingFluid.Properties ETCHING_ACID_PROPERTIES = new BaseFlowingFluid.Properties(
-            NTFluidTypes.ETCHING_ACID_FLUID_TYPE, ETCHING_ACID_SOURCE, ETCHING_ACID_FLOWING)
-            .slopeFindDistance(4).levelDecreasePerBlock(1).block(NTBlocks.ETCHING_ACID_FLUID_BLOCK)
-            .bucket(NTItems.ETCHING_ACID_BUCKET);
+    public static final OilFluid OIL = HELPER.registerFluid(new OilFluid("oil"));
+    public static final SaltWaterFluid SALT_WATER = HELPER.registerFluid(new SaltWaterFluid("saltwater"));
+    public static final EASFluid EAS = HELPER.registerFluid(new EASFluid("eas"));
+    public static final EtchingAcidFluid ETCHING_ACID = HELPER.registerFluid(new EtchingAcidFluid("etching_acid"));
 }
diff --git a/src/main/java/com/portingdeadmods/nautec/registries/NTItems.java b/src/main/java/com/portingdeadmods/nautec/registries/NTItems.java
index f52560bb..10147dad 100644
--- a/src/main/java/com/portingdeadmods/nautec/registries/NTItems.java
+++ b/src/main/java/com/portingdeadmods/nautec/registries/NTItems.java
@@ -40,6 +40,7 @@ public final class NTItems {
             AirBottleItem::new, new Item.Properties().stacksTo(16));
     public static final DeferredItem<Item> AQUARINE_STEEL_COMPOUND = registerItem("aquarine_steel_compound",
             Item::new, new Item.Properties());
+    public static final DeferredItem<Item> SALT = registerItem("salt", Item::new, new Item.Properties());
 
     // MACHINE PARTS
     public static final DeferredItem<Item> RUSTY_GEAR = registerItem("rusty_gear",
@@ -120,14 +121,6 @@ public final class NTItems {
     public static final DeferredItem<AquarinePickaxeItem> AQUARINE_PICKAXE = registerItem("aquarine_steel_pickaxe", AquarinePickaxeItem::new);
     public static final DeferredItem<AquarineShovelItem> AQUARINE_SHOVEL = registerItem("aquarine_steel_shovel", AquarineShovelItem::new);
 
-    // BUCKETS
-    public static final DeferredItem<BucketItem> SALT_WATER_BUCKET = registerItemBucket("salt_water_bucket",
-            () -> new BucketItem(NTFluids.SALT_WATER_SOURCE.get(), new Item.Properties().craftRemainder(Items.BUCKET).stacksTo(1)));
-    public static final DeferredItem<BucketItem> EAS_BUCKET = registerItemBucket("eas_bucket",
-            () -> new BucketItem(NTFluids.EAS_SOURCE.get(), new Item.Properties().craftRemainder(Items.BUCKET).stacksTo(1)));
-    public static final DeferredItem<BucketItem> ETCHING_ACID_BUCKET = registerItemBucket("etching_acid_bucket",
-            () -> new BucketItem(NTFluids.ETCHING_ACID_SOURCE.get(), new Item.Properties().craftRemainder(Items.BUCKET).stacksTo(1)));
-
     // TOOLS
     public static final DeferredItem<AquarineWrenchItem> AQUARINE_WRENCH = registerItem("aquarine_steel_wrench",
             AquarineWrenchItem::new, new Item.Properties());
diff --git a/src/main/java/com/portingdeadmods/nautec/utils/AugmentClientHelper.java b/src/main/java/com/portingdeadmods/nautec/utils/AugmentClientHelper.java
index 18688599..746deca8 100644
--- a/src/main/java/com/portingdeadmods/nautec/utils/AugmentClientHelper.java
+++ b/src/main/java/com/portingdeadmods/nautec/utils/AugmentClientHelper.java
@@ -8,7 +8,7 @@
 
 import java.util.HashMap;
 
-public class AugmentClientHelper {
+public final class AugmentClientHelper {
     public static void initCache(Player player) {
         AugmentLayerRenderer.AUGMENTS_CACHE = new HashMap<>(AugmentHelper.getAugments(player));
     }
diff --git a/src/main/java/com/portingdeadmods/nautec/utils/FluidRegistrationHelper.java b/src/main/java/com/portingdeadmods/nautec/utils/FluidRegistrationHelper.java
new file mode 100644
index 00000000..f8671d3a
--- /dev/null
+++ b/src/main/java/com/portingdeadmods/nautec/utils/FluidRegistrationHelper.java
@@ -0,0 +1,95 @@
+package com.portingdeadmods.nautec.utils;
+import com.portingdeadmods.nautec.api.fluids.NTFluid;
+import net.minecraft.core.registries.Registries;
+import net.minecraft.world.item.BucketItem;
+import net.minecraft.world.item.Item;
+import net.minecraft.world.item.Items;
+import net.minecraft.world.level.block.LiquidBlock;
+import net.minecraft.world.level.material.Fluid;
+import net.neoforged.bus.api.IEventBus;
+import net.neoforged.neoforge.fluids.FluidType;
+import net.neoforged.neoforge.registries.DeferredRegister;
+import net.neoforged.neoforge.registries.NeoForgeRegistries;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public final class FluidRegistrationHelper {
+    private final List<NTFluid> fluids = new ArrayList<>();
+
+    private final DeferredRegister.Blocks blockRegister;
+    private final DeferredRegister.Items itemRegister;
+    private final DeferredRegister<FluidType> fluidTypeRegister;
+    private final DeferredRegister<Fluid> fluidRegister;
+
+    private boolean createFluidsRegister;
+
+    public FluidRegistrationHelper(DeferredRegister.Blocks blockRegister,
+                                   DeferredRegister.Items itemRegister,
+                                   DeferredRegister<FluidType> fluidTypeRegister,
+                                   DeferredRegister<Fluid> fluidRegister) {
+        this.blockRegister = blockRegister;
+        this.itemRegister = itemRegister;
+        this.fluidTypeRegister = fluidTypeRegister;
+        this.fluidRegister = fluidRegister;
+    }
+
+    public FluidRegistrationHelper(DeferredRegister.Blocks blockRegister, DeferredRegister.Items itemRegister, String modid) {
+        this(blockRegister, itemRegister, DeferredRegister.create(NeoForgeRegistries.FLUID_TYPES, modid), DeferredRegister.create(Registries.FLUID, modid));
+        this.createFluidsRegister = true;
+    }
+
+    public <T extends NTFluid> T registerFluid(T fluid) {
+        fluid.stillFluid = getFluidRegister().register(fluid.getName(), fluid.stillFluid);
+        fluid.flowingFluid = getFluidRegister().register(flowing(fluid.getName()), fluid.flowingFluid);
+        fluid.fluidType = getFluidTypeRegister().register(fluid.getName(), fluid.fluidType);
+
+        fluid.block = () -> new LiquidBlock(fluid.stillFluid.get(), fluid.blockProperties());
+
+        fluid.block = getBlockRegister().register(fluid(fluid.getName()), fluid.block);
+
+        fluid.deferredBucket = getItemRegister().register(bucket(fluid.getName()), () -> new BucketItem(fluid.stillFluid.get(), new Item.Properties().craftRemainder(Items.BUCKET).stacksTo(1)));
+
+        this.fluids.add(fluid);
+        return fluid;
+    }
+
+    public DeferredRegister.Blocks getBlockRegister() {
+        return blockRegister;
+    }
+
+    public DeferredRegister.Items getItemRegister() {
+        return itemRegister;
+    }
+
+    public DeferredRegister<FluidType> getFluidTypeRegister() {
+        return fluidTypeRegister;
+    }
+
+    public DeferredRegister<Fluid> getFluidRegister() {
+        return fluidRegister;
+    }
+
+    public List<NTFluid> getFluids() {
+        return fluids;
+    }
+
+    public void register(IEventBus modEventBus) {
+        if (createFluidsRegister) {
+            getFluidRegister().register(modEventBus);
+            getFluidTypeRegister().register(modEventBus);
+        }
+    }
+
+    private static String fluid(String fluid) {
+        return fluid + "_fluid";
+    }
+
+    private static String flowing(String fluid) {
+        return fluid + "_flowing";
+    }
+
+    private static String bucket(String fluid) {
+        return fluid + "_bucket";
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/portingdeadmods/nautec/utils/Tooltips.java b/src/main/java/com/portingdeadmods/nautec/utils/Tooltips.java
index 8ad6cc6c..ec235a69 100644
--- a/src/main/java/com/portingdeadmods/nautec/utils/Tooltips.java
+++ b/src/main/java/com/portingdeadmods/nautec/utils/Tooltips.java
@@ -6,25 +6,29 @@
 
 import java.util.List;
 
-public class Tooltips {
-    public static void trans(List<Component> components, String key, ChatFormatting ... formatings) {
-        tt(components,Component.translatable(key), formatings);
+public final class Tooltips {
+    public static void trans(List<Component> components, String key, ChatFormatting... formatings) {
+        tt(components, Component.translatable(key), formatings);
     }
-    public static void transInsert(List<Component> components, String key,String additional, ChatFormatting ... formatings){
+
+    public static void transInsert(List<Component> components, String key, String additional, ChatFormatting... formatings) {
         MutableComponent trans = apply(Component.translatable(key), formatings);
         MutableComponent lit = apply(Component.literal(additional), formatings);
         components.add(trans.append(lit));
     }
-    public static void transtrans(List<Component> components, String key,String additional, ChatFormatting ... formatings){
+
+    public static void transtrans(List<Component> components, String key, String additional, ChatFormatting... formatings) {
         MutableComponent trans = apply(Component.translatable(key), formatings);
         MutableComponent extra = apply(Component.translatable(additional), formatings);
         components.add(trans.append(extra));
     }
-    public static void tt(List<Component> components, MutableComponent c, ChatFormatting ... formatings){
+
+    public static void tt(List<Component> components, MutableComponent c, ChatFormatting... formatings) {
         apply(c, formatings);
         components.add(c);
     }
-    public static MutableComponent apply(MutableComponent component,ChatFormatting ... formattings) {
+
+    public static MutableComponent apply(MutableComponent component, ChatFormatting... formattings) {
         for (ChatFormatting formatting : formattings) {
             component = component.withStyle(formatting);
         }
diff --git a/src/main/resources/assets/nautec/models/block/fishing_station.json b/src/main/resources/assets/nautec/models/block/fishing_station.json
index c3aaef26..b3f9db9d 100644
--- a/src/main/resources/assets/nautec/models/block/fishing_station.json
+++ b/src/main/resources/assets/nautec/models/block/fishing_station.json
@@ -47,6 +47,37 @@
 			}
 		}
 	],
+	"display": {
+		"thirdperson_righthand": {
+			"rotation": [75, 45, 0],
+			"translation": [0, 2.5, 0],
+			"scale": [0.375, 0.375, 0.375]
+		},
+		"thirdperson_lefthand": {
+			"rotation": [75, 45, 0],
+			"translation": [0, 2.5, 0],
+			"scale": [0.375, 0.375, 0.375]
+		},
+		"firstperson_righthand": {
+			"rotation": [0, 45, 0],
+			"scale": [0.4, 0.4, 0.4]
+		},
+		"firstperson_lefthand": {
+			"rotation": [0, 225, 0],
+			"scale": [0.4, 0.4, 0.4]
+		},
+		"ground": {
+			"translation": [0, 3, 0],
+			"scale": [0.25, 0.25, 0.25]
+		},
+		"gui": {
+			"rotation": [30, 225, 0],
+			"scale": [0.625, 0.625, 0.625]
+		},
+		"fixed": {
+			"scale": [0.5, 0.5, 0.5]
+		}
+	},
 	"groups": [
 		{
 			"name": "group",
diff --git a/src/main/resources/assets/nautec/textures/item/cast_iron_ingot.png b/src/main/resources/assets/nautec/textures/item/cast_iron_ingot.png
index 17ab48e6..95d20c15 100644
Binary files a/src/main/resources/assets/nautec/textures/item/cast_iron_ingot.png and b/src/main/resources/assets/nautec/textures/item/cast_iron_ingot.png differ
diff --git a/src/main/resources/assets/nautec/textures/item/eas_bucket.png b/src/main/resources/assets/nautec/textures/item/eas_bucket.png
deleted file mode 100644
index 3a4db28f..00000000
Binary files a/src/main/resources/assets/nautec/textures/item/eas_bucket.png and /dev/null differ
diff --git a/src/main/resources/assets/nautec/textures/item/etching_acid_bucket.png b/src/main/resources/assets/nautec/textures/item/etching_acid_bucket.png
deleted file mode 100644
index c7a25e3e..00000000
Binary files a/src/main/resources/assets/nautec/textures/item/etching_acid_bucket.png and /dev/null differ
diff --git a/src/main/resources/assets/nautec/textures/item/salt_water_bucket.png b/src/main/resources/assets/nautec/textures/item/salt_water_bucket.png
deleted file mode 100644
index 44ec4f70..00000000
Binary files a/src/main/resources/assets/nautec/textures/item/salt_water_bucket.png and /dev/null differ