diff --git a/mesecons_detector/doc/nodedetector/description.html b/mesecons_detector/doc/nodedetector/description.html
index be34fde0bdf866892a1d96d27e08795594cb5230..be1582e924749aa1d7872c7ca23852af83367ae9 100644
--- a/mesecons_detector/doc/nodedetector/description.html
+++ b/mesecons_detector/doc/nodedetector/description.html
@@ -4,3 +4,4 @@ It can also receive digiline signals. You can either send "GET" and it will
 respond with the detected nodename or you can send any other string and it will
 set this string as the node to scan for.
 Nodenames must include the mod they reside in, so for instance default:dirt, not just dirt.
+The distance parameter specifies how many blocks are between the node detector and the node to detect.
diff --git a/mesecons_detector/doc/objectdetector/description.html b/mesecons_detector/doc/objectdetector/description.html
index c8315e8fa7e0a4ac3eb5f5b8a44b278b9fc48097..bb8885656475611d671b8a1efd8e70340002bfb4 100644
--- a/mesecons_detector/doc/objectdetector/description.html
+++ b/mesecons_detector/doc/objectdetector/description.html
@@ -1,3 +1,4 @@
 The object detector is a receptor. It changes its state when a player approaches.
 Right-click it to set a name to scan for.
+You can also search for comma-separated lists of players where the detector gets activated if any of the names in the list are found.
 It can also receive digiline signals which are the name to scan for on the specified channel in the right-click menu.
diff --git a/mesecons_detector/init.lua b/mesecons_detector/init.lua
index 65e5c6e6e5318188195723c71b8dcd35ebd73195..397543c3b085ea6db8de4adc9962d91561d1270e 100644
--- a/mesecons_detector/init.lua
+++ b/mesecons_detector/init.lua
@@ -5,15 +5,18 @@ local GET_COMMAND = "GET"
 -- The radius can be specified in mesecons/settings.lua
 
 local function object_detector_make_formspec(pos)
