diff --git a/README.md b/README.md
index fae4769..077a3bd 100644
--- a/README.md
+++ b/README.md
@@ -61,6 +61,7 @@ Change log:
 - 3.1 - Ability to hide protection blocks using /protector_hide and /protector_show , italian local added (thanks Hamlet)
 - 3.2 - Defaults to Minetest translation if found, otherwise intllib fallback if loaded, locale files updated for both.  Added 'protector_msg' setting for player text.
 - 3.3 - Added support for playerfactions new api (thanks louisroyer), added limiter to protection radius of 22.
+- 3.4 - Player flip and hurt functions moved to minetest.register_protection_violation function (thanks hlqkj), added 'protector_crafts' setting, changed wood doors n chests to immediate_dig for mineclone2 fix.
 
 Lucky Blocks: 10
 
diff --git a/admin.lua b/admin.lua
index 2a4f1a5..c7c4446 100644
--- a/admin.lua
+++ b/admin.lua
@@ -29,7 +29,7 @@ minetest.register_chatcommand("protector_remove", {
 		end
 
 		removal_names = param
-	end,
+	end
 })
 
 
@@ -63,7 +63,7 @@ minetest.register_chatcommand("protector_replace", {
 		end
 
 		replace_names = param
-	end,
+	end
 })
 
 
@@ -163,8 +163,8 @@ minetest.register_node("protector:protect_hidden", {
 	-- 1px block inside door hinge near node top
 	collision_box = {
 		type = "fixed",
-		fixed = {-15/32, 13/32, -15/32, -13/32, 1/2, -13/32},
-	},
+		fixed = {-15/32, 13/32, -15/32, -13/32, 1/2, -13/32}
+	}
 })
 
 
diff --git a/depends.txt b/depends.txt
index 5b09c28..daa563a 100644
--- a/depends.txt
+++ b/depends.txt
@@ -3,3 +3,5 @@ intllib?
 lucky_block?
 mesecons_mvps?
 playerfactions?
+mcl_core?
+mcl_formspec?
diff --git a/doors_chest.lua b/doors_chest.lua
index 1d7819e..2793b82 100644
--- a/doors_chest.lua
+++ b/doors_chest.lua
@@ -7,7 +7,11 @@ local S = protector.intllib
 local F = minetest.formspec_escape
 
 -- MineClone2 support
-local mcl = not minetest.registered_items["default:steel_ingot"]
+local mcl = minetest.get_modpath("mcl_core")
+local mcf = minetest.get_modpath("mcl_formspec")
+
+-- Are crafts enabled?
+local protector_crafts = minetest.settings:get_bool("protector_crafts") ~= false
 
 -- Registers a door
 function register_door(name, def)
@@ -297,7 +301,6 @@ function register_door(name, def)
 		sunlight_propagates = def.sunlight,
 		on_blast = function() end,
 	})
-
 end
 
 -- Protected Wooden Door
@@ -308,38 +311,40 @@ register_door(name, {
 	description = S("Protected Wooden Door"),
 	inventory_image = "doors_wood.png^protector_logo.png",
 	groups = {
-		snappy = 1, choppy = 2, oddly_breakable_by_hand = 2,
+		snappy = 1, choppy = 2, dig_immediate = 2,
 		unbreakable = 1, --door = 1
 	},
 	tiles_bottom = {"doors_wood_b.png^protector_logo.png", "doors_brown.png"},
 	tiles_top = {"doors_wood_a.png", "doors_brown.png"},
 	sounds = default.node_sound_wood_defaults(),
-	sunlight = false,
+	sunlight = false
 })
 
-if mcl then
-minetest.register_craft({
-	output = name,
-	recipe = {
-		{"mcl_doors:wooden_door", "mcl_core:gold_ingot"}
-	}
-})
-else
-minetest.register_craft({
-	output = name,
-	recipe = {
-		{"group:wood", "group:wood"},
-		{"group:wood", "default:copper_ingot"},
-		{"group:wood", "group:wood"}
-	}
-})
+if protector_crafts then
+	if mcl then
+	minetest.register_craft({
+		output = name,
+		recipe = {
+			{"mcl_doors:wooden_door", "mcl_core:gold_ingot"}
+		}
+	})
+	else
+	minetest.register_craft({
+		output = name,
+		recipe = {
+			{"group:wood", "group:wood"},
+			{"group:wood", "default:copper_ingot"},
+			{"group:wood", "group:wood"}
+		}
+	})
 
