diff --git a/mesecons_luacontroller/init.lua b/mesecons_luacontroller/init.lua
index 4c6ff30..9fa995f 100644
--- a/mesecons_luacontroller/init.lua
+++ b/mesecons_luacontroller/init.lua
@@ -135,10 +135,29 @@ local code_prohibited = function(code)
 	end
 end
 
-local safeprint = function(param)
+local safe_print = function(param)
 	print(dump(param))
 end
 
+deep_copy = function(original) --deep copy that removes functions
+	if type(original) == 'table' then --nested table
+		local copy = {}
+		for key, value in next, original, nil do
+			copy[deep_copy(key)] = deep_copy(value)
+		end
+		setmetatable(copy, deep_copy(getmetatable(original)))
+		return copy
+	elseif type(original) == 'function' then --ignore functions
+		return nil
+	else --by-value type
+		return original
+	end
+end
+
+local safe_serialize = function(value)
+	return minetest.serialize(deep_copy(value))
+end
+
 local interrupt = function(params)
 	lc_update(params.pos, {type="interrupt", iid = params.iid})
 end
@@ -150,15 +169,16 @@ local getinterrupt = function(pos)
 		local meta = minetest.env:get_meta(pos)
 		local interrupts = minetest.deserialize(meta:get_string("lc_interrupts")) or {}
 		local found = false
+		local search = safe_serialize(iid)
 		for _, i in ipairs(interrupts) do
-			if minetest.serialize(i) == minetest.serialize(iid) then
+			if safe_serialize(i) == search then
 				found = true
 				break
 			end
 		end
 		if not found then
 			table.insert(interrupts, iid)
-			meta:set_string("lc_interrupts", minetest.serialize(interrupts))
+			meta:set_string("lc_interrupts", safe_serialize(interrupts))
 		end
 		minetest.after(time, interrupt, {pos=pos, iid = iid})
 	end
@@ -181,7 +201,7 @@ local create_environment = function(pos, mem, event)
 	local rports = get_real_portstates(pos)
 
 	return {
-			print = safeprint,
+			print = safe_print,
 			pin = merge_portstates(vports, rports),
 			port = vports,
 			interrupt = getinterrupt(pos),
@@ -272,15 +292,16 @@ local load_memory = function(meta)
 end
 
 local save_memory = function(meta, mem)
-	meta:set_string("lc_memory", minetest.serialize(mem))
+	meta:set_string("lc_memory", safe_serialize(mem))
 end
 
 local interrupt_allow = function (meta, event)
 	if event.type ~= "interrupt" then return true end
 
 	local interrupts = minetest.deserialize(meta:get_string("lc_interrupts")) or {}
+	local search = safe_serialize(event.iid)
 	for _, i in ipairs(interrupts) do
-		if minetest.serialize(i) == minetest.serialize(event.iid) then
+		if safe_serialize(i) == search then
 			return true
 		end
 	end