diff --git a/dragons/eggs.lua b/dragons/eggs.lua
new file mode 100644
index 0000000000000000000000000000000000000000..38ac6951947c4dae93c156311374caec501d0db1
--- /dev/null
+++ b/dragons/eggs.lua
@@ -0,0 +1,132 @@
+-- eggs from mobs_dragon --------------------------------------------------------------------------
+	
+local dragonpairs = {
+	fire = {colour="red",nest="default:lava_source"},
+	lightning = {colour="black",nest="default:obsidian"},
+	poison = {colour="green",nest="default:cactus"},
+	ice = {colour="black",nest="default:ice"},
+	great = {colour="great",nest=""},
+}
+
+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
+		for element,details in pairs(dragonpairs) do
+			if corner_name == details.nest then
+				dragon_type = element
+				break
+			end
+		end
+		
+		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 function egghatch(pos, node, clicker, item, _)
+	local wield_item = clicker:get_wielded_item():get_name()
+	local eggnode = minetest.get_node(pos).name
+	
+	for nature,details in pairs(dragonpairs) do
+		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(), " ... it ... swallowed the gem...")
+		   	
+			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_"..details.colour )
+					minetest.sound_play("dmobs_chirrup",{pos=pos,max_hear_distance=20})
+					
+					local obj = ent:get_luaentity()
+					if eggnode ~= "dmobs:dragon_egg_great" then
+						ent:set_properties({
+							textures = {"dmobs_dragon_young.png"},
+							visual_size = {x=1, y=1},
+						})
+					end
+					obj.tamed = true
+					obj.owner = clicker:get_player_name()
+				end,
+				pos, clicker:get_player_name()
+			)
+			item:take_item()
+			break
+		end
+	end -- for loop
+end
+
+-- Egg form dfinitions -----------------------------------------
+
+local base_egg = { -- base template for all dragon eggs
+	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 = egg_transform,
+}
+
+
+minetest.register_node("dmobs:egg", dmobs.deepclone(base_egg) ) -- clone, to not affect the base template
+
+base_egg.groups.not_in_creative_inventory=1
+base_egg.on_rightclick = egghatch
+
+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) )
+
+base_egg.tiles = {"dmobs_egg4.png"}
+minetest.register_node("dmobs:dragon_egg_ice", dmobs.deepclone(base_egg) )
+
+base_egg.groups.not_in_creative_inventory=nil
+--base_egg.tiles = {"dmobs_dragon_egg_great.png"} -- non existent
+base_egg.tiles = {"dmobs_fire.png"}
+base_egg.description = "Great Dragon Egg"
+minetest.register_node("dmobs:dragon_egg_great", dmobs.deepclone(base_egg) )
diff --git a/dragons/main.lua b/dragons/main.lua
index a90e945f5e760354aa3c1e26daa835266328ee74..ee5a699bd162463498dafc445165b582a4f00288 100644
--- a/dragons/main.lua
+++ b/dragons/main.lua
@@ -61,140 +61,6 @@ dmobs.dragon.do_custom = function(self, dtime)
 	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"
-			
-		elseif corner_name == "default:obsidian" then
-			dragon_type = "lightning"
-			
-		elseif corner_name == "default:cactus" then
-			dragon_type = "poison"
-
-		elseif corner_name == "default:ice" then
-			dragon_type = "ice"
-		end
-		
-		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).name
-	
-	for nature,colour in pairs(dragonpairs) do
-		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})
-					
-					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 -- for loop
-end
-
-local base_egg = { -- base template for all dragon eggs
-	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 = egg_transform,
-}
-
-
-minetest.register_node("dmobs:egg", dmobs.deepclone(base_egg) ) -- clone, to not affect the base template
-
-base_egg.groups.not_in_creative_inventory=1
-base_egg.on_rightclick = egghatch
-
-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) )
-
-base_egg.tiles = {"dmobs_egg4.png"}
-minetest.register_node("dmobs:dragon_egg_ice", dmobs.deepclone(base_egg) )
-
-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
 
diff --git a/init.lua b/init.lua
index 71a4bef06e062bccb715d8444633a733294cbd76..415645a260abd05ebaad508218675865df837a6b 100644
--- a/init.lua
+++ b/init.lua
@@ -79,11 +79,13 @@ else
 	loadmob("dragon4","/dragons/")
 	loadmob("water_dragon","/dragons/")
 	loadmob("wyvern","/dragons/")
+	
+	dofile(minetest.get_modpath("dmobs").."/dragons/eggs.lua")
 	dofile(minetest.get_modpath("dmobs").."/arrows/dragonfire.lua")
 	dofile(minetest.get_modpath("dmobs").."/arrows/dragonarrows.lua")
 end
 
--- Arrow definitions
+-- General arrow definitions
 
 if dmobs.destructive == true then
 	dofile(minetest.get_modpath("dmobs").."/arrows/fire_explosive.lua")