diff --git a/mesecons_dispenser/depends.txt b/mesecons_dispenser/depends.txt
new file mode 100644
index 0000000000000000000000000000000000000000..4ad96d51599fb734101f6229f6c1a8a509bd6255
--- /dev/null
+++ b/mesecons_dispenser/depends.txt
@@ -0,0 +1 @@
+default
diff --git a/mesecons_dispenser/init.lua b/mesecons_dispenser/init.lua
new file mode 100644
index 0000000000000000000000000000000000000000..f974b4a6b123a501f92894a6399ff26982c2361d
--- /dev/null
+++ b/mesecons_dispenser/init.lua
@@ -0,0 +1,57 @@
+minetest.register_node("mesecons_dispenser:dispenser", {
+	description = "Dispenser",
+	tiles = {"mesecons_dispenser_top.png" , "mesecons_dispenser_bottom.png",
+		 "mesecons_dispenser_side.png", "mesecons_dispenser_side.png"   ,
+		 "mesecons_dispenser_side.png", "mesecons_dispenser_front.png"},
+	paramtype2 = "facedir",
+	groups = {cracky=2},
+	sounds = default.node_sound_stone_defaults(),
+	on_construct = function(pos)
+		local meta = minetest.env:get_meta(pos)
+		meta:set_string("formspec",
+				"size[8,7]"..
+				"list[current_name;main;2.5,0;3,3;]"..
+				"list[current_player;main;0,3;8,4;]")
+		local inv = meta:get_inventory()
+		inv:set_size("main", 3*3)
+	end,
+	mesecons = {effector={
+		action_on = function (pos, node)
+			local dir = {{x=1, y=0, z=0}}
+			for _ = 0, node.param2 do
+				dir = mesecon:rotate_rules_left(dir)
+			end
+			dir = dir[1]
+			local objpos = mesecon:addPosRule(pos, {x=dir.x/2, y=dir.y/2, z=dir.z/2})
+			--minetest.env:add_node(mesecon:addPosRule(pos, dir[1]), {name="default:wood"})
+			local inv = minetest.env:get_meta(pos):get_inventory()
+			local stacks = {}
+			for j = 1, 9 do
+				local ts = inv:get_stack("main", j)
+				if not ts:is_empty() then
+					table.insert(stacks, {stack = ts, id = j})
+				end
+			end
+			print(dump(stacks))
+			if #stacks > 0 then
+				local sn = math.random(1, #stacks)
+				local takenitem = stacks[sn].stack:take_item()
+				inv:set_stack("main", stacks[sn].id, stacks[sn].stack)
+				print(dump(takenitem:to_table()))
+				local obj = minetest.env:add_item(objpos, takenitem:to_table())
+				obj:setvelocity({	x=dir.x*5+math.random(1, 100)/50-0.5,
+							y=dir.y*5+math.random(1, 100)/50-0.5,
+							z=dir.z*5+math.random(1, 100)/50-0.5})
+			end
+		end
+	}},
+})
+
+minetest.register_craft({
+	output = 'mesecons_dispenser:dispenser',
+	recipe = {
+		{"default:cobble", "default:cobble", "default:cobble"},
+		{"default:cobble", "mesecons_materials:fiber", "default:cobble"},
+		{"default:cobble", "group:mesecon_conductor_craftable", "default:cobble"},
+	}
+})
diff --git a/mesecons_textures/textures/mesecons_dispenser_bottom.png b/mesecons_textures/textures/mesecons_dispenser_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..c86782a2147130bb2b12644fb767e33ad5f4b1de
Binary files /dev/null and b/mesecons_textures/textures/mesecons_dispenser_bottom.png differ
diff --git a/mesecons_textures/textures/mesecons_dispenser_front.png b/mesecons_textures/textures/mesecons_dispenser_front.png
new file mode 100644
index 0000000000000000000000000000000000000000..ea07ed15dc4970cbb905a9f9d32d47628ef72393
Binary files /dev/null and b/mesecons_textures/textures/mesecons_dispenser_front.png differ
diff --git a/mesecons_textures/textures/mesecons_dispenser_side.png b/mesecons_textures/textures/mesecons_dispenser_side.png
new file mode 100644
index 0000000000000000000000000000000000000000..c86782a2147130bb2b12644fb767e33ad5f4b1de
Binary files /dev/null and b/mesecons_textures/textures/mesecons_dispenser_side.png differ
diff --git a/mesecons_textures/textures/mesecons_dispenser_top.png b/mesecons_textures/textures/mesecons_dispenser_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..c86782a2147130bb2b12644fb767e33ad5f4b1de
Binary files /dev/null and b/mesecons_textures/textures/mesecons_dispenser_top.png differ