-minetest.register_craft({
-	output = name,
-	recipe = {
-		{"doors:door_wood", "default:copper_ingot"}
-	}
-})
+	minetest.register_craft({
+		output = name,
+		recipe = {
+			{"doors:door_wood", "default:copper_ingot"}
+		}
+	})
+	end
 end
 
 -- Protected Steel Door
@@ -359,29 +364,33 @@ register_door(name, {
 	sunlight = false,
 })
 
-if mcl then
-minetest.register_craft({
-	output = name,
-	recipe = {
-		{"mcl_doors:iron_door", "mcl_core:gold_ingot"}
-	}
-})
-else
-minetest.register_craft({
-	output = name,
-	recipe = {
-		{"default:steel_ingot", "default:steel_ingot"},
-		{"default:steel_ingot", "default:copper_ingot"},
-		{"default:steel_ingot", "default:steel_ingot"}
-	}
-})
-
-minetest.register_craft({
-	output = name,
-	recipe = {
-		{"doors:door_steel", "default:copper_ingot"}
-	}
-})
+if protector_crafts then
+
+	if mcl then
+
+		minetest.register_craft({
+			output = name,
+			recipe = {
+				{"mcl_doors:iron_door", "mcl_core:gold_ingot"}
+			}
+		})
+	else
+		minetest.register_craft({
+			output = name,
+			recipe = {
+				{"default:steel_ingot", "default:steel_ingot"},
+				{"default:steel_ingot", "default:copper_ingot"},
+				{"default:steel_ingot", "default:steel_ingot"}
+			}
+		})
+
+		minetest.register_craft({
+			output = name,
+			recipe = {
+				{"doors:door_steel", "default:copper_ingot"}
+			}
+		})
+	end
 end
 
 ----trapdoor----
@@ -454,34 +463,36 @@ register_trapdoor("protector:trapdoor", {
 	tile_front = "doors_trapdoor.png^protector_logo.png",
 	tile_side = "doors_trapdoor_side.png",
 	groups = {
-		snappy = 1, choppy = 2, oddly_breakable_by_hand = 2,
+		snappy = 1, choppy = 2, dig_immediate = 2,
 		unbreakable = 1, --door = 1
 	},
 	sounds = default.node_sound_wood_defaults(),
 })
 
-if mcl then
-minetest.register_craft({
-	output = "protector:trapdoor",
-	recipe = {
-		{"mcl_doors:trapdoor", "mcl_core:gold_ingot"}
-	}
-})
-else
-minetest.register_craft({
-	output = "protector:trapdoor 2",
-	recipe = {
-		{"group:wood", "default:copper_ingot", "group:wood"},
-		{"group:wood", "group:wood", "group:wood"},
-	}
-})
+if protector_crafts then
+	if mcl then
+	minetest.register_craft({
+		output = "protector:trapdoor",
+		recipe = {
+			{"mcl_doors:trapdoor", "mcl_core:gold_ingot"}
+		}
+	})
+	else
+	minetest.register_craft({
+		output = "protector:trapdoor 2",
+		recipe = {
+			{"group:wood", "default:copper_ingot", "group:wood"},
+			{"group:wood", "group:wood", "group:wood"}
+		}
+	})
 
-minetest.register_craft({
-	output = "protector:trapdoor",
-	recipe = {
-		{"doors:trapdoor", "default:copper_ingot"}
-	}
-})
+	minetest.register_craft({
+		output = "protector:trapdoor",
+		recipe = {
+			{"doors:trapdoor", "default:copper_ingot"}
+		}
+	})
+	end
 end
 
 -- Protected Steel Trapdoor
@@ -499,28 +510,30 @@ register_trapdoor("protector:trapdoor_steel", {
 	sounds = default.node_sound_wood_defaults(),
 })
 
-if mcl then
-minetest.register_craft({
-	output = "protector:trapdoor_steel",
-	recipe = {
-		{"mcl_doors:iron_trapdoor", "mcl_core:gold_ingot"}
-	}
-})
-else
-minetest.register_craft({
-	output = "protector:trapdoor_steel",
-	recipe = {
-		{"default:copper_ingot", "default:steel_ingot"},
-		{"default:steel_ingot", "default:steel_ingot"},
-	}
-})
+if protector_crafts then
+	if mcl then
+	minetest.register_craft({
+		output = "protector:trapdoor_steel",
+		recipe = {
+			{"mcl_doors:iron_trapdoor", "mcl_core:gold_ingot"}
+		}
+	})
+	else
+	minetest.register_craft({
+		output = "protector:trapdoor_steel",
+		recipe = {
+			{"default:copper_ingot", "default:steel_ingot"},
+			{"default:steel_ingot", "default:steel_ingot"}
+		}
+	})
 
