diff --git a/game_api.txt b/game_api.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b7d87616fb840bfe0776c28b1538468a77008d72
--- /dev/null
+++ b/game_api.txt
@@ -0,0 +1,200 @@
+minetest_game API
+======================
+GitHub Repo: https://github.com/BlockMen/minetest_game
+
+Introduction
+------------
+The minetest_game gamemode offers multiple new possibilities in addition to Minetest's built-in API, allowing you to
+add new plants to farming mod, buckets for new liquids, new stairs and custom panes.
+For information on the Minetest API, visit https://github.com/minetest/minetest/blob/master/doc/lua_api.txt
+Please note:
+	[XYZ] refers to a section the Minetest API
+	[#ABC] refers to a section in this document
+	^ Explanation for line above
+
+Bucket API
+----------
+The bucket API allows registering new types of buckets for non-default liquids.
+
+	bucket.register_liquid(
+		"default:lava_source",		-- Source node name
+		"default:lava_flowing",		-- Flowing node name
+		"bucket:bucket_lava",		-- Name to be used for bucket
+		"bucket_lava.png",			-- Bucket texture (for wielditem and inventory_image)
+		"Lava Bucket"				-- Bucket description
+	)
+	
+Doors API
+---------
+The doors mod allows modders to register custom doors.
+
+	doors:register_door(name, def)
+	^ Notice the ":" instaed of "."!
+	^ name: "Door name"
+	^ def: See [#Door definition]
+	
+#Door definition
+----------------
+{
+	description = "Door description",
+	inventory_image = "mod_door_inv.png",
+	groups = {group = 1},
+	tiles_bottom: [Tile definition],
+	^ the tiles of the bottom part of the door {front, side}
+	tiles_top: [Tile definition],
+	^ the tiles of the bottom part of the door {front, side}
+	node_box_bottom = regular nodebox, see [Node boxes], OPTIONAL,
+	node_box_top = regular nodebox, see [Node boxes], OPTIONAL,
+	selection_box_bottom = regular nodebox, see [Node boxes], OPTIONAL,
+	selection_box_top = regular nodebox, see [Node boxes], OPTIONAL,
+	only_placer_can_open = true/false,
+	^ If true, only placer can open the door (locked for others)
+}
+
+Farming API
+-----------
+The farming API allows you to easily register plants and hoes.
+
+farming.register_hoe(name, hoe definition)
+ -> Register a new hoe, see [#hoe definition]
+ 
+farming.register_plant(name, Plant definition)
+ -> Register a new growing plant, see [#Plant definition]
+
+#Hoe Definition
+---------------
+{
+	description = "",	-- Description for tooltip
+	inventory_image = "unknown_item.png",	-- Image to be used as wield- and inventory image
+	max_uses = 30,	-- Uses until destroyed
+	recipe = {	-- Craft recipe
+		{"air", "air", "air"},
+		{"", "group:stick"},
+		{"", "group:stick"},
+	}
+}
+
+#Plant definition
+-----------------
+{
+	description = "",	-- Description of seed item
+	inventory_image = "unknown_item.png",	-- Image to be used as seed's wield- and inventory image
+	steps = 8,	-- How many steps the plant has to grow, until it can be harvested
+	^ Always provide a plant texture for ech step, format: modname_plantname_i.png (i = stepnumber)
+	minlight = 13, -- Minimum light to grow
+	maxlight = LIGHT_MAX -- Maximum light to grow
+}
+
+Stairs API
+----------
+The stairs API lets you register stairs and slabs and ensures that they are registered the same way as those
+delivered with minetest_game, to keep them compatible with other mods.
+
+stairs.register_stair(subname, recipeitem, groups, images, description, sounds)
+ -> Registers a stair.
+ -> subname: Basically the material name (e.g. cobble) used for the stair name. Nodename pattern: "stairs:stair_subname"
+ -> recipeitem: Item used in the craft recipe, e.g. "default:cobble"
+ -> groups: see [Known damage and digging time defining groups]
+ -> images: see [Tile definition]
+ -> description: used for the description field in the stair's definition
+ -> sounds: see [#Default sounds]
+ 
+stairs.register_slab(subname, recipeitem, groups, images, description, sounds)
+ -> Registers a slabs
+ -> subname: Basically the material name (e.g. cobble) used for the stair name. Nodename pattern: "stairs:stair_subname"
+ -> recipeitem: Item used in the craft recipe, e.g. "default:cobble"
+ -> groups: see [Known damage and digging time defining groups]
+ -> images: see [Tile definition]
+ -> description: used for the description field in the stair's definition
+ -> sounds: see [#Default sounds]
+ 
+stairs.register_stair_and_slab(subname, recipeitem, groups, images, desc_stair, desc_slab, sounds)
+ -> A wrapper for stairs.register_stair and stairs.register_slab
+ -> Uses almost the same arguments as stairs.register_stair
+ -> desc_stair: Description for stair node
+ -> desc_slab: Description for slab node
+ 
+Xpanes API
+----------
+Creates panes that automatically connect to each other
+
+xpanes.register_pane(subname, def)
+ -> subname: used for nodename. Result: "xpanes:subname_{1..16}"
+ -> def: See [#Pane definition]
+
+#Pane definition
+----------------
+{
+	textures = {"texture_Bottom_top", "texture_left_right", "texture_front_back"},
+	^ More tiles aren't supported
+	groups = {group = rating},
+	^ Uses the known node groups, see [Known damage and digging time defining groups]
+	sounds = SoundSpec,
+	^ See [#Default sounds]
+	recipe = {{"","","","","","","","",""}},
+	^ Recipe field only
+	on_construct = function(pos)
+		update_pane(pos, "pane")
+    end,
+	^ Required to handle rotation correctly
+}
+
+Default sounds
+--------------
+Sounds inside the default table can be used within the sounds field of node definitions.
+
+default.node_sound_defaults()
+default.node_sound_stone_defaults()
+default.node_sound_dirt_defaults()
+default.node_sound_sand_defaults()
+default.node_sound_wood_defaults()
+default.node_sound_leaves_defaults()
+default.node_sound_glass_defaults()
+
+Player API
+----------
+The player API can register player models and update the player's appearence
+
+default.player_register_model(name, def)
+^ Register a new model to be used by players.
+ -> name: model filename such as "character.x", "foo.b3d", etc.
+ -> def: See [#Model definition]
+
+default.registered_player_models[name]
+^ Get a model's definition
+ -> see [#Model definition]
+
+default.player_set_model(player, model_name)
+^ Change a player's model
+ -> player: PlayerRef
+ -> model_name: model registered with player_register_model()
+
+default.player_set_animation(player, anim_name [, speed])
+^ Applies an animation to a player
+ -> anim_name: name of the animation.
+ -> speed: frames per second. If nil, default from the model is used
+
+default.player_set_textures(player, textures)
+^ Sets player textures
+ -> player: PlayerRef
+ -> textures: array of textures
+ ^ If <textures> is nil, the default textures from the model def are used
+
+default.player_get_animation(player)
+^ Returns a table containing fields "model", "textures" and "animation".
+^ Any of the fields of the returned table may be nil.
+ -> player: PlayerRef
+
+Model Definition
+----------------
+{
+	animation_speed = 30, -- Default animation speed, in FPS.
+	textures = {"character.png", }, -- Default array of textures.
+	visual_size = {x=1, y=1,}, -- Used to scale the model.
+	animations = {
+		-- <anim_name> = { x=<start_frame>, y=<end_frame>, },
+		foo = { x= 0, y=19, },
+		bar = { x=20, y=39, },
+		-- ...
+	},
+}
diff --git a/mods/xpanes/init.lua b/mods/xpanes/init.lua
index 92d9bfce627e043c87dd2a029e2c59f309ac131f..60ec68c15874616b8a1f122a15018d867f850f4e 100644
--- a/mods/xpanes/init.lua
+++ b/mods/xpanes/init.lua
@@ -1,3 +1,5 @@
+xpanes = {}
+
 local function rshift(x, by)
   return math.floor(x / 2 ^ by)
 end
@@ -61,7 +63,7 @@ local sb_full_blocks = {
     {-0.06, -0.5, -0.5, 0.06, 0.5, 0.5}
 }
 --register panes and bars
-local function register_panes(name, def)
+function xpanes.register_pane(name, def)
 for i = 1, 15 do
     local need = {}
     local cnt = 0
@@ -122,7 +124,7 @@ end
 minetest.register_on_placenode(update_nearby)
 minetest.register_on_dignode(update_nearby)
 
-register_panes("pane", {
+xpanes.register_pane("pane", {
     description = "Glass Pane",
     tiles = {"xpanes_space.png"},
     drawtype = "airlike",
@@ -147,7 +149,7 @@ register_panes("pane", {
 	}
 })
 
-register_panes("bar", {
+xpanes.register_pane("bar", {
     description = "Iron bar",
     tiles = {"xpanes_space.png"},
     drawtype = "airlike",