diff --git a/.luacheckrc b/.luacheckrc
index ea47ea3a3e3582e3bf2fad97dae9671a9a277ab8..3534e853a611e16f861a73ba07c9d1ec10a99d4c 100644
--- a/.luacheckrc
+++ b/.luacheckrc
@@ -6,4 +6,5 @@ read_globals = {
 	"vector", "ItemStack",
 	"default",
 	"stairs", "doors", "xpanes",
+	"xdecor", "xbg",
 }
diff --git a/LICENSE b/LICENSE
index 0e2655dcc7cd12dd6d30de8f0a7fede13ea6d3a5..7f1e390af05864d74dd91e6bffb89b3523c25ce4 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,16 +1,16 @@
-+----------------------------------------------------------------------+
-|   Copyright (c) 2015-2016 kilbith <jeanpatrick.guerrero@gmail.com>   |
-|								       |
-|   Code: GPL version 3						       |
-|   Textures: WTFPL (credits: Gambit, kilbith, Cisoun)		       |
-|   Sounds:	                                                       |
-|     - xdecor_boiling_water.ogg - by Audionautics - CC BY-SA          |
-|	   freesound.org/people/Audionautics/sounds/133901/ 	       |
-|     - xdecor_enchanting.ogg - by Timbre - CC BY-SA-NC                |
-|          freesound.org/people/Timbre/sounds/221683/                  |
-|     - xdecor_bouncy.ogg - by Blender Foundation - CC BY 3.0	       |
-|	   opengameart.org/content/funny-comic-cartoon-bounce-sound    |
-+----------------------------------------------------------------------+
+┌──────────────────────────────────────────────────────────────────────┐
+│   Copyright (c) 2015-2017 kilbith <jeanpatrick.guerrero@gmail.com>   │
+│								       │
+│   Code: GPL version 3						       │
+│   Textures: WTFPL (credits: Gambit, kilbith, Cisoun)		       │
+│   Sounds:	                                                       │
+│     - xdecor_boiling_water.ogg - by Audionautics - CC BY-SA          │
+│	   freesound.org/people/Audionautics/sounds/133901/ 	       │
+│     - xdecor_enchanting.ogg - by Timbre - CC BY-SA-NC                │
+│          freesound.org/people/Timbre/sounds/221683/                  │
+│     - xdecor_bouncy.ogg - by Blender Foundation - CC BY 3.0	       │
+│	   opengameart.org/content/funny-comic-cartoon-bounce-sound    │
+└──────────────────────────────────────────────────────────────────────┘
 
 
                     GNU GENERAL PUBLIC LICENSE
diff --git a/src/chess.lua b/src/chess.lua
index 6de09cc7f1acc1e755b2fbcdc9b8c78775204b0c..017b1b1a4211bc77b01265678ec2d6db84fbcad9 100644
--- a/src/chess.lua
+++ b/src/chess.lua
@@ -15,7 +15,7 @@ end
 function realchess.init(pos)
 	local meta = minetest.get_meta(pos)
 	local inv = meta:get_inventory()
