-- Road signs
	local signs = {"stop", "yield", "right_of_way"}

	for i, sign_name in ipairs(signs) do
		minetest.register_node("infrastructure:road_sign_"..sign_name, {
			description = "Road sign "..sign_name,
			tiles = {
				"infrastructure_traffic_lights_side.png",
				"infrastructure_traffic_lights_side.png",
				"infrastructure_traffic_lights_side.png",
				"infrastructure_traffic_lights_side.png",
				"infrastructure_road_sign_"..sign_name.."_back.png",
				"infrastructure_road_sign_"..sign_name.."_front.png"
			},
			drawtype = "nodebox",
			paramtype = "light",
			paramtype2 = "facedir",
			groups = {cracky = 2},
			node_box = {
				type = "fixed",
				fixed = {
					{-1/2, -1/2, 7/16, 1/2, 1/2, 7/16},
					{-3/16, -1/8, 7/16, 3/16, 1/8, 1/2 - 0.001}
				}
			},
			selection_box = {
				type = "fixed",
				fixed = {
					{-1/2, -1/2, 7/16, 1/2, 1/2, 7/16},
					{-3/16, -1/8, 7/16 + 0.01, 3/16, 1/8, 1/2 - 0.01}
				}
			},

			after_place_node = function(pos, node)
				local node = minetest.env:get_node(pos)
				local param2 = node.param2
				local sign_pos = {x=pos.x, y=pos.y, z=pos.z}

				if param2 == 0 then
					pos.z = pos.z + 1
				elseif param2 == 1 then
					pos.x = pos.x + 1
				elseif param2 == 2 then
					pos.z = pos.z - 1
				elseif param2 == 3 then
					pos.x = pos.x - 1
				end

				local node = minetest.env:get_node(pos)

				if minetest.registered_nodes[node.name].drawtype == "fencelike" then
					minetest.set_node(sign_pos, {name="infrastructure:road_sign_"..sign_name.."_on_post", param2=param2})
				end
			end
		})

		minetest.register_node("infrastructure:road_sign_"..sign_name.."_on_post", {
			tiles = {
				"infrastructure_traffic_lights_side.png",
				"infrastructure_traffic_lights_side.png",
				"infrastructure_traffic_lights_side.png",
				"infrastructure_traffic_lights_side.png",
				"infrastructure_road_sign_"..sign_name.."_back.png",
				"infrastructure_road_sign_"..sign_name.."_front.png"
			},
			drawtype = "nodebox",
			paramtype = "light",
			paramtype2 = "facedir",
			groups = {cracky = 2, not_in_creative_inventory = 1},
			drop = "infrastructure:road_sign_"..sign_name,
			node_box = {
				type = "fixed",
				fixed = {
					{-1/2, -1/2, 7/16 + 3/8, 1/2, 1/2, 7/16 + 3/8},
					{-3/16, 1/16, 7/16 + 3/8, 3/16, 1/8, 13/16 + 3/8 - 0.001},
					{-3/16, -1/8, 7/16 + 3/8, 3/16, -1/16, 13/16 + 3/8 - 0.001}
				}
			},
			selection_box = {
				type = "fixed",
				fixed = {
					{-1/2, -1/2, 7/16 + 3/8, 1/2, 1/2, 7/16 + 3/8},
					{-3/16, 1/16, 7/16 + 3/8 + 0.01, 3/16, 1/8, 13/16 + 3/8 - 0.01},
					{-3/16, -1/8, 7/16 + 3/8 + 0.01, 3/16, -1/16, 13/16 + 3/8 - 0.01}
				}
			}
		})
	end