-minetest.register_craft({
-	output = "protector:trapdoor_steel",
-	recipe = {
-		{"doors:trapdoor_steel", "default:copper_ingot"}
-	}
-})
+	minetest.register_craft({
+		output = "protector:trapdoor_steel",
+		recipe = {
+			{"doors:trapdoor_steel", "default:copper_ingot"}
+		}
+	})
+	end
 end
 
 -- Protected Chest
@@ -533,7 +546,7 @@ minetest.register_node("protector:chest", {
 		"default_chest_side.png", "default_chest_front.png^protector_logo.png"
 	},
 	paramtype2 = "facedir",
-	groups = {choppy = 2, oddly_breakable_by_hand = 2, unbreakable = 1},
+	groups = {dig_immediate = 2, unbreakable = 1},
 	legacy_facedir_simple = true,
 	is_ground_content = false,
 	sounds = default.node_sound_wood_defaults(),
@@ -624,7 +637,30 @@ minetest.register_node("protector:chest", {
 		end
 
 		local spos = pos.x .. "," .. pos.y .. "," ..pos.z
-		local formspec = "size[8,9]"
+		local formspec
+
+		-- mineclone support
+		if mcl and mcf then
+
+			formspec = "size[9,8.75]"
+			.. "label[0,0;" .. minetest.formspec_escape(
+					minetest.colorize("#313131", "Protected Chest")) .. "]"
+			.. "list[nodemeta:" .. spos .. ";main;0,0.5;9,3;]"
+			.. mcl_formspec.get_itemslot_bg(0,0.5,9,3)
+			.. "image_button[3.0,3.5;1.05,0.8;protector_up_icon.png;protect_up;]"
+			.. "image_button[4.0,3.5;1.05,0.8;protector_down_icon.png;protect_down;]"
+			.. "label[0,4.0;" .. minetest.formspec_escape(
+					minetest.colorize("#313131", "Inventory")) .. "]"
+			.. "list[current_player;main;0,4.5;9,3;9]"
+			.. mcl_formspec.get_itemslot_bg(0,4.5,9,3)
+			.. "list[current_player;main;0,7.74;9,1;]"
+			.. mcl_formspec.get_itemslot_bg(0,7.74,9,1)
+			.. "listring[nodemeta:" .. spos .. ";main]"
+			.. "listring[current_player;main]"
+
+		else -- default formspec
+
+			formspec = "size[8,9]"
 			.. "list[nodemeta:".. spos .. ";main;0,0.3;8,4;]"
 
 			.. "image_button[-0.01,4.26;1.05,0.8;protector_up_icon.png;protect_up;]"
@@ -640,11 +676,10 @@ minetest.register_node("protector:chest", {
 			.. "list[current_player;main;0,6.08;8,3;8]"
 			.. "listring[nodemeta:" .. spos .. ";main]"
 			.. "listring[current_player;main]"
+		end
 
-			minetest.show_formspec(
-				clicker:get_player_name(),
-				"protector:chest_" .. minetest.pos_to_string(pos),
-				formspec)
+		minetest.show_formspec(clicker:get_player_name(),
+				"protector:chest_" .. minetest.pos_to_string(pos), formspec)
 	end,
 
 	on_blast = function() end,
@@ -720,27 +755,31 @@ end)
 
 -- Protected Chest recipes
 
-if mcl then
-minetest.register_craft({
-	output = "protector:chest",
-	recipe = {
-		{"mcl_chests:chest", "mcl_core:gold_ingot"},
-	}
-})
-else
-minetest.register_craft({
-	output = "protector:chest",
-	recipe = {
-		{"group:wood", "group:wood", "group:wood"},
-		{"group:wood", "default:copper_ingot", "group:wood"},
-		{"group:wood", "group:wood", "group:wood"},
-	}
-})
-
-minetest.register_craft({
-	output = "protector:chest",
-	recipe = {
-		{"default:chest", "default:copper_ingot"},
-	}
-})
+if protector_crafts then
+
+	if mcl then
+
+		minetest.register_craft({
+			output = "protector:chest",
+			recipe = {
+				{"mcl_chests:chest", "mcl_core:gold_ingot"}
+			}
+		})
+	else
+		minetest.register_craft({
+			output = "protector:chest",
+			recipe = {
+				{"group:wood", "group:wood", "group:wood"},
+				{"group:wood", "default:copper_ingot", "group:wood"},
+				{"group:wood", "group:wood", "group:wood"}
+			}
+		})
+
+		minetest.register_craft({
+			output = "protector:chest",
+			recipe = {
+				{"default:chest", "default:copper_ingot"}
+			}
+		})
+	end
 end
diff --git a/init.lua b/init.lua
index 2e20b10..d40dab0 100644
--- a/init.lua
+++ b/init.lua
@@ -109,6 +109,11 @@ end
 -- add player name to table as member
 local add_member = function(meta, name)
 
+	-- Validate player name for MT compliance
+	if name ~= string.match(name, "[%w_-]+") then
+		return
+	end
+
 	-- Constant (20) defined by player.h
 	if name:len() > 25 then
 		return
@@ -155,7 +160,6 @@ local protector_formspec = function(meta)
 	local formspec = "size[8,7]"
 		.. default.gui_bg
 		.. default.gui_bg_img
-		.. default.gui_slots
 		.. "label[2.5,0;" .. F(S("-- Protector interface --")) .. "]"
 		.. "label[0,1;" .. F(S("PUNCH node to show protected area")) .. "]"
 		.. "label[0,2;" .. F(S("Members:")) .. "]"
@@ -356,58 +360,62 @@ protector.can_dig = function(r, pos, digger, onlyowner, infolevel)
 end
 
 
-local old_is_protected = minetest.is_protected
+-- add protector hurt and flip to protection violation function
+minetest.register_on_protection_violation(function(pos, name)
 
--- check for protected area, return true if protected and digger isn't on list
-function minetest.is_protected(pos, digger)
+	local player = minetest.get_player_by_name(name)
 
-	digger = digger or "" -- nil check
+	if player and player:is_player() then
 
-	-- is area protected against digger?
-	if not protector.can_dig(protector_radius, pos, digger, false, 1) then
+		-- hurt player if protection violated
+		if protector_hurt > 0 and player:get_hp() > 0 then
 
-		local player = minetest.get_player_by_name(digger)
+			-- This delay fixes item duplication bug (thanks luk3yx)
+			minetest.after(0.1, function(player)
+				player:set_hp(player:get_hp() - protector_hurt)
+			end, player)
+		end
 
-		if player and player:is_player() then
+		-- flip player when protection violated
+		if protector_flip then
 
-			-- hurt player if protection violated
-			if protector_hurt > 0 and player:get_hp() > 0 then
+			-- yaw + 180°
+			local yaw = player:get_look_horizontal() + math.pi
 
-				-- This delay fixes item duplication bug (thanks luk3yx)
-				minetest.after(0.1, function(player)
-					player:set_hp(player:get_hp() - protector_hurt)
-				end, player)
+			if yaw > 2 * math.pi then
+				yaw = yaw - 2 * math.pi
 			end
 
-			-- flip player when protection violated
-			if protector_flip then
+			player:set_look_horizontal(yaw)
 
-				-- yaw + 180°
-				local yaw = player:get_look_horizontal() + math.pi
+			-- invert pitch
+			player:set_look_vertical(-player:get_look_vertical())
 
-				if yaw > 2 * math.pi then
-					yaw = yaw - 2 * math.pi
-				end
+			-- if digging below player, move up to avoid falling through hole
+			local pla_pos = player:get_pos()
+
+			if pos.y < pla_pos.y then
 
-				player:set_look_horizontal(yaw)
+				player:set_pos({
+					x = pla_pos.x,
+					y = pla_pos.y + 0.8,
+					z = pla_pos.z
+				})
+			end
+		end
+	end
+end)
 
-				-- invert pitch
-				player:set_look_vertical(-player:get_look_vertical())
 
-				-- if digging below player, move up to avoid falling through hole
-				local pla_pos = player:get_pos()
+local old_is_protected = minetest.is_protected
 
-				if pos.y < pla_pos.y then
+-- check for protected area, return true if protected and digger isn't on list
+function minetest.is_protected(pos, digger)
 
-					player:set_pos({
-						x = pla_pos.x,
-						y = pla_pos.y + 0.8,
-						z = pla_pos.z
-					})
-				end
-			end
-		end
+	digger = digger or "" -- nil check
 
+	-- is area protected against digger?
+	if not protector.can_dig(protector_radius, pos, digger, false, 1) then
 		return true
 	end
 
@@ -485,7 +493,7 @@ minetest.register_node("protector:protect", {
 	node_box = {
 		type = "fixed",
 		fixed = {
-			{-0.5 ,-0.5, -0.5, 0.5, 0.5, 0.5},
+			{-0.5 ,-0.5, -0.5, 0.5, 0.5, 0.5}
 		}
 	},
 
@@ -554,7 +562,7 @@ if protector_recipe then
 			recipe = {
 				{"default:stone", "default:stone", "default:stone"},
 				{"default:stone", "default:gold_ingot", "default:stone"},
-				{"default:stone", "default:stone", "default:stone"},
+				{"default:stone", "default:stone", "default:stone"}
 			}
 		})
 	else
@@ -564,7 +572,7 @@ if protector_recipe then
 			recipe = {
 				{"mcl_core:stone", "mcl_core:stone", "mcl_core:stone"},
 				{"mcl_core:stone", "mcl_core:gold_ingot", "mcl_core:stone"},
-				{"mcl_core:stone", "mcl_core:stone", "mcl_core:stone"},
+				{"mcl_core:stone", "mcl_core:stone", "mcl_core:stone"}
 			}
 		})
 	end
@@ -590,7 +598,7 @@ minetest.register_node("protector:protect2", {
 		type = "wallmounted",
 		wall_top    = {-0.375, 0.4375, -0.5, 0.375, 0.5, 0.5},
 		wall_bottom = {-0.375, -0.5, -0.5, 0.375, -0.4375, 0.5},
-		wall_side   = {-0.5, -0.5, -0.375, -0.4375, 0.5, 0.375},
+		wall_side   = {-0.5, -0.5, -0.375, -0.4375, 0.5, 0.375}
 	},
 	selection_box = {type = "wallmounted"},
 
@@ -705,7 +713,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
 	end
 
 	-- add faction members
-	if factions_available then
+	if factions_available and fields.faction_members ~= nil then
 		meta:set_int("faction_members", fields.faction_members == "true" and 1 or 0)
 	end
 
@@ -751,7 +759,7 @@ minetest.register_entity("protector:display", {
 		if self.timer > protector_show then
 			self.object:remove()
 		end
-	end,
+	end
 })
 
 
@@ -761,7 +769,7 @@ minetest.register_entity("protector:display", {
 local x = protector_radius
 minetest.register_node("protector:display_node", {
 	tiles = {"protector_display.png"},
-	use_texture_alpha = "clip", -- true,
+	use_texture_alpha = "clip",
 	walkable = false,
 	drawtype = "nodebox",
 	node_box = {
@@ -777,15 +785,15 @@ minetest.register_node("protector:display_node", {
 			-- bottom
 			{-(x+.55), -(x+.55), -(x+.55), (x+.55), -(x+.45), (x+.55)},
 			-- middle (surround protector)
-			{-.55,-.55,-.55, .55,.55,.55},
-		},
+			{-.55,-.55,-.55, .55,.55,.55}
+		}
 	},
 	selection_box = {
 		type = "regular",
 	},
 	paramtype = "light",
 	groups = {dig_immediate = 3, not_in_creative_inventory = 1},
-	drop = "",
+	drop = ""
 })
 
 
diff --git a/lucky_block.lua b/lucky_block.lua
index 59c52c1..8e17614 100644
--- a/lucky_block.lua
+++ b/lucky_block.lua
@@ -13,6 +13,6 @@ if minetest.get_modpath("lucky_block") then
 		{"dro", {"protector:trapdoor_steel"}, 1},
 		{"dro", {"protector:tool"}, 1},
 		{"dro", {"protector:chest"}, 1},
-		{"exp"},
+		{"exp"}
 	})
 end
diff --git a/mod.conf b/mod.conf
index 774f1a1..5d90f01 100644
--- a/mod.conf
+++ b/mod.conf
@@ -1,3 +1,3 @@
 name = protector
 description = Lets players craft special blocks to protect their builds or disable PVP in areas.
-optional_depends = default, intllib, lucky_block, mesecons_mvps, playerfactions
+optional_depends = default, intllib, lucky_block, mesecons_mvps, playerfactions, mcl_core, mcl_formspec
diff --git a/settingtypes.txt b/settingtypes.txt
index 7fe8446..723efd4 100644
--- a/settingtypes.txt
+++ b/settingtypes.txt
@@ -28,5 +28,8 @@ protector_hud_interval (Protector HUD Interval) int 5
 #    Enables craft recipe for protection block
 protector_recipe (Enable Protector recipe) bool true
 
+#    Enables craft recipes for protected doors and chest
+protector_crafts (Enable Protector door/chest recipes) bool true
+
 #    Enables protection messages in player chat
 protector_msg (Enable Protector Messages) bool true
diff --git a/tool.lua b/tool.lua
index 3f6709d..3aae1f7 100644
--- a/tool.lua
+++ b/tool.lua
@@ -164,6 +164,6 @@ minetest.register_craft({
 	recipe = {
 		{df, df, df},
 		{df, "protector:protect", df},
-		{df, df, df},
+		{df, df, df}
 	}
 })