diff --git a/mesecons/init.lua b/mesecons/init.lua
index 900d4bb4bad61f5bc30cd85575a34667db2ef335..6378946285e5a784ca07294033a3e7301794ae6e 100644
--- a/mesecons/init.lua
+++ b/mesecons/init.lua
@@ -80,8 +80,9 @@ function mesecon:receptor_on(pos, rules)
 
 	for _, rule in ipairs(rules) do
 		local np = mesecon:addPosRule(pos, rule)
-		if mesecon:rules_link(pos, np, rules) then
-			mesecon:turnon(np, pos)
+		local link, rulename = mesecon:rules_link(pos, np, rules)
+		if link then
+			mesecon:turnon(np, rulename)
 		end
 	end
 end
@@ -91,8 +92,9 @@ function mesecon:receptor_off(pos, rules)
 
 	for _, rule in ipairs(rules) do
 		local np = mesecon:addPosRule(pos, rule)
-		if mesecon:rules_link(pos, np, rules) and not mesecon:connected_to_receptor(np) then
-			mesecon:turnoff(np, pos)
+		local link, rulename = mesecon:rules_link(pos, np, rules)
+		if link then
+			mesecon:turnoff(np, rulename)
 		end
 	end
 end
diff --git a/mesecons/internal.lua b/mesecons/internal.lua
index e9cde2dd4ba651529be085104ba1ea4567197dc4..96e407ecedaf3fc5abfd277083ad286b672add67 100644
--- a/mesecons/internal.lua
+++ b/mesecons/internal.lua
@@ -41,8 +41,8 @@
 -- HIGH-LEVEL Internals
 -- mesecon:is_power_on(pos)             --> Returns true if pos emits power in any way
 -- mesecon:is_power_off(pos)            --> Returns true if pos does not emit power in any way
--- mesecon:turnon(pos)                  --> Returns true  whatever there is at pos. Calls itself for connected nodes (if pos is a conductor) --> recursive
--- mesecon:turnoff(pos)                 --> Turns off whatever there is at pos. Calls itself for connected nodes (if pos is a conductor) --> recursive
+-- mesecon:turnon(pos, rulename)        --> Returns true  whatever there is at pos. Calls itself for connected nodes (if pos is a conductor) --> recursive, the rulename is the name of the input rule that caused calling turnon
+-- mesecon:turnoff(pos, rulename)       --> Turns off whatever there is at pos. Calls itself for connected nodes (if pos is a conductor) --> recursive, the rulename is the name of the input rule that caused calling turnoff
 -- mesecon:connected_to_receptor(pos)   --> Returns true if pos is connected to a receptor directly or via conductors; calls itself if pos is a conductor --> recursive
 -- mesecon:rules_link(output, input, dug_outputrules) --> Returns true if outputposition + outputrules = inputposition and inputposition + inputrules = outputposition (if the two positions connect)
 -- mesecon:rules_link_anydir(outp., inp., d_outpr.)   --> Same as rules mesecon:rules_link but also returns true if output and input are swapped
@@ -178,24 +178,24 @@ end
 
 --Signals
 
-function mesecon:activate(pos, node)
+function mesecon:activate(pos, node, rulename)
 	local effector = mesecon:get_effector(node.name)
 	if effector and effector.action_on then
-		effector.action_on (pos, node)
+		effector.action_on (pos, node, rulename)
 	end
 end
 
-function mesecon:deactivate(pos, node)
+function mesecon:deactivate(pos, node, rulename)
 	local effector = mesecon:get_effector(node.name)
 	if effector and effector.action_off then
-		effector.action_off (pos, node)
+		effector.action_off (pos, node, rulename)
 	end
 end
 
-function mesecon:changesignal(pos, node)
+function mesecon:changesignal(pos, node, rulename)
 	local effector = mesecon:get_effector(node.name)
 	if effector and effector.action_change then
-		effector.action_change (pos, node)
+		effector.action_change (pos, node, rulename)
 	end
 end
 
@@ -282,7 +282,7 @@ function mesecon:is_power_off(pos)
 	return false
 end
 
-function mesecon:turnon(pos)
+function mesecon:turnon(pos, rulename)
 	local node = minetest.env:get_node(pos)
 
 	if mesecon:is_conductor_off(node.name) then
@@ -291,20 +291,21 @@ function mesecon:turnon(pos)
 
 		for _, rule in ipairs(rules) do
 			local np = mesecon:addPosRule(pos, rule)
