diff --git a/core.lua b/core.lua
index c04f2c28d487208dee1419b1fb3c9f6da3f54499..6f1eff56dfad9e0a4c20c91347a33f60d0a14ae7 100644
--- a/core.lua
+++ b/core.lua
@@ -302,9 +302,11 @@ F.core.train_enter = function(place, dir, train)
 		assert(false, msg)
 	end
 
+	-- for report to consoles
 	local flags = {"train_enter"}
 	local payload = {["place"] = place, ["dir"] = dir, ["train"] = train}
 
+	-- check if train is coming in via interfaces
 	local is_entry = false
 	if S.caches.interfaces == nil then
 		F.core.generate_interfaces_cache()
@@ -314,6 +316,7 @@ F.core.train_enter = function(place, dir, train)
 			is_entry = true
 			table.insert(flags, "real_entry")
 	end
+
 	if is_entry then
 		if S.trains[train.id] ~= nil then
 			atc_send("BB")
@@ -322,6 +325,7 @@ F.core.train_enter = function(place, dir, train)
 			F.util.debug(msg)
 			assert(false, msg)
 		end
+		-- register the train
 		S.trains[train.id] = train
 		F.util.debug("Train "..F.util.dump(train.id).." entered via "..F.util.dump(place).."→"..F.util.dump(dir))
 	else
@@ -333,6 +337,7 @@ F.core.train_enter = function(place, dir, train)
 			assert(false, msg)
 		end
 	end
+
 	-- update attributes
 	for k,v in pairs(train) do
 		S.trains[train.id][k] = v
@@ -349,6 +354,7 @@ F.core.train_enter = function(place, dir, train)
 
 	if train.desired == nil or
 		(train.desired.state == "routed" and train.desired.place == place and train.desired.dir == dir) then
+			-- if we have completed a route (or have just started)
 			local dest = F.core.train_find_next_destination(train)
 			if dest == nil then
 				if is_entry then
@@ -367,6 +373,7 @@ F.core.train_enter = function(place, dir, train)
 					print(msg)
 				end
 			else
+				-- schedule a routing task
 				train.desired = {
 					["state"] = "routed",
 					["place"] = dest.place.fullname,
@@ -376,6 +383,7 @@ F.core.train_enter = function(place, dir, train)
 				payload.new_task = "route"
 			end
 	elseif (train.desired.state == "routed" or train.desired.state == "parked") and (train.desired.place ~= place or train.desired.dir ~= dir) then
+		-- if we are not finished routing or finding the parking space, schedule another routing task
 		F.core.validate_place_dir_combo(train.desired.place, train.desired.dir)
 		table.insert(S.tasks, {["type"] = "route", ["train"] = train, ["dest"] = {
 			["place"] = S.places[train.desired.place],
@@ -404,6 +412,7 @@ F.core.train_exit = function(place, dir, train)
 		assert(false, msg)
 	end
 
+	-- for report to consoles
 	local flags = {"train_exit"}
 	local payload = {["place"] = place, ["dir"] = dir, ["train"] = train}
 
@@ -414,6 +423,7 @@ F.core.train_exit = function(place, dir, train)
 		F.util.debug(msg)
 		assert(false, msg)
 	end
+
 	-- use the original object
 	train = S.trains[train.id]
 	-- save current place and dir
@@ -432,6 +442,7 @@ end
 
 
 F.core.reject_train = function(train)
+	-- a train came in which we don't know what to do with, send it back through the interface it came in
 	local msg = "Unexpected train! Train entered "..F.util.dump(train.place.name).."→"..F.util.dump(train.dir).."! Sending back..."
 	if S.generated_places == nil or S.generated_places.interfaces == nil then
 		-- save and announce error
@@ -440,9 +451,11 @@ F.core.reject_train = function(train)
 		F.util.debug(msg)
 		assert(false, msg)
 	end
+
 	if S.caches.interfaces == nil then
 		F.core.generate_interfaces_cache()
 	end
+	-- find the exit interface, if there is any
 	if S.caches.interfaces[train.place.fullname] ~= nil and S.caches.interfaces[train.place.fullname][train.dir] ~= nil then
 		local interface = S.caches.interfaces[train.place.fullname][train.dir].interface
 		if interface.exit ~= nil then
@@ -462,6 +475,7 @@ F.core.reject_train = function(train)
 end
 
 F.core.expect_train = function(train, dest)
+	-- verify that the train appeared where we expected it
 	if dest == nil then
 		dest = train.expected
 	end