-- Road sign crosswalk
	minetest.register_node("infrastructure:road_sign_crosswalk", {
		description = "Road sign crosswalk",
		tiles = {
			"infrastructure_traffic_lights_side.png",
			"infrastructure_traffic_lights_side.png",
			"infrastructure_traffic_lights_side.png",
			"infrastructure_traffic_lights_side.png",
			"infrastructure_road_sign_crosswalk_back.png",
			"infrastructure_road_sign_crosswalk_front.png"
		},
		drawtype = "nodebox",
		paramtype = "light",
		paramtype2 = "facedir",
		groups = {cracky = 2},
		node_box = {
			type = "fixed",
			fixed = {
				{-1/2, -1/2, 7/16, 1/2, 1/2, 7/16},
				{-3/16, -1/8, 7/16, 3/16, 1/8, 1/2 - 0.001}
			}
		},
		selection_box = {
			type = "fixed",
			fixed = {
				{-1/2, -1/2, 7/16, 1/2, 1/2, 7/16},
				{-3/16, -1/8, 7/16, 3/16, 1/8, 1/2 - 0.001}
			}
		},

		after_place_node = function(pos, node)
			local node = minetest.env:get_node(pos)
			local param2 = node.param2
			local sign_pos = {x=pos.x, y=pos.y, z=pos.z}

			if param2 == 0 then
				pos.z = pos.z + 1
			elseif param2 == 1 then
				pos.x = pos.x + 1
			elseif param2 == 2 then
				pos.z = pos.z - 1
			elseif param2 == 3 then
				pos.x = pos.x - 1
			end

			local node = minetest.env:get_node(pos)

			if param2 == 0 then
				pos.z = pos.z - 2
			elseif param2 == 1 then
				pos.x = pos.x - 2
			elseif param2 == 2 then
				pos.z = pos.z + 2
			elseif param2 == 3 then
				pos.x = pos.x + 2
			end

			if minetest.registered_nodes[node.name].drawtype == "fencelike" then
				minetest.set_node(sign_pos, {name="infrastructure:road_sign_crosswalk_on_post", param2=param2})
				minetest.env:add_node(pos, {name="infrastructure:road_sign_retroreflective_surface_on_post", param2=param2})
			else
				minetest.env:add_node(pos, {name="infrastructure:road_sign_retroreflective_surface", param2=param2})
			end
		end
	})

	minetest.register_node("infrastructure:road_sign_crosswalk_on_post", {
		description = "Road sign crosswalk",
		tiles = {
			"infrastructure_traffic_lights_side.png",
			"infrastructure_traffic_lights_side.png",
			"infrastructure_traffic_lights_side.png",
			"infrastructure_traffic_lights_side.png",
			"infrastructure_road_sign_crosswalk_back.png",
			"infrastructure_road_sign_crosswalk_front.png"
		},
		drawtype = "nodebox",
		paramtype = "light",
		paramtype2 = "facedir",
		groups = {cracky = 2, not_in_creative_inventory = 1},
		drop = "infrastructure:road_sign_crosswalk",
		node_box = {
			type = "fixed",
			fixed = {
				{-1/2, -1/2, 7/16 + 3/8, 1/2, 1/2, 7/16 + 3/8},
				{-3/16, 1/16, 7/16 + 3/8, 3/16, 1/8, 13/16 + 3/8 - 0.001},
				{-3/16, -1/8, 7/16 + 3/8, 3/16, -1/16, 13/16 + 3/8 - 0.001}
			}
		},
		selection_box = {
			type = "fixed",
			fixed = {
				{-1/2, -1/2, 7/16 + 3/8, 1/2, 1/2, 7/16 + 3/8},
				{-3/16, 1/16, 7/16 + 3/8 + 0.01, 3/16, 1/8, 13/16 + 3/8 - 0.01},
				{-3/16, -1/8, 7/16 + 3/8 + 0.01, 3/16, -1/16, 13/16 + 3/8 - 0.01}
			}
		}
	})

	minetest.register_node("infrastructure:road_sign_retroreflective_surface", {
		tiles = {
			"infrastructure_traffic_lights_side.png",
			"infrastructure_traffic_lights_side.png",
			"infrastructure_traffic_lights_side.png",
			"infrastructure_traffic_lights_side.png",
			"infrastructure_traffic_lights_side.png",
			"infrastructure_road_sign_retroreflective_surface.png"
		},
		drawtype = "nodebox",
		paramtype = "light",
		paramtype2 = "facedir",
		groups = {cracky = 2, not_in_creative_inventory = 1},
		light_source = RETROREFLECTIVE_SURFACE_LIGHT_RANGE,
		drop = "",
		node_box = {
			type = "fixed",
			fixed = {-3/4, -3/4, 7/16 + 1 + 0.01, 3/4, 3/4, 7/16 + 1 + 0.01}
		},
		selection_box = {
			type = "fixed",
			fixed = {-3/4, -3/4, 7/16 + 1 + 0.01, 3/4, 3/4, 7/16 + 1 + 0.01}
		}
	})

	minetest.register_node("infrastructure:road_sign_retroreflective_surface_on_post", {
		tiles = {
			"infrastructure_traffic_lights_side.png",
			"infrastructure_traffic_lights_side.png",
			"infrastructure_traffic_lights_side.png",
			"infrastructure_traffic_lights_side.png",
			"infrastructure_traffic_lights_side.png",
			"infrastructure_road_sign_retroreflective_surface.png"
		},
		drawtype = "nodebox",
		paramtype = "light",
		paramtype2 = "facedir",
		groups = {cracky = 2, not_in_creative_inventory = 1},
		light_source = RETROREFLECTIVE_SURFACE_LIGHT_RANGE,
		drop = "",
		node_box = {
			type = "fixed",
			fixed = {-3/4, -3/4, 7/16 + 3/8 + 1 + 0.01, 3/4, 3/4, 7/16 + 3/8 + 1 + 0.01}
		},
		selection_box = {
			type = "fixed",
			fixed = {-3/4, -3/4, 7/16 + 3/8 + 1 + 0.01, 3/4, 3/4, 7/16 + 3/8 + 1 + 0.01}
		}
	})