diff --git a/arrows/dragonarrows.lua b/arrows/dragonarrows.lua
new file mode 100644
index 0000000000000000000000000000000000000000..81e7fee376acb4bf23fe3304a2bb13e9da29d0b4
--- /dev/null
+++ b/arrows/dragonarrows.lua
@@ -0,0 +1,30 @@
+local base_arrow = {
+   visual = "sprite",
+   visual_size = {x = 0.5, y = 0.5},
+   velocity = 8,
+   tail = 1, -- enable tail
+   tail_texture = "dmobs_ice.png",
+
+   hit_player = function(self, player)
+      player:punch(self.object, 1.0, {
+         full_punch_interval = 1.0,
+         damage_groups = {fleshy = 8},
+      }, nil)
+   end,
+   
+   hit_mob = function(self, player)
+      player:punch(self.object, 1.0, {
+         full_punch_interval = 1.0,
+         damage_groups = {fleshy = 8},
+      }, nil)
+   end,
+
+   hit_node = function(self, pos, node)
+      self.object:remove()
+   end,
+}
+
+for _,arrowtype in pairs( {"ice","lightning","poison"} ) do
+	base_arrow.textures = {"dmobs_"..arrowtype..".png"},
+	mobs:register_arrow("dmobs:"..arrowtype, dmobs.deepclone(base_arrow) )
+end
diff --git a/arrows/dragonfire.lua b/arrows/dragonfire.lua
new file mode 100644
index 0000000000000000000000000000000000000000..f5728cfd8a690b8782d634d5c3bc38bc41a30cf4
--- /dev/null
+++ b/arrows/dragonfire.lua
@@ -0,0 +1,71 @@
+--function to register tamed dragon attacks
+
+function dmobs.register_fire(fname, texture, dmg, replace_node, explode, ice, variance, size)
+minetest.register_entity(fname, {
+	textures = {texture},
+	velocity = 0.1,
+	damage = dmg,
+	collisionbox = {0, 0, 0, 0, 0, 0},
+	on_step = function(self, obj, pos)		
+		local remove = minetest.after(2, function() 
+		self.object:remove()
+		end)
+		local pos = self.object:getpos()
+		local objs = minetest.get_objects_inside_radius({x=pos.x,y=pos.y,z=pos.z}, 2)	
+			for k, obj in pairs(objs) do
+				if obj:get_luaentity() ~= nil then
+					if obj:get_luaentity().name ~= fname and obj:get_luaentity().name ~= "dmobs:dragon_red" and obj:get_luaentity().name ~= "dmobs:dragon_blue" and obj:get_luaentity().name ~= "dmobs:dragon_black" and obj:get_luaentity().name ~= "dmobs:dragon_green" and obj:get_luaentity().name ~= "dmobs:dragon_great_tame" and obj:get_luaentity().name ~= "__builtin:item" then
+						obj:punch(self.launcher, 1.0, {
+							full_punch_interval=1.0,
+							damage_groups={fleshy=3},
+						}, nil)
+					self.object:remove()
+					end
+				end
+			end
+			for dx=0,1 do
+						for dy=0,1 do
+							for dz=0,1 do
+								local p = {x=pos.x+dx, y=pos.y, z=pos.z+dz}
+								local t = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz}
+								local n = minetest.env:get_node(p).name
+								if n ~= fname and n ~="default:dirt_with_grass" and n ~="default:dirt_with_dry_grass" and n ~="default:stone"  then	
+									if minetest.registered_nodes[n].groups.flammable --[[or math.random(1, 100) <= 1]] then
+										minetest.env:set_node(t, {name=replace_node})
+									self.object:remove()
+									return
+									end
+									if ice and n == "default:water_source" then
+									minetest.env:set_node(t, {name="default:ice"})
+									self.object:remove()
+									end
+								end
+							end
+						end
+					end
+		local apos = self.object:getpos()
+		local part = minetest.add_particlespawner(
+			6, --amount
+			0.3, --time
+			{x=apos.x-variance, y=apos.y-variance, z=apos.z-variance}, --minpos
+			{x=apos.x+variance, y=apos.y+variance, z=apos.z+variance}, --maxpos
+			{x=-0, y=-0, z=-0}, --minvel
+			{x=0, y=0, z=0}, --maxvel
+			{x=variance,y=-0.5-variance,z=variance}, --minacc
+			{x=0.5+variance,y=0.5+variance,z=0.5+variance}, --maxacc
+			0.1, --minexptime
+			0.3, --maxexptime
+			size, --minsize
+			size+2, --maxsize
+			false, --collisiondetection
+			texture --texture
+		)
+		
+	end,
+})
+end
+
+dmobs.register_fire("dmobs:fire_plyr", "dmobs_fire.png", 2, "fire:basic_flame", true, false, 0.3, 1)
+dmobs.register_fire("dmobs:ice_plyr", "dmobs_ice.png", 2, "default:ice", false, true, 0.5, 10)
+dmobs.register_fire("dmobs:poison_plyr", "dmobs_poison.png", 2, "air", false, false, 0.3, 1)
+dmobs.register_fire("dmobs:lightning_plyr", "dmobs_lightning.png", 2, "air", true, false, 0, 0.5)
diff --git a/dragons.lua b/dragons.lua
deleted file mode 100644
index ac14ffc14f5b9708d1ca4f8840029b2f3216c203..0000000000000000000000000000000000000000
--- a/dragons.lua
+++ /dev/null
@@ -1,1539 +0,0 @@
---thanks to diriel, blert2112 and taikedz 
-
-local step_custom = function(self, dtime)
-	if self.driver then
-		lib_mount.drive(self, dtime, "walk", "stand", true)
-		if self.state == "attack" then
-			self.state = nil
-		end
-		return false
-	end
-	return true
-end
-
-local tamed_dragons = {}
-
-local node_hit = {}
-
-dmobs.destructive = false
-
-if dmobs.destructive == true then
-node_hit = function(self, pos, node)
-mobs:explosion(pos, 2, 1, 1)
-end
-else
-node_hit = function(self)
-self.object:remove()
-end
-end
-
-local on_rc = function(self, clicker)
-	if not clicker or not clicker:is_player() then
-		return
-	end
-	if mobs:feed_tame(self, clicker, 1, false, false) then
-		return
-	end
-	if self.tamed and self.owner == clicker:get_player_name() then
-		local inv = clicker:get_inventory()
-		if self.driver and clicker == self.driver then
-			-- detach
-			lib_mount.detach(self, clicker, {x=1, y=0, z=1})
-			if inv:room_for_item("main", "mobs:saddle") then
-				inv:add_item("main", "mobs:saddle")
-			else
-				minetest.add_item(clicker.getpos(), "mobs:saddle")
-			end
-			self.object:setacceleration({x=0, y=0, z=0})
-		elseif not self.driver then
-			-- attach
-			if clicker:get_wielded_item():get_name() == "mobs:saddle" then
-				lib_mount.attach(self, clicker, {x=0, y=12, z=4}, {x=0, y=0, z=4})
-				inv:remove_item("main", "mobs:saddle")
-			end
-		end
-	end
-end
-
-
-
-mobs:register_mob("dmobs:dragon", {
-   type = "monster",
-   passive = false,
-   attacks_monsters = true,
-   damage = 4,
-   reach = 3,
-   attack_type = "dogshoot",
-   shoot_interval = 2.5,
-	dogshoot_switch = 2,
-	dogshoot_count = 0,
-	dogshoot_count_max =5,
-   arrow = "dmobs:fire",
-   shoot_offset = 1,
-   hp_min = 70,
-   hp_max = 100,
-   armor = 100,
-	collisionbox = {-0.6, -1.2, -0.6, 0.6, 0.6, 0.6},
-   visual = "mesh",
-   mesh = "dragon.b3d",
-   textures = {
-      {"dmobs_dragon.png"},
-   },
-   blood_texture = "mobs_blood.png",
-   visual_size = {x=2, y=2},
-   makes_footstep_sound = true,
-	runaway = false,
-	jump_chance = 30,
-	walk_chance = 80,
-	fall_speed = 0,
-	follow = {"dmobs:dragon_gem"},
-	pathfinding = true,
-	fall_damage = 0,
-   sounds = {
-      shoot_attack = "mobs_fireball",
-   },
-   walk_velocity = 3,
-   run_velocity = 5,
-   jump = true,
-   fly = true,
-   drops = {
-      {name = "dmobs:egg", chance = 1, min = 1, max = 1},
-      {name = "dmobs:dragon_gem", chance = 1, min = 1, max = 1},
-   },
-   fall_speed = 0,
-   stepheight = 10,
-   water_damage = 2,
-   lava_damage = 0,
-   light_damage = 0,
-   view_range = 20,
-   animation = {
-      speed_normal = 10,
-      speed_run = 20,
-      walk_start = 1,
-      walk_end = 22,
-      stand_start = 1,
-      stand_end = 22,
-      run_start = 1,
-      run_end = 22,
-      punch_start = 22,
-      punch_end = 47,
-   },
-	knock_back = 2,
-	do_custom = step_custom,
-	on_rightclick = on_rc
-})
-
-mobs:register_mob("dmobs:dragon2", {
-   type = "monster",
-   passive = false,
-   attacks_monsters = true,
-   damage = 4,
-   reach = 3,
-   attack_type = "dogshoot",
-   shoot_interval = 2.5,
-	dogshoot_switch = 2,
-	dogshoot_count = 0,
-	dogshoot_count_max =5,
-   arrow = "dmobs:lightning",
-   shoot_offset = 1,
-   hp_min = 70,
-   hp_max = 100,
-   armor = 100,
-	collisionbox = {-0.6, -1.2, -0.6, 0.6, 0.6, 0.6},
-   visual = "mesh",
-   mesh = "dragon.b3d",
-   textures = {
-	  {"dmobs_dragon2.png"},
-   },
-   blood_texture = "mobs_blood.png",
-   visual_size = {x=2, y=2},
-   makes_footstep_sound = true,
-	runaway = false,
-	jump_chance = 30,
-	walk_chance = 80,
-	fall_speed = 0,
-	follow = {"dmobs:dragon_gem"},
-	pathfinding = true,
-	fall_damage = 0,
-   sounds = {
-      shoot_attack = "mobs_fireball",
-   },
-   walk_velocity = 3,
-   run_velocity = 5,
-   jump = true,
-   fly = true,
-   drops = {
-      {name = "dmobs:egg", chance = 1, min = 1, max = 1},
-      {name = "dmobs:dragon_gem", chance = 1, min = 1, max = 1},
-   },
-   fall_speed = 0,
-   stepheight = 10,
-   water_damage = 2,
-   lava_damage = 0,
-   light_damage = 0,
-   view_range = 20,
-   animation = {
-      speed_normal = 10,
-      speed_run = 20,
-      walk_start = 1,
-      walk_end = 22,
-      stand_start = 1,
-      stand_end = 22,
-      run_start = 1,
-      run_end = 22,
-      punch_start = 22,
-      punch_end = 47,
-   },
-	knock_back = 2,
-	do_custom = step_custom,
-	on_rightclick = on_rc
-})
-
-mobs:register_mob("dmobs:dragon3", {
-   type = "monster",
-   passive = false,
-   attacks_monsters = true,
-   damage = 4,
-   reach = 3,
-   attack_type = "dogshoot",
-   shoot_interval = 2.5,
-	dogshoot_switch = 2,
-	dogshoot_count = 0,
-	dogshoot_count_max =5,
-   arrow = "dmobs:poison",
-   shoot_offset = 1,
-   hp_min = 70,
-   hp_max = 100,
-   armor = 100,
-	collisionbox = {-0.6, -1.2, -0.6, 0.6, 0.6, 0.6},
-   visual = "mesh",
-   mesh = "dragon.b3d",
-   textures = {
-	  {"dmobs_dragon3.png"},
-   },
-   blood_texture = "mobs_blood.png",
-   visual_size = {x=2, y=2},
-   makes_footstep_sound = true,
-	runaway = false,
-	jump_chance = 30,
-	walk_chance = 80,
-	fall_speed = 0,
-	follow = {"dmobs:dragon_gem"},
-	pathfinding = true,
-	fall_damage = 0,
-   sounds = {
-      shoot_attack = "mobs_fireball",
-   },
-   walk_velocity = 3,
-   run_velocity = 5,
-   jump = true,
-   fly = true,
-   drops = {
-      {name = "dmobs:egg", chance = 1, min = 1, max = 1},
-      {name = "dmobs:dragon_gem", chance = 1, min = 1, max = 1},
-   },
-   fall_speed = 0,
-   stepheight = 10,
-   water_damage = 2,
-   lava_damage = 0,
-   light_damage = 0,
-   view_range = 20,
-   animation = {
-      speed_normal = 10,
-      speed_run = 20,
-      walk_start = 1,
-      walk_end = 22,
-      stand_start = 1,
-      stand_end = 22,
-      run_start = 1,
-      run_end = 22,
-      punch_start = 22,
-      punch_end = 47,
-   },
-	knock_back = 2,
-	do_custom = step_custom,
-	on_rightclick = on_rc
-})
-
-mobs:register_mob("dmobs:dragon4", {
-   type = "monster",
-   passive = false,
-   attacks_monsters = true,
-   damage = 4,
-   reach = 3,
-   attack_type = "dogshoot",
-   shoot_interval = 2.5,
-	dogshoot_switch = 2,
-	dogshoot_count = 0,
-	dogshoot_count_max =5,
-   arrow = "dmobs:ice",
-   shoot_offset = 1,
-   hp_min = 70,
-   hp_max = 100,
-   armor = 100,
-	collisionbox = {-0.6, -1.2, -0.6, 0.6, 0.6, 0.6},
-   visual = "mesh",
-   mesh = "dragon.b3d",
-   textures = {
-	  {"dmobs_dragon4.png"},
-   },
-   blood_texture = "mobs_blood.png",
-   visual_size = {x=2, y=2},
-   makes_footstep_sound = true,
-	runaway = false,
-	jump_chance = 30,
-	walk_chance = 80,
-	fall_speed = 0,
-	follow = {"dmobs:dragon_gem"},
-	pathfinding = true,
-	fall_damage = 0,
-   sounds = {
-      shoot_attack = "mobs_fireball",
-   },
-   walk_velocity = 3,
-   run_velocity = 5,
-   jump = true,
-   fly = true,
-   drops = {
-      {name = "dmobs:egg", chance = 1, min = 1, max = 1},
-      {name = "dmobs:dragon_gem", chance = 1, min = 1, max = 1},
-   },
-   fall_speed = 0,
-   stepheight = 10,
-   water_damage = 2,
-   lava_damage = 0,
-   light_damage = 0,
-   view_range = 20,
-   animation = {
-      speed_normal = 10,
-      speed_run = 20,
-      walk_start = 1,
-      walk_end = 22,
-      stand_start = 1,
-      stand_end = 22,
-      run_start = 1,
-      run_end = 22,
-      punch_start = 22,
-      punch_end = 47,
-   },
-	knock_back = 2,
-	do_custom = step_custom,
-	on_rightclick = on_rc
-})
-
---hatched dragons
-mobs:register_mob("dmobs:dragon_red", {
-   type = "npc",
-   passive = false,
-   attacks_monsters = true,
-   damage = 4,
-   reach = 3,
-   attack_type = "dogshoot",
-   shoot_interval = 2.5,
-	dogshoot_switch = 2,
-	dogshoot_count = 0,
-	dogshoot_count_max =5,
-   arrow = "dmobs:fire",
-   shoot_offset = 1,
-   hp_min = 80,
-   hp_max = 100,
-   armor = 100,
-	collisionbox = {-0.6, -0.9, -0.6, 0.6, 0.6, 0.6},
-   visual = "mesh",
-   mesh = "dragon.b3d",
-   textures = {
-      {"dmobs_dragon.png"},
-   },
-	child_texture = {
-		{"dmobs_dragon_young.png"}
-	},
-   blood_texture = "mobs_blood.png",
-   visual_size = {x=1.5, y=1.5},
-   makes_footstep_sound = true,
-	runaway = false,
-	jump_chance = 30,
-	walk_chance = 80,
-	fall_speed = 0,
-	follow = {"dmobs:dragon_gem_fire"},
-	pathfinding = true,
-	fall_damage = 0,
-   sounds = {
-      shoot_attack = "mobs_fireball",
-   },
-   walk_velocity = 3,
-   run_velocity = 5,
-   jump = true,
-   fly = true,
-   drops = {
-      {name = "mobs:meat_raw", chance = 1, min = 1, max = 1},
-   },
-   fall_speed = 0,
-   stepheight = 10,
-   water_damage = 2,
-   lava_damage = 0,
-   light_damage = 0,
-   view_range = 20,
-   animation = {
-      speed_normal = 10,
-      speed_run = 20,
-      walk_start = 1,
-      walk_end = 22,
-      stand_start = 1,
-      stand_end = 22,
-      run_start = 1,
-      run_end = 22,
-      punch_start = 22,
-      punch_end = 47,
-   },
-	knock_back = 2,
-	on_rightclick = function(self, clicker)
-	if self.tamed and self.owner == clicker:get_player_name() then
-		local inv = clicker:get_inventory()
-		if self.driver and clicker == self.driver then
-		object_detach(self, clicker, {x=1, y=0, z=1})
-		if inv:room_for_item("main", "mobs:saddle") then
-				inv:add_item("main", "mobs:saddle")
-		else
-				minetest.add_item(clicker.getpos(), "mobs:saddle")
-		end
-		elseif not self.driver then
-		if clicker:get_wielded_item():get_name() == "mobs:saddle" then
-		object_attach(self, clicker, {x=0, y=12, z=4}, {x=0, y=0, z=4})
-		inv:remove_item("main", "mobs:saddle")
-		end
-		end
-		end
-	end,
-	do_custom = function(self, dtime)
-	if self.driver then
-		object_fly(self, dtime, 10, true, "dmobs:fire_plyr", "walk", "stand")
-		if self.state == "attack" then
-		self.state = "idle"
-		end
-		return false
-		end
-		return true
-	end,
-})
-
-mobs:register_mob("dmobs:dragon_black", {
-   type = "npc",
-   passive = false,
-   attacks_monsters = true,
-   damage = 4,
-   reach = 3,
-   attack_type = "dogshoot",
-   shoot_interval = 2.5,
-	dogshoot_switch = 2,
-	dogshoot_count = 0,
-	dogshoot_count_max =5,
-   arrow = "dmobs:lightning",
-   shoot_offset = 1,
-   hp_min = 80,
-   hp_max = 100,
-   armor = 100,
-	collisionbox = {-0.6, -0.9, -0.6, 0.6, 0.6, 0.6},
-   visual = "mesh",
-   mesh = "dragon.b3d",
-   textures = {
-      {"dmobs_dragon2.png"},
-   },
-	child_texture = {
-		{"dmobs_dragon_young.png"}
-	},
-   blood_texture = "mobs_blood.png",
-   visual_size = {x=1.5, y=1.5},
-   makes_footstep_sound = true,
-	runaway = false,
-	jump_chance = 30,
-	walk_chance = 80,
-	fall_speed = 0,
-	follow = {"dmobs:dragon_gem_lightning"},
-	pathfinding = true,
-	fall_damage = 0,
-   sounds = {
-      shoot_attack = "mobs_fireball",
-   },
-   walk_velocity = 3,
-   run_velocity = 5,
-   jump = true,
-   fly = true,
-   drops = {
-      {name = "mobs:meat_raw", chance = 1, min = 1, max = 1},
-   },
-   fall_speed = 0,
-   stepheight = 10,
-   water_damage = 2,
-   lava_damage = 0,
-   light_damage = 0,
-   view_range = 20,
-   animation = {
-      speed_normal = 10,
-      speed_run = 20,
-      walk_start = 1,
-      walk_end = 22,
-      stand_start = 1,
-      stand_end = 22,
-      run_start = 1,
-      run_end = 22,
-      punch_start = 22,
-      punch_end = 47,
-   },
-	knock_back = 2,
-	on_rightclick = function(self, clicker)
-	if self.tamed and self.owner == clicker:get_player_name() then
-		local inv = clicker:get_inventory()
-		if self.driver and clicker == self.driver then
-		object_detach(self, clicker, {x=1, y=0, z=1})
-		if inv:room_for_item("main", "mobs:saddle") then
-				inv:add_item("main", "mobs:saddle")
-		else
-				minetest.add_item(clicker.getpos(), "mobs:saddle")
-		end
-		elseif not self.driver then
-		if clicker:get_wielded_item():get_name() == "mobs:saddle" then
-		object_attach(self, clicker, {x=0, y=12, z=4}, {x=0, y=0, z=4})
-		inv:remove_item("main", "mobs:saddle")
-		end
-		end
-		end
-	end,
-	do_custom = function(self, dtime)
-	if self.driver then
-		object_fly(self, dtime, 15, true, "dmobs:lightning_plyr", "walk", "stand")
-		if self.state == "attack" then
-		self.state = "idle"
-		end
-		return false
-		end
-		return true
-	end,
-})
-
-mobs:register_mob("dmobs:dragon_green", {
-   type = "npc",
-   passive = false,
-   attacks_monsters = true,
-   damage = 4,
-   reach = 3,
-   attack_type = "dogshoot",
-   shoot_interval = 2.5,
-	dogshoot_switch = 2,
-	dogshoot_count = 0,
-	dogshoot_count_max =5,
-   arrow = "dmobs:poison",
-   shoot_offset = 1,
-   hp_min = 80,
-   hp_max = 100,
-   armor = 100,
-	collisionbox = {-0.6, -0.9, -0.6, 0.6, 0.6, 0.6},
-   visual = "mesh",
-   mesh = "dragon.b3d",
-   textures = {
-      {"dmobs_dragon3.png"},
-   },
-	child_texture = {
-		{"dmobs_dragon_young.png"}
-	},
-   blood_texture = "mobs_blood.png",
-   visual_size = {x=1.5, y=1.5},
-   makes_footstep_sound = true,
-	runaway = false,
-	jump_chance = 30,
-	walk_chance = 80,
-	fall_speed = 0,
-	follow = {"dmobs:dragon_gem_poison"},
-	pathfinding = true,
-	fall_damage = 0,
-   sounds = {
-      shoot_attack = "mobs_fireball",
-   },
-   walk_velocity = 3,
-   run_velocity = 5,
-   jump = true,
-   fly = true,
-   drops = {
-      {name = "mobs:meat_raw", chance = 1, min = 1, max = 1},
-   },
-   fall_speed = 0,
-   stepheight = 10,
-   water_damage = 2,
-   lava_damage = 0,
-   light_damage = 0,
-   view_range = 20,
-   animation = {
-      speed_normal = 10,
-      speed_run = 20,
-      walk_start = 1,
-      walk_end = 22,
-      stand_start = 1,
-      stand_end = 22,
-      run_start = 1,
-      run_end = 22,
-      punch_start = 22,
-      punch_end = 47,
-   },
-	knock_back = 2,
-	on_rightclick = function(self, clicker)
-	if self.tamed and self.owner == clicker:get_player_name() then
-		local inv = clicker:get_inventory()
-		if self.driver and clicker == self.driver then
-		object_detach(self, clicker, {x=1, y=0, z=1})
-		if inv:room_for_item("main", "mobs:saddle") then
-				inv:add_item("main", "mobs:saddle")
-		else
-				minetest.add_item(clicker.getpos(), "mobs:saddle")
-		end
-		elseif not self.driver then
-		if clicker:get_wielded_item():get_name() == "mobs:saddle" then
-		object_attach(self, clicker, {x=0, y=12, z=4}, {x=0, y=0, z=4})
-		inv:remove_item("main", "mobs:saddle")
-		end
-		end
-		end
-	end,
-	do_custom = function(self, dtime)
-	if self.driver then
-		object_fly(self, dtime, 10, true, "dmobs:poison_plyr", "walk", "stand")
-		if self.state == "attack" then
-		self.state = "idle"
-		end
-		return false
-		end
-		return true
-	end,
-})
-
-mobs:register_mob("dmobs:dragon_blue", {
-   type = "npc",
-   passive = false,
-   attacks_monsters = true,
-   damage = 4,
-   reach = 3,
-   attack_type = "dogshoot",
-   shoot_interval = 2.5,
-	dogshoot_switch = 2,
-	dogshoot_count = 0,
-	dogshoot_count_max =5,
-   arrow = "dmobs:ice",
-   shoot_offset = 1,
-   hp_min = 80,
-   hp_max = 100,
-   armor = 100,
-	collisionbox = {-0.6, -0.9, -0.6, 0.6, 0.6, 0.6},
-   visual = "mesh",
-   mesh = "dragon.b3d",
-   textures = {
-      {"dmobs_dragon4.png"},
-   },
-	child_texture = {
-		{"dmobs_dragon_young.png"}
-	},
-   blood_texture = "mobs_blood.png",
-   visual_size = {x=1.5, y=1.5},
-   makes_footstep_sound = true,
-	runaway = false,
-	jump_chance = 30,
-	walk_chance = 80,
-	fall_speed = 0,
-	follow = {"dmobs:dragon_gem_ice"},
-	pathfinding = true,
-	fall_damage = 0,
-   sounds = {
-      shoot_attack = "mobs_fireball",
-   },
-   walk_velocity = 3,
-   run_velocity = 5,
-   jump = true,
-   fly = true,
-   drops = {
-      {name = "mobs:meat_raw", chance = 1, min = 1, max = 1},
-   },
-   fall_speed = 0,
-   stepheight = 10,
-   water_damage = 2,
-   lava_damage = 0,
-   light_damage = 0,
-   view_range = 20,
-   animation = {
-      speed_normal = 10,
-      speed_run = 20,
-      walk_start = 1,
-      walk_end = 22,
-      stand_start = 1,
-      stand_end = 22,
-      run_start = 1,
-      run_end = 22,
-      punch_start = 22,
-      punch_end = 47,
-   },
-	knock_back = 2,
-	on_rightclick = function(self, clicker)
-	if self.tamed and self.owner == clicker:get_player_name() then
-		local inv = clicker:get_inventory()
-		if self.driver and clicker == self.driver then
-		object_detach(self, clicker, {x=1, y=0, z=1})
-		if inv:room_for_item("main", "mobs:saddle") then
-				inv:add_item("main", "mobs:saddle")
-		else
-				minetest.add_item(clicker.getpos(), "mobs:saddle")
-		end
-		elseif not self.driver then
-		if clicker:get_wielded_item():get_name() == "mobs:saddle" then
-		object_attach(self, clicker, {x=0, y=12, z=4}, {x=0, y=0, z=4})
-		inv:remove_item("main", "mobs:saddle")
-		end
-		end
-		end
-	end,
-	do_custom = function(self, dtime)
-	if self.driver then
-		object_fly(self, dtime, 10, true, "dmobs:ice_plyr", "walk", "stand")
-		if self.state == "attack" then
-		self.state = "idle"
-		end
-		return false
-		end
-		return true
-	end,
-})
-
-
-
-
--- eggs from mobs_dragon 
-
-minetest.register_node("dmobs:egg", {
-	description = "Dragon Egg",
-	drawtype = "mesh",
-	mesh = "egg.b3d",
-	tiles = {"dmobs_egg.png"},
-	paramtype = "light",
-	sunlight_propagates = true,
-	is_ground_content = false,
-	groups = {fleshy=3, dig_immediate=3},
-	sounds = default.node_sound_leaves_defaults(),
-	on_rightclick = function(pos, node, clicker, item, _)
-		local wield_item = clicker:get_wielded_item():get_name()
-		if wield_item == "dmobs:dragon_gem" then
-		
-		local p = {x = pos.x, y = pos.y - 1, z = pos.z}
-		local name1
-		for x1 = -1,1 do
-			for z1 = -1,1 do
-				p.x = pos.x + x1
-				p.z = pos.z + z1
-				local name2 = minetest.get_node(p).name
-				if x1 == -1 and z1 == -1 then
-					name1 = minetest.get_node(p).name
-				elseif x1 == 0 and z1 == 0 then
-					if name2 ~= "default:obsidian" then return end
-				else
-					if name2 ~= name1 then return end
-				end
-			end
-		end
-		local which_dragon
-		if name1 == "default:lava_source" then which_dragon = "red"
-		elseif name1 == "default:obsidian" then which_dragon = "black"
-		elseif name1 == "default:cactus" then which_dragon = "green"
-		elseif name1 == "default:ice" then which_dragon = "blue"
-		end
-		minetest.after(100, function(pos, dragon, pname)
-			if which_dragon == "red" then
-			minetest.set_node(pos, {name="dmobs:dragon_egg_fire"})
-			elseif which_dragon == "black" then
-			minetest.set_node(pos, {name="dmobs:dragon_egg_lightning"})
-			elseif which_dragon == "green" then
-			minetest.set_node(pos, {name="dmobs:dragon_egg_poison"})
-			elseif which_dragon == "blue" then
-			minetest.set_node(pos, {name="dmobs:dragon_egg_ice"})
-			end
-		end, pos)
-			item:take_item()
-		else
-	end
-	end,
-})
-
-
-minetest.register_node("dmobs:dragon_egg_fire", {
-	description = "Dragon Egg",
-	drawtype = "mesh",
-	mesh = "egg.b3d",
-	tiles = {"dmobs_egg1.png"},
-	paramtype = "light",
-	sunlight_propagates = true,
-	is_ground_content = false,
-	groups = {fleshy=3, dig_immediate=3, not_in_creative_inventory=1},
-	sounds = default.node_sound_leaves_defaults(),
-	on_rightclick = function(pos, node, clicker, item, _)
-		local wield_item = clicker:get_wielded_item():get_name()
-		if wield_item == "dmobs:dragon_gem_fire" then
-		minetest.after(100, function(pos, dragon, pname)
-			minetest.remove_node(pos)
-			local ent = minetest.add_entity(pos, "dmobs:dragon_red")
-			minetest.sound_play("dmobs_chirrup",{pos=pos,max_hear_distance=20})
-			local obj = ent:get_luaentity()
-			ent:set_properties({
-				textures = {"dmobs_dragon_young.png"},
-				visual_size = {x=1, y=1},
-			})
-			obj.tamed = true
-			obj.owner = clicker:get_player_name()
-		end, pos, clicker:get_player_name())
-		item:take_item()
-	end
-	end
-})
-
-minetest.register_node("dmobs:dragon_egg_lightning", {
-	description = "Dragon Egg",
-	drawtype = "mesh",
-	mesh = "egg.b3d",
-	tiles = {"dmobs_egg2.png"},
-	paramtype = "light",
-	sunlight_propagates = true,
-	is_ground_content = false,
-	groups = {fleshy=3, dig_immediate=3, not_in_creative_inventory=1},
-	sounds = default.node_sound_leaves_defaults(),
-	on_rightclick = function(pos, node, clicker, item, _)
-		local pname = clicker:get_player_name()
-		local wield_item = clicker:get_wielded_item():get_name()
-		if wield_item == "dmobs:dragon_gem_lightning" then
-		minetest.after(100, function(pos, dragon, pname)
-			minetest.remove_node(pos)
-			minetest.sound_play("dmobs_chirrup",{pos=pos,max_hear_distance=20})
-			local ent = minetest.add_entity(pos, "dmobs:dragon_black")
-			local obj = ent:get_luaentity()
-			ent:set_properties({
-				textures = {"dmobs_dragon_young.png"},
-				visual_size = {x=1, y=1},
-			})
-			obj.tamed = true
-			obj.owner = clicker:get_player_name()
-		end, pos, clicker:get_player_name())
-		item:take_item()
-	end
-	end
-})
-
-minetest.register_node("dmobs:dragon_egg_poison", {
-	description = "Dragon Egg",
-	drawtype = "mesh",
-	mesh = "egg.b3d",
-	tiles = {"dmobs_egg3.png"},
-	paramtype = "light",
-	sunlight_propagates = true,
-	is_ground_content = false,
-	groups = {fleshy=3, dig_immediate=3, not_in_creative_inventory=1},
-	sounds = default.node_sound_leaves_defaults(),
-	on_rightclick = function(pos, node, clicker, item, _)
-		local wield_item = clicker:get_wielded_item():get_name()
-		if wield_item == "dmobs:dragon_gem_poison" then
-		minetest.after(100, function(pos, dragon, pname)
-			minetest.remove_node(pos)
-			minetest.sound_play("dmobs_chirrup",{pos=pos,max_hear_distance=20})
-			local ent = minetest.add_entity(pos, "dmobs:dragon_green")
-			local obj = ent:get_luaentity()
-			ent:set_properties({
-				textures = {"dmobs_dragon_young.png"},
-				visual_size = {x=1, y=1},
-			})
-			obj.tamed = true
-			obj.owner = clicker:get_player_name()
-		end, pos, clicker:get_player_name())
-		item:take_item()
-	end
-	end
-})
-
-minetest.register_node("dmobs:dragon_egg_ice", {
-	description = "Dragon Egg",
-	drawtype = "mesh",
-	mesh = "egg.b3d",
-	tiles = {"dmobs_egg4.png"},
-	paramtype = "light",
-	sunlight_propagates = true,
-	is_ground_content = false,
-	groups = {fleshy=3, dig_immediate=3, not_in_creative_inventory=1},
-	sounds = default.node_sound_leaves_defaults(),
-	on_rightclick = function(pos, node, clicker, item, _)
-		local wield_item = clicker:get_wielded_item():get_name()
-		if wield_item == "dmobs:dragon_gem_ice" then
-		minetest.after(100, function(pos, dragon, pname)
-			minetest.remove_node(pos)
-			minetest.sound_play("dmobs_chirrup",{pos=pos,max_hear_distance=20})
-			local ent = minetest.add_entity(pos, "dmobs:dragon_blue")
-			local obj = ent:get_luaentity()
-			ent:set_properties({
-				textures = {"dmobs_dragon_young.png"},
-				visual_size = {x=1, y=1},
-			})
-			obj.tamed = true
-			obj.owner = clicker:get_player_name()
-		end, pos, clicker:get_player_name())
-		item:take_item()
-	end
-	end
-})
-
-minetest.register_node("dmobs:egg_great", {
-	description = "Great Dragon Egg",
-	drawtype = "mesh",
-	mesh = "egg.b3d",
-	tiles = {"dmobs_egg.png"},
-	paramtype = "light",
-	sunlight_propagates = true,
-	is_ground_content = false,
-	groups = {fleshy=3, dig_immediate=3},
-	sounds = default.node_sound_leaves_defaults(),
-	on_rightclick = function(pos, node, clicker, item, _)
-		local wield_item = clicker:get_wielded_item():get_name()
-		if wield_item == "dmobs:dragon_gem" then
-		minetest.after(100, function(pos, dragon, pname)
-			minetest.remove_node(pos)
-			local ent = minetest.add_entity(pos, "dmobs:dragon_great_tame")
-			local obj = ent:get_luaentity()
-			obj.tamed = true
-			obj.owner = clicker:get_player_name()
-		end, pos, clicker:get_player_name())
-		item:take_item()
-	end
-	end
-})
-
-
---saddle license
-
--- **mobs_saddle.png**
--- -------------------
--- The MIT License (MIT)
-
--- Copyright (c) 2014 Krupnov Pavel
-
--- Permission is hereby granted, free of charge, to any person obtaining a copy
--- of this software and associated documentation files (the "Software"), to deal
--- in the Software without restriction, including without limitation the rights
--- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
--- copies of the Software, and to permit persons to whom the Software is
--- furnished to do so, subject to the following conditions:
-
--- The above copyright notice and this permission notice shall be included in
--- all copies or substantial portions of the Software.
-
--- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
--- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
--- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
--- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
--- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
--- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
--- THE SOFTWARE.
-
-
--- saddle (if not already available)
-if not minetest.get_modpath("mobs_horse") then
-	minetest.register_craftitem(":mobs:saddle", {
-		description = "Saddle",
-		inventory_image = "mobs_saddle.png"
-	})
-
-	minetest.register_craft({
-		output = "mobs:saddle",
-		recipe = {
-			{"mobs:leather", "mobs:leather", "mobs:leather"},
-			{"mobs:leather", "default:steel_ingot", "mobs:leather"},
-			{"mobs:leather", "default:steel_ingot", "mobs:leather"}
-		}
-	})
-end
-
---arrows
-
---Thanks to Tenplus1
-mobs:register_arrow("dmobs:fire", {
-   visual = "sprite",
-   visual_size = {x = 0.5, y = 0.5},
-   textures = {"dmobs_fire.png"},
-   velocity = 8,
-   tail = 1, -- enable tail
-   tail_texture = "fire_basic_flame.png",
-
-   hit_player = function(self, player)
-      player:punch(self.object, 1.0, {
-         full_punch_interval = 1.0,
-         damage_groups = {fleshy = 8},
-      }, nil)
-   end,
-   
-   hit_mob = function(self, player)
-      player:punch(self.object, 1.0, {
-         full_punch_interval = 1.0,
-         damage_groups = {fleshy = 8},
-      }, nil)
-   end,
-
-   hit_node = node_hit,
-})
-
---function to register tamed dragon attacks
-
-function dmobs.register_fire(fname, texture, dmg, replace_node, explode, ice, variance, size)
-minetest.register_entity(fname, {
-	textures = {texture},
-	velocity = 0.1,
-	damage = dmg,
-	collisionbox = {0, 0, 0, 0, 0, 0},
-	on_step = function(self, obj, pos)		
-		local remove = minetest.after(2, function() 
-		self.object:remove()
-		end)
-		local pos = self.object:getpos()
-		local objs = minetest.get_objects_inside_radius({x=pos.x,y=pos.y,z=pos.z}, 2)	
-			for k, obj in pairs(objs) do
-				if obj:get_luaentity() ~= nil then
-					if obj:get_luaentity().name ~= fname and obj:get_luaentity().name ~= "dmobs:dragon_red" and obj:get_luaentity().name ~= "dmobs:dragon_blue" and obj:get_luaentity().name ~= "dmobs:dragon_black" and obj:get_luaentity().name ~= "dmobs:dragon_green" and obj:get_luaentity().name ~= "dmobs:dragon_great_tame" and obj:get_luaentity().name ~= "__builtin:item" then
-						obj:punch(self.launcher, 1.0, {
-							full_punch_interval=1.0,
-							damage_groups={fleshy=3},
-						}, nil)
-					self.object:remove()
-					end
-				end
-			end
-			for dx=0,1 do
-						for dy=0,1 do
-							for dz=0,1 do
-								local p = {x=pos.x+dx, y=pos.y, z=pos.z+dz}
-								local t = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz}
-								local n = minetest.env:get_node(p).name
-								if n ~= fname and n ~="default:dirt_with_grass" and n ~="default:dirt_with_dry_grass" and n ~="default:stone"  then	
-									if minetest.registered_nodes[n].groups.flammable --[[or math.random(1, 100) <= 1]] then
-										minetest.env:set_node(t, {name=replace_node})
-									self.object:remove()
-									return
-									end
-									if ice and n == "default:water_source" then
-									minetest.env:set_node(t, {name="default:ice"})
-									self.object:remove()
-									end
-								end
-							end
-						end
-					end
-		local apos = self.object:getpos()
-		local part = minetest.add_particlespawner(
-			6, --amount
-			0.3, --time
-			{x=apos.x-variance, y=apos.y-variance, z=apos.z-variance}, --minpos
-			{x=apos.x+variance, y=apos.y+variance, z=apos.z+variance}, --maxpos
-			{x=-0, y=-0, z=-0}, --minvel
-			{x=0, y=0, z=0}, --maxvel
-			{x=variance,y=-0.5-variance,z=variance}, --minacc
-			{x=0.5+variance,y=0.5+variance,z=0.5+variance}, --maxacc
-			0.1, --minexptime
-			0.3, --maxexptime
-			size, --minsize
-			size+2, --maxsize
-			false, --collisiondetection
-			texture --texture
-		)
-		
-	end,
-})
-end
-
-dmobs.register_fire("dmobs:fire_plyr", "dmobs_fire.png", 2, "fire:basic_flame", true, false, 0.3, 1)
-dmobs.register_fire("dmobs:ice_plyr", "dmobs_ice.png", 2, "default:ice", false, true, 0.5, 10)
-dmobs.register_fire("dmobs:poison_plyr", "dmobs_poison.png", 2, "air", false, false, 0.3, 1)
-dmobs.register_fire("dmobs:lightning_plyr", "dmobs_lightning.png", 2, "air", true, false, 0, 0.5)
-
-
-
-mobs:register_arrow("dmobs:ice", {
-   visual = "sprite",
-   visual_size = {x = 0.5, y = 0.5},
-   textures = {"dmobs_ice.png"},
-   velocity = 8,
-   tail = 1, -- enable tail
-   tail_texture = "dmobs_ice.png",
-
-   hit_player = function(self, player)
-      player:punch(self.object, 1.0, {
-         full_punch_interval = 1.0,
-         damage_groups = {fleshy = 8},
-      }, nil)
-   end,
-   
-   hit_mob = function(self, player)
-      player:punch(self.object, 1.0, {
-         full_punch_interval = 1.0,
-         damage_groups = {fleshy = 8},
-      }, nil)
-   end,
-
-   hit_node = function(self, pos, node)
-      self.object:remove()
-   end,
-})
-
-mobs:register_arrow("dmobs:lightning", {
-   visual = "sprite",
-   visual_size = {x = 0.5, y = 0.5},
-   textures = {"dmobs_lightning.png"},
-   velocity = 8,
-   tail = 1, -- enable tail
-   tail_texture = "dmobs_lightning.png",
-
-   hit_player = function(self, player)
-      player:punch(self.object, 1.0, {
-         full_punch_interval = 1.0,
-         damage_groups = {fleshy = 8},
-      }, nil)
-   end,
-   
-   hit_mob = function(self, player)
-      player:punch(self.object, 1.0, {
-         full_punch_interval = 1.0,
-         damage_groups = {fleshy = 8},
-      }, nil)
-   end,
-
-   hit_node = node_hit,
-})
-
-mobs:register_arrow("dmobs:poison", {
-   visual = "sprite",
-   visual_size = {x = 0.5, y = 0.5},
-   textures = {"dmobs_poison.png"},
-   velocity = 8,
-   tail = 1, -- enable tail
-   tail_texture = "dmobs_poison.png",
-
-   hit_player = function(self, player)
-      player:punch(self.object, 1.0, {
-         full_punch_interval = 1.0,
-         damage_groups = {fleshy = 8},
-      }, nil)
-   end,
-   
-   hit_mob = function(self, player)
-      player:punch(self.object, 1.0, {
-         full_punch_interval = 1.0,
-         damage_groups = {fleshy = 8},
-      }, nil)
-   end,
-
-   hit_node = function(self, pos, node)
-      self.object:remove()
-   end,
-})
-
-
---items and tools
-
-minetest.register_craftitem("dmobs:dragon_gem_lightning", {
-	description = "Lightning Gem",
-	inventory_image = "dmobs_gem_lightning.png"
-})
-minetest.register_craftitem("dmobs:dragon_gem_ice", {
-	description = "Ice Gem",
-	inventory_image = "dmobs_gem_ice.png"
-})
-minetest.register_craftitem("dmobs:dragon_gem_fire", {
-	description = "Fire Gem",
-	inventory_image = "dmobs_gem_fire.png"
-})
-minetest.register_craftitem("dmobs:dragon_gem_poison", {
-	description = "Poison Gem",
-	inventory_image = "dmobs_gem_poison.png"
-})
-
-minetest.register_craftitem("dmobs:dragon_gem", {
-	description = "Dragon Gem",
-	inventory_image = "dmobs_gem.png"
-})
-
-
---spawns and eggs
-
--- mobs:spawn_specific("dmobs:dragon", {"air"}, {"default:stone"}, 20, 10, 300, 15000, 2, -100, 11000)
--- mobs:spawn_specific("dmobs:dragon2", {"air"}, {"default:stone"}, 20, 10, 300, 15000, 2, -100, 11000)
--- mobs:spawn_specific("dmobs:dragon3", {"air"}, {"default:stone"}, 20, 10, 300, 15000, 2, -100, 11000)
--- mobs:spawn_specific("dmobs:dragon4", {"air"}, {"default:stone"}, 20, 10, 300, 15000, 2, -100, 11000)
-
-mobs:register_spawn("dmobs:dragon", {"default:leaves","default:dirt_with_grass"}, 20, 10, 64000, 2, 31000)
-mobs:register_spawn("dmobs:dragon2", {"default:pine_needles"}, 20, 10, 64000, 2, 31000)
-mobs:register_spawn("dmobs:dragon3", {"default:acacia_leaves","default:dirt_with_dry_grass"}, 20, 10, 64000, 2, 31000)
-mobs:register_spawn("dmobs:dragon4", {"default:jungleleaves"}, 20, 10, 64000, 2, 31000)
-   
-mobs:register_egg("dmobs:dragon", "Wild Fire Dragon", "default_apple.png", 1)
-mobs:register_egg("dmobs:dragon2", "Wild Lightning Dragon", "default_mese_crystal.png", 1)
-mobs:register_egg("dmobs:dragon3", "Wild Poison Dragon", "dmobs_poison.png", 1)
-mobs:register_egg("dmobs:dragon4", "Wild Ice Dragon", "default_ice.png", 1)
-
-mobs:register_egg("dmobs:dragon_red", "Tame Fire Dragon", "default_apple.png", 1)
-mobs:register_egg("dmobs:dragon_black", "Tame Lightning Dragon", "default_mese_crystal.png", 1)
-mobs:register_egg("dmobs:dragon_green", "Tame Poison Dragon", "dmobs_poison.png", 1)
-mobs:register_egg("dmobs:dragon_blue", "Tame Ice Dragon", "default_ice.png", 1)
-
-
---other dragons
-
-mobs:register_mob("dmobs:waterdragon", {
-	type = "monster",
-	passive = false,
-	attack_type = "dogshoot",
-	dogshoot_switch = 2,
-	dogshoot_count = 0,
-	dogshoot_count_max =5,
-	shoot_interval = 2.5,
-	arrow = "dmobs:ice",
-	shoot_offset = 0,
-	pathfinding = false,
-	reach = 5,
-	damage = 2,
-	hp_min = 100,
-	hp_max = 127,
-	armor = 100,
-	collisionbox = {-0.4, -0.5, -0.4, 0.4, 5, 0.4},
-	visual_size = {x=4, y=4},
-	visual = "mesh",
-	mesh = "water_dragon.b3d",
-	textures = {
-		{"dmobs_waterdragon.png"},
-	},
-	blood_texture = "mobs_blood.png",
-	makes_footstep_sound = true,
-	sounds = {
-		random = "mobs_dirtmonster",
-	},
-	view_range = 15,
-	rotate = 180,
-	walk_velocity = 0.01,
-	run_velocity = 0.01,
-	jump = false,
-	drops = {
-		{name = "dmobs:dragon_gem_ice", chance = 1, min = 1, max = 1},
-		{name = "dmobs:dragon_gem_fire", chance = 1, min = 1, max = 1},
-	},
-	water_damage = 0,
-	lava_damage = 5,
-	light_damage = 0,
-	floats = 0,
-	animation = {
-		speed_normal = 15,
-		speed_run = 15,
-		stand_start = 1,
-		stand_end = 20,
-		walk_start = 1,
-		walk_end = 20,
-		run_start = 1,
-		run_end = 20,
-		punch_start = 40,
-		punch_end = 60,
-		shoot_start = 20,
-		shoot_end = 40,
-	},
-	do_custom = function(self)
-	--follow thanks to TenPlus1 and Byakuren
-            if not self.hydra then
-                self.hydra = true -- flip switch so this part is done only once
-
-                -- get head position and define a few temp variables
-                local pos = self.object:getpos()
-                local obj, obj2, ent
-
-                -- add body and make it follow head
-                obj = minetest.add_entity({x=pos.x+1, y=pos.y, z=pos.z}, "dmobs:waterdragon_2")
-                ent = obj:get_luaentity()
-                ent.following = self.object
-
-                -- add body and make it follow previous body segment
-                obj2 = minetest.add_entity({x=pos.x-1, y=pos.y, z=pos.z}, "dmobs:waterdragon_2")
-                ent = obj2:get_luaentity()
-                ent.following = self.object
-            end
-    end,
-})
-
-mobs:register_mob("dmobs:waterdragon_2", {
-	type = "monster",
-	passive = false,
-	attack_type = "shoot",
-	dogshoot_switch = 2,
-	dogshoot_count = 0,
-	dogshoot_count_max =5,
-	shoot_interval = 3,
-	arrow = "dmobs:ice",
-	shoot_offset = 0,
-	pathfinding = false,
-	reach = 5,
-	damage = 2,
-	hp_min = 50,
-	hp_max = 60,
-	armor = 50,
-	collisionbox = {-0.4, -0.2, -0.4, 0.4, 5, 0.4},
-	visual_size = {x=3, y=3},
-	visual = "mesh",
-	mesh = "water_dragon.b3d",
-	textures = {
-		{"dmobs_waterdragon.png"},
-	},
-	blood_texture = "mobs_blood.png",
-	makes_footstep_sound = true,
-   sounds = {
-	  shoot_attack = "mobs_fireball",
-	  random = "velociraptor",
-   },
-	view_range = 15,
-	rotate = 180,
-	floats = 0,
-	walk_velocity = 0.01,
-	run_velocity = 0.01,
-	jump = false,
-	water_damage = 0,
-	lava_damage = 5,
-	light_damage = 0,
-	animation = {
-		speed_normal = 15,
-		speed_run = 15,
-		stand_start = 1,
-		stand_end = 20,
-		walk_start = 1,
-		walk_end = 20,
-		run_start = 1,
-		run_end = 20,
-		punch_start = 40,
-		punch_end = 60,
-		shoot_start = 20,
-		shoot_end = 40,
-	},
-})
-
-mobs:register_spawn("dmobs:waterdragon", {"default:water_source"}, 20, 10, 32000, 1, 31000, false)
-
-mobs:register_egg("dmobs:waterdragon", "Boss Waterdragon", "dmobs_egg4.png", 1)
-
-mobs:register_mob("dmobs:wyvern", {
-   type = "monster",
-   passive = false,
-   attacks_monsters = false,
-   damage = 4,
-   reach = 3,
-   attack_type = "dogshoot",
-   shoot_interval = 2.5,
-	dogshoot_switch = 2,
-	dogshoot_count = 0,
-	dogshoot_count_max =5,
-   arrow = "dmobs:poison",
-   shoot_offset = 0.5,
-   hp_min = 100,
-   hp_max = 150,
-   armor = 100,
-	collisionbox = {-0.6, -1.4, -0.6, 0.6, 0.6, 0.6},
-   visual = "mesh",
-   mesh = "wyvern.b3d",
-   textures = {
-      {"dmobs_wyvern.png"},
-   },
-   blood_texture = "mobs_blood.png",
-   visual_size = {x=1, y=1},
-   makes_footstep_sound = true,
-	runaway = true,
-	jump_chance = 30,
-	walk_chance = 80,
-	pathfinding = true,
-   walk_velocity = 3,
-   run_velocity = 5,
-   fall_speed = -2,
-   jump = true,
-   fly = false,
-   drops = {
-      {name = "dmobs:dragon_gem_poison", chance = 1, min = 1, max = 1},
-	  {name = "dmobs:dragon_gem_lightning", chance = 1, min = 1, max = 1},
-   },
-   sounds = {
-	  shoot_attack = "mobs_fireball",
-	  random = "velociraptor",
-   },
-   water_damage = 0,
-   lava_damage = 2,
-   light_damage = 0,
-   view_range = 20,
-   animation = {
-      speed_normal = 20,
-      speed_run = 30,
-      walk_start = 33,
-      walk_end = 68,
-      stand_start = 1,
-      stand_end = 30,
-      run_start = 33,
-      run_end = 68,
-      punch_start = 70,
-      punch_end = 89,
-   },
-	knock_back = 2,
-})
-
-mobs:register_spawn("dmobs:wyvern",	{"default:leaves"}, 20, 10, 32000, 1, 31000, false)
-
-mobs:register_egg("dmobs:wyvern", "Boss Wyvern", "dmobs_egg3.png", 1)
-
-mobs:register_mob("dmobs:dragon_great", {
-   type = "monster",
-   passive = false,
-   attacks_monsters = false,
-   damage = 5,
-   reach = 4,
-   attack_type = "dogshoot",
-   shoot_interval = 2.5,
-	dogshoot_switch = 2,
-	dogshoot_count = 0,
-	dogshoot_count_max =5,
-   arrow = "dmobs:lightning",
-   shoot_offset = 1,
-   hp_min = 140,
-   hp_max = 180,
-   armor = 220,
-	collisionbox = {-0.6, -1.4, -0.6, 0.6, 0.6, 0.6},
-   visual = "mesh",
-   mesh = "dragon.b3d",
-   textures = {
-	  {"dmobs_dragon_great.png"},
-   },
-   blood_texture = "mobs_blood.png",
-   visual_size = {x=2.5, y=2.5},
-   makes_footstep_sound = true,
-	runaway = false,
-	jump_chance = 30,
-	walk_chance = 80,
-	fall_speed = 0,
-	pathfinding = true,
-	fall_damage = 0,
-   sounds = {
-      shoot_attack = "mobs_fireball",
-	  random = "roar",
-   },
-   walk_velocity = 3,
-   run_velocity = 5,
-   jump = true,
-   fly = true,
-   drops = {
-      {name = "dmobs:egg_great", chance = 1, min = 1, max = 1},
-   },
-   fall_speed = 0,
-   stepheight = 10,
-   water_damage = 2,
-   lava_damage = 0,
-   light_damage = 0,
-   view_range = 20,
-   animation = {
-      speed_normal = 10,
-      speed_run = 20,
-      walk_start = 1,
-      walk_end = 22,
-      stand_start = 1,
-      stand_end = 22,
-      run_start = 1,
-      run_end = 22,
-      punch_start = 22,
-      punch_end = 47,
-   },
-	knock_back = 2,
-})
-
-mobs:register_mob("dmobs:dragon_great_tame", {
-   type = "npc",
-   passive = false,
-   attacks_monsters = true,
-   damage = 5,
-   reach = 4,
-   attack_type = "dogshoot",
-   shoot_interval = 2.5,
-	dogshoot_switch = 2,
-	dogshoot_count = 0,
-	dogshoot_count_max =5,
-   arrow = "dmobs:lightning",
-   shoot_offset = 1,
-   hp_min = 140,
-   hp_max = 180,
-   armor = 220,
-	collisionbox = {-0.6, -1.4, -0.6, 0.6, 0.6, 0.6},
-   visual = "mesh",
-   mesh = "dragon.b3d",
-   textures = {
-	  {"dmobs_dragon_great.png"},
-   },
-   blood_texture = "mobs_blood.png",
-   visual_size = {x=2.5, y=2.5},
-   makes_footstep_sound = true,
-	runaway = false,
-	jump_chance = 30,
-	walk_chance = 80,
-	fall_speed = 0,
-	pathfinding = true,
-	fall_damage = 0,
-   sounds = {
-      shoot_attack = "mobs_fireball",
-	  random = "roar",
-   },
-   walk_velocity = 3,
-   run_velocity = 5,
-   jump = true,
-   fly = true,
-   drops = {
-      {name = "dmobs:egg_great", chance = 1, min = 1, max = 1},
-   },
-   fall_speed = 0,
-   stepheight = 10,
-   water_damage = 2,
-   lava_damage = 0,
-   light_damage = 0,
-   view_range = 20,
-   animation = {
-      speed_normal = 10,
-      speed_run = 20,
-      walk_start = 1,
-      walk_end = 22,
-      stand_start = 1,
-      stand_end = 22,
-      run_start = 1,
-      run_end = 22,
-      punch_start = 22,
-      punch_end = 47,
-   },
-	knock_back = 2,
-	on_rightclick = function(self, clicker)
-	if self.tamed and self.owner == clicker:get_player_name() then
-		local inv = clicker:get_inventory()
-		if self.driver and clicker == self.driver then
-		object_detach(self, clicker, {x=1, y=0, z=1})
-		if inv:room_for_item("main", "mobs:saddle") then
-				inv:add_item("main", "mobs:saddle")
-		else
-				minetest.add_item(clicker.getpos(), "mobs:saddle")
-		end
-		elseif not self.driver then
-		if clicker:get_wielded_item():get_name() == "mobs:saddle" then
-		object_attach(self, clicker, {x=0, y=12, z=4}, {x=0, y=0, z=4})
-		inv:remove_item("main", "mobs:saddle")
-		end
-		end
-		end
-	end,
-	do_custom = function(self, dtime)
-	if self.driver then
-		object_fly(self, dtime, 10, true, "dmobs:fire_plyr", "walk", "stand")
-		if self.state == "attack" then
-		self.state = "idle"
-		end
-		return false
-		end
-		return true
-	end,
-})
-
-mobs:register_spawn("dmobs:dragon_great", {"default:lava_source"}, 20, 0, 64000, -21000, 1000, false)
-
-mobs:register_egg("dmobs:dragon_great", "Boss Dragon", "dmobs_egg1.png", 1)
diff --git a/dragons/dragon1.lua b/dragons/dragon1.lua
index 0a72f0a8044b60efde0ecd53971d1b8af75a7a35..b433854319196b36dc5596ee3f7e72090c5b8898 100644
--- a/dragons/dragon1.lua
+++ b/dragons/dragon1.lua
@@ -1,4 +1,4 @@
-mobs:register_mob("dmobs:dragon", {
+local dragondef = {
    type = "monster",
    passive = false,
    attacks_monsters = true,
@@ -62,98 +62,15 @@ mobs:register_mob("dmobs:dragon", {
 	knock_back = 2,
 	do_custom = step_custom,
 	on_rightclick = dmobs.dragon.on_rc
-})
+}
 
-mobs:register_mob("dmobs:dragon_red", {
-   type = "npc",
-   passive = false,
-   attacks_monsters = true,
-   damage = 4,
-   reach = 3,
-   attack_type = "dogshoot",
-   shoot_interval = 2.5,
-	dogshoot_switch = 2,
-	dogshoot_count = 0,
-	dogshoot_count_max =5,
-   arrow = "dmobs:fire",
-   shoot_offset = 1,
-   hp_min = 80,
-   hp_max = 100,
-   armor = 100,
-	collisionbox = {-0.6, -0.9, -0.6, 0.6, 0.6, 0.6},
-   visual = "mesh",
-   mesh = "dragon.b3d",
-   textures = {
-      {"dmobs_dragon.png"},
-   },
-	child_texture = {
-		{"dmobs_dragon_young.png"}
-	},
-   blood_texture = "mobs_blood.png",
-   visual_size = {x=1.5, y=1.5},
-   makes_footstep_sound = true,
-	runaway = false,
-	jump_chance = 30,
-	walk_chance = 80,
-	fall_speed = 0,
-	follow = {"dmobs:dragon_gem_fire"},
-	pathfinding = true,
-	fall_damage = 0,
-   sounds = {
-      shoot_attack = "mobs_fireball",
-   },
-   walk_velocity = 3,
-   run_velocity = 5,
-   jump = true,
-   fly = true,
-   drops = {
-      {name = "mobs:meat_raw", chance = 1, min = 1, max = 1},
-   },
-   fall_speed = 0,
-   stepheight = 10,
-   water_damage = 2,
-   lava_damage = 0,
-   light_damage = 0,
-   view_range = 20,
-   animation = {
-      speed_normal = 10,
-      speed_run = 20,
-      walk_start = 1,
-      walk_end = 22,
-      stand_start = 1,
-      stand_end = 22,
-      run_start = 1,
-      run_end = 22,
-      punch_start = 22,
-      punch_end = 47,
-   },
-	knock_back = 2,
-	on_rightclick = function(self, clicker)
-	if self.tamed and self.owner == clicker:get_player_name() then
-		local inv = clicker:get_inventory()
-		if self.driver and clicker == self.driver then
-		object_detach(self, clicker, {x=1, y=0, z=1})
-		if inv:room_for_item("main", "mobs:saddle") then
-				inv:add_item("main", "mobs:saddle")
-		else
-				minetest.add_item(clicker.getpos(), "mobs:saddle")
-		end
-		elseif not self.driver then
-		if clicker:get_wielded_item():get_name() == "mobs:saddle" then
-		object_attach(self, clicker, {x=0, y=12, z=4}, {x=0, y=0, z=4})
-		inv:remove_item("main", "mobs:saddle")
-		end
-		end
-		end
-	end,
-	do_custom = function(self, dtime)
-	if self.driver then
-		object_fly(self, dtime, 10, true, "dmobs:fire_plyr", "walk", "stand")
-		if self.state == "attack" then
-		self.state = "idle"
-		end
-		return false
-		end
-		return true
-	end,
-})
+mobs:register_mob("dmobs:dragon", dmobs.deepclone(dragondef) )
+
+dragondef.type = "npc"
+dragondef.attacks_monsters = true
+
+dragondef.on_rightclick = dmobs.dragon.ride
+	
+dragondef.do_custom = dmobs.dragon_do_custom
+
+mobs:register_mob("dmobs:dragon_red", dmobs.deepclone(dragondef) )
diff --git a/dragons/dragon2.lua b/dragons/dragon2.lua
index 9c5c683c03c91928cae58ad0067b29b688567e90..a61a39bc34545aea824084437cc75b228f5b3018 100644
--- a/dragons/dragon2.lua
+++ b/dragons/dragon2.lua
@@ -1,4 +1,4 @@
-mobs:register_mob("dmobs:dragon2", {
+local dragondef = {
    type = "monster",
    passive = false,
    attacks_monsters = true,
@@ -62,98 +62,16 @@ mobs:register_mob("dmobs:dragon2", {
 	knock_back = 2,
 	do_custom = step_custom,
 	on_rightclick = dmobs.dragon.on_rc
-})
+}
 
-mobs:register_mob("dmobs:dragon_black", {
-   type = "npc",
-   passive = false,
-   attacks_monsters = true,
-   damage = 4,
-   reach = 3,
-   attack_type = "dogshoot",
-   shoot_interval = 2.5,
-	dogshoot_switch = 2,
-	dogshoot_count = 0,
-	dogshoot_count_max =5,
-   arrow = "dmobs:lightning",
-   shoot_offset = 1,
-   hp_min = 80,
-   hp_max = 100,
-   armor = 100,
-	collisionbox = {-0.6, -0.9, -0.6, 0.6, 0.6, 0.6},
-   visual = "mesh",
-   mesh = "dragon.b3d",
-   textures = {
-      {"dmobs_dragon2.png"},
-   },
-	child_texture = {
-		{"dmobs_dragon_young.png"}
-	},
-   blood_texture = "mobs_blood.png",
-   visual_size = {x=1.5, y=1.5},
-   makes_footstep_sound = true,
-	runaway = false,
-	jump_chance = 30,
-	walk_chance = 80,
-	fall_speed = 0,
-	follow = {"dmobs:dragon_gem_lightning"},
-	pathfinding = true,
-	fall_damage = 0,
-   sounds = {
-      shoot_attack = "mobs_fireball",
-   },
-   walk_velocity = 3,
-   run_velocity = 5,
-   jump = true,
-   fly = true,
-   drops = {
-      {name = "mobs:meat_raw", chance = 1, min = 1, max = 1},
-   },
-   fall_speed = 0,
-   stepheight = 10,
-   water_damage = 2,
-   lava_damage = 0,
-   light_damage = 0,
-   view_range = 20,
-   animation = {
-      speed_normal = 10,
-      speed_run = 20,
-      walk_start = 1,
-      walk_end = 22,
-      stand_start = 1,
-      stand_end = 22,
-      run_start = 1,
-      run_end = 22,
-      punch_start = 22,
-      punch_end = 47,
-   },
-	knock_back = 2,
-	on_rightclick = function(self, clicker)
-	if self.tamed and self.owner == clicker:get_player_name() then
-		local inv = clicker:get_inventory()
-		if self.driver and clicker == self.driver then
-		object_detach(self, clicker, {x=1, y=0, z=1})
-		if inv:room_for_item("main", "mobs:saddle") then
-				inv:add_item("main", "mobs:saddle")
-		else
-				minetest.add_item(clicker.getpos(), "mobs:saddle")
-		end
-		elseif not self.driver then
-		if clicker:get_wielded_item():get_name() == "mobs:saddle" then
-		object_attach(self, clicker, {x=0, y=12, z=4}, {x=0, y=0, z=4})
-		inv:remove_item("main", "mobs:saddle")
-		end
-		end
-		end
-	end,
-	do_custom = function(self, dtime)
-	if self.driver then
-		object_fly(self, dtime, 15, true, "dmobs:lightning_plyr", "walk", "stand")
-		if self.state == "attack" then
-		self.state = "idle"
-		end
-		return false
-		end
-		return true
-	end,
-})
+
+mobs:register_mob("dmobs:dragon2", dmobs.deepclone(dragondef) )
+
+dragondef.type = "npc"
+dragondef.attacks_monsters = true
+
+dragondef.on_rightclick = dmobs.dragon.ride
+	
+dragondef.do_custom = dmobs.dragon_do_custom
+
+mobs:register_mob("dmobs:dragon_black", dmobs.deepclone(dragondef) )
diff --git a/dragons/dragon3.lua b/dragons/dragon3.lua
index 8aaf6a381885a94b449b7a03a85bdb3ab1736e4f..f33f013fd9df4ff477f8cefdd449cbc0b0b86eb4 100644
--- a/dragons/dragon3.lua
+++ b/dragons/dragon3.lua
@@ -1,4 +1,4 @@
-mobs:register_mob("dmobs:dragon3", {
+local dragondef = {
    type = "monster",
    passive = false,
    attacks_monsters = true,
@@ -62,98 +62,16 @@ mobs:register_mob("dmobs:dragon3", {
 	knock_back = 2,
 	do_custom = step_custom,
 	on_rightclick = dmobs.dragon.on_rc
-})
+}
 
-mobs:register_mob("dmobs:dragon_green", {
-   type = "npc",
-   passive = false,
-   attacks_monsters = true,
-   damage = 4,
-   reach = 3,
-   attack_type = "dogshoot",
-   shoot_interval = 2.5,
-	dogshoot_switch = 2,
-	dogshoot_count = 0,
-	dogshoot_count_max =5,
-   arrow = "dmobs:poison",
-   shoot_offset = 1,
-   hp_min = 80,
-   hp_max = 100,
-   armor = 100,
-	collisionbox = {-0.6, -0.9, -0.6, 0.6, 0.6, 0.6},
-   visual = "mesh",
-   mesh = "dragon.b3d",
-   textures = {
-      {"dmobs_dragon3.png"},
-   },
-	child_texture = {
-		{"dmobs_dragon_young.png"}
-	},
-   blood_texture = "mobs_blood.png",
-   visual_size = {x=1.5, y=1.5},
-   makes_footstep_sound = true,
-	runaway = false,
-	jump_chance = 30,
-	walk_chance = 80,
-	fall_speed = 0,
-	follow = {"dmobs:dragon_gem_poison"},
-	pathfinding = true,
-	fall_damage = 0,
-   sounds = {
-      shoot_attack = "mobs_fireball",
-   },
-   walk_velocity = 3,
-   run_velocity = 5,
-   jump = true,
-   fly = true,
-   drops = {
-      {name = "mobs:meat_raw", chance = 1, min = 1, max = 1},
-   },
-   fall_speed = 0,
-   stepheight = 10,
-   water_damage = 2,
-   lava_damage = 0,
-   light_damage = 0,
-   view_range = 20,
-   animation = {
-      speed_normal = 10,
-      speed_run = 20,
-      walk_start = 1,
-      walk_end = 22,
-      stand_start = 1,
-      stand_end = 22,
-      run_start = 1,
-      run_end = 22,
-      punch_start = 22,
-      punch_end = 47,
-   },
-	knock_back = 2,
-	on_rightclick = function(self, clicker)
-	if self.tamed and self.owner == clicker:get_player_name() then
-		local inv = clicker:get_inventory()
-		if self.driver and clicker == self.driver then
-		object_detach(self, clicker, {x=1, y=0, z=1})
-		if inv:room_for_item("main", "mobs:saddle") then
-				inv:add_item("main", "mobs:saddle")
-		else
-				minetest.add_item(clicker.getpos(), "mobs:saddle")
-		end
-		elseif not self.driver then
-		if clicker:get_wielded_item():get_name() == "mobs:saddle" then
-		object_attach(self, clicker, {x=0, y=12, z=4}, {x=0, y=0, z=4})
-		inv:remove_item("main", "mobs:saddle")
-		end
-		end
-		end
-	end,
-	do_custom = function(self, dtime)
-	if self.driver then
-		object_fly(self, dtime, 10, true, "dmobs:poison_plyr", "walk", "stand")
-		if self.state == "attack" then
-		self.state = "idle"
-		end
-		return false
-		end
-		return true
-	end,
-})
+
+mobs:register_mob("dmobs:dragon3", dmobs.deepclone(dragondef) )
+
+dragondef.type = "npc"
+dragondef.attacks_monsters = true
+
+dragondef.on_rightclick = dmobs.dragon.ride
+	
+dragondef.do_custom = dmobs.dragon_do_custom
+
+mobs:register_mob("dmobs:dragon_green", dmobs.deepclone(dragondef) )
diff --git a/dragons/dragon4.lua b/dragons/dragon4.lua
index 8be15e429cd74155fa554301f2d9c887ad0838f6..3d6a1bbe58e36508482650ed99ba6dd83fe1823c 100644
--- a/dragons/dragon4.lua
+++ b/dragons/dragon4.lua
@@ -1,4 +1,4 @@
-mobs:register_mob("dmobs:dragon4", {
+local dragondef = {
    type = "monster",
    passive = false,
    attacks_monsters = true,
@@ -62,98 +62,16 @@ mobs:register_mob("dmobs:dragon4", {
 	knock_back = 2,
 	do_custom = step_custom,
 	on_rightclick = dmobs.dragon.on_rc
-})
+}
 
-mobs:register_mob("dmobs:dragon_blue", {
-   type = "npc",
-   passive = false,
-   attacks_monsters = true,
-   damage = 4,
-   reach = 3,
-   attack_type = "dogshoot",
-   shoot_interval = 2.5,
-	dogshoot_switch = 2,
-	dogshoot_count = 0,
-	dogshoot_count_max =5,
-   arrow = "dmobs:ice",
-   shoot_offset = 1,
-   hp_min = 80,
-   hp_max = 100,
-   armor = 100,
-	collisionbox = {-0.6, -0.9, -0.6, 0.6, 0.6, 0.6},
-   visual = "mesh",
-   mesh = "dragon.b3d",
-   textures = {
-      {"dmobs_dragon4.png"},
-   },
-	child_texture = {
-		{"dmobs_dragon_young.png"}
-	},
-   blood_texture = "mobs_blood.png",
-   visual_size = {x=1.5, y=1.5},
-   makes_footstep_sound = true,
-	runaway = false,
-	jump_chance = 30,
-	walk_chance = 80,
-	fall_speed = 0,
-	follow = {"dmobs:dragon_gem_ice"},
-	pathfinding = true,
-	fall_damage = 0,
-   sounds = {
-      shoot_attack = "mobs_fireball",
-   },
-   walk_velocity = 3,
-   run_velocity = 5,
-   jump = true,
-   fly = true,
-   drops = {
-      {name = "mobs:meat_raw", chance = 1, min = 1, max = 1},
-   },
-   fall_speed = 0,
-   stepheight = 10,
-   water_damage = 2,
-   lava_damage = 0,
-   light_damage = 0,
-   view_range = 20,
-   animation = {
-      speed_normal = 10,
-      speed_run = 20,
-      walk_start = 1,
-      walk_end = 22,
-      stand_start = 1,
-      stand_end = 22,
-      run_start = 1,
-      run_end = 22,
-      punch_start = 22,
-      punch_end = 47,
-   },
-	knock_back = 2,
-	on_rightclick = function(self, clicker)
-	if self.tamed and self.owner == clicker:get_player_name() then
-		local inv = clicker:get_inventory()
-		if self.driver and clicker == self.driver then
-		object_detach(self, clicker, {x=1, y=0, z=1})
-		if inv:room_for_item("main", "mobs:saddle") then
-				inv:add_item("main", "mobs:saddle")
-		else
-				minetest.add_item(clicker.getpos(), "mobs:saddle")
-		end
-		elseif not self.driver then
-		if clicker:get_wielded_item():get_name() == "mobs:saddle" then
-		object_attach(self, clicker, {x=0, y=12, z=4}, {x=0, y=0, z=4})
-		inv:remove_item("main", "mobs:saddle")
-		end
-		end
-		end
-	end,
-	do_custom = function(self, dtime)
-	if self.driver then
-		object_fly(self, dtime, 10, true, "dmobs:ice_plyr", "walk", "stand")
-		if self.state == "attack" then
-		self.state = "idle"
-		end
-		return false
-		end
-		return true
-	end,
-})
+
+mobs:register_mob("dmobs:dragon4", dmobs.deepclone(dragondef) )
+
+dragondef.type = "npc"
+dragondef.attacks_monsters = true
+
+dragondef.on_rightclick = dmobs.dragon.ride
+	
+dragondef.do_custom = dmobs.dragon_do_custom
+
+mobs:register_mob("dmobs:dragon_blue", dmobs.deepclone(dragondef) )
diff --git a/dragons/great_dragon.lua b/dragons/great_dragon.lua
new file mode 100644
index 0000000000000000000000000000000000000000..e9d39dc0e0718b4d5acf9dc58278516282fd865b
--- /dev/null
+++ b/dragons/great_dragon.lua
@@ -0,0 +1,76 @@
+local gdragon_base = {
+	type = "monster",
+	passive = false,
+	attacks_monsters = false,
+	damage = 5,
+	reach = 4,
+	attack_type = "dogshoot",
+	shoot_interval = 2.5,
+	dogshoot_switch = 2,
+	dogshoot_count = 0,
+	dogshoot_count_max =5,
+	arrow = "dmobs:lightning",
+	shoot_offset = 1,
+	hp_min = 140,
+	hp_max = 180,
+	armor = 220,
+	collisionbox = {-0.6, -1.4, -0.6, 0.6, 0.6, 0.6},
+	visual = "mesh",
+	mesh = "dragon.b3d",
+	textures = {
+	  {"dmobs_dragon_great.png"},
+	},
+	blood_texture = "mobs_blood.png",
+	visual_size = {x=2.5, y=2.5},
+	makes_footstep_sound = true,
+	runaway = false,
+	jump_chance = 30,
+	walk_chance = 80,
+	fall_speed = 0,
+	pathfinding = true,
+	fall_damage = 0,
+	sounds = {
+		shoot_attack = "mobs_fireball",
+	  random = "roar",
+	},
+	walk_velocity = 3,
+	run_velocity = 5,
+	jump = true,
+	fly = true,
+	drops = {
+		{name = "dmobs:dragon_egg_great", chance = 1, min = 1, max = 1},
+	},
+	fall_speed = 0,
+	stepheight = 10,
+	water_damage = 2,
+	lava_damage = 0,
+	light_damage = 0,
+	view_range = 20,
+	animation = {
+		speed_normal = 10,
+		speed_run = 20,
+		walk_start = 1,
+		walk_end = 22,
+		stand_start = 1,
+		stand_end = 22,
+		run_start = 1,
+		run_end = 22,
+		punch_start = 22,
+		punch_end = 47,
+	},
+	knock_back = 2,
+}
+
+mobs:register_mob("dmobs:dragon_great", dmobs.deepclone(gdragon_base) )
+
+gdragon_base.type = "npc"
+gdragon_base.attacks_monsters = true
+
+gdragon_base.on_rightclick = dmobs.dragon.ride
+	
+gdragon_base.do_custom = dmobs.dragon_do_custom
+
+mobs:register_mob("dmobs:dragon_great_tame", dmobs.deepclone(gdragon_base) )
+
+
+mobs:register_egg("dmobs:dragon_great", "Boss Dragon", "dmobs_egg1.png", 1)
diff --git a/dragons/main.lua b/dragons/main.lua
index 89f14134add7899c10859b37a7966631a38c8775..6e493e7fc93f1686289a748a65ffa189ae218c49 100644
--- a/dragons/main.lua
+++ b/dragons/main.lua
@@ -15,111 +15,130 @@ end
 
 local tamed_dragons = {}
 
-
-dmobs.dragon.on_rc = function(self, clicker)
-	if not clicker or not clicker:is_player() then
-		return
-	end
-	if mobs:feed_tame(self, clicker, 1, false, false) then
-		return
-	end
+dmobs.dragon.ride = function(self, clicker)
 	if self.tamed and self.owner == clicker:get_player_name() then
 		local inv = clicker:get_inventory()
+		
 		if self.driver and clicker == self.driver then
-			-- detach
-			lib_mount.detach(self, clicker, {x=1, y=0, z=1})
+			object_detach(self, clicker, {x=1, y=0, z=1})
+			
 			if inv:room_for_item("main", "mobs:saddle") then
-				inv:add_item("main", "mobs:saddle")
+					inv:add_item("main", "mobs:saddle")
 			else
-				minetest.add_item(clicker.getpos(), "mobs:saddle")
+					minetest.add_item(clicker.getpos(), "mobs:saddle")
 			end
-			self.object:setacceleration({x=0, y=0, z=0})
+			
 		elseif not self.driver then
-			-- attach
 			if clicker:get_wielded_item():get_name() == "mobs:saddle" then
-				lib_mount.attach(self, clicker, {x=0, y=12, z=4}, {x=0, y=0, z=4})
+				object_attach(self, clicker, {x=0, y=12, z=4}, {x=0, y=0, z=4})
 				inv:remove_item("main", "mobs:saddle")
 			end
 		end
 	end
 end
 
--- eggs from mobs_dragon 
 
-minetest.register_node("dmobs:egg", {
-	description = "Dragon Egg",
-	drawtype = "mesh",
-	mesh = "egg.b3d",
-	tiles = {"dmobs_egg.png"},
-	paramtype = "light",
-	sunlight_propagates = true,
-	is_ground_content = false,
-	groups = {fleshy=3, dig_immediate=3},
-	sounds = default.node_sound_leaves_defaults(),
-	
-	on_rightclick = function(pos, node, clicker, item, _)
-		local wield_item = clicker:get_wielded_item():get_name()
-		if wield_item == "dmobs:dragon_gem" then
+dmobs.dragon.on_rc = function(self, clicker)
+	if not clicker or not clicker:is_player() then
+		return
+	end
+	if mobs:feed_tame(self, clicker, 1, false, false) then
+		return
+	end
+	dmobs.dragon.ride(self,clicker)
+end
+
+dmobs.dragon.do_custom = function(self, dtime)
+	if self.driver then
+		object_fly(self, dtime, 10, true, "dmobs:fire_plyr", "walk", "stand")
 		
-			local p = {x = pos.x, y = pos.y - 1, z = pos.z}
-			local name1
-			for x1 = -1,1 do
-				for z1 = -1,1 do
-					p.x = pos.x + x1
-					p.z = pos.z + z1
-					local name2 = minetest.get_node(p).name
-					if x1 == -1 and z1 == -1 then
-						name1 = minetest.get_node(p).name
-					elseif x1 == 0 and z1 == 0 then
-						if name2 ~= "default:obsidian" then return end
-					else
-						if name2 ~= name1 then return end
-					end
+		if self.state == "attack" then
+			self.state = "idle"
+		end
+		
+		return false
+	end
+	return true
+end
+
+-- eggs from mobs_dragon --------------------------------------------------------------------------
+
+local function egg_transform(pos, node, clicker, item, _)
+	local wield_item = clicker:get_wielded_item():get_name()
+	if wield_item == "dmobs:dragon_gem" then
+	
+		local p = {x = pos.x, y = pos.y - 1, z = pos.z}
+		local corner_name
+		for x1 = -1,1 do
+			for z1 = -1,1 do
+				p.x = pos.x + x1
+				p.z = pos.z + z1
+				local nestfloor_name = minetest.get_node(p).name
+
+				if x1 == -1 and z1 == -1 then
+					corner_name = minetest.get_node(p).name
+
+				elseif x1 == 0 and z1 == 0 then -- special case in centre
+					-- must be obsidian
+					if nestfloor_name ~= "default:obsidian" then return end
+
+				else
+					-- else ring must all be of the same type
+					if nestfloor_name ~= corner_name then return end
 				end
 			end
+		end
+		
+		local dragon_type
+		if corner_name == "default:lava_source" then
+			dragon_type = "fire"
 			
-			local dragon_type
-			if name1 == "default:lava_source" then
-				dragon_type = "fire"
-				
-			elseif name1 == "default:obsidian" then
-				dragon_type = "lightning"
-				
-			elseif name1 == "default:cactus" then
-				dragon_type = "poison"
-			elseif name1 == "default:ice" then
-				dragon_type = "ice"
-			end
-			
-			minetest.chat_send_player(clicker:get_player_name()," ... something's happening .... very... slowly....")
+		elseif corner_name == "default:obsidian" then
+			dragon_type = "lightning"
 			
-			minetest.after(100,
-				function(pos, dragon, pname)
-					minetest.set_node(pos, {name="dmobs:dragon_egg_"..dragon_type})
-				end,
-				pos
-			)
-			
-			item:take_item()
+		elseif corner_name == "default:cactus" then
+			dragon_type = "poison"
+
+		elseif corner_name == "default:ice" then
+			dragon_type = "ice"
 		end
-	end, -- rightclick function
-})
+		
+		minetest.chat_send_player(clicker:get_player_name()," ... something seems to be happening .... come back later?")
+		
+		minetest.after(100,
+			function(pos, dragon, pname)
+				minetest.set_node(pos, {name="dmobs:dragon_egg_"..dragon_type})
+			end,
+			pos
+		)
+		
+		item:take_item()
+	end
+end
 	
 local dragonpairs = {
 	fire = "red",
 	lightning = "black",
 	poison = "green",
 	ice = "black",
+	great = "great",
 }
 
 local function egghatch(pos, node, clicker, item, _)
 	local wield_item = clicker:get_wielded_item():get_name()
-	local eggnode = minetest.get_node(pos)
+	local eggnode = minetest.get_node(pos).name
 	
 	for nature,colour in pairs(dragonpairs) do
-		if wield_item == "dmobs:dragon_gem_"..nature then
+		if ( wield_item == "dmobs:dragon_gem_"..nature and eggnode:find(nature) ) or
+		   ( wield_item == "dmobs:dragon_gem" and eggnode == "dmobs:dragon_egg_great" ) then -- special case... because inconsiderate/inconsistent naming
+		   
+		   	minetest.chat_send_player(clicker:get_player_name(), " ... let the hatching... begin...")
+		   	
 			minetest.after(100,
 				function(pos, dragon, pname)
+					local neweggnode = minetest.get_node(pos).name
+					if eggnode ~= neweggnode then return end -- prevent infinite hatchings
+
 					minetest.remove_node(pos)
 					local ent = minetest.add_entity(pos, "dmobs:dragon_"..colour )
 					minetest.sound_play("dmobs_chirrup",{pos=pos,max_hear_distance=20})
@@ -139,284 +158,42 @@ local function egghatch(pos, node, clicker, item, _)
 	end -- for loop
 end
 
-minetest.register_node("dmobs:dragon_egg_fire", {
-	description = "Dragon Egg",
-	drawtype = "mesh",
-	mesh = "egg.b3d",
-	tiles = {"dmobs_egg1.png"},
-	paramtype = "light",
-	sunlight_propagates = true,
-	is_ground_content = false,
-	groups = {fleshy=3, dig_immediate=3, not_in_creative_inventory=1},
-	sounds = default.node_sound_leaves_defaults(),
-	on_rightclick = egghatch,
-})
-
-minetest.register_node("dmobs:dragon_egg_lightning", {
+local base_egg = { -- base template for all dragon eggs
 	description = "Dragon Egg",
 	drawtype = "mesh",
 	mesh = "egg.b3d",
-	tiles = {"dmobs_egg2.png"},
-	paramtype = "light",
-	sunlight_propagates = true,
-	is_ground_content = false,
-	groups = {fleshy=3, dig_immediate=3, not_in_creative_inventory=1},
-	sounds = default.node_sound_leaves_defaults(),
-	on_rightclick = egghatch,
-})
-
-minetest.register_node("dmobs:dragon_egg_poison", {
-	description = "Dragon Egg",
-	drawtype = "mesh",
-	mesh = "egg.b3d",
-	tiles = {"dmobs_egg3.png"},
-	paramtype = "light",
-	sunlight_propagates = true,
-	is_ground_content = false,
-	groups = {fleshy=3, dig_immediate=3, not_in_creative_inventory=1},
-	sounds = default.node_sound_leaves_defaults(),
-	on_rightclick = egghatch,
-})
-
-minetest.register_node("dmobs:dragon_egg_ice", {
-	description = "Dragon Egg",
-	drawtype = "mesh",
-	mesh = "egg.b3d",
-	tiles = {"dmobs_egg4.png"},
-	paramtype = "light",
-	sunlight_propagates = true,
-	is_ground_content = false,
-	groups = {fleshy=3, dig_immediate=3, not_in_creative_inventory=1},
-	sounds = default.node_sound_leaves_defaults(),
-	on_rightclick = egghatch,
-})
-
-minetest.register_node("dmobs:egg_great", {
-	description = "Great Dragon Egg",
-	drawtype = "mesh",
-	mesh = "egg.b3d",
 	tiles = {"dmobs_egg.png"},
 	paramtype = "light",
 	sunlight_propagates = true,
 	is_ground_content = false,
 	groups = {fleshy=3, dig_immediate=3},
-	sounds = default.node_sound_leaves_defaults(),
-	on_rightclick = function(pos, node, clicker, item, _)
-		local wield_item = clicker:get_wielded_item():get_name()
-		if wield_item == "dmobs:dragon_gem" then
-		minetest.after(100, function(pos, dragon, pname)
-			minetest.remove_node(pos)
-			local ent = minetest.add_entity(pos, "dmobs:dragon_great_tame")
-			local obj = ent:get_luaentity()
-			obj.tamed = true
-			obj.owner = clicker:get_player_name()
-		end, pos, clicker:get_player_name())
-		item:take_item()
-	end
-	end
-})
+	sounds = default.node_sound_leaves_defaults(),	
+	on_rightclick = egg_transform,
+}
 
 
---saddle license
-
--- **mobs_saddle.png**
--- -------------------
--- The MIT License (MIT)
-
--- Copyright (c) 2014 Krupnov Pavel
-
--- Permission is hereby granted, free of charge, to any person obtaining a copy
--- of this software and associated documentation files (the "Software"), to deal
--- in the Software without restriction, including without limitation the rights
--- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
--- copies of the Software, and to permit persons to whom the Software is
--- furnished to do so, subject to the following conditions:
-
--- The above copyright notice and this permission notice shall be included in
--- all copies or substantial portions of the Software.
-
--- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
--- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
--- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
--- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
--- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
--- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
--- THE SOFTWARE.
-
-
--- saddle (if not already available)
-if not minetest.get_modpath("mobs_horse") then
-	minetest.register_craftitem(":mobs:saddle", {
-		description = "Saddle",
-		inventory_image = "mobs_saddle.png"
-	})
-
-	minetest.register_craft({
-		output = "mobs:saddle",
-		recipe = {
-			{"mobs:leather", "mobs:leather", "mobs:leather"},
-			{"mobs:leather", "default:steel_ingot", "mobs:leather"},
-			{"mobs:leather", "default:steel_ingot", "mobs:leather"}
-		}
-	})
-end
+minetest.register_node("dmobs:egg", dmobs.deepclone(base_egg) ) -- clone, to not affect the base template
 
---arrows
-
-
-
---function to register tamed dragon attacks
-
-function dmobs.register_fire(fname, texture, dmg, replace_node, explode, ice, variance, size)
-minetest.register_entity(fname, {
-	textures = {texture},
-	velocity = 0.1,
-	damage = dmg,
-	collisionbox = {0, 0, 0, 0, 0, 0},
-	on_step = function(self, obj, pos)		
-		local remove = minetest.after(2, function() 
-		self.object:remove()
-		end)
-		local pos = self.object:getpos()
-		local objs = minetest.get_objects_inside_radius({x=pos.x,y=pos.y,z=pos.z}, 2)	
-			for k, obj in pairs(objs) do
-				if obj:get_luaentity() ~= nil then
-					if obj:get_luaentity().name ~= fname and obj:get_luaentity().name ~= "dmobs:dragon_red" and obj:get_luaentity().name ~= "dmobs:dragon_blue" and obj:get_luaentity().name ~= "dmobs:dragon_black" and obj:get_luaentity().name ~= "dmobs:dragon_green" and obj:get_luaentity().name ~= "dmobs:dragon_great_tame" and obj:get_luaentity().name ~= "__builtin:item" then
-						obj:punch(self.launcher, 1.0, {
-							full_punch_interval=1.0,
-							damage_groups={fleshy=3},
-						}, nil)
-					self.object:remove()
-					end
-				end
-			end
-			for dx=0,1 do
-						for dy=0,1 do
-							for dz=0,1 do
-								local p = {x=pos.x+dx, y=pos.y, z=pos.z+dz}
-								local t = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz}
-								local n = minetest.env:get_node(p).name
-								if n ~= fname and n ~="default:dirt_with_grass" and n ~="default:dirt_with_dry_grass" and n ~="default:stone"  then	
-									if minetest.registered_nodes[n].groups.flammable --[[or math.random(1, 100) <= 1]] then
-										minetest.env:set_node(t, {name=replace_node})
-									self.object:remove()
-									return
-									end
-									if ice and n == "default:water_source" then
-									minetest.env:set_node(t, {name="default:ice"})
-									self.object:remove()
-									end
-								end
-							end
-						end
-					end
-		local apos = self.object:getpos()
-		local part = minetest.add_particlespawner(
-			6, --amount
-			0.3, --time
-			{x=apos.x-variance, y=apos.y-variance, z=apos.z-variance}, --minpos
-			{x=apos.x+variance, y=apos.y+variance, z=apos.z+variance}, --maxpos
-			{x=-0, y=-0, z=-0}, --minvel
-			{x=0, y=0, z=0}, --maxvel
-			{x=variance,y=-0.5-variance,z=variance}, --minacc
-			{x=0.5+variance,y=0.5+variance,z=0.5+variance}, --maxacc
-			0.1, --minexptime
-			0.3, --maxexptime
-			size, --minsize
-			size+2, --maxsize
-			false, --collisiondetection
-			texture --texture
-		)
-		
-	end,
-})
-end
+base_egg.groups.not_in_creative_inventory=1
+base_egg.on_rightclick = egghatch
 
-dmobs.register_fire("dmobs:fire_plyr", "dmobs_fire.png", 2, "fire:basic_flame", true, false, 0.3, 1)
-dmobs.register_fire("dmobs:ice_plyr", "dmobs_ice.png", 2, "default:ice", false, true, 0.5, 10)
-dmobs.register_fire("dmobs:poison_plyr", "dmobs_poison.png", 2, "air", false, false, 0.3, 1)
-dmobs.register_fire("dmobs:lightning_plyr", "dmobs_lightning.png", 2, "air", true, false, 0, 0.5)
+base_egg.tiles = {"dmobs_egg1.png"}
+minetest.register_node("dmobs:dragon_egg_fire", dmobs.deepclone(base_egg) )
 
+base_egg.tiles = {"dmobs_egg2.png"}
+minetest.register_node("dmobs:dragon_egg_lightning", dmobs.deepclone(base_egg) )
 
+base_egg.tiles = {"dmobs_egg3.png"}
+minetest.register_node("dmobs:dragon_egg_poison", dmobs.deepclone(base_egg) )
 
-mobs:register_arrow("dmobs:ice", {
-   visual = "sprite",
-   visual_size = {x = 0.5, y = 0.5},
-   textures = {"dmobs_ice.png"},
-   velocity = 8,
-   tail = 1, -- enable tail
-   tail_texture = "dmobs_ice.png",
+base_egg.tiles = {"dmobs_egg4.png"}
+minetest.register_node("dmobs:dragon_egg_ice", dmobs.deepclone(base_egg) )
 
-   hit_player = function(self, player)
-      player:punch(self.object, 1.0, {
-         full_punch_interval = 1.0,
-         damage_groups = {fleshy = 8},
-      }, nil)
-   end,
-   
-   hit_mob = function(self, player)
-      player:punch(self.object, 1.0, {
-         full_punch_interval = 1.0,
-         damage_groups = {fleshy = 8},
-      }, nil)
-   end,
-
-   hit_node = function(self, pos, node)
-      self.object:remove()
-   end,
-})
-
-mobs:register_arrow("dmobs:lightning", {
-   visual = "sprite",
-   visual_size = {x = 0.5, y = 0.5},
-   textures = {"dmobs_lightning.png"},
-   velocity = 8,
-   tail = 1, -- enable tail
-   tail_texture = "dmobs_lightning.png",
-
-   hit_player = function(self, player)
-      player:punch(self.object, 1.0, {
-         full_punch_interval = 1.0,
-         damage_groups = {fleshy = 8},
-      }, nil)
-   end,
-   
-   hit_mob = function(self, player)
-      player:punch(self.object, 1.0, {
-         full_punch_interval = 1.0,
-         damage_groups = {fleshy = 8},
-      }, nil)
-   end,
-
-   hit_node = node_hit,
-})
-
-mobs:register_arrow("dmobs:poison", {
-   visual = "sprite",
-   visual_size = {x = 0.5, y = 0.5},
-   textures = {"dmobs_poison.png"},
-   velocity = 8,
-   tail = 1, -- enable tail
-   tail_texture = "dmobs_poison.png",
-
-   hit_player = function(self, player)
-      player:punch(self.object, 1.0, {
-         full_punch_interval = 1.0,
-         damage_groups = {fleshy = 8},
-      }, nil)
-   end,
-   
-   hit_mob = function(self, player)
-      player:punch(self.object, 1.0, {
-         full_punch_interval = 1.0,
-         damage_groups = {fleshy = 8},
-      }, nil)
-   end,
-
-   hit_node = function(self, pos, node)
-      self.object:remove()
-   end,
-})
+base_egg.groups.not_in_creative_inventory=nil
+--base_egg.tiles = {"dmobs_dragon_egg_great.png"}
+base_egg.tiles = {"dmobs_fire.png"}
+base_egg.description = "Great Dragon Egg"
+minetest.register_node("dmobs:dragon_egg_great", dmobs.deepclone(base_egg) )
 
 
 --items and tools
@@ -451,10 +228,6 @@ minetest.register_craftitem("dmobs:dragon_gem", {
 -- mobs:spawn_specific("dmobs:dragon3", {"air"}, {"default:stone"}, 20, 10, 300, 15000, 2, -100, 11000)
 -- mobs:spawn_specific("dmobs:dragon4", {"air"}, {"default:stone"}, 20, 10, 300, 15000, 2, -100, 11000)
 
-mobs:register_spawn("dmobs:dragon", {"default:leaves","default:dirt_with_grass"}, 20, 10, 64000, 2, 31000)
-mobs:register_spawn("dmobs:dragon2", {"default:pine_needles"}, 20, 10, 64000, 2, 31000)
-mobs:register_spawn("dmobs:dragon3", {"default:acacia_leaves","default:dirt_with_dry_grass"}, 20, 10, 64000, 2, 31000)
-mobs:register_spawn("dmobs:dragon4", {"default:jungleleaves"}, 20, 10, 64000, 2, 31000)
    
 mobs:register_egg("dmobs:dragon", "Wild Fire Dragon", "default_apple.png", 1)
 mobs:register_egg("dmobs:dragon2", "Wild Lightning Dragon", "default_mese_crystal.png", 1)
@@ -466,363 +239,3 @@ mobs:register_egg("dmobs:dragon_black", "Tame Lightning Dragon", "default_mese_c
 mobs:register_egg("dmobs:dragon_green", "Tame Poison Dragon", "dmobs_poison.png", 1)
 mobs:register_egg("dmobs:dragon_blue", "Tame Ice Dragon", "default_ice.png", 1)
 
-
---other dragons
-
-mobs:register_mob("dmobs:waterdragon", {
-	type = "monster",
-	passive = false,
-	attack_type = "dogshoot",
-	dogshoot_switch = 2,
-	dogshoot_count = 0,
-	dogshoot_count_max =5,
-	shoot_interval = 2.5,
-	arrow = "dmobs:ice",
-	shoot_offset = 0,
-	pathfinding = false,
-	reach = 5,
-	damage = 2,
-	hp_min = 100,
-	hp_max = 127,
-	armor = 100,
-	collisionbox = {-0.4, -0.5, -0.4, 0.4, 5, 0.4},
-	visual_size = {x=4, y=4},
-	visual = "mesh",
-	mesh = "water_dragon.b3d",
-	textures = {
-		{"dmobs_waterdragon.png"},
-	},
-	blood_texture = "mobs_blood.png",
-	makes_footstep_sound = true,
-	sounds = {
-		random = "mobs_dirtmonster",
-	},
-	view_range = 15,
-	rotate = 180,
-	walk_velocity = 0.01,
-	run_velocity = 0.01,
-	jump = false,
-	drops = {
-		{name = "dmobs:dragon_gem_ice", chance = 1, min = 1, max = 1},
-		{name = "dmobs:dragon_gem_fire", chance = 1, min = 1, max = 1},
-	},
-	water_damage = 0,
-	lava_damage = 5,
-	light_damage = 0,
-	floats = 0,
-	animation = {
-		speed_normal = 15,
-		speed_run = 15,
-		stand_start = 1,
-		stand_end = 20,
-		walk_start = 1,
-		walk_end = 20,
-		run_start = 1,
-		run_end = 20,
-		punch_start = 40,
-		punch_end = 60,
-		shoot_start = 20,
-		shoot_end = 40,
-	},
-	do_custom = function(self)
-	--follow thanks to TenPlus1 and Byakuren
-            if not self.hydra then
-                self.hydra = true -- flip switch so this part is done only once
-
-                -- get head position and define a few temp variables
-                local pos = self.object:getpos()
-                local obj, obj2, ent
-
-                -- add body and make it follow head
-                obj = minetest.add_entity({x=pos.x+1, y=pos.y, z=pos.z}, "dmobs:waterdragon_2")
-                ent = obj:get_luaentity()
-                ent.following = self.object
-
-                -- add body and make it follow previous body segment
-                obj2 = minetest.add_entity({x=pos.x-1, y=pos.y, z=pos.z}, "dmobs:waterdragon_2")
-                ent = obj2:get_luaentity()
-                ent.following = self.object
-            end
-    end,
-})
-
-mobs:register_mob("dmobs:waterdragon_2", {
-	type = "monster",
-	passive = false,
-	attack_type = "shoot",
-	dogshoot_switch = 2,
-	dogshoot_count = 0,
-	dogshoot_count_max =5,
-	shoot_interval = 3,
-	arrow = "dmobs:ice",
-	shoot_offset = 0,
-	pathfinding = false,
-	reach = 5,
-	damage = 2,
-	hp_min = 50,
-	hp_max = 60,
-	armor = 50,
-	collisionbox = {-0.4, -0.2, -0.4, 0.4, 5, 0.4},
-	visual_size = {x=3, y=3},
-	visual = "mesh",
-	mesh = "water_dragon.b3d",
-	textures = {
-		{"dmobs_waterdragon.png"},
-	},
-	blood_texture = "mobs_blood.png",
-	makes_footstep_sound = true,
-   sounds = {
-	  shoot_attack = "mobs_fireball",
-	  random = "velociraptor",
-   },
-	view_range = 15,
-	rotate = 180,
-	floats = 0,
-	walk_velocity = 0.01,
-	run_velocity = 0.01,
-	jump = false,
-	water_damage = 0,
-	lava_damage = 5,
-	light_damage = 0,
-	animation = {
-		speed_normal = 15,
-		speed_run = 15,
-		stand_start = 1,
-		stand_end = 20,
-		walk_start = 1,
-		walk_end = 20,
-		run_start = 1,
-		run_end = 20,
-		punch_start = 40,
-		punch_end = 60,
-		shoot_start = 20,
-		shoot_end = 40,
-	},
-})
-
-mobs:register_spawn("dmobs:waterdragon", {"default:water_source"}, 20, 10, 32000, 1, 31000, false)
-
-mobs:register_egg("dmobs:waterdragon", "Boss Waterdragon", "dmobs_egg4.png", 1)
-
-mobs:register_mob("dmobs:wyvern", {
-   type = "monster",
-   passive = false,
-   attacks_monsters = false,
-   damage = 4,
-   reach = 3,
-   attack_type = "dogshoot",
-   shoot_interval = 2.5,
-	dogshoot_switch = 2,
-	dogshoot_count = 0,
-	dogshoot_count_max =5,
-   arrow = "dmobs:poison",
-   shoot_offset = 0.5,
-   hp_min = 100,
-   hp_max = 150,
-   armor = 100,
-	collisionbox = {-0.6, -1.4, -0.6, 0.6, 0.6, 0.6},
-   visual = "mesh",
-   mesh = "wyvern.b3d",
-   textures = {
-      {"dmobs_wyvern.png"},
-   },
-   blood_texture = "mobs_blood.png",
-   visual_size = {x=1, y=1},
-   makes_footstep_sound = true,
-	runaway = true,
-	jump_chance = 30,
-	walk_chance = 80,
-	pathfinding = true,
-   walk_velocity = 3,
-   run_velocity = 5,
-   fall_speed = -2,
-   jump = true,
-   fly = false,
-   drops = {
-      {name = "dmobs:dragon_gem_poison", chance = 1, min = 1, max = 1},
-	  {name = "dmobs:dragon_gem_lightning", chance = 1, min = 1, max = 1},
-   },
-   sounds = {
-	  shoot_attack = "mobs_fireball",
-	  random = "velociraptor",
-   },
-   water_damage = 0,
-   lava_damage = 2,
-   light_damage = 0,
-   view_range = 20,
-   animation = {
-      speed_normal = 20,
-      speed_run = 30,
-      walk_start = 33,
-      walk_end = 68,
-      stand_start = 1,
-      stand_end = 30,
-      run_start = 33,
-      run_end = 68,
-      punch_start = 70,
-      punch_end = 89,
-   },
-	knock_back = 2,
-})
-
-mobs:register_spawn("dmobs:wyvern",	{"default:leaves"}, 20, 10, 32000, 1, 31000, false)
-
-mobs:register_egg("dmobs:wyvern", "Boss Wyvern", "dmobs_egg3.png", 1)
-
-mobs:register_mob("dmobs:dragon_great", {
-   type = "monster",
-   passive = false,
-   attacks_monsters = false,
-   damage = 5,
-   reach = 4,
-   attack_type = "dogshoot",
-   shoot_interval = 2.5,
-	dogshoot_switch = 2,
-	dogshoot_count = 0,
-	dogshoot_count_max =5,
-   arrow = "dmobs:lightning",
-   shoot_offset = 1,
-   hp_min = 140,
-   hp_max = 180,
-   armor = 220,
-	collisionbox = {-0.6, -1.4, -0.6, 0.6, 0.6, 0.6},
-   visual = "mesh",
-   mesh = "dragon.b3d",
-   textures = {
-	  {"dmobs_dragon_great.png"},
-   },
-   blood_texture = "mobs_blood.png",
-   visual_size = {x=2.5, y=2.5},
-   makes_footstep_sound = true,
-	runaway = false,
-	jump_chance = 30,
-	walk_chance = 80,
-	fall_speed = 0,
-	pathfinding = true,
-	fall_damage = 0,
-   sounds = {
-      shoot_attack = "mobs_fireball",
-	  random = "roar",
-   },
-   walk_velocity = 3,
-   run_velocity = 5,
-   jump = true,
-   fly = true,
-   drops = {
-      {name = "dmobs:egg_great", chance = 1, min = 1, max = 1},
-   },
-   fall_speed = 0,
-   stepheight = 10,
-   water_damage = 2,
-   lava_damage = 0,
-   light_damage = 0,
-   view_range = 20,
-   animation = {
-      speed_normal = 10,
-      speed_run = 20,
-      walk_start = 1,
-      walk_end = 22,
-      stand_start = 1,
-      stand_end = 22,
-      run_start = 1,
-      run_end = 22,
-      punch_start = 22,
-      punch_end = 47,
-   },
-	knock_back = 2,
-})
-
-mobs:register_mob("dmobs:dragon_great_tame", {
-   type = "npc",
-   passive = false,
-   attacks_monsters = true,
-   damage = 5,
-   reach = 4,
-   attack_type = "dogshoot",
-   shoot_interval = 2.5,
-	dogshoot_switch = 2,
-	dogshoot_count = 0,
-	dogshoot_count_max =5,
-   arrow = "dmobs:lightning",
-   shoot_offset = 1,
-   hp_min = 140,
-   hp_max = 180,
-   armor = 220,
-	collisionbox = {-0.6, -1.4, -0.6, 0.6, 0.6, 0.6},
-   visual = "mesh",
-   mesh = "dragon.b3d",
-   textures = {
-	  {"dmobs_dragon_great.png"},
-   },
-   blood_texture = "mobs_blood.png",
-   visual_size = {x=2.5, y=2.5},
-   makes_footstep_sound = true,
-	runaway = false,
-	jump_chance = 30,
-	walk_chance = 80,
-	fall_speed = 0,
-	pathfinding = true,
-	fall_damage = 0,
-   sounds = {
-      shoot_attack = "mobs_fireball",
-	  random = "roar",
-   },
-   walk_velocity = 3,
-   run_velocity = 5,
-   jump = true,
-   fly = true,
-   drops = {
-      {name = "dmobs:egg_great", chance = 1, min = 1, max = 1},
-   },
-   fall_speed = 0,
-   stepheight = 10,
-   water_damage = 2,
-   lava_damage = 0,
-   light_damage = 0,
-   view_range = 20,
-   animation = {
-      speed_normal = 10,
-      speed_run = 20,
-      walk_start = 1,
-      walk_end = 22,
-      stand_start = 1,
-      stand_end = 22,
-      run_start = 1,
-      run_end = 22,
-      punch_start = 22,
-      punch_end = 47,
-   },
-	knock_back = 2,
-	on_rightclick = function(self, clicker)
-	if self.tamed and self.owner == clicker:get_player_name() then
-		local inv = clicker:get_inventory()
-		if self.driver and clicker == self.driver then
-		object_detach(self, clicker, {x=1, y=0, z=1})
-		if inv:room_for_item("main", "mobs:saddle") then
-				inv:add_item("main", "mobs:saddle")
-		else
-				minetest.add_item(clicker.getpos(), "mobs:saddle")
-		end
-		elseif not self.driver then
-		if clicker:get_wielded_item():get_name() == "mobs:saddle" then
-		object_attach(self, clicker, {x=0, y=12, z=4}, {x=0, y=0, z=4})
-		inv:remove_item("main", "mobs:saddle")
-		end
-		end
-		end
-	end,
-	do_custom = function(self, dtime)
-	if self.driver then
-		object_fly(self, dtime, 10, true, "dmobs:fire_plyr", "walk", "stand")
-		if self.state == "attack" then
-		self.state = "idle"
-		end
-		return false
-		end
-		return true
-	end,
-})
-
-mobs:register_spawn("dmobs:dragon_great", {"default:lava_source"}, 20, 0, 64000, -21000, 1000, false)
-
-mobs:register_egg("dmobs:dragon_great", "Boss Dragon", "dmobs_egg1.png", 1)
diff --git a/dragons/water_dragon.lua b/dragons/water_dragon.lua
new file mode 100644
index 0000000000000000000000000000000000000000..fcb984375864a4b47ddad8f9b5e8f3ecf8110e0f
--- /dev/null
+++ b/dragons/water_dragon.lua
@@ -0,0 +1,135 @@
+mobs:register_mob("dmobs:waterdragon", {
+	type = "monster",
+	passive = false,
+	attack_type = "dogshoot",
+	dogshoot_switch = 2,
+	dogshoot_count = 0,
+	dogshoot_count_max =5,
+	shoot_interval = 2.5,
+	arrow = "dmobs:ice",
+	shoot_offset = 0,
+	pathfinding = false,
+	reach = 5,
+	damage = 2,
+	hp_min = 100,
+	hp_max = 127,
+	armor = 100,
+	collisionbox = {-0.4, -0.5, -0.4, 0.4, 5, 0.4},
+	visual_size = {x=4, y=4},
+	visual = "mesh",
+	mesh = "water_dragon.b3d",
+	textures = {
+		{"dmobs_waterdragon.png"},
+	},
+	blood_texture = "mobs_blood.png",
+	makes_footstep_sound = true,
+	sounds = {
+		random = "mobs_dirtmonster",
+	},
+	view_range = 15,
+	rotate = 180,
+	walk_velocity = 0.01,
+	run_velocity = 0.01,
+	jump = false,
+	drops = {
+		{name = "dmobs:dragon_gem_ice", chance = 1, min = 1, max = 1},
+		{name = "dmobs:dragon_gem_fire", chance = 1, min = 1, max = 1},
+	},
+	water_damage = 0,
+	lava_damage = 5,
+	light_damage = 0,
+	floats = 0,
+	animation = {
+		speed_normal = 15,
+		speed_run = 15,
+		stand_start = 1,
+		stand_end = 20,
+		walk_start = 1,
+		walk_end = 20,
+		run_start = 1,
+		run_end = 20,
+		punch_start = 40,
+		punch_end = 60,
+		shoot_start = 20,
+		shoot_end = 40,
+	},
+	do_custom = function(self)
+	--follow thanks to TenPlus1 and Byakuren
+            if not self.hydra then
+                self.hydra = true -- flip switch so this part is done only once
+
+                -- get head position and define a few temp variables
+                local pos = self.object:getpos()
+                local obj, obj2, ent
+
+                -- add body and make it follow head
+                obj = minetest.add_entity({x=pos.x+1, y=pos.y, z=pos.z}, "dmobs:waterdragon_2")
+                ent = obj:get_luaentity()
+                ent.following = self.object
+
+                -- add body and make it follow previous body segment
+                obj2 = minetest.add_entity({x=pos.x-1, y=pos.y, z=pos.z}, "dmobs:waterdragon_2")
+                ent = obj2:get_luaentity()
+                ent.following = self.object
+            end
+    end,
+})
+
+
+
+mobs:register_mob("dmobs:waterdragon_2", {
+	type = "monster",
+	passive = false,
+	attack_type = "shoot",
+	dogshoot_switch = 2,
+	dogshoot_count = 0,
+	dogshoot_count_max =5,
+	shoot_interval = 3,
+	arrow = "dmobs:ice",
+	shoot_offset = 0,
+	pathfinding = false,
+	reach = 5,
+	damage = 2,
+	hp_min = 50,
+	hp_max = 60,
+	armor = 50,
+	collisionbox = {-0.4, -0.2, -0.4, 0.4, 5, 0.4},
+	visual_size = {x=3, y=3},
+	visual = "mesh",
+	mesh = "water_dragon.b3d",
+	textures = {
+		{"dmobs_waterdragon.png"},
+	},
+	blood_texture = "mobs_blood.png",
+	makes_footstep_sound = true,
+   sounds = {
+	  shoot_attack = "mobs_fireball",
+	  random = "velociraptor",
+   },
+	view_range = 15,
+	rotate = 180,
+	floats = 0,
+	walk_velocity = 0.01,
+	run_velocity = 0.01,
+	jump = false,
+	water_damage = 0,
+	lava_damage = 5,
+	light_damage = 0,
+	animation = {
+		speed_normal = 15,
+		speed_run = 15,
+		stand_start = 1,
+		stand_end = 20,
+		walk_start = 1,
+		walk_end = 20,
+		run_start = 1,
+		run_end = 20,
+		punch_start = 40,
+		punch_end = 60,
+		shoot_start = 20,
+		shoot_end = 40,
+	},
+})
+
+
+mobs:register_egg("dmobs:waterdragon", "Boss Waterdragon", "dmobs_egg4.png", 1)
diff --git a/dragons/wyvern.lua b/dragons/wyvern.lua
new file mode 100644
index 0000000000000000000000000000000000000000..773b5508fa4194b488892505e6909b6de0e8dbec
--- /dev/null
+++ b/dragons/wyvern.lua
@@ -0,0 +1,63 @@
+mobs:register_mob("dmobs:wyvern", {
+   type = "monster",
+   passive = false,
+   attacks_monsters = false,
+   damage = 4,
+   reach = 3,
+   attack_type = "dogshoot",
+   shoot_interval = 2.5,
+	dogshoot_switch = 2,
+	dogshoot_count = 0,
+	dogshoot_count_max =5,
+   arrow = "dmobs:poison",
+   shoot_offset = 0.5,
+   hp_min = 100,
+   hp_max = 150,
+   armor = 100,
+	collisionbox = {-0.6, -1.4, -0.6, 0.6, 0.6, 0.6},
+   visual = "mesh",
+   mesh = "wyvern.b3d",
+   textures = {
+      {"dmobs_wyvern.png"},
+   },
+   blood_texture = "mobs_blood.png",
+   visual_size = {x=1, y=1},
+   makes_footstep_sound = true,
+	runaway = true,
+	jump_chance = 30,
+	walk_chance = 80,
+	pathfinding = true,
+   walk_velocity = 3,
+   run_velocity = 5,
+   fall_speed = -2,
+   jump = true,
+   fly = false,
+   drops = {
+      {name = "dmobs:dragon_gem_poison", chance = 1, min = 1, max = 1},
+	  {name = "dmobs:dragon_gem_lightning", chance = 1, min = 1, max = 1},
+   },
+   sounds = {
+	  shoot_attack = "mobs_fireball",
+	  random = "velociraptor",
+   },
+   water_damage = 0,
+   lava_damage = 2,
+   light_damage = 0,
+   view_range = 20,
+   animation = {
+      speed_normal = 20,
+      speed_run = 30,
+      walk_start = 33,
+      walk_end = 68,
+      stand_start = 1,
+      stand_end = 30,
+      run_start = 33,
+      run_end = 68,
+      punch_start = 70,
+      punch_end = 89,
+   },
+	knock_back = 2,
+})
+
+
+mobs:register_egg("dmobs:wyvern", "Boss Wyvern", "dmobs_egg3.png", 1)
diff --git a/init.lua b/init.lua
index d8d99347005e18cee4de65d5cca9b98fe34d24b7..71a4bef06e062bccb715d8444633a733294cbd76 100644
--- a/init.lua
+++ b/init.lua
@@ -7,15 +7,28 @@ dmobs = {}
 dofile(minetest.get_modpath("dmobs").."/api.lua")
 
 -- Enable dragons (disable to remove tamed dragons and dragon bosses)
-dmobs.dragons = minetest.setting_get_bool("dmobs.dragons") or true
+dmobs.dragons = minetest.setting_getbool("dmobs.dragons") or true
 
 -- Enable fireballs/explosions
-dmobs.destructive = minetest.setting_get_bool("dmobs.destructive") or false
-
+dmobs.destructive = minetest.setting_getbool("dmobs.destructive") or false
+
+-- Table cloning to reduce code repetition
+dmobs.deepclone = function(t) -- deep-copy a table -- from https://gist.github.com/MihailJP/3931841
+	if type(t) ~= "table" then return t end
+
+	local target = {}
+
+	for k, v in pairs(t) do
+		if k ~= "__index" and type(v) == "table" then -- omit circular reference
+			target[k] = dmobs.deepclone(v)
+		else
+			target[k] = v
+		end
+	end
+	return target
+end
 
-dofile(minetest.get_modpath("dmobs").."/nodes.lua")
-
-dofile(minetest.get_modpath("dmobs").."/arrows/sting.lua")
+-- Start loading ----------------------------------------------------------------------------------
 
 local function loadmob(mobname,dir)
 	dir = dir or "/mobs/"
@@ -56,14 +69,7 @@ end
 
 -- dragons!!
 
-
-if dmobs.destructive == true then
-	dofile(minetest.get_modpath("dmobs").."/arrows/fire_explosive.lua")
-else
-	dofile(minetest.get_modpath("dmobs").."/arrows/fire.lua")
-end
-
-if dmobs.dragons then
+if not dmobs.dragons then
 	loadmob("dragon_normal","/dragons/")
 else
 	loadmob("main","/dragons/")
@@ -71,4 +77,25 @@ else
 	loadmob("dragon2","/dragons/")
 	loadmob("dragon3","/dragons/")
 	loadmob("dragon4","/dragons/")
+	loadmob("water_dragon","/dragons/")
+	loadmob("wyvern","/dragons/")
+	dofile(minetest.get_modpath("dmobs").."/arrows/dragonfire.lua")
+	dofile(minetest.get_modpath("dmobs").."/arrows/dragonarrows.lua")
 end
+
+-- Arrow definitions
+
+if dmobs.destructive == true then
+	dofile(minetest.get_modpath("dmobs").."/arrows/fire_explosive.lua")
+else
+	dofile(minetest.get_modpath("dmobs").."/arrows/fire.lua")
+end
+
+dofile(minetest.get_modpath("dmobs").."/nodes.lua")
+dofile(minetest.get_modpath("dmobs").."/arrows/sting.lua")
+
+-- Spawning
+
+
+dofile(minetest.get_modpath("dmobs").."/spawn.lua")
+dofile(minetest.get_modpath("dmobs").."/saddle.lua")
diff --git a/mobs/badger.lua b/mobs/badger.lua
index 7abc9cff0557f95ca5fcbf46bbb76017a56909aa..e0d524dc1998f058f2a0049d5a3f6ada38454712 100644
--- a/mobs/badger.lua
+++ b/mobs/badger.lua
@@ -53,6 +53,5 @@ mobs:register_mob("dmobs:badger", {
 	end,
 })
 
-mobs:register_spawn("dmobs:badger", {"default:dirt_with_grass","default:dirt"}, 20, 10, 15000, 2, 31000)
 
 mobs:register_egg("dmobs:badger", "Badger", "default_obsidian.png", 1)
diff --git a/mobs/elephant.lua b/mobs/elephant.lua
index fb7e6d3bf0f63b63fe34681e68e41f4c0a9ad5c4..5dd7a08050c6b376a55b5c4caa94225a6f69e716 100644
--- a/mobs/elephant.lua
+++ b/mobs/elephant.lua
@@ -54,6 +54,5 @@ mobs:register_mob("dmobs:elephant", {
 	end,
 })
 
-mobs:register_spawn("dmobs:elephant", {"default:dirt_with_dry_grass","default:desert_sand"}, 20, 10, 15000, 2, 31000)
 
 mobs:register_egg("dmobs:elephant", "Elephant", "default_dry_grass.png", 1)
diff --git a/mobs/fox.lua b/mobs/fox.lua
index 21236b89029545c5f4f597a3d2f65403705f19fd..9661f9824a6401e2bc294413565e352da55f32f8 100644
--- a/mobs/fox.lua
+++ b/mobs/fox.lua
@@ -62,6 +62,5 @@ mobs:register_mob("dmobs:fox", {
 	end,
 })
 
-mobs:register_spawn("dmobs:fox", {"default:dirt_with_grass","default:dirt"}, 20, 10, 32000, 2, 31000)
 
 mobs:register_egg("dmobs:fox", "Fox", "wool_orange.png", 1)
diff --git a/mobs/gnorm.lua b/mobs/gnorm.lua
index 793b964a9ee913a1f0b31da7bbdd12ae34ed686b..ff6ab0e78501268bf96db2a0d415c20822b1e09c 100644
--- a/mobs/gnorm.lua
+++ b/mobs/gnorm.lua
@@ -55,6 +55,5 @@ mobs:register_mob("dmobs:gnorm", {
 	end,
 })
 
-mobs:register_spawn("dmobs:gnorm", {"default:dirt_with_grass","default:wood"}, 20, 10, 32000, 2, 31000)
 
 mobs:register_egg("dmobs:gnorm", "Gnorm", "default_dirt.png", 1)
diff --git a/mobs/golem.lua b/mobs/golem.lua
index 63d5ef1b2a8612c6875079d01ac1e9fba48f91a9..d3242f6f37d5ae7c8438fbe698e6fd8cd7ebee0e 100644
--- a/mobs/golem.lua
+++ b/mobs/golem.lua
@@ -44,6 +44,5 @@ mobs:register_mob("dmobs:golem", {
 	},
 })
 
-mobs:register_spawn("dmobs:golem", {"default:stone"}, 7, 0, 16000, 2, 31000)
 
 mobs:register_egg("dmobs:golem", "Stone Golem", "default_stone.png", 1)
diff --git a/mobs/hedgehog.lua b/mobs/hedgehog.lua
index c5b6dbfa3ab06e49aa5a43804db628e058165a66..81572cc55d3dba9451a0e246f8a2d5ae5cb62e1c 100644
--- a/mobs/hedgehog.lua
+++ b/mobs/hedgehog.lua
@@ -46,6 +46,5 @@ mobs:register_mob("dmobs:hedgehog", {
 	end,
 })
 
-mobs:register_spawn("dmobs:hedgehog", {"default:dirt_with_grass","default:pine_needles"}, 20, 10, 15000, 2, 31000)
 
 mobs:register_egg("dmobs:hedgehog", "Hedgehog", "wool_brown.png", 1)
diff --git a/mobs/nyan.lua b/mobs/nyan.lua
index e8b88e06525b8fe1dc9039af6609a55657245810..d680d94f21265abbf12826bb56154bc0b841df63 100644
--- a/mobs/nyan.lua
+++ b/mobs/nyan.lua
@@ -73,7 +73,5 @@ mobs:register_mob("dmobs:nyan", {
 	end,
 })
 
-mobs:register_spawn("dmobs:nyan", {"default:pine_needles","default:leaves"}, 20, 10, 50000, 2, 31000)
-mobs:register_spawn("dmobs:nyan", {"nyanland:meseleaves"}, 20, 10, 15000, 2, 31000)
 
 mobs:register_egg("dmobs:nyan", "Nyan Cat", "wool_pink.png", 1)
diff --git a/mobs/ogre.lua b/mobs/ogre.lua
index 615bf3b233fff713f7929a5fd7ab739c111789cf..c5044a40c0bb023256f1cab4aafc156f2b824407 100644
--- a/mobs/ogre.lua
+++ b/mobs/ogre.lua
@@ -46,10 +46,4 @@ mobs:register_mob("dmobs:ogre", {
 	},
 })
 
-if not dmobs.dragons == true then
-	mobs:register_spawn("dmobs:ogre", {"default:snow","default:dirt_with_dry_grass", "default:desert_sand"}, 20, 10, 15000, 2, 31000)
-else
-	mobs:register_spawn("dmobs:ogre", {"default:snow","default:dirt_with_dry_grass", "default:desert_sand"}, 20, 10, 350, 2, 31000)
-end
-
 mobs:register_egg("dmobs:ogre", "Ogre", "default_desert_sand.png", 1)
diff --git a/mobs/orc.lua b/mobs/orc.lua
index 2bdb7dce509e40eef52f438fc7f72b910a4484d5..f319cbff5c9625ab49843ee37b31849ec3fd0509 100644
--- a/mobs/orc.lua
+++ b/mobs/orc.lua
@@ -47,7 +47,7 @@ mobs:register_mob("dmobs:orc", {
 })
 
 -- Orc (Redesign)
-mobs:register_mob("dmobs:orc_redesign", {
+mobs:register_mob("dmobs:orc2", {
 	type = "monster",
 	passive = false,
 	reach = 1,
@@ -93,11 +93,6 @@ mobs:register_mob("dmobs:orc_redesign", {
 	},
 })
 
-if not dmobs.dragons == true then
-	mobs:register_spawn("dmobs:orc", {"default:snow","default:snow_block", "default:desert_sand"}, 20, 10, 15000, 2, 31000)
-else
-	mobs:register_spawn("dmobs:orc", {"default:snow","default:snow_block", "default:desert_sand"}, 20, 10, 3500, 2, 31000)
-end
 
-mobs:register_egg("dmobs:orc_redesign", "Orc (redesign)", "default_desert_sand.png", 1)
+mobs:register_egg("dmobs:orc2", "Morgul Orc", "default_desert_sand.png", 1) -- new and improved, hey
 mobs:register_egg("dmobs:orc", "Orc", "default_desert_sand.png", 1)
diff --git a/mobs/owl.lua b/mobs/owl.lua
index 0db61716eab76d1223ac0794b1c7940d8d9d76c3..d2d8fb8affddda146ac82c6e7a196e620e445613 100644
--- a/mobs/owl.lua
+++ b/mobs/owl.lua
@@ -42,6 +42,5 @@ mobs:register_mob("dmobs:owl", {
 	},
 })
 
-mobs:register_spawn("dmobs:owl", {"default:leaves","default:tree"}, 20, 10, 15000, 2, 31000)
 
 mobs:register_egg("dmobs:owl", "Owl", "default_tree.png", 1)
diff --git a/mobs/panda.lua b/mobs/panda.lua
index 249d3c63528759008eaf999405601aae05b2d24d..73e85ab2f376ddeb181da05c4acc56a63047c6eb 100644
--- a/mobs/panda.lua
+++ b/mobs/panda.lua
@@ -59,6 +59,5 @@ mobs:register_mob("dmobs:panda", {
 	end,
 })
 
-mobs:register_spawn("dmobs:panda", {"default:dirt_with_grass","ethereal:bamboo_dirt"}, 20, 10, 15000, 2, 31000)
 
 mobs:register_egg("dmobs:panda", "Panda", "default_papyrus.png", 1)
diff --git a/mobs/pig.lua b/mobs/pig.lua
index ed07ff7b717cdd2bafca4f0d7594abfbd0e593d1..f59041bf7677719a70d405dc558129548ba6172d 100644
--- a/mobs/pig.lua
+++ b/mobs/pig.lua
@@ -65,6 +65,5 @@ mobs:register_mob("dmobs:pig", {
 	end,
 })
 
-mobs:register_spawn("dmobs:pig", {"default:pine_needles","default:leaves", "nyanland:cloudstone"}, 20, 10, 32000, 2, 31000)
 
 mobs:register_egg("dmobs:pig", "flying Pig", "wool_pink.png", 1)
diff --git a/mobs/pig_evil.lua b/mobs/pig_evil.lua
index 42d3085e6c3a0fc031a4afa741da20fa9f94c765..a3d1edaf0c2f80bdcd3a4a9358266fbad36ebe75 100644
--- a/mobs/pig_evil.lua
+++ b/mobs/pig_evil.lua
@@ -71,6 +71,5 @@ end
 
 mobs:register_mob("dmobs:pig_evil", pigdef)
 
-mobs:register_spawn("dmobs:pig_evil", {"default:pine_needles","default:leaves"}, 20, 10, 32000, 2, 31000)
 
 mobs:register_egg("dmobs:pig_evil", "Kamikaze Pig", "wool_pink.png", 1)
diff --git a/mobs/rat.lua b/mobs/rat.lua
index d415547bbfdaa2d6c0ca909b68e0491b0f04b1c2..fb187276c5fc0e92324cc58de0f94493cccc59bf 100644
--- a/mobs/rat.lua
+++ b/mobs/rat.lua
@@ -48,6 +48,5 @@ mobs:register_mob("dmobs:rat", {
 	},
 })
 
-mobs:register_spawn("dmobs:rat", {"default:stone","default:sand"}, 20, 0, 32000, 2, 31000)
 
 mobs:register_egg("dmobs:rat", "Giant Rat", "wool_grey.png", 1)
diff --git a/mobs/skeleton.lua b/mobs/skeleton.lua
index d836dca578139969a28696896fbd77eb994d1869..a66c0a8322c7b2b11e4f45529c3e7dd1bb97dd55 100644
--- a/mobs/skeleton.lua
+++ b/mobs/skeleton.lua
@@ -44,6 +44,5 @@ mobs:register_mob("dmobs:skeleton", {
 	},
 })
 
-mobs:register_spawn("dmobs:skeleton", {"default:stone"}, 7, 0, 16000, 2, 31000)
 
 mobs:register_egg("dmobs:skeleton", "Skeleton", "default_dirt.png", 1)
diff --git a/mobs/tortoise.lua b/mobs/tortoise.lua
index c2067472ace1cfcee0bed9cecc84f4ae5468b57f..dd1e05716635c39f38e45eaa1b612814a49c8160 100644
--- a/mobs/tortoise.lua
+++ b/mobs/tortoise.lua
@@ -54,6 +54,5 @@ mobs:register_mob("dmobs:tortoise", {
 	end,
 })
 
-mobs:register_spawn("dmobs:tortoise", {"default:clay","default:sand"}, 20, 10, 15000, 2, 31000)
 
 mobs:register_egg("dmobs:tortoise", "Tortoise", "default_grass.png", 1)
diff --git a/mobs/treeman.lua b/mobs/treeman.lua
index bf85c013a20f294dcacf0ae20eb3c03c166dddf1..b5329d653e0b601d0668bae23a5f8180acfde577 100644
--- a/mobs/treeman.lua
+++ b/mobs/treeman.lua
@@ -44,6 +44,5 @@ mobs:register_mob("dmobs:treeman", {
 	},
 })
 
-mobs:register_spawn("dmobs:treeman", {"default:leaves", "default:pine_needles"}, 7, 0, 16000, 2, 31000)
 
 mobs:register_egg("dmobs:treeman", "Treeman", "default_tree.png", 1)
diff --git a/mobs/wasps.lua b/mobs/wasps.lua
index 93bda053be53bbd1ef38da94a9c76b930b03d766..bd1ca10d1257cac734e207a6b06f17bc297abeb2 100644
--- a/mobs/wasps.lua
+++ b/mobs/wasps.lua
@@ -43,8 +43,6 @@ mobs:register_mob("dmobs:wasp", {
 	},
 })
 
-mobs:register_spawn("dmobs:wasp", {"default:dirt_with_grass"}, 20, 10, 32000, 2, 31000)
-mobs:register_spawn("dmobs:wasp", {"dmobs:hive"}, 20, 10, 16000, 2, 31000)
 
 mobs:register_egg("dmobs:wasp", "Wasp", "dmobs_wasp_bg.png", 1)
 
@@ -108,6 +106,5 @@ mobs:register_mob("dmobs:wasp_leader", {
 	},
 })
 
-mobs:register_spawn("dmobs:wasp_leader", {"default:dirt_with_grass","dmobs:hive"}, 20, 10, 64000, 2, 31000)
 
 mobs:register_egg("dmobs:wasp_leader", "King of Sting", "dmobs_wasp_bg.png", 1)
diff --git a/mobs/whale.lua b/mobs/whale.lua
index d802f44e4351f604e207df185b3f2ca7b84325f6..cafa83f87786a0a475883fac1b30d747545494a0 100644
--- a/mobs/whale.lua
+++ b/mobs/whale.lua
@@ -58,6 +58,5 @@ mobs:register_mob("dmobs:whale", {
 	end,
 })
 
-mobs:register_spawn("dmobs:whale", {"default:water_source"}, 20, 10, 15000, -20, 1000)
 
 mobs:register_egg("dmobs:whale", "Whale", "default_water_source.png", 1)
diff --git a/saddle.lua b/saddle.lua
new file mode 100644
index 0000000000000000000000000000000000000000..bcef4c2b13ff1b67265453dfc903f1b6f68f1992
--- /dev/null
+++ b/saddle.lua
@@ -0,0 +1,43 @@
+--saddle license
+
+-- **mobs_saddle.png**
+-- -------------------
+-- The MIT License (MIT)
+
+-- Copyright (c) 2014 Krupnov Pavel
+
+-- Permission is hereby granted, free of charge, to any person obtaining a copy
+-- of this software and associated documentation files (the "Software"), to deal
+-- in the Software without restriction, including without limitation the rights
+-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+-- copies of the Software, and to permit persons to whom the Software is
+-- furnished to do so, subject to the following conditions:
+
+-- The above copyright notice and this permission notice shall be included in
+-- all copies or substantial portions of the Software.
+
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+-- THE SOFTWARE.
+
+
+-- saddle (if not already available)
+if not minetest.get_modpath("mobs_horse") then
+	minetest.register_craftitem(":mobs:saddle", {
+		description = "Saddle",
+		inventory_image = "mobs_saddle.png"
+	})
+
+	minetest.register_craft({
+		output = "mobs:saddle",
+		recipe = {
+			{"mobs:leather", "mobs:leather", "mobs:leather"},
+			{"mobs:leather", "default:steel_ingot", "mobs:leather"},
+			{"mobs:leather", "default:steel_ingot", "mobs:leather"}
+		}
+	})
+end
diff --git a/spawn.lua b/spawn.lua
new file mode 100644
index 0000000000000000000000000000000000000000..f98d0010d555194bb54753562cc0fa9294fa4998
--- /dev/null
+++ b/spawn.lua
@@ -0,0 +1,49 @@
+-- friendlies
+
+mobs:register_spawn("dmobs:nyan", {"default:pine_needles","default:leaves"}, 20, 10, 50000, 2, 31000)
+mobs:register_spawn("dmobs:nyan", {"nyanland:meseleaves"}, 20, 10, 15000, 2, 31000)
+
+mobs:register_spawn("dmobs:hedgehog", {"default:dirt_with_grass","default:pine_needles"}, 20, 10, 15000, 2, 31000)
+mobs:register_spawn("dmobs:whale", {"default:water_source"}, 20, 10, 15000, -20, 1000)
+mobs:register_spawn("dmobs:owl", {"default:leaves","default:tree"}, 20, 10, 15000, 2, 31000)
+mobs:register_spawn("dmobs:gnorm", {"default:dirt_with_grass","default:wood"}, 20, 10, 32000, 2, 31000)
+mobs:register_spawn("dmobs:tortoise", {"default:clay","default:sand"}, 20, 10, 15000, 2, 31000)
+mobs:register_spawn("dmobs:elephant", {"default:dirt_with_dry_grass","default:desert_sand"}, 20, 10, 15000, 2, 31000)
+mobs:register_spawn("dmobs:badger", {"default:dirt_with_grass","default:dirt"}, 20, 10, 15000, 2, 31000)
+mobs:register_spawn("dmobs:pig", {"default:pine_needles","default:leaves", "nyanland:cloudstone"}, 20, 10, 32000, 2, 31000)
+mobs:register_spawn("dmobs:panda", {"default:dirt_with_grass","ethereal:bamboo_dirt"}, 20, 10, 15000, 2, 31000)
+
+-- baddies
+
+mobs:register_spawn("dmobs:wasp", {"default:dirt_with_grass"}, 20, 10, 32000, 2, 31000)
+mobs:register_spawn("dmobs:wasp", {"dmobs:hive"}, 20, 10, 16000, 2, 31000)
+mobs:register_spawn("dmobs:wasp_leader", {"default:dirt_with_grass","dmobs:hive"}, 20, 10, 64000, 2, 31000)
+
+mobs:register_spawn("dmobs:golem", {"default:stone"}, 7, 0, 16000, 2, 31000)
+mobs:register_spawn("dmobs:pig_evil", {"default:pine_needles","default:leaves"}, 20, 10, 32000, 2, 31000)
+mobs:register_spawn("dmobs:fox", {"default:dirt_with_grass","default:dirt"}, 20, 10, 32000, 2, 31000)
+
+if not dmobs.dragons then
+	mobs:register_spawn("dmobs:orc", {"default:snow","default:snow_block", "default:desert_sand"}, 20, 10, 15000, 2, 31000)
+	mobs:register_spawn("dmobs:ogre", {"default:snow","default:dirt_with_dry_grass", "default:desert_sand"}, 20, 10, 15000, 2, 31000)
+else
+	mobs:register_spawn("dmobs:orc", {"default:snow","default:snow_block", "default:desert_sand"}, 20, 10, 3500, 2, 31000)
+	mobs:register_spawn("dmobs:ogre", {"default:snow","default:dirt_with_dry_grass", "default:desert_sand"}, 20, 10, 350, 2, 31000)
+end
+
+
+mobs:register_spawn("dmobs:rat", {"default:stone","default:sand"}, 20, 0, 32000, 2, 31000)
+mobs:register_spawn("dmobs:treeman", {"default:leaves", "default:pine_needles"}, 7, 0, 16000, 2, 31000)
+mobs:register_spawn("dmobs:skeleton", {"default:stone"}, 7, 0, 16000, 2, 31000)
+
+-- dragons
+
+mobs:register_spawn("dmobs:dragon", {"default:leaves","default:dirt_with_grass"}, 20, 10, 64000, 2, 31000)
+
+mobs:register_spawn("dmobs:dragon2", {"default:pine_needles"}, 20, 10, 64000, 2, 31000)
+mobs:register_spawn("dmobs:dragon3", {"default:acacia_leaves","default:dirt_with_dry_grass"}, 20, 10, 64000, 2, 31000)
+mobs:register_spawn("dmobs:dragon4", {"default:jungleleaves"}, 20, 10, 64000, 2, 31000)
+mobs:register_spawn("dmobs:waterdragon", {"default:water_source"}, 20, 10, 32000, 1, 31000, false)
+mobs:register_spawn("dmobs:wyvern",	{"default:leaves"}, 20, 10, 32000, 1, 31000, false)
+mobs:register_spawn("dmobs:dragon_great", {"default:lava_source"}, 20, 0, 64000, -21000, 1000, false)
+