diff --git a/mods/bucket/init.lua b/mods/bucket/init.lua
index 2cf431cac5b5857bc366fb306275a741069bfa11..ebdf2e74ebdde3bc307da3f6328e3c2fb24cb7dc 100644
--- a/mods/bucket/init.lua
+++ b/mods/bucket/init.lua
@@ -225,3 +225,16 @@ minetest.register_craft({
 	replacements = {{"bucket:bucket_lava", "bucket:bucket_empty"}},
 })
 
+-- Register buckets as dungeon loot
+if minetest.global_exists("dungeon_loot") then
+	dungeon_loot.register({
+		{name = "bucket:bucket_empty", chance = 0.55},
+		-- water in deserts/ice or above ground, lava otherwise
+		{name = "bucket:bucket_water", chance = 0.45,
+			types = {"sandstone", "desert", "ice"}},
+		{name = "bucket:bucket_water", chance = 0.45, y = {0, 32768},
+			types = {"normal"}},
+		{name = "bucket:bucket_lava", chance = 0.45, y = {-32768, -1},
+			types = {"normal"}},
+	})
+end
diff --git a/mods/bucket/mod.conf b/mods/bucket/mod.conf
index 1c60a099632f625284e7513d54fa05bbf16cab00..fef46873412e10d2ff30e2e78e7292e33a2bd966 100644
--- a/mods/bucket/mod.conf
+++ b/mods/bucket/mod.conf
@@ -1,3 +1,4 @@
 name = bucket
 description = Minetest Game mod: bucket
 depends = default
+optional_depends = dungeon_loot
diff --git a/mods/carts/init.lua b/mods/carts/init.lua
index a5aa9cb56a16ec4b77339d5f06d7a20d8e290ad3..69d59d9f7a080f1425f9ac50b309b71fe66471b6 100644
--- a/mods/carts/init.lua
+++ b/mods/carts/init.lua
@@ -19,3 +19,10 @@ carts.path_distance_max = 3
 dofile(carts.modpath.."/functions.lua")
 dofile(carts.modpath.."/rails.lua")
 dofile(carts.modpath.."/cart_entity.lua")
+
+-- Register rails as dungeon loot
+if minetest.global_exists("dungeon_loot") then
+	dungeon_loot.register({
+		name = "carts:rail", chance = 0.35, count = {1, 6}
+	})
+end
diff --git a/mods/carts/mod.conf b/mods/carts/mod.conf
index 20357e3e618112358f9213bc9639fe36e39deda9..0eab35c31317b079dfcd97d43b823ea3babd83c6 100644
--- a/mods/carts/mod.conf
+++ b/mods/carts/mod.conf
@@ -1,3 +1,4 @@
 name = carts
 description = Carts (formerly boost_cart)
 depends = default, player_api
+optional_depends = dungeon_loot
diff --git a/mods/dungeon_loot/loot.lua b/mods/dungeon_loot/loot.lua
index 7eb08cd8cb8812d79e2f95d3ec236df715ccdefe..a5a40973759a8ff48543e68250fdc5b981ac3da7 100644
--- a/mods/dungeon_loot/loot.lua
+++ b/mods/dungeon_loot/loot.lua
@@ -1,26 +1,13 @@
-dungeon_loot.registered_loot = {
-	-- buckets
-	{name = "bucket:bucket_empty", chance = 0.55},
-	-- water in deserts/ice or above ground, lava otherwise
-	{name = "bucket:bucket_water", chance = 0.45,
-		types = {"sandstone", "desert", "ice"}},
-	{name = "bucket:bucket_water", chance = 0.45, y = {0, 32768},
-		types = {"normal"}},
-	{name = "bucket:bucket_lava", chance = 0.45, y = {-32768, -1},
-		types = {"normal"}},
+-- Loot from the `default` mod is registered here,
+-- with the rest being registered in the respective mods
 
+dungeon_loot.registered_loot = {
 	-- various items
 	{name = "default:stick", chance = 0.6, count = {3, 6}},
 	{name = "default:flint", chance = 0.4, count = {1, 3}},
-	{name = "vessels:glass_fragments", chance = 0.35, count = {1, 4}},
-	{name = "carts:rail", chance = 0.35, count = {1, 6}},
 
 	-- farming / consumable
-	{name = "farming:string", chance = 0.5, count = {1, 8}},
-	{name = "farming:wheat", chance = 0.5, count = {2, 5}},
 	{name = "default:apple", chance = 0.4, count = {1, 4}},
-	{name = "farming:seed_cotton", chance = 0.4, count = {1, 4},
-		types = {"normal"}},
 	{name = "default:cactus", chance = 0.4, count = {1, 4},
 		types = {"sandstone", "desert"}},
 
diff --git a/mods/farming/init.lua b/mods/farming/init.lua
index e6dfd579f5a5ddd7344ed50b672e4f108b25d25b..96672fa10ead9a2ab4cabf4949086b413a49c364 100644
--- a/mods/farming/init.lua
+++ b/mods/farming/init.lua
@@ -144,3 +144,13 @@ minetest.register_craft({
 	recipe = "farming:hoe_wood",
 	burntime = 5,
 })
+
+-- Register farming items as dungeon loot
+if minetest.global_exists("dungeon_loot") then
+	dungeon_loot.register({
+		{name = "farming:string", chance = 0.5, count = {1, 8}},
+		{name = "farming:wheat", chance = 0.5, count = {2, 5}},
+		{name = "farming:seed_cotton", chance = 0.4, count = {1, 4},
+			types = {"normal"}},
+	})
+end
diff --git a/mods/farming/mod.conf b/mods/farming/mod.conf
index c26c28fc26883825063add788ffbddc2c8ffee99..9a76a6a7d0409f29c99784974ec914812c83bcfc 100644
--- a/mods/farming/mod.conf
+++ b/mods/farming/mod.conf
@@ -1,3 +1,4 @@
 name = farming
 description = Minetest Game mod: farming
 depends = default, wool, stairs
+optional_depends = dungeon_loot
diff --git a/mods/vessels/init.lua b/mods/vessels/init.lua
index b330efc224e54ef9b8aeee49b08bb928d410f1e6..71a0689335a7c3da0aeaacc28841810027bcd10b 100644
--- a/mods/vessels/init.lua
+++ b/mods/vessels/init.lua
@@ -228,3 +228,10 @@ minetest.register_craft({
 	recipe = "vessels:shelf",
 	burntime = 30,
 })
+
+-- Register glass fragments as dungeon loot
+if minetest.global_exists("dungeon_loot") then
+	dungeon_loot.register({
+		name = "vessels:glass_fragments", chance = 0.35, count = {1, 4}
+	})
+end
diff --git a/mods/vessels/mod.conf b/mods/vessels/mod.conf
index 7551b54ab79dbf6fb4dc8f0109e2f80e999be367..eba9076f6af7ec3fa49e8ef70914e7fafb8151ca 100644
--- a/mods/vessels/mod.conf
+++ b/mods/vessels/mod.conf
@@ -1,3 +1,4 @@
 name = vessels
 description = Minetest Game mod: vessels
 depends = default
+optional_depends = dungeon_loot