diff --git a/additional_stuff/salad_pickaxe.lua b/additional_stuff/salad_pickaxe.lua
index c001b844940044b965c60bed70823c62c2e554ad..3bb9c9f9dbf0ae7a2ec2e3fb2a85fffe66c816a2 100644
--- a/additional_stuff/salad_pickaxe.lua
+++ b/additional_stuff/salad_pickaxe.lua
@@ -16,7 +16,7 @@ minetest.register_tool("kif_custom:pick_salad", {
 	end
 })
 
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "kif_custom:pick_salad",
     recipe = {
         {"farming:potato_salad", "farming:potato_salad", "farming:potato_salad"},
diff --git a/advtrains/ignore_collisions.lua b/advtrains/ignore_collisions.lua
index 21197cf89a45daa124171f77e32b54bcdfcb1359..e86b51ffb53f59e169478971b71806066d63e0a5 100644
--- a/advtrains/ignore_collisions.lua
+++ b/advtrains/ignore_collisions.lua
@@ -10,48 +10,47 @@ local additional_nonblocknodes={
     "mesecons_pressureplates:pressure_plate_wood",
     "mesecons_pressureplates:pressure_plate_stone",
 }
-minetest.after(0, function()
-    local mods = {"moreblocks", "bakedclay", "building_blocks", "my_door_wood", "my_sliding_doors"}
-    local variants = {
-        micro_ = nil,
-        slope = nil,
-        slab_ = {"_1", "_2", "_quarter", "_two_sides", "_three_sides"},
-        stair_ = {"_alt", "_alt_1", "_alt_2", "_alt_4", "_outer"},
-        panel_ = {"_1", "_2", "_4"},
-    }
-    local to_add = {}
-    for i, mod in ipairs(mods) do
-        for variant, data in pairs(variants) do
-            if to_add[mod] == nil then
-                to_add[mod] = {}
-            end
-            to_add[mod][variant] = data
+
+local mods = {"moreblocks", "bakedclay", "building_blocks", "my_door_wood", "my_sliding_doors"}
+local variants = {
+    micro_ = nil,
+    slope = nil,
+    slab_ = {"_1", "_2", "_quarter", "_two_sides", "_three_sides"},
+    stair_ = {"_alt", "_alt_1", "_alt_2", "_alt_4", "_outer"},
+    panel_ = {"_1", "_2", "_4"},
+}
+local to_add = {}
+for i, mod in ipairs(mods) do
+    for variant, data in pairs(variants) do
+        if to_add[mod] == nil then
+            to_add[mod] = {}
         end
+        to_add[mod][variant] = data
     end
-    for name, def in pairs(minetest.registered_nodes) do
-        for mod, variants in pairs(to_add) do
-            if string.sub(name, 1, #mod+1) == mod .. ":" then
-                for variant, endings in pairs(variants) do
-                    local prefix = mod .. ":" .. variant
-                    if string.sub(name, 1, #prefix) == prefix then
-                        if endings then
-                            for _, ending in ipairs(endings) do
-                                if string.sub(name, #name - #ending + 1, #name) == ending then
-                                    table.insert(additional_nonblocknodes, name)
-                                end
+end
+for name, def in pairs(minetest.registered_nodes) do
+    for mod, variants in pairs(to_add) do
+        if string.sub(name, 1, #mod+1) == mod .. ":" then
+            for variant, endings in pairs(variants) do
+                local prefix = mod .. ":" .. variant
+                if string.sub(name, 1, #prefix) == prefix then
+                    if endings then
+                        for _, ending in ipairs(endings) do
+                            if string.sub(name, #name - #ending + 1, #name) == ending then
+                                table.insert(additional_nonblocknodes, name)
                             end
-                        else
-                            table.insert(additional_nonblocknodes, name)
                         end
+                    else
+                        table.insert(additional_nonblocknodes, name)
                     end
                 end
             end
         end
     end
+end
 
-    for _,name in ipairs(additional_nonblocknodes) do
-        if minetest.registered_nodes[name] then
-            minetest.registered_nodes[name].groups.not_blocking_trains=1
-        end
+for _,name in ipairs(additional_nonblocknodes) do
+    if minetest.registered_nodes[name] then
+        minetest.registered_nodes[name].groups.not_blocking_trains=1
     end
-end)
+end
diff --git a/advtrains/survival_recipes.lua b/advtrains/survival_recipes.lua
index f854d69b8df40f11e2995da4e1413d1b2461e077..31b4bfe98be6d3ec8866a3fa29957eb8fb29850b 100644
--- a/advtrains/survival_recipes.lua
+++ b/advtrains/survival_recipes.lua
@@ -3,35 +3,35 @@ local greens = {"dye:green", "dye:light_green", "dye:medium_green", "dye:dark_gr
 
 -- track stuff
 
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains_interlocking:tcb_node",
     recipe = {{"default:mese_crystal_fragment"},
               {"default:steel_ingot"}}
     })
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains_interlocking:tcb_node 9",
     recipe = {{"default:mese_crystal"},
               {"default:steelblock"}}
     })
 
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains_line_automation:dtrack_stop_placer",
     recipe = {{"dye:black"},
               {"default:mese_crystal_fragment"},
               {"advtrains:dtrack_placer"}}
     })
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains_interlocking:dtrack_npr_placer",
     recipe = {{"advtrains_line_automation:dtrack_stop_placer"}}
     })
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains_interlocking:dtrack_stop_placer",
     recipe = {{"advtrains_line_automation:dtrack_npr_placer"}}
     })
 
 --[[
 -- TODO: fix crash in advtrains before adding recipe
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains:dtrack_atc_placer",
     recipe = {{"dye:blue"},
               {"default:mese_crystal_fragment"},
@@ -39,35 +39,35 @@ minetest.register_craft({
     })
 ]]--
 for i,color in ipairs(greens) do
-    minetest.register_craft({
+    kif.register_craft_if_items_exist({
         output = "advtrains:dtrack_unload_placer",
         recipe = {{color},
                   {"default:mese_crystal_fragment"},
                   {"advtrains:dtrack_placer"}}
         })
 end
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains:dtrack_load_placer",
     recipe = {{"dye:red"},
               {"default:mese_crystal_fragment"},
               {"advtrains:dtrack_placer"}}
     })
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains:dtrack_load_placer",
     recipe = {{"advtrains:dtrack_unload_placer"}}
     })
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains:dtrack_unload_placer",
     recipe = {{"advtrains:dtrack_load_placer"}}
     })
 
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains_luaautomation:dtrack_placer",
     recipe = {{"dye:blue"},
               {"mesecons_microcontroller:microcontroller0000"},
               {"advtrains:dtrack_placer"}}
     })
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains_luaautomation:oppanel",
     recipe = {
         {"default:steel_ingot","dye:blue","default:steel_ingot"},
@@ -77,12 +77,12 @@ minetest.register_craft({
 
 -- train stuff
 
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains:engine_japan",
     recipe = {{"advtrains:wagon_japan"},
               {"default:mese"}}
     })
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains:wagon_japan",
     recipe = {
         {"default:steel_ingot","default:steel_ingot","default:steel_ingot"},
@@ -90,14 +90,14 @@ minetest.register_craft({
         {"default:steel_ingot","default:steel_ingot","default:steel_ingot"}}
     })
 
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains:engine_industrial",
     recipe = {
         {"dye:red", "advtrains:driver_cab"},
         {"default:steelblock", "default:mese_crystal"},
         {"advtrains:wheel", "advtrains:wheel"}}
     })
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains:engine_industrial_big",
     recipe = {
         {"dye:red", "advtrains:driver_cab", "default:steelblock"},
@@ -105,14 +105,14 @@ minetest.register_craft({
         {"advtrains:wheel", "advtrains:wheel", "advtrains:wheel"}}
     })
 
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains:wagon_wood",
     recipe = {
         {"default:steel_ingot","","default:steel_ingot"},
         {"default:steel_ingot","default:steel_ingot","default:steel_ingot"},
         {"advtrains:wheel","advtrains:wheel","advtrains:wheel"}}
     })
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains:wagon_tank",
     recipe = {
         {"default:steel_ingot","default:steel_ingot","default:steel_ingot"},
@@ -120,42 +120,42 @@ minetest.register_craft({
         {"advtrains:wheel","advtrains:wheel","advtrains:wheel"}}
     })
 
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains:engine_railbus",
     recipe = {
         {"","basic_materials:steel_bar"},
         {"dye:red","advtrains:subway_wagon"}}
     })
 
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains:diesel_lokomotive",
     recipe = {
         {"dye:cyan", "advtrains:driver_cab"},
         {"default:steelblock", "default:mese_crystal"},
         {"advtrains:wheel", "advtrains:wheel"}}
     })
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains:wagon_track",
     recipe = {
         {"advtrains:dtrack_placer", "advtrains:dtrack_placer", "advtrains:dtrack_placer"},
         {"default:stick", "default:stick", "default:stick"},
         {"advtrains:wheel", "", "advtrains:wheel"}}
     })
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains:wagon_gravel",
     recipe = {
         {"group:wood", "default:gravel", "group:wood"},
         {"group:wood", "group:wood", "group:wood"},
         {"advtrains:wheel", "", "advtrains:wheel"}}
     })
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains:wagon_tree",
     recipe = {
         {"", "group:tree", ""},
         {"default:stick", "default:stick", "default:stick"},
         {"advtrains:wheel", "", "advtrains:wheel"}}
     })
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains:wagon_lava",
     recipe = {
         {"default:stick", "bucket:bucket_lava", "default:stick"},
@@ -163,27 +163,27 @@ minetest.register_craft({
         {"advtrains:wheel", "", "advtrains:wheel"}}
     })
 
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains:SaHa_E231",
     recipe = {
         {"default:steel_ingot","default:steel_ingot","default:steel_ingot"},
         {"default:steel_ingot","dye:green","default:steel_ingot"},
         {"advtrains:wheel","","advtrains:wheel"}}
     })
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains:MoHa_E230",
     recipe = {
         {"default:steel_ingot","default:steel_ingot","default:steel_ingot"},
         {"default:steel_ingot","dye:green","default:steel_ingot"},
         {"advtrains:wheel","default:mese","advtrains:wheel"}}
     })
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains:MoHa_E231",
     recipe = {
         {"basic_materials:steel_bar"},
         {"advtrains:MoHa_E230"}},
     })
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains:KuHa_E231",
     recipe = {
         {"default:steel_ingot","default:steel_ingot","default:steel_ingot"},
@@ -191,14 +191,14 @@ minetest.register_craft({
         {"advtrains:wheel","default:mese","advtrains:wheel"}}
     })
 
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains:under_s7dm",
     recipe = {
         {"default:steel_ingot","default:steel_ingot","default:steel_ingot"},
         {"default:steel_ingot","dye:red","default:steel_ingot"},
         {"advtrains:wheel","dye:blue","advtrains:wheel"}}
     })
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains:under_s7ndm",
     recipe = {
         {"default:steel_ingot","default:steel_ingot","default:steel_ingot"},
@@ -209,73 +209,73 @@ minetest.register_craft({
 
 -- signal stuff
 
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains_signals_ks:mast_mast_0",
     recipe = {{"default:steel_ingot"},
         {"default:steel_ingot"},
         {"default:steel_ingot"}}
     })
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains_signals_ks:hs_danger_0 2",
     type = "shapeless",
     recipe = {"advtrains:signal_off", "advtrains:signal_off", "dye:white", "dye:yellow"}
     })
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains_signals_ks:ra_danger_0 2",
     type = "shapeless",
     recipe = {"advtrains:signal_off", "advtrains:signal_off", "dye:white"}
     })
 
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains:signal_wall_l_off",
     recipe = {{"advtrains:signal_wall_t_off"}}
     })
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains:signal_wall_r_off",
     recipe = {{"advtrains:signal_wall_l_off"}}
     })
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains:signal_wall_t_off",
     recipe = {{"advtrains:signal_wall_r_off"}}
     })
 
 for i,color in ipairs(greens) do
