diff --git a/game_api.txt b/game_api.txt
index d5d09e92..4e200fbc 100644
--- a/game_api.txt
+++ b/game_api.txt
@@ -284,8 +284,58 @@ Give Initial Stuff API
 ^ Adds items to the list of items to be given
 
 
+Players API
+-----------
+
+The player API can register player models and update the player's appearence
+
+* `player_api.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]
+    * saved to player_api.registered_models
+
+* `player_api.registered_player_models[name]`
+	 * Get a model's definition
+	 * see [#Model definition]
+
+* `player_api.set_model(player, model_name)`
+	* Change a player's model
+	* `player`: PlayerRef
+	* `model_name`: model registered with player_api.register_model()
+
+* `player_api.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
+
+* `player_api.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
+
+* `player_api.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},
+		-- ...
+		},
+	}
+
+
 TNT API
-----------
+-------
 
 `tnt.register_tnt(definition)`
 
@@ -634,60 +684,6 @@ GUI and formspecs
  * Get the inactive furnace formspec using the defined GUI elements
 
 
-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},
-		-- ...
-		},
-	}
-
 Leafdecay
 ---------
 
diff --git a/mods/default/README.txt b/mods/default/README.txt
index 8af65a9c..1a3446a6 100644
--- a/mods/default/README.txt
+++ b/mods/default/README.txt
@@ -54,12 +54,6 @@ Calinou (CC BY-SA 3.0):
   default_mineral_copper.png
   default_glass_detail.png
 
-MirceaKitsune (CC BY-SA 3.0):
-  character.x
-
-Jordach (CC BY-SA 3.0):
-  character.png
-
 PilzAdam (CC BY-SA 3.0):
   default_jungleleaves.png
   default_junglesapling.png
@@ -297,4 +291,3 @@ Chests sounds added by sofar, derived of several files mixed together:
     - http://www.freesound.org/people/kingsamas/sounds/135576/ CC-BY-3.0
     - http://www.freesound.org/people/bulbastre/sounds/126887/ CC-BY-3.0
     - http://www.freesound.org/people/Yoyodaman234/sounds/183541/ CC0
-
diff --git a/mods/default/depends.txt b/mods/default/depends.txt
new file mode 100644
index 00000000..e1c38184
--- /dev/null
+++ b/mods/default/depends.txt
@@ -0,0 +1 @@
+player_api?
diff --git a/mods/default/init.lua b/mods/default/init.lua
index 7b5f62f3..2d5a9bd2 100644
--- a/mods/default/init.lua
+++ b/mods/default/init.lua
@@ -47,6 +47,5 @@ dofile(default_path.."/item_entity.lua")
 dofile(default_path.."/craftitems.lua")
 dofile(default_path.."/crafting.lua")
 dofile(default_path.."/mapgen.lua")
-dofile(default_path.."/player.lua")
 dofile(default_path.."/aliases.lua")
 dofile(default_path.."/legacy.lua")
diff --git a/mods/default/legacy.lua b/mods/default/legacy.lua
index a8c8ad56..37f03212 100644
--- a/mods/default/legacy.lua
+++ b/mods/default/legacy.lua
@@ -23,3 +23,14 @@ LIGHT_MAX = default.LIGHT_MAX
 
 -- Formspecs
 default.gui_suvival_form = default.gui_survival_form
+
+-- Players
+if minetest.get_modpath("player_api") then
+	default.registered_player_models = player_api.registered_models
+	default.player_register_model    = player_api.register_model
+	default.player_attached          = player_api.player_attached
+	default.player_get_animation     = player_api.get_animation
+	default.player_set_model         = player_api.set_model
+	default.player_set_textures      = player_api.set_textures
+	default.player_set_animation     = player_api.set_animation
+end
diff --git a/mods/player_api/README.txt b/mods/player_api/README.txt
new file mode 100644
index 00000000..1f28ad9a
--- /dev/null
+++ b/mods/player_api/README.txt
@@ -0,0 +1,20 @@
+Minetest Game mod: player_api
+============================
+See license.txt for license information.
+
+Provides an API to allow multiple mods to set player models and textures.
+Also sets the default model, texture, and player flags.
+
+Authors of source code
+----------------------
+Originally by celeron55, Perttu Ahola <celeron55@gmail.com> (LGPL 2.1)
+Various Minetest developers and contributors (LGPL 2.1)
+
+Authors of media (textures, models and sounds)
+----------------------------------------------
+
+MirceaKitsune (CC BY-SA 3.0):
+  character.x
+
+Jordach (CC BY-SA 3.0):
+  character.png
diff --git a/mods/default/player.lua b/mods/player_api/api.lua
similarity index 70%
rename from mods/default/player.lua
rename to mods/player_api/api.lua
index 0a2078d6..9dd33eee 100644
--- a/mods/default/player.lua
+++ b/mods/player_api/api.lua
@@ -1,42 +1,29 @@
 -- Minetest 0.4 mod: player
 -- See README.txt for licensing and other information.
 
+player_api = {}
+
 -- Player animation blending
 -- Note: This is currently broken due to a bug in Irrlicht, leave at 0
 local animation_blend = 0
 
-default.registered_player_models = { }
+player_api.registered_models = { }
 
 -- Local for speed.
-local models = default.registered_player_models
+local models = player_api.registered_models
 
-function default.player_register_model(name, def)
+function player_api.register_model(name, def)
 	models[name] = def
 end
 
--- Default player appearance
-default.player_register_model("character.b3d", {
-	animation_speed = 30,
-	textures = {"character.png", },
-	animations = {
-		-- Standard animations.
-		stand     = { x=  0, y= 79, },
-		lay       = { x=162, y=166, },
-		walk      = { x=168, y=187, },
-		mine      = { x=189, y=198, },
-		walk_mine = { x=200, y=219, },
-		sit       = { x= 81, y=160, },
-	},
-})
-
 -- Player stats and animations
 local player_model = {}
 local player_textures = {}
 local player_anim = {}
 local player_sneak = {}
