diff --git a/game/engines/default/engine/GameEnergyBased.lua b/game/engines/default/engine/GameEnergyBased.lua
index 2956d7e7c1d12b229219a7e8b820dcae283b7237..f6346b2484bf3dee2b48d1b2677c7b5cac68e816 100644
--- a/game/engines/default/engine/GameEnergyBased.lua
+++ b/game/engines/default/engine/GameEnergyBased.lua
@@ -59,22 +59,15 @@ function _M:tick()
 
 	-- Give some energy to entities
 	if self.level then
-		local i, e
-		local arr = self.level.e_array
-		for i = 1, #arr do
-			e = arr[i]
-			if e and e.act and e.energy then
---				print("<ENERGY", e.name, e.uid, "::", e.energy.value, self.paused, "::", e.player)
-				if e.energy.value < self.energy_to_act then
-					e.energy.value = (e.energy.value or 0) + self.energy_per_tick * (e.energy.mod or 1) * (e.global_speed or 1)
-				end
-				if e.energy.value >= self.energy_to_act then
-					e.energy.used = false
-					e:act(self)
-				end
---				print(">ENERGY", e.name, e.uid, "::", e.energy.value, self.paused, "::", e.player)
-			end
+		self:tickLevel(self.level)
+		local mainlev = self.level
+
+		for name, level in pairs(self.level.sublevels) do
+			self.level = level
+			self:tickLevel(level)
+			if self.level ~= level then mainlev = self.level end
 		end
+		self.level = mainlev
 	end
 
 	local arr = self.entities
@@ -100,6 +93,26 @@ function _M:tick()
 	end
 end
 
+--- Run tick on a level
+function _M:tickLevel(level)
+	local i, e
+	local arr = level.e_array
+	for i = 1, #arr do
+		e = arr[i]
+		if e and e.act and e.energy then
+--				print("<ENERGY", e.name, e.uid, "::", e.energy.value, self.paused, "::", e.player)
+			if e.energy.value < self.energy_to_act then
+				e.energy.value = (e.energy.value or 0) + self.energy_per_tick * (e.energy.mod or 1) * (e.global_speed or 1)
+			end
+			if e.energy.value >= self.energy_to_act then
+				e.energy.used = false
+				e:act(self)
+			end
+--				print(">ENERGY", e.name, e.uid, "::", e.energy.value, self.paused, "::", e.player)
+		end
+	end
+end
+
 --- Called every game turns
 -- Does nothing, you can override it
 function _M:onTurn()
diff --git a/game/engines/default/engine/Level.lua b/game/engines/default/engine/Level.lua
index 9044dd4f7997aeaa6a177f3729f7548c45f8a45a..5f319611a432f6c4594143fdd64dc98f051aaec6 100644
--- a/game/engines/default/engine/Level.lua
+++ b/game/engines/default/engine/Level.lua
@@ -31,6 +31,39 @@ function _M:init(level, map)
 	self.entities = {}
 	self.entities_list = {}
 	self.perm_entities_list = {}
+	self.sublevels = {}
+	self.sublevel_id = "__main__"
+	self.data = {}
+end
+
+--- Adds a sublevel
+function _M:addSublevel(name, level)
+	if self.sublevels[name] then error("Sublevel already exists: "..name) end
+	self.sublevels[name] = level
+	level.sublevel_id = name
+	print("[LEVEL] new sublevel", name)
+end
+
+--- Removes a sublevel
+function _M:removeSublevel(name)
+	self.sublevels[name] = nil
+	print("[LEVEL] del sublevel", name)
+end
+
+--- Activate the given sublevel to become the new main one
+function _M:selectSublevel(name)
+	if not self.sublevels[name] then error("Sublevel does not exist, cant switch: "..name) end
+	if game.level ~= self then error("Switching sublevel on a level that is not active") end
+	local level = self.sublevels[name]
+	game.level = level
+
+	level.sublevels = self.sublevels
+	self.sublevels = {}
+
+	level.sublevels[level.sublevel_id] = nil
+	level.sublevels[self.sublevel_id] = self
+
+	print("[LEVEL] switch to sublevel", level.sublevel_id, "from", self.sublevel_id)
 end
 
 --- Adds an entity to the level
diff --git a/game/modules/tome/data/gfx/shockbolt/npc/dragon_cold_cold_drake.png b/game/modules/tome/data/gfx/shockbolt/npc/dragon_cold_cold_drake.png
new file mode 100644
index 0000000000000000000000000000000000000000..beea9ac6dbef2aba3d08a97d68f65f6a55644231
Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/npc/dragon_cold_cold_drake.png differ
diff --git a/game/modules/tome/data/gfx/shockbolt/npc/dragon_fire_fire_drake.png b/game/modules/tome/data/gfx/shockbolt/npc/dragon_fire_fire_drake.png
new file mode 100644
index 0000000000000000000000000000000000000000..cdd7670f52c17f45d086c985838db98e729a5f94
Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/npc/dragon_fire_fire_drake.png differ
diff --git a/game/modules/tome/data/gfx/shockbolt/npc/dragon_fire_fire_drake_hatchling.png b/game/modules/tome/data/gfx/shockbolt/npc/dragon_fire_fire_drake_hatchling.png
new file mode 100644
index 0000000000000000000000000000000000000000..c7c986e19c2dd3821dec9a5c0aafabd4f016da08
Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/npc/dragon_fire_fire_drake_hatchling.png differ
diff --git a/game/modules/tome/data/gfx/shockbolt/npc/insect_ritch_ritch_larva.png b/game/modules/tome/data/gfx/shockbolt/npc/insect_ritch_ritch_larva.png
new file mode 100644
index 0000000000000000000000000000000000000000..6c8cae062f6cfd7ab864b227ca177cbaf0f970bd
Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/npc/insect_ritch_ritch_larva.png differ