-    minetest.register_craft({
+    kif.register_craft_if_items_exist({
         output = "advtrains:signal_wall_l_off 2",
         recipe = {{"default:steel_ingot", "dye:red"},
             {"", color},
             {"default:steel_ingot", "default:steel_ingot"}}
         })
-    minetest.register_craft({
+    kif.register_craft_if_items_exist({
         output = "advtrains:signal_wall_r_off 2",
         recipe = {{"dye:red", "default:steel_ingot"},
             {color, ""},
             {"default:steel_ingot", "default:steel_ingot"}}
         })
-    minetest.register_craft({
+    kif.register_craft_if_items_exist({
         output = "advtrains:signal_wall_t_off 2",
         recipe = {{"default:steel_ingot", "", "default:steel_ingot"},
             {"default:steel_ingot", color, "dye:red"}}
         })
 end
 
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains_signals_ks:sign_8_0 2",
     type = "shapeless",
     recipe = {"default:sign_wall_steel", "default:sign_wall_steel", "default:steel_ingot", "dye:white", "dye:black"}
     })
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains_signals_ks:sign_8_0 2",
     type = "shapeless",
     recipe = {"basic_signs:sign_wall_steel_white_black", "default:steel_ingot"}
     })
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains_signals_ks:sign_8_0 2",
     recipe = {{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
         {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
         {"dye:black", "default:steel_ingot", "dye:white"}}
     })
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains_signals_ks:sign_8_0 2",
     recipe = {{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
         {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
@@ -292,7 +292,7 @@ for rot = 0, 3 do
       return "dye:red"
     end
   end
-  minetest.register_craft({
+  kif.register_craft_if_items_exist({
     output = "advtrains:across_off 2",
     recipe = {
         {pos(3), "", pos(2)},
@@ -303,7 +303,7 @@ end
 
 
 -- add recipe with normal green for signal
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "advtrains:signal_off 2",
     recipe = {
         {"", "dye:red", "default:steel_ingot"},
diff --git a/depends.txt b/depends.txt
deleted file mode 100644
index 8731817e9e3f52d3ddda188b411ae64b9acf87cd..0000000000000000000000000000000000000000
--- a/depends.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-default
-digilines
-xpanes
-basic_materials
-mesecons_luacontroller
-moreblocks
-advtrains_interlocking
-advtrains_signals_ks
-advtrains_luaautomation
diff --git a/init.lua b/init.lua
index bc605651008a4364c5fc06a1ef0333d41385653b..06e50e2ad4c18701095e20df6896700275596937 100644
--- a/init.lua
+++ b/init.lua
@@ -3,6 +3,9 @@ kif = {}
 
 local MP = minetest.get_modpath("kif_custom")
 
+-- utilities
+dofile(MP.."/util.lua")
+
 -- some items don't have recipes. fill them in
 dofile(MP.."/missing_recipes.lua")
 
diff --git a/missing_recipes.lua b/missing_recipes.lua
index 83564f3ee6342aad6b372cf2e978d2aae7f1eeba..1268849bccbfbed22553420130c38c4b66862c8e 100644
--- a/missing_recipes.lua
+++ b/missing_recipes.lua
@@ -1,11 +1,12 @@
-minetest.register_craft({
+
+kif.register_craft_if_items_exist({
     output = "digilines:lightsensor",
     recipe = {
         {"basic_materials:plastic_sheet", "xpanes:pane_flat", "basic_materials:plastic_sheet"},
         {"default:steel_ingot", "mesecons_luacontroller:luacontroller0000", "digilines:wire_std_00000000"}
     }
 })
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "digilines:rtc",
     recipe = {
         {"basic_materials:plastic_sheet", "basic_materials:energy_crystal_simple", "basic_materials:plastic_sheet"},
@@ -13,7 +14,7 @@ minetest.register_craft({
     }
 })
 
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "computer:tetris_arcade",
     recipe = {
         {"basic_materials:plastic_sheet", "basic_materials:energy_crystal_simple", "basic_materials:plastic_sheet"},
@@ -21,7 +22,7 @@ minetest.register_craft({
         {"basic_materials:plastic_sheet", "basic_materials:energy_crystal_simple", "basic_materials:plastic_sheet"}
     }
 })
-minetest.register_craft({
+kif.register_craft_if_items_exist({
     output = "computer:3dprinter_bedflinger",
     recipe = {
         {"basic_materials:plastic_sheet", "basic_materials:empty_spool", "default:mese_crystal_fragment"},
diff --git a/mod.conf b/mod.conf
new file mode 100644
index 0000000000000000000000000000000000000000..78ab3711fa8b0be05180342f7160469052e416e8
--- /dev/null
+++ b/mod.conf
@@ -0,0 +1,22 @@
+name = kif_custom
+depends = default
+optional_depends = """
+	advtrains_interlocking,
+	advtrains_signals_ks,
+	advtrains_luaautomation,
+	bakedclay,
+	basic_materials,
+	building_blocks,
+	computer,
+	digilines,
+	digiterms,
+	dye,
+	farming,
+	homedecor,
+	mesecons_luacontroller,
+	mesecons_pressureplates,
+	moreblocks,
+	my_door_wood,
+	my_sliding_doors,
+	xpanes,
+"""
diff --git a/util.lua b/util.lua
new file mode 100644
index 0000000000000000000000000000000000000000..753e21a4601c2b34e588aaa5f1a6b8f5e324a9b0
--- /dev/null
+++ b/util.lua
@@ -0,0 +1,30 @@
+
+kif.register_craft_if_items_exist = function(def)
+	if def.output and minetest.registered_items[tostring(def.output)] == nil then
+		return false
+	end
+	if def.recipe then
+		if type(def.recipe) ~= "table" then
+			if minetest.registered_items[tostring(def.recipe)] == nil then
+				return false
+			end
+		else
+			for y, row in ipairs(def.recipe) do
+				if type(row) ~= "table" then
+					if row ~= "" and minetest.registered_items[tostring(row)] == nil then
+						return false
+					end
+				else
+					for x, col in ipairs(row) do
+						if col ~= "" and minetest.registered_items[tostring(col)] == nil then
+							return false
+						end
+					end
+				end
+			end
+		end
+		-- still here? recipe is fine then!
+		minetest.register_craft(def)
+		return true
+	end
+end