-default.player_attached = {}
+player_api.player_attached = {}
 
-function default.player_get_animation(player)
+function player_api.get_animation(player)
 	local name = player:get_player_name()
 	return {
 		model = player_model[name],
@@ -46,7 +33,7 @@ function default.player_get_animation(player)
 end
 
 -- Called when a player's appearance needs to be updated
-function default.player_set_model(player, model_name)
+function player_api.set_model(player, model_name)
 	local name = player:get_player_name()
 	local model = models[model_name]
 	if model then
@@ -59,7 +46,7 @@ function default.player_set_model(player, model_name)
 			visual = "mesh",
 			visual_size = model.visual_size or {x=1, y=1},
 		})
-		default.player_set_animation(player, "stand")
+		player_api.set_animation(player, "stand")
 	else
 		player:set_properties({
 			textures = { "player.png", "player_back.png", },
@@ -69,13 +56,13 @@ function default.player_set_model(player, model_name)
 	player_model[name] = model_name
 end
 
-function default.player_set_textures(player, textures)
+function player_api.set_textures(player, textures)
 	local name = player:get_player_name()
 	player_textures[name] = textures
 	player:set_properties({textures = textures,})
 end
 
-function default.player_set_animation(player, anim_name, speed)
+function player_api.set_animation(player, anim_name, speed)
 	local name = player:get_player_name()
 	if player_anim[name] == anim_name then
 		return
@@ -89,16 +76,6 @@ function default.player_set_animation(player, anim_name, speed)
 	player:set_animation(anim, speed or model.animation_speed, animation_blend)
 end
 
--- Update appearance when the player joins
-minetest.register_on_joinplayer(function(player)
-	default.player_attached[player:get_player_name()] = false
-	default.player_set_model(player, "character.b3d")
-	player:set_local_animation({x=0, y=79}, {x=168, y=187}, {x=189, y=198}, {x=200, y=219}, 30)
-
-	player:hud_set_hotbar_image("gui_hotbar.png")
-	player:hud_set_hotbar_selected_image("gui_hotbar_selected.png")
-end)
-
 minetest.register_on_leaveplayer(function(player)
 	local name = player:get_player_name()
 	player_model[name] = nil
@@ -107,8 +84,8 @@ minetest.register_on_leaveplayer(function(player)
 end)
 
 -- Localize for better performance.
-local player_set_animation = default.player_set_animation
-local player_attached = default.player_attached
+local player_set_animation = player_api.set_animation
+local player_attached = player_api.player_attached
 
 -- Check each player and apply animations
 minetest.register_globalstep(function(dtime)
diff --git a/mods/player_api/init.lua b/mods/player_api/init.lua
new file mode 100644
index 00000000..9484647c
--- /dev/null
+++ b/mods/player_api/init.lua
@@ -0,0 +1,26 @@
+dofile(minetest.get_modpath("player_api") .. "/api.lua")
+
+-- Default player appearance
+player_api.register_model("character.b3d", {
+	animation_speed = 30,
+	textures = {"character.png", },
+	animations = {
+		-- Standard animations.
+		stand     = { x=  0, y= 79, },
+		lay       = { x=162, y=166, },
+		walk      = { x=168, y=187, },
+		mine      = { x=189, y=198, },
+		walk_mine = { x=200, y=219, },
+		sit       = { x= 81, y=160, },
+	},
+})
+
+-- Update appearance when the player joins
+minetest.register_on_joinplayer(function(player)
+	player_api.player_attached[player:get_player_name()] = false
+	player_api.set_model(player, "character.b3d")
+	player:set_local_animation({x=0, y=79}, {x=168, y=187}, {x=189, y=198}, {x=200, y=219}, 30)
+
+	player:hud_set_hotbar_image("gui_hotbar.png")
+	player:hud_set_hotbar_selected_image("gui_hotbar_selected.png")
+end)
diff --git a/mods/default/models/character.b3d b/mods/player_api/models/character.b3d
similarity index 100%
rename from mods/default/models/character.b3d
rename to mods/player_api/models/character.b3d
diff --git a/mods/default/models/character.blend b/mods/player_api/models/character.blend
similarity index 100%
rename from mods/default/models/character.blend
rename to mods/player_api/models/character.blend
diff --git a/mods/default/models/character.png b/mods/player_api/models/character.png
similarity index 100%
rename from mods/default/models/character.png
rename to mods/player_api/models/character.png
diff --git a/mods/default/sounds/player_damage.ogg b/mods/player_api/sounds/player_damage.ogg
similarity index 100%
rename from mods/default/sounds/player_damage.ogg
rename to mods/player_api/sounds/player_damage.ogg
diff --git a/mods/default/textures/gui_hotbar.png b/mods/player_api/textures/gui_hotbar.png
similarity index 100%
rename from mods/default/textures/gui_hotbar.png
rename to mods/player_api/textures/gui_hotbar.png
diff --git a/mods/default/textures/gui_hotbar_selected.png b/mods/player_api/textures/gui_hotbar_selected.png
similarity index 100%
rename from mods/default/textures/gui_hotbar_selected.png
rename to mods/player_api/textures/gui_hotbar_selected.png
diff --git a/mods/default/textures/player.png b/mods/player_api/textures/player.png
similarity index 100%
rename from mods/default/textures/player.png
rename to mods/player_api/textures/player.png
diff --git a/mods/default/textures/player_back.png b/mods/player_api/textures/player_back.png
similarity index 100%
rename from mods/default/textures/player_back.png
rename to mods/player_api/textures/player_back.png