diff --git a/advtrains/ignore_collisions.lua b/advtrains/ignore_collisions.lua
new file mode 100644
index 0000000000000000000000000000000000000000..21197cf89a45daa124171f77e32b54bcdfcb1359
--- /dev/null
+++ b/advtrains/ignore_collisions.lua
@@ -0,0 +1,57 @@
+-- add blocks to be ignored by trains
+
+local additional_nonblocknodes={
+    "digiterms:lcd_monitor",
+    "digiterms:beige_keyboard",
+    "digiterms:white_keyboard",
+    "digiterms:black_keyboard",
+    "digilines:lcd",
+    "homedecor:glowlight_quarter_14",
+    "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
+        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
+                            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
+    end
+end)
diff --git a/chat/spawn.lua b/chat/spawn.lua
new file mode 100644
index 0000000000000000000000000000000000000000..45a3b7bfac6521872c4a387ed257fa280493f67b
--- /dev/null
+++ b/chat/spawn.lua
@@ -0,0 +1,22 @@
+-- stolen from pandorabox.io https://github.com/pandorabox-io/pandorabox_custom
+
+local spawn_command = {}
+spawn_command.pos = {x=-130, y=13, z=-62}
+
+if minetest.setting_get_pos("static_spawnpoint") then
+    spawn_command.pos = minetest.setting_get_pos("static_spawnpoint")
+end
+
+local function teleport_to_spawn(name)
+    local player = minetest.get_player_by_name(name)
+    if player == nil then
+        return false
+    end
+    player:setpos(spawn_command.pos)
+    minetest.chat_send_player(name, "Teleported to spawn!")
+end
+
+minetest.register_chatcommand("spawn", {
+    description = "Teleports you to the spawn point.",
+    func = teleport_to_spawn,
+})
diff --git a/default_password_warn.lua b/default_password_warn.lua
new file mode 100644
index 0000000000000000000000000000000000000000..c2776c3fcd3173316202fdf3f2f40f30225f8024
--- /dev/null
+++ b/default_password_warn.lua
@@ -0,0 +1,18 @@
+-- stolen from pandorabox.io https://github.com/pandorabox-io/pandorabox_custom
+
+local default_pw = minetest.settings:get("default_password")
+
+minetest.register_on_joinplayer(function(player)
+    local playername = player:get_player_name()
+    local handler = minetest.get_auth_handler()
+    local entry = handler.get_auth(playername)
+    if entry and minetest.check_password_entry(playername, entry.password, default_pw) then
+        -- player has still the default password
+        minetest.chat_send_player(
+            playername,
+            minetest.colorize("#ff0000", "WARNING: You are using the default password! " ..
+                    "Please change it for your own safety!" ..
+                    "(press the escape-button and click on 'change password')")
+        )
+    end
+end)
diff --git a/init.lua b/init.lua
index e6fec1776cebbd6e9d365c18eccf19fbbac05e2a..d99dfdc47b05176b8942115b5e57528801aed11a 100644
--- a/init.lua
+++ b/init.lua
@@ -1,92 +1,18 @@
-minetest.register_craft({
-    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({
-    output = "digilines:rtc",
-    recipe = {
-        {"basic_materials:plastic_sheet", "basic_materials:energy_crystal_simple", "basic_materials:plastic_sheet"},
-        {"default:steel_ingot", "mesecons_luacontroller:luacontroller0000", "digilines:wire_std_00000000"}
-    }
-})
 
-minetest.register_craft({
-    output = "computer:tetris_arcade",
-    recipe = {
-        {"basic_materials:plastic_sheet", "basic_materials:energy_crystal_simple", "basic_materials:plastic_sheet"},
-        {"dye:black", "default:glass", "dye:black"},
-        {"basic_materials:plastic_sheet", "basic_materials:energy_crystal_simple", "basic_materials:plastic_sheet"}
-    }
-})
-minetest.register_craft({
-    output = "computer:3dprinter_bedflinger",
-    recipe = {
-        {"basic_materials:plastic_sheet", "basic_materials:empty_spool", "default:mese_crystal_fragment"},
-        {"basic_materials:plastic_sheet", "", "basic_materials:plastic_sheet"},
-        {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}
-    }
-})
+kif = {}
 
+local MP = minetest.get_modpath("kif_custom")
 
--- add blocks to be ignored by trains
+-- some items don't have recipes. fill them in
+dofile(MP.."/missing_recipes.lua")
 
+-- make trains ignore microblocks and some others
+dofile(MP.."/advtrains/ignore_collisions.lua")
 
-local additional_nonblocknodes={
-    "digiterms:lcd_monitor",
-    "digiterms:beige_keyboard",
-    "digiterms:white_keyboard",
-    "digiterms:black_keyboard",
-    "digilines:lcd",
-    "homedecor:glowlight_quarter_14",
-    "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
-        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
-                            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
-    end
-end)
+-- warning message for default password (if set)
+if minetest.settings:get("default_password") then
+    dofile(MP.."/default_password_warn.lua")
+end
 
+-- /spawn command
+dofile(MP.."/chat/spawn.lua")
diff --git a/missing_recipes.lua b/missing_recipes.lua
new file mode 100644
index 0000000000000000000000000000000000000000..83564f3ee6342aad6b372cf2e978d2aae7f1eeba
--- /dev/null
+++ b/missing_recipes.lua
@@ -0,0 +1,31 @@
+minetest.register_craft({
+    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({
+    output = "digilines:rtc",
+    recipe = {
+        {"basic_materials:plastic_sheet", "basic_materials:energy_crystal_simple", "basic_materials:plastic_sheet"},
+        {"default:steel_ingot", "mesecons_luacontroller:luacontroller0000", "digilines:wire_std_00000000"}
+    }
+})
+
+minetest.register_craft({
+    output = "computer:tetris_arcade",
+    recipe = {
+        {"basic_materials:plastic_sheet", "basic_materials:energy_crystal_simple", "basic_materials:plastic_sheet"},
+        {"dye:black", "default:glass", "dye:black"},
+        {"basic_materials:plastic_sheet", "basic_materials:energy_crystal_simple", "basic_materials:plastic_sheet"}
+    }
+})
+minetest.register_craft({
+    output = "computer:3dprinter_bedflinger",
+    recipe = {
+        {"basic_materials:plastic_sheet", "basic_materials:empty_spool", "default:mese_crystal_fragment"},
+        {"basic_materials:plastic_sheet", "", "basic_materials:plastic_sheet"},
+        {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}
+    }
+})