diff --git a/mods/default/craftitems.lua b/mods/default/craftitems.lua
index 539f6b4..dd5ae51 100644
--- a/mods/default/craftitems.lua
+++ b/mods/default/craftitems.lua
@@ -11,10 +11,79 @@ minetest.register_craftitem("default:paper", {
 	inventory_image = "default_paper.png",
 })
 
+local function book_on_use(itemstack, user, pointed_thing)
+	local player_name = user:get_player_name()
+	local data = minetest.deserialize(itemstack:get_metadata())
+	local title, text, owner = "", "", player_name
+	if data then
+		title, text, owner = data.title, data.text, data.owner
+	end
+	local formspec
+	if owner == player_name then
+		formspec = "size[8,8]"..default.gui_bg..
+			"field[0.5,1;7.5,0;title;Title:;"..
+				minetest.formspec_escape(title).."]"..
+			"textarea[0.5,1.5;7.5,7;text;Contents:;"..
+				minetest.formspec_escape(text).."]"..
+			"button_exit[2.5,7.5;3,1;save;Save]"
+	else
+		formspec = "size[8,8]"..default.gui_bg..
+			"label[1,0.5;"..minetest.formspec_escape(title).."]"..
+			"label[0.5,1.5;"..minetest.formspec_escape(text).."]"
+	end
+	minetest.show_formspec(user:get_player_name(), "default:book", formspec)
+end
+
+minetest.register_on_player_receive_fields(function(player, form_name, fields)
+	if form_name ~= "default:book" or not fields.save or
+			fields.title == "" or fields.text == "" then
+		return
+	end
+	local inv = player:get_inventory()
+	local stack = player:get_wielded_item()
+	local new_stack, data
+	if stack:get_name() ~= "default:book_written" then
+		local count = stack:get_count()
+		if count == 1 then
+			stack:set_name("default:book_written")
+		else
+			stack:set_count(count - 1)
+			new_stack = ItemStack("default:book_written")
+		end
+	else
+		data = minetest.deserialize(stack:get_metadata())
+	end
+	if not data then data = {} end
+	data.title = fields.title
+	data.text = fields.text
+	data.owner = player:get_player_name()
+	local data_str = minetest.serialize(data)
+	if new_stack then
+		new_stack:set_metadata(data_str)
+		if inv:room_for_item("main", new_stack) then
+			inv:add_item("main", new_stack)
+		else
+			minetest.add_item(player:getpos(), new_stack)
+		end
+	else
+		stack:set_metadata(data_str)
+	end
+	player:set_wielded_item(stack)
+end)
+
 minetest.register_craftitem("default:book", {
 	description = "Book",
 	inventory_image = "default_book.png",
 	groups = {book=1},
+	on_use = book_on_use,
+})
+
+minetest.register_craftitem("default:book_written", {
+	description = "Book With Text",
+	inventory_image = "default_book.png",
+	groups = {book=1, not_in_creative_inventory=1},
+	stack_max = 1,
+	on_use = book_on_use,
 })
 
 minetest.register_craftitem("default:coal_lump", {