+			local link, rulename = mesecon:rules_link(pos, np)
 
-			if mesecon:rules_link(pos, np) then
-				mesecon:turnon(np)
+			if link then
+				mesecon:turnon(np, rulename)
 			end
 		end
 	elseif mesecon:is_effector(node.name) then
-		mesecon:changesignal(pos, node)
+		mesecon:changesignal(pos, node, rulename)
 		if mesecon:is_effector_off(node.name) then
-			mesecon:activate(pos, node)
+			mesecon:activate(pos, node, rulename)
 		end
 	end
 end
 
-function mesecon:turnoff(pos)
+function mesecon:turnoff(pos, rulename)
 	local node = minetest.env:get_node(pos)
 
 	if mesecon:is_conductor_on(node.name) then
@@ -313,16 +314,17 @@ function mesecon:turnoff(pos)
 
 		for _, rule in ipairs(rules) do
 			local np = mesecon:addPosRule(pos, rule)
+			local link, rulename = mesecon:rules_link(pos, np)
 
-			if mesecon:rules_link(pos, np) then
-				mesecon:turnoff(np)
+			if link then
+				mesecon:turnoff(np, rulename)
 			end
 		end
 	elseif mesecon:is_effector(node.name) then
-		mesecon:changesignal(pos, node)
+		mesecon:changesignal(pos, node, rulename)
 		if mesecon:is_effector_on(node.name)
 		and not mesecon:is_powered(pos) then
-			mesecon:deactivate(pos, node)
+			mesecon:deactivate(pos, node, rulename)
 		end
 	end
 end
@@ -363,12 +365,11 @@ function mesecon:connected_to_receptor(pos, checked)
 	return false, checked
 end
 
-function mesecon:rules_link(output, input, dug_outputrules) --output/input are positions (outputrules optional, used if node has been dug)
+function mesecon:rules_link(output, input, dug_outputrules) --output/input are positions (outputrules optional, used if node has been dug), second return value: the name of the affected input rule
 	local outputnode = minetest.env:get_node(output)
 	local inputnode = minetest.env:get_node(input)
 	local outputrules = dug_outputrules or mesecon:get_any_outputrules (outputnode)
 	local inputrules = mesecon:get_any_inputrules (inputnode)
-
 	if not outputrules or not inputrules then
 		return
 	end
@@ -379,7 +380,7 @@ function mesecon:rules_link(output, input, dug_outputrules) --output/input are p
 			for _, inputrule in ipairs(inputrules) do
 				-- Check if input accepts from output
 				if  mesecon:cmpPos(mesecon:addPosRule(input, inputrule), output) then
-					return true
+					return true, inputrule.name
 				end
 			end
 		end
diff --git a/mesecons_microcontroller/init.lua b/mesecons_microcontroller/init.lua
index 3117880b388d1d55c8f0871fb12b9369d36155c1..6120adee8dee4660cec1d0f461bd558692a0183d 100644
--- a/mesecons_microcontroller/init.lua
+++ b/mesecons_microcontroller/init.lua
@@ -30,16 +30,16 @@ if (c == 1) then table.insert(rules, {x =  1, y = 0, z =  0}) end
 if (d == 1) then table.insert(rules, {x =  0, y = 0, z = -1}) end
 
 local input_rules={}
-if (a == 0) then table.insert(input_rules, {x = -1, y = 0, z =  0}) end
-if (b == 0) then table.insert(input_rules, {x =  0, y = 0, z =  1}) end
-if (c == 0) then table.insert(input_rules, {x =  1, y = 0, z =  0}) end
-if (d == 0) then table.insert(input_rules, {x =  0, y = 0, z = -1}) end
+if (a == 0) then table.insert(input_rules, {x = -1, y = 0, z =  0, name = "A"}) end
+if (b == 0) then table.insert(input_rules, {x =  0, y = 0, z =  1, name = "B"}) end
+if (c == 0) then table.insert(input_rules, {x =  1, y = 0, z =  0, name = "C"}) end
+if (d == 0) then table.insert(input_rules, {x =  0, y = 0, z = -1, name = "D"}) end
 mesecon:add_rules(nodename, rules)
 
 local mesecons = {effector =
 {
 	rules = input_rules,
-	action_change = function (pos, node)
+	action_change = function (pos, node, rulename)
 		update_yc(pos)
 	end
 }}