-	minetest.get_meta(pos):set_string("formspec", "size[9,2.5]" ..
+	local meta = minetest.get_meta(pos)
+	meta:set_string("formspec", "size[9,2.5]" ..
 		"field[0.3,  0;9,2;scanname;Name of player to scan for (empty for any):;${scanname}]"..
 		"field[0.3,1.5;4,2;digiline_channel;Digiline Channel (optional):;${digiline_channel}]"..
 		"button_exit[7,0.75;2,3;;Save]")
 end
 
-local function object_detector_on_receive_fields(pos, _, fields)
+local function object_detector_on_receive_fields(pos, formname, fields, sender)
 	if not fields.scanname or not fields.digiline_channel then return end
 
+	if minetest.is_protected(pos, sender:get_player_name()) then return end
+
 	local meta = minetest.get_meta(pos)
 	meta:set_string("scanname", fields.scanname)
 	meta:set_string("digiline_channel", fields.digiline_channel)
@@ -28,14 +31,17 @@ local function object_detector_scan(pos)
 	if next(objs) == nil then return false end
 
 	local scanname = minetest.get_meta(pos):get_string("scanname")
+	local scan_for = {}
+	for _, str in pairs(string.split(scanname:gsub(" ", ""), ",")) do
+		scan_for[str] = true
+	end
+	
 	local every_player = scanname == ""
 	for _, obj in pairs(objs) do
 		-- "" is returned if it is not a player; "" ~= nil; so only handle objects with foundname ~= ""
 		local foundname = obj:get_player_name()
-
 		if foundname ~= "" then
-			-- return true if scanning for any player or if specific playername was detected
-			if scanname == "" or foundname == scanname then
+			if every_player or scan_for[foundname] then
 				return true
 			end
 		end
@@ -128,17 +134,23 @@ minetest.register_abm({
 -- Detects the node in front of it
 
 local function node_detector_make_formspec(pos)
-	minetest.get_meta(pos):set_string("formspec", "size[9,2.5]" ..
+	local meta = minetest.get_meta(pos)
+	if meta:get_string("distance") == ""  then meta:set_string("distance", "0") end
+	meta:set_string("formspec", "size[9,2.5]" ..
 		"field[0.3,  0;9,2;scanname;Name of node to scan for (empty for any):;${scanname}]"..
-		"field[0.3,1.5;4,2;digiline_channel;Digiline Channel (optional):;${digiline_channel}]"..
+		"field[0.3,1.5;2.5,2;distance;Distance (0-"..mesecon.setting("node_detector_distance_max", 10).."):;${distance}]"..
+		"field[3,1.5;4,2;digiline_channel;Digiline Channel (optional):;${digiline_channel}]"..
 		"button_exit[7,0.75;2,3;;Save]")
 end
 
-local function node_detector_on_receive_fields(pos, _, fields)
+local function node_detector_on_receive_fields(pos, fieldname, fields, sender)
 	if not fields.scanname or not fields.digiline_channel then return end
 
+	if minetest.is_protected(pos, sender:get_player_name()) then return end
+
 	local meta = minetest.get_meta(pos)
 	meta:set_string("scanname", fields.scanname)
+	meta:set_string("distance", fields.distance or "0")
 	meta:set_string("digiline_channel", fields.digiline_channel)
 	node_detector_make_formspec(pos)
 end
@@ -148,10 +160,17 @@ local function node_detector_scan(pos)
 	local node = minetest.get_node_or_nil(pos)
 	if not node then return end
 
+	local meta = minetest.get_meta(pos)
+
+	local distance = meta:get_int("distance")
+	local distance_max = mesecon.setting("node_detector_distance_max", 10)
+	if distance < 0 then distance = 0 end
+	if distance > distance_max then distance = distance_max end
+
 	local frontname = minetest.get_node(
-		vector.subtract(pos, minetest.facedir_to_dir(node.param2))
+		vector.subtract(pos, vector.multiply(minetest.facedir_to_dir(node.param2), distance + 1))
 	).name
-	local scanname = minetest.get_meta(pos):get_string("scanname")
+	local scanname = meta:get_string("scanname")
 
 	return (frontname == scanname) or
 		(frontname ~= "air" and frontname ~= "ignore" and scanname == "")
@@ -162,11 +181,17 @@ local node_detector_digiline = {
 	effector = {
 		action = function(pos, node, channel, msg)
 			local meta = minetest.get_meta(pos)
+			
+			local distance = meta:get_int("distance")
+			local distance_max = mesecon.setting("node_detector_distance_max", 10)
+			if distance < 0 then distance = 0 end
+			if distance > distance_max then distance = distance_max end
+			
 			if channel ~= meta:get_string("digiline_channel") then return end
 
 			if msg == GET_COMMAND then
 				local nodename = minetest.get_node(
-					vector.subtract(pos, minetest.facedir_to_dir(node.param2))
+					vector.subtract(pos, vector.multiply(minetest.facedir_to_dir(node.param2), distance + 1))
 				).name
 
 				digiline:receptor_send(pos, digiline.rules.default, channel, nodename)
@@ -208,7 +233,6 @@ minetest.register_node("mesecons_detector:node_detector_off", {
 	}},
 	on_construct = node_detector_make_formspec,
 	on_receive_fields = node_detector_on_receive_fields,
-	after_place_node = after_place_node_detector,
 	sounds = default.node_sound_stone_defaults(),
 	digiline = node_detector_digiline
 })
@@ -225,7 +249,6 @@ minetest.register_node("mesecons_detector:node_detector_on", {
 	}},
 	on_construct = node_detector_make_formspec,
 	on_receive_fields = node_detector_on_receive_fields,
-	after_place_node = after_place_node_detector,
 	sounds = default.node_sound_stone_defaults(),
 	digiline = node_detector_digiline
 })