diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua
index 0dbc40c68a51582e06ace5e99575a4db0806bce9..85c2978d1d54e70400f534e2502ac94b4455d96f 100644
--- a/mods/stairs/init.lua
+++ b/mods/stairs/init.lua
@@ -28,36 +28,35 @@ function stairs.register_stair(subname, recipeitem, groups, images, description,
 			
 			local p0 = pointed_thing.under
 			local p1 = pointed_thing.above
+			local param2 = 0
+			
+			local placer_pos = placer:getpos()
+			if placer_pos then
+				local dir = {
+					x = p1.x - placer_pos.x,
+					y = p1.y - placer_pos.y,
+					z = p1.z - placer_pos.z
+				}
+				param2 = minetest.dir_to_facedir(dir)
+			end
+			
 			if p0.y-1 == p1.y then
-				local fakestack = ItemStack("stairs:stair_" .. subname.."upside_down")
-				local ret = minetest.item_place(fakestack, placer, pointed_thing)
-				if ret:is_empty() then
-					itemstack:take_item()
-					return itemstack
+				param2 = param2 + 20
+				if param2 == 21 then
+					param2 = 23
+				elseif param2 == 23 then
+					param2 = 21
 				end
 			end
 			
-			-- Otherwise place regularly
-			return minetest.item_place(itemstack, placer, pointed_thing)
+			return minetest.item_place(itemstack, placer, pointed_thing, param2)
 		end,
 	})
 	
+	-- for replace ABM
 	minetest.register_node(":stairs:stair_" .. subname.."upside_down", {
-		drop = "stairs:stair_" .. subname,
-		drawtype = "nodebox",
-		tiles = images,
-		paramtype = "light",
-		paramtype2 = "facedir",
-		is_ground_content = true,
-		groups = groups,
-		sounds = sounds,
-		node_box = {
-			type = "fixed",
-			fixed = {
-				{-0.5, 0, -0.5, 0.5, 0.5, 0.5},
-				{-0.5, -0.5, 0, 0.5, 0, 0.5},
-			},
-		},
+		replace_name = "stairs:stair_" .. subname,
+		groups = {slabs_replace=1},
 	})
 
 	minetest.register_craft({
@@ -87,6 +86,7 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
 		drawtype = "nodebox",
 		tiles = images,
 		paramtype = "light",
+		paramtype2 = "facedir",
 		is_ground_content = true,
 		groups = groups,
 		sounds = sounds,
@@ -106,21 +106,32 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
 			local p0 = pointed_thing.under
 			local p1 = pointed_thing.above
 			local n0 = minetest.get_node(p0)
-			if n0.name == "stairs:slab_" .. subname and
-					p0.y+1 == p1.y then
+			local n1 = minetest.get_node(p1)
+			local param2 = 0
+			
+			local n0_is_upside_down = (n0.name == "stairs:slab_" .. subname and
+					n0.param2 >= 20)
+			
+			if n0.name == "stairs:slab_" .. subname and not n0_is_upside_down and p0.y+1 == p1.y then
 				slabpos = p0
 				slabnode = n0
+			elseif n1.name == "stairs:slab_" .. subname then
+				slabpos = p1
+				slabnode = n1
 			end
 			if slabpos then
 				-- Remove the slab at slabpos
 				minetest.remove_node(slabpos)
 				-- Make a fake stack of a single item and try to place it
 				local fakestack = ItemStack(recipeitem)
+				fakestack:set_count(itemstack:get_count())
+				
 				pointed_thing.above = slabpos
-				fakestack = minetest.item_place(fakestack, placer, pointed_thing)
+				local success
+				fakestack, success = minetest.item_place(fakestack, placer, pointed_thing)
 				-- If the item was taken from the fake stack, decrement original
-				if not fakestack or fakestack:is_empty() then
-					itemstack:take_item(1)
+				if success then
+					itemstack:set_count(fakestack:get_count())
 				-- Else put old node back
 				else
 					minetest.set_node(slabpos, slabnode)
@@ -131,16 +142,19 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
 			-- Upside down slabs
 			if p0.y-1 == p1.y then
 				-- Turn into full block if pointing at a existing slab
-				if n0.name == "stairs:slab_" .. subname.."upside_down" then
+				if n0_is_upside_down  then
 					-- Remove the slab at the position of the slab
 					minetest.remove_node(p0)
 					-- Make a fake stack of a single item and try to place it
 					local fakestack = ItemStack(recipeitem)
+					fakestack:set_count(itemstack:get_count())
+					
 					pointed_thing.above = p0
-					fakestack = minetest.item_place(fakestack, placer, pointed_thing)
+					local success
+					fakestack, success = minetest.item_place(fakestack, placer, pointed_thing)
 					-- If the item was taken from the fake stack, decrement original
-					if not fakestack or fakestack:is_empty() then
-						itemstack:take_item(1)
+					if success then
+						itemstack:set_count(fakestack:get_count())
 					-- Else put old node back
 					else
 						minetest.set_node(p0, n0)
@@ -149,43 +163,22 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
 				end
 				
 				-- Place upside down slab
-				local fakestack = ItemStack("stairs:slab_" .. subname.."upside_down")
-				local ret = minetest.item_place(fakestack, placer, pointed_thing)
-				if ret:is_empty() then
-					itemstack:take_item()
-					return itemstack
-				end
+				param2 = 20
 			end
 			
 			-- If pointing at the side of a upside down slab
-			if n0.name == "stairs:slab_" .. subname.."upside_down" and
-					p0.y+1 ~= p1.y then
-				-- Place upside down slab
-				local fakestack = ItemStack("stairs:slab_" .. subname.."upside_down")
-				local ret = minetest.item_place(fakestack, placer, pointed_thing)
-				if ret:is_empty() then
-					itemstack:take_item()
-					return itemstack
-				end
+			if n0_is_upside_down and p0.y+1 ~= p1.y then
+				param2 = 20
 			end
 			
-			-- Otherwise place regularly
-			return minetest.item_place(itemstack, placer, pointed_thing)
+			return minetest.item_place(itemstack, placer, pointed_thing, param2)
 		end,
 	})
 	
+	-- for replace ABM
 	minetest.register_node(":stairs:slab_" .. subname.."upside_down", {
-		drop = "stairs:slab_"..subname,
-		drawtype = "nodebox",
-		tiles = images,
-		paramtype = "light",
-		is_ground_content = true,
-		groups = groups,
-		sounds = sounds,
-		node_box = {
-			type = "fixed",
-			fixed = {-0.5, 0, -0.5, 0.5, 0.5, 0.5},
-		},
+		replace_name = "stairs:slab_"..subname,
+		groups = {slabs_replace=1},
 	})
 
 	minetest.register_craft({
@@ -196,6 +189,23 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
 	})
 end
 
+-- Replace old "upside_down" nodes with new param2 versions
+minetest.register_abm({
+	nodenames = {"group:slabs_replace"},
+	interval = 1,
+	chance = 1,
+	action = function(pos, node)
+		node.name = minetest.registered_nodes[node.name].replace_name
+		node.param2 = node.param2 + 20
+		if node.param2 == 21 then
+			node.param2 = 23
+		elseif node.param2 == 23 then
+			node.param2 = 21
+		end
+		minetest.set_node(pos, node)
+	end,
+})
+
 -- Nodes will be called stairs:{stair,slab}_<subname>
 function stairs.register_stair_and_slab(subname, recipeitem, groups, images, desc_stair, desc_slab, sounds)
 	stairs.register_stair(subname, recipeitem, groups, images, desc_stair, sounds)