-	
+
 	local formspec = [[ size[8,8.6;]
 			bgcolor[#080808BB;true]
 			background[0,0;8,8;chess_bg.png]
@@ -101,7 +101,7 @@ function realchess.move(pos, from_list, from_index, to_list, to_index, _, player
 		if playerWhite ~= "" and playerWhite ~= playerName then
 			minetest.chat_send_player(playerName, "Someone else plays white pieces!")
 			return 0
-		end		
+		end
 		if lastMove ~= "" and lastMove ~= "black" then
 			minetest.chat_send_player(playerName, "It's not your turn, wait for your opponent to play.")
 			return 0
@@ -361,7 +361,7 @@ function realchess.move(pos, from_list, from_index, to_list, to_index, _, player
 						return 0
 					end
 				end
-			end		
+			end
 		elseif from_x < to_x then
 			if from_y == to_y then
 				-- goes right
@@ -387,7 +387,7 @@ function realchess.move(pos, from_list, from_index, to_list, to_index, _, player
 						return 0
 					end
 				end
-			end				
+			end
 		else
 			if from_y == to_y then
 				-- goes left
@@ -413,14 +413,14 @@ function realchess.move(pos, from_list, from_index, to_list, to_index, _, player
 						return 0
 					end
 				end
-			end		
+			end
 		end
 
 	elseif pieceFrom:sub(11,14) == "king" then
 		local dx = from_x - to_x
 		local dy = from_y - to_y
 		local check = true
-		
+
 		if thisMove == "white" then
 			if from_y == 7 and to_y == 7 then
 				if to_x == 1 then
@@ -492,12 +492,12 @@ function realchess.move(pos, from_list, from_index, to_list, to_index, _, player
 			if dy < 0 then dy = -dy end
 			if dx > 1 or dy > 1 then return 0 end
 		end
-		
+
 		if thisMove == "white" then
 			meta:set_int("castlingWhiteL", 0)
 			meta:set_int("castlingWhiteR", 0)
 		elseif thisMove == "black" then
-			meta:set_int("castlingBlackL", 0)		
+			meta:set_int("castlingBlackL", 0)
 			meta:set_int("castlingBlackR", 0)
 		end
 	end
diff --git a/src/cooking.lua b/src/cooking.lua
index a14e30ec315f1b29b0886eb302ff8ef37aee489e..aaeae79c2fd6e73ef05079b1eea7d4f6af17c07f 100644
--- a/src/cooking.lua
+++ b/src/cooking.lua
@@ -88,7 +88,7 @@ end
 function cauldron.boiling_timer(pos)
 	local node = minetest.get_node(pos)
 	local objs = minetest.get_objects_inside_radius(pos, 0.5)
-	if objs == {} then return true end
+	if not next(objs) then return true end
 
 	local ingredients = {}
 	for _, obj in pairs(objs) do
diff --git a/src/enchanting.lua b/src/enchanting.lua
index 5d1d44a6e0a78edc24f2d26462063045b7348fa6..409e1786aa2cb1cfadf99c8635084601d4f0896c 100644
--- a/src/enchanting.lua
+++ b/src/enchanting.lua
@@ -42,19 +42,18 @@ function enchanting:get_tooltip(enchant, orig_caps, fleshy)
 		strong  = {"#ff3d3d", ""},
 		speed   = {"#fd5eff", ""}
 	}
-	return minetest.colorize and
-		minetest.colorize(specs[enchant][1],
-				  "\n"..cap(enchant)..specs[enchant][2]) or
-		"\n"..cap(enchant)..specs[enchant][2]
+	return minetest.colorize and minetest.colorize(specs[enchant][1],
+			"\n"..cap(enchant)..specs[enchant][2]) or
+			"\n"..cap(enchant)..specs[enchant][2]
 end
 
 local enchant_buttons = {
-    	[[ image_button[3.9,0.85;4,0.92;bg_btn.png;fast;Efficiency]
-    	image_button[3.9,1.77;4,1.12;bg_btn.png;durable;Durability] ]],
-    	"image_button[3.9,0.85;4,0.92;bg_btn.png;strong;Strength]",
-    	"image_button[3.9,2.9;4,0.92;bg_btn.png;sharp;Sharpness]",
-    	[[ image_button[3.9,0.85;4,0.92;bg_btn.png;strong;Strength]
-    	image_button[3.9,1.77;4,1.12;bg_btn.png;speed;Speed] ]]
+	[[ image_button[3.9,0.85;4,0.92;bg_btn.png;fast;Efficiency]
+	image_button[3.9,1.77;4,1.12;bg_btn.png;durable;Durability] ]],
+	"image_button[3.9,0.85;4,0.92;bg_btn.png;strong;Strength]",
+	"image_button[3.9,2.9;4,0.92;bg_btn.png;sharp;Sharpness]",
+	[[ image_button[3.9,0.85;4,0.92;bg_btn.png;strong;Strength]
+	image_button[3.9,1.77;4,1.12;bg_btn.png;speed;Speed] ]]
 }
 
 function enchanting.formspec(pos, num)
@@ -65,6 +64,10 @@ function enchanting.formspec(pos, num)
 			list[context;tool;0.9,2.9;1,1;]
 			list[context;mese;2,2.9;1,1;]
 			list[current_player;main;0.5,4.5;8,4;]
+			listring[current_player;main]
+			listring[context;tool]
+			listring[current_player;main]
+			listring[context;mese]
 			image[2,2.9;1,1;mese_layout.png]
 			tooltip[sharp;Your weapon inflicts more damages]
 			tooltip[durable;Your tool last longer]
@@ -159,7 +162,8 @@ function enchanting.destruct(pos)
 	for _, obj in pairs(minetest.get_objects_inside_radius(pos, 0.9)) do
 		if obj and obj:get_luaentity() and
 				obj:get_luaentity().name == "xdecor:book_open" then
-			obj:remove() break
+			obj:remove()
+			break
 		end
 	end
 end
diff --git a/src/mailbox.lua b/src/mailbox.lua
index c1b330b74596dce0dd3e175cf3b5f4f51c9564f5..c7d34a348729fbad28ac5c2c684a8016a538ac6c 100644
--- a/src/mailbox.lua
+++ b/src/mailbox.lua
@@ -62,13 +62,13 @@ function mailbox:formspec(pos, owner, is_owner)
 			"listring[nodemeta:"..spos..";mailbox]"..
 			xbg..default.get_hotbar_bg(0.75,5.25)
 	end
-    	return [[ size[8,5]
-    		list[current_player;main;0,1.25;8,4;] ]]..
-    		"label[0,0;Send your goods to\n"..
-			(minetest.colorize and
-			 minetest.colorize("#FFFF00", owner) or owner).."]"..
-    		"list[nodemeta:"..spos..";drop;3.5,0;1,1;]"..
-    		xbg..default.get_hotbar_bg(0,1.25)
+	return [[ size[8,5]
+		list[current_player;main;0,1.25;8,4;] ]]..
+		"label[0,0;Send your goods to\n"..
+		(minetest.colorize and
+			minetest.colorize("#FFFF00", owner) or owner).."]"..
+		"list[nodemeta:"..spos..";drop;3.5,0;1,1;]"..
+		xbg..default.get_hotbar_bg(0,1.25)
 end
 
 function mailbox.dig(pos, player)
diff --git a/src/mechanisms.lua b/src/mechanisms.lua
index 85bc927b7a3b26264ed56b3ecff637e1f8f4c978..258bce29b424de95e381c2bec5917a0d5ebcb4de 100644
--- a/src/mechanisms.lua
+++ b/src/mechanisms.lua
@@ -1,7 +1,6 @@
---[[ Thanks to sofar for helping with that code.
-Recommended setting in minetest.conf (requires 0.4.14 or newer) :
-	nodetimer_interval = 0.1
-]]
+-- Thanks to sofar for helping with that code.
+
+minetest.setting_set("nodetimer_interval", 0.1)
 
 local plate = {}
 screwdriver = screwdriver or {}
@@ -32,14 +31,14 @@ end
 
 function plate.timer(pos)
 	local objs = minetest.get_objects_inside_radius(pos, 0.8)
-	if objs == {} or not doors.get then return true end
+	if not next(objs) or not doors.get then return true end
 	local minp = {x=pos.x-2, y=pos.y, z=pos.z-2}
 	local maxp = {x=pos.x+2, y=pos.y, z=pos.z+2}
 	local doors = minetest.find_nodes_in_area(minp, maxp, "group:door")
 
 	for _, player in pairs(objs) do
 		if player:is_player() then
-			for i = 1, #doors do
+			for i=1, #doors do
 				door_toggle(pos, doors[i], player)
 			end
 			break
@@ -92,15 +91,13 @@ xdecor.register("lever_off", {
 	sounds = default.node_sound_stone_defaults(),
 	sunlight_propagates = true,
 	on_rotate = screwdriver.rotate_simple,
-	on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
-		if not doors.get then
-			return itemstack
-		end
+	on_rightclick = function(pos, node, clicker, itemstack)
+		if not doors.get then return itemstack end
 		local minp = {x=pos.x-2, y=pos.y-1, z=pos.z-2}
 		local maxp = {x=pos.x+2, y=pos.y+1, z=pos.z+2}
 		local doors = minetest.find_nodes_in_area(minp, maxp, "group:door")
 
-		for i = 1, #doors do
+		for i=1, #doors do
 			door_toggle(pos, doors[i], clicker)
 		end
 		return itemstack
diff --git a/src/nodes.lua b/src/nodes.lua
index 632c27dc0cb45aa8bed829327be250e13bbdfa6d..f56bf500e63e9108cb2a9fe83aac68851b866b3c 100644
--- a/src/nodes.lua
+++ b/src/nodes.lua
@@ -1,6 +1,6 @@
 screwdriver = screwdriver or {}
 
-function xdecor.register_pane(name, desc, def)
+local function register_pane(name, desc, def)
 	xpanes.register_pane(name, {
 		description = desc,
 		tiles = {"xdecor_"..name..".png"},
@@ -15,21 +15,21 @@ function xdecor.register_pane(name, desc, def)
 	})
 end
 
-xdecor.register_pane("bamboo_frame", "Bamboo Frame", {
+register_pane("bamboo_frame", "Bamboo Frame", {
 	groups = {choppy=3, oddly_breakable_by_hand=2, pane=1, flammable=2},
 	recipe = {{"default:papyrus", "default:papyrus", "default:papyrus"},
 		  {"default:papyrus", "farming:cotton",  "default:papyrus"},
 		  {"default:papyrus", "default:papyrus", "default:papyrus"}}
 })
 
-xdecor.register_pane("chainlink", "Chainlink", {
+register_pane("chainlink", "Chainlink", {
 	groups = {cracky=3, oddly_breakable_by_hand=2, pane=1},
 	recipe = {{"default:steel_ingot", "", "default:steel_ingot"},
 		  {"", "default:steel_ingot", ""},
 		  {"default:steel_ingot", "", "default:steel_ingot"}}
 })
 
-xdecor.register_pane("rusty_bar", "Rusty Iron Bars", {
+register_pane("rusty_bar", "Rusty Iron Bars", {
 	sounds = default.node_sound_stone_defaults(),
 	groups = {cracky=2, pane=1},
 	recipe = {{"", "default:dirt", ""},
@@ -37,7 +37,7 @@ xdecor.register_pane("rusty_bar", "Rusty Iron Bars", {
 		  {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}}
 })
 
-xdecor.register_pane("wood_frame", "Wood Frame", {
+register_pane("wood_frame", "Wood Frame", {
 	sounds = default.node_sound_wood_defaults(),
 	groups = {choppy=2, pane=1, flammable=2},
 	recipe = {{"group:wood", "group:stick", "group:wood"},
@@ -65,7 +65,7 @@ xdecor.register("barrel", {
 	sounds = default.node_sound_wood_defaults()
 })
 
-function xdecor.register_storage(name, desc, def)
+local function register_storage(name, desc, def)
 	xdecor.register(name, {
 		description = desc,
 		inventory = {size=def.inv_size or 24},
@@ -79,14 +79,14 @@ function xdecor.register_storage(name, desc, def)
 	})
 end
 
-xdecor.register_storage("cabinet", "Wooden Cabinet", {
+register_storage("cabinet", "Wooden Cabinet", {
 	on_rotate = screwdriver.rotate_simple,
 	tiles = {"xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png",
 		 "xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png",
 		 "xdecor_cabinet_sides.png", "xdecor_cabinet_front.png"}
 })
 
-xdecor.register_storage("cabinet_half", "Half Wooden Cabinet", {
+register_storage("cabinet_half", "Half Wooden Cabinet", {
 	inv_size = 8,
 	node_box = xdecor.nodebox.slab_y(0.5, 0.5),
 	on_rotate = screwdriver.rotate_simple,
@@ -95,14 +95,16 @@ xdecor.register_storage("cabinet_half", "Half Wooden Cabinet", {
 		 "xdecor_half_cabinet_sides.png", "xdecor_half_cabinet_front.png"}
 })
 
-xdecor.register_storage("empty_shelf", "Empty Shelf", {
+register_storage("empty_shelf", "Empty Shelf", {
 	on_rotate = screwdriver.rotate_simple,
-	tiles = {"default_wood.png", "default_wood.png^xdecor_empty_shelf.png"}
+	tiles = {"default_wood.png", "default_wood.png", "default_wood.png",
+		 "default_wood.png", "default_wood.png^xdecor_empty_shelf.png"}
 })
 
-xdecor.register_storage("multishelf", "Multi Shelf", {
+register_storage("multishelf", "Multi Shelf", {
 	on_rotate = screwdriver.rotate_simple,
-	tiles = {"default_wood.png", "default_wood.png^xdecor_multishelf.png"},
+	tiles = {"default_wood.png", "default_wood.png", "default_wood.png",
+		 "default_wood.png", "default_wood.png^xdecor_multishelf.png"},
 })
 
 xdecor.register("candle", {
@@ -142,38 +144,40 @@ xdecor.register("chair", {
 	}),
 	can_dig = xdecor.sit_dig,
 	on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
-		pos.y = pos.y + 0  -- Sitting position.
+		pos.y = pos.y + 0  -- Sitting position
 		xdecor.sit(pos, node, clicker, pointed_thing)
 		return itemstack
 	end
 })
 
-for _, c in pairs({"red"}) do  -- Add more curtains colors simply here.
+for _, c in pairs({"red"}) do  -- Add more curtains colors simply here
 	xdecor.register("curtain_"..c, {
 		description = c:gsub("^%l", string.upper).." Curtain",
 		walkable = false,
 		tiles = {"wool_white.png^[colorize:"..c..":170"},
-		inventory_image = "wool_white.png^[colorize:"..c..":170^xdecor_curtain_open_overlay.png^[makealpha:255,126,126",
+		inventory_image = "wool_white.png^[colorize:"..c..
+			":170^xdecor_curtain_open_overlay.png^[makealpha:255,126,126",
 		wield_image = "wool_white.png^[colorize:"..c..":170",
 		drawtype = "signlike",
 		paramtype2 = "wallmounted",
 		groups = {dig_immediate=3, flammable=3},
 		selection_box = {type="wallmounted"},
-		on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
+		on_rightclick = function(pos, node, _, itemstack)
 			minetest.set_node(pos, {name="xdecor:curtain_open_"..c, param2=node.param2})
 			return itemstack
 		end
 	})
 
 	xdecor.register("curtain_open_"..c, {
-		tiles = {"wool_white.png^[colorize:"..c..":170^xdecor_curtain_open_overlay.png^[makealpha:255,126,126"},
+		tiles = {"wool_white.png^[colorize:"..c..
+			 ":170^xdecor_curtain_open_overlay.png^[makealpha:255,126,126"},
 		drawtype = "signlike",
 		paramtype2 = "wallmounted",
 		walkable = false,
 		groups = {dig_immediate=3, flammable=3, not_in_creative_inventory=1},
 		selection_box = {type="wallmounted"},
 		drop = "xdecor:curtain_"..c,
-		on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
+		on_rightclick = function(pos, node, _, itemstack)
 			minetest.set_node(pos, {name="xdecor:curtain_"..c, param2=node.param2})
 			return itemstack
 		end
@@ -181,8 +185,8 @@ for _, c in pairs({"red"}) do  -- Add more curtains colors simply here.
 
 	minetest.register_craft({
 		output = "xdecor:curtain_"..c.." 4",
-		recipe = { {"", "wool:"..c, ""},
-			   {"", "wool:"..c, ""} }
+		recipe = {{"", "wool:"..c, ""},
+			  {"", "wool:"..c, ""}}
 	})
 end
 
@@ -194,7 +198,7 @@ xdecor.register("cushion", {
 	node_box = xdecor.nodebox.slab_y(0.5),
 	can_dig = xdecor.sit_dig,
 	on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
-		pos.y = pos.y + 0  -- Sitting position.
+		pos.y = pos.y + 0  -- Sitting position
 		xdecor.sit(pos, node, clicker, pointed_thing)
 		return itemstack
 	end
@@ -206,7 +210,10 @@ xdecor.register("cushion_block", {
 	groups = {snappy=3, flammable=3, fall_damage_add_percent=-75, not_in_creative_inventory=1}
 })
 
-local function door_access(name) return name:find("prison") end
+local function door_access(name)
+	return name:find("prison")
+end
+
 local xdecor_doors = {
 	japanese = {
 		{"group:wood", "default:paper"},
@@ -299,7 +306,7 @@ xdecor.register("lantern", {
 	paramtype2 = "wallmounted",
 	walkable = false,
 	groups = {snappy=3, attached_node=1},
-	tiles = {{name = "xdecor_lantern.png", animation = {type="vertical_frames", length=1.5}}},
+	tiles = {{name="xdecor_lantern.png", animation={type="vertical_frames", length=1.5}}},
 	selection_box = xdecor.pixelbox(16, {{4, 0, 4, 8, 16, 8}})
 })
 
@@ -328,8 +335,8 @@ for _, f in pairs({"dandelion_white", "dandelion_yellow", "geranium",
 
 	minetest.register_craft({
 		output = "xdecor:potted_"..f,
-		recipe = { {"default:clay_brick", "flowers:"..f, "default:clay_brick"},
-			   {"", "default:clay_brick", ""} }
+		recipe = {{"default:clay_brick", "flowers:"..f,
+			   "default:clay_brick"}, {"", "default:clay_brick", ""}}
 	})
 end
 
@@ -353,8 +360,10 @@ xdecor.register("painting_1", {
 	node_placement_prediction = "",
 	on_place = function(itemstack, placer, pointed_thing)
 		local num = math.random(4)
-		local leftover = minetest.item_place_node(ItemStack("xdecor:painting_"..num), placer, pointed_thing)
-		if leftover:get_count() == 0 and not minetest.setting_getbool("creative_mode") then
+		local leftover = minetest.item_place_node(
+			ItemStack("xdecor:painting_"..num), placer, pointed_thing)
+		if leftover:get_count() == 0 and
+				not minetest.setting_getbool("creative_mode") then
 			itemstack:take_item()
 		end
 		return itemstack
@@ -367,7 +376,8 @@ for i = 2, 4 do
 		paramtype2 = "wallmounted",
 		drop = "xdecor:painting_1",
 		sunlight_propagates = true,
-		groups = {choppy=3, oddly_breakable_by_hand=2, flammable=2, attached_node=1, not_in_creative_inventory=1},
+		groups = {choppy=3, oddly_breakable_by_hand=2, flammable=2,
+			  attached_node=1, not_in_creative_inventory=1},
 		sounds = default.node_sound_wood_defaults(),
 		node_box = painting_box
 	})
@@ -387,7 +397,8 @@ xdecor.register("stonepath", {
 	selection_box = xdecor.nodebox.slab_y(0.05)
 })
 
-function xdecor.register_hard_node(name, desc, def)
+local function register_hard_node(name, desc, def)
+	def = def or {}
 	xdecor.register(name, {
 		description = desc,
 		tiles = {"xdecor_"..name..".png"},
@@ -396,18 +407,18 @@ function xdecor.register_hard_node(name, desc, def)
 	})
 end
 
-xdecor.register_hard_node("cactusbrick", "Cactus Brick", {})
-xdecor.register_hard_node("coalstone_tile", "Coal Stone Tile", {})
-xdecor.register_hard_node("desertstone_tile", "Desert Stone Tile", {})
-xdecor.register_hard_node("hard_clay", "Hardened Clay", {})
-xdecor.register_hard_node("moonbrick", "Moon Brick", {})
-xdecor.register_hard_node("stone_tile", "Stone Tile", {})
-xdecor.register_hard_node("stone_rune", "Runestone", {})
-xdecor.register_hard_node("packed_ice", "Packed Ice", {
+register_hard_node("cactusbrick", "Cactus Brick")
+register_hard_node("coalstone_tile", "Coal Stone Tile")
+register_hard_node("desertstone_tile", "Desert Stone Tile")
+register_hard_node("hard_clay", "Hardened Clay")
+register_hard_node("moonbrick", "Moon Brick")
+register_hard_node("stone_tile", "Stone Tile")
+register_hard_node("stone_rune", "Runestone")
+register_hard_node("packed_ice", "Packed Ice", {
 	groups = {cracky=1, puts_out_fire=1},
 	sounds = default.node_sound_glass_defaults()
 })
-xdecor.register_hard_node("wood_tile", "Wooden Tile", {
+register_hard_node("wood_tile", "Wooden Tile", {
 	groups = {choppy=1, wood=1, flammable=2},
 	sounds = default.node_sound_wood_defaults()
 })
@@ -460,5 +471,3 @@ xdecor.register("woodframed_glass", {
 	groups = {cracky=2, oddly_breakable_by_hand=1},
 	sounds = default.node_sound_glass_defaults()
 })
-
-minetest.register_alias("xdecor:worktable", "xdecor:workbench")
diff --git a/src/workbench.lua b/src/workbench.lua
index 3070137716a6682c47de1680356f2683255f5cb9..46f16b1a3f672a8016e548da1573226e9beb391d 100644
--- a/src/workbench.lua
+++ b/src/workbench.lua
@@ -1,11 +1,13 @@
 local workbench = {}
+WB = {}
 screwdriver = screwdriver or {}
 local min, ceil = math.min, math.ceil
+local registered_nodes = minetest.registered_nodes
 
--- Nodes allowed to be cut.
--- Only the regular, solid blocks without metas or explosivity can be cut.
+-- Nodes allowed to be cut
+-- Only the regular, solid blocks without metas or explosivity can be cut
 local nodes = {}
-for node, def in pairs(minetest.registered_nodes) do
+for node, def in pairs(registered_nodes) do
 	if (def.drawtype == "normal" or def.drawtype:sub(1,5) == "glass") and
 	   (def.groups.cracky or def.groups.choppy) and
 	   not def.on_construct and
@@ -27,8 +29,8 @@ for node, def in pairs(minetest.registered_nodes) do
 	end
 end
 
--- Optionally, you can register custom cuttable nodes in the workbench.
-workbench.custom_nodes_register = {
+-- Optionally, you can register custom cuttable nodes in the workbench
+WB.custom_nodes_register = {
 	-- "default:leaves",
 }
 
@@ -41,9 +43,9 @@ setmetatable(nodes, {
 	end
 })
 
-nodes = nodes..workbench.custom_nodes_register
+nodes = nodes..WB.custom_nodes_register
 
--- Nodeboxes definitions.
+-- Nodeboxes definitions
 workbench.defs = {
 	-- Name       Yield   X  Y   Z  W   H  L
 	{"nanoslab",	16, { 0, 0,  0, 8,  1, 8  }},
@@ -66,7 +68,7 @@ workbench.defs = {
 			    { 0, 8,  0, 8,  8, 8  }}
 }
 
--- Tools allowed to be repaired.
+-- Tools allowed to be repaired
 function workbench:repairable(stack)
 	local tools = {"pick", "axe", "shovel", "sword", "hoe", "armor", "shield"}
 	for _, t in pairs(tools) do
@@ -76,22 +78,19 @@ function workbench:repairable(stack)
 end
 
 function workbench:get_output(inv, input, name)
-	if inv:is_empty("input") then
-		inv:set_list("forms", {}) return
-	end
-
 	local output = {}
-	for _, n in pairs(self.defs) do
-		local count = min(n[2] * input:get_count(), input:get_stack_max())
-		local item = name.."_"..n[1]
-		if not n[3] then item = "stairs:"..n[1].."_"..name:match(":(.*)") end
+	for i=1, #self.defs do
+		local nbox = self.defs[i]
+		local count = min(nbox[2] * input:get_count(), input:get_stack_max())
+		local item = name.."_"..nbox[1]
+		item = nbox[3] and item or "stairs:"..nbox[1].."_"..name:match(":(.*)")
 		output[#output+1] = item.." "..count
 	end
 	inv:set_list("forms", output)
 end
 
 local formspecs = {
-	-- Main formspec.
+	-- Main formspec
 	[[ label[0.9,1.23;Cut]
 	   label[0.9,2.23;Repair]
 	   box[-0.05,1;2.05,0.9;#555555]
@@ -105,15 +104,23 @@ local formspecs = {
 	   list[context;input;2,1;1,1;]
 	   list[context;tool;2,2;1,1;]
 	   list[context;hammer;3,2;1,1;]
-	   list[context;forms;4,0;4,3;] ]],
-	-- Crafting formspec.
+	   list[context;forms;4,0;4,3;]
+	   listring[current_player;main]
+	   listring[context;tool]
+	   listring[current_player;main]
+	   listring[context;hammer]
+	   listring[current_player;main]
+	   listring[context;forms]
+	   listring[current_player;main]
+	   listring[context;input] ]],
+	-- Crafting formspec
 	[[ image[5,1;1,1;gui_furnace_arrow_bg.png^[transformR270]
 	   button[0,0;1.5,1;back;< Back]
 	   list[current_player;craft;2,0;3,3;]
 	   list[current_player;craftpreview;6,1;1,1;]
 	   listring[current_player;main]
 	   listring[current_player;craft] ]],
-	-- Storage formspec.
+	-- Storage formspec
 	[[ list[context;storage;0,1;8,2;]
 	   button[0,0;1.5,1;back;< Back]
 	   listring[context;storage]
@@ -121,7 +128,8 @@ local formspecs = {
 }
 
 function workbench:set_formspec(meta, id)
-	meta:set_string("formspec", "size[8,7;]list[current_player;main;0,3.25;8,4;]"..
+	meta:set_string("formspec",
+			"size[8,7;]list[current_player;main;0,3.25;8,4;]"..
 			formspecs[id]..xbg..default.get_hotbar_bg(0,3.25))
 end
 
@@ -140,16 +148,17 @@ function workbench.construct(pos)
 end
 
 function workbench.fields(pos, _, fields)
+	if fields.quit then return end
 	local meta = minetest.get_meta(pos)
-	if     fields.back    then workbench:set_formspec(meta, 1)
-	elseif fields.craft   then workbench:set_formspec(meta, 2)
-	elseif fields.storage then workbench:set_formspec(meta, 3) end
+	workbench:set_formspec(meta, fields.back    and 1 or
+				     fields.craft   and 2 or
+				     fields.storage and 3)
 end
 
 function workbench.dig(pos)
 	local inv = minetest.get_meta(pos):get_inventory()
 	return inv:is_empty("input") and inv:is_empty("hammer") and
-		inv:is_empty("tool") and inv:is_empty("storage")
+	       inv:is_empty("tool") and inv:is_empty("storage")
 end
 
 function workbench.timer(pos)
@@ -159,10 +168,11 @@ function workbench.timer(pos)
 	local hammer = inv:get_stack("hammer", 1)
 
 	if tool:is_empty() or hammer:is_empty() or tool:get_wear() == 0 then
-		timer:stop() return
+		timer:stop()
+		return
 	end
 
-	-- Tool's wearing range: 0-65535 | 0 = new condition.
+	-- Tool's wearing range: 0-65535 | 0 = new condition
 	tool:add_wear(-500)
 	hammer:add_wear(700)
 
@@ -175,7 +185,7 @@ function workbench.put(_, listname, _, stack)
 	local stackname = stack:get_name()
 	if (listname == "tool" and stack:get_wear() > 0 and
 	    workbench:repairable(stackname)) or
-	   (listname == "input" and minetest.registered_nodes[stackname.."_cube"]) or
+	   (listname == "input" and registered_nodes[stackname.."_cube"]) or
 	   (listname == "hammer" and stackname == "cottages:hammer") or
 	    listname == "storage" then
 		return stack:get_count()
@@ -183,18 +193,8 @@ function workbench.put(_, listname, _, stack)
 	return 0
 end
 
-function workbench.take(_, listname, _, stack, player)
-	if listname == "forms" then
-		local inv = player:get_inventory()
-		if inv:room_for_item("main", stack:get_name()) then return -1 end
-		return 0
-	end
-	return stack:get_count()
-end
-
 function workbench.move(_, from_list, _, to_list, _, count)
-	if to_list == "storage" and from_list ~= "forms" then return count end
-	return 0
+	return (to_list == "storage" and from_list ~= "forms") and count or 0
 end
 
 function workbench.on_put(pos, listname, _, stack)
@@ -208,20 +208,30 @@ function workbench.on_put(pos, listname, _, stack)
 	end
 end
 
-function workbench.on_take(pos, listname, index, stack)
+function workbench.on_take(pos, listname, index, stack, player)
 	local inv = minetest.get_meta(pos):get_inventory()
 	local input = inv:get_stack("input", 1)
+	local inputname = input:get_name()
+	local stackname = stack:get_name()
 
 	if listname == "input" then
-		if stack:get_name() == input:get_name() then
-			workbench:get_output(inv, input, stack:get_name())
+		if stackname == inputname then
+			workbench:get_output(inv, input, stackname)
 		else
 			inv:set_list("forms", {})
 		end
 	elseif listname == "forms" then
+		local fromstack = inv:get_stack(listname, index)
+		if not fromstack:is_empty() and fromstack:get_name() ~= stackname then
+			local player_inv = player:get_inventory()
+			if player_inv:room_for_item("main", fromstack) then
+				player_inv:add_item("main", fromstack)
+			end
+		end
+
 		input:take_item(ceil(stack:get_count() / workbench.defs[index][2]))
 		inv:set_stack("input", 1, input)
-		workbench:get_output(inv, input, input:get_name())
+		workbench:get_output(inv, input, inputname)
 	end
 end
 
@@ -240,14 +250,13 @@ xdecor.register("workbench", {
 	on_metadata_inventory_put = workbench.on_put,
 	on_metadata_inventory_take = workbench.on_take,
 	allow_metadata_inventory_put = workbench.put,
-	allow_metadata_inventory_take = workbench.take,
 	allow_metadata_inventory_move = workbench.move
 })
 
 for _, d in pairs(workbench.defs) do
 for i=1, #nodes do
 	local node = nodes[i]
-	local def = minetest.registered_nodes[node]
+	local def = registered_nodes[node]
 
 	if d[3] then
 		local groups = {}
@@ -261,7 +270,7 @@ for i=1, #nodes do
 		end
 
 		if def.tiles then
-			if #def.tiles > 1 and not (def.drawtype:sub(1,5) == "glass") then
+			if #def.tiles > 1 and (def.drawtype:sub(1,5) ~= "glass") then
 				tiles = def.tiles
 			else
 				tiles = {def.tiles[1]}
@@ -270,7 +279,7 @@ for i=1, #nodes do
 			tiles = {def.tile_images[1]}
 		end
 
-		if not minetest.registered_nodes["stairs:slab_"..node:match(":(.*)")] then
+		if not registered_nodes["stairs:slab_"..node:match(":(.*)")] then
 			stairs.register_stair_and_slab(node:match(":(.*)"), node,
 				groups, tiles, def.description.." Stair",
 				def.description.." Slab", def.sounds)
@@ -284,7 +293,7 @@ for i=1, #nodes do
 			sounds = def.sounds,
 			tiles = tiles,
 			groups = groups,
-			-- `unpack` has been changed to `table.unpack` in newest Lua versions.
+			-- `unpack` has been changed to `table.unpack` in newest Lua versions
 			node_box = xdecor.pixelbox(16, {unpack(d, 3)}),
 			sunlight_propagates = true,
 			on_place = minetest.rotate_node
@@ -292,4 +301,3 @@ for i=1, #nodes do
 	end
 end
 end
-