diff --git a/game/engine/Birther.lua b/game/engine/Birther.lua
index b2c844a11c81e63ce3edeba6060cc483aa1532a5..78e052b8b0a4aedd6792065514c1688112eef45f 100644
--- a/game/engine/Birther.lua
+++ b/game/engine/Birther.lua
@@ -90,6 +90,7 @@ function _M:init(actor, order, at_end)
 end
 
 function _M:selectType(type)
+	local default = 1
 	self.list = {}
 	-- Make up the list
 	for i, d in ipairs(self.birth_descriptor_def[type]) do
@@ -108,9 +109,10 @@ function _M:selectType(type)
 		-- Check it is allowed
 		if allowed then
 			table.insert(self.list, d)
+			if d.selection_default then default = #self.list end
 		end
 	end
-	self.sel = 1
+	self.sel = default
 	self.current_type = type
 end
 
diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua
index ae619272ea2625b93d3e97c01d82151cc22bb224..3e20bb80ef0b44894da4008de67b416c56f59e28 100644
--- a/game/modules/tome/class/Game.lua
+++ b/game/modules/tome/class/Game.lua
@@ -57,6 +57,12 @@ local QuitDialog = require "mod.dialogs.Quit"
 
 module(..., package.seeall, class.inherit(engine.GameTurnBased, engine.interface.GameMusic, engine.interface.GameSound))
 
+-- Difficulty settings
+DIFFICULTY_EASY = 1
+DIFFICULTY_NORMAL = 2
+DIFFICULTY_NIGHTMARE = 3
+DIFFICULTY_INSANE = 4
+
 function _M:init()
 	engine.GameTurnBased.init(self, engine.KeyBind.new(), 1000, 100)
 	engine.interface.GameMusic.init(self)
@@ -114,7 +120,7 @@ function _M:newGame()
 	Map:setViewerActor(self.player)
 	self:setupDisplayMode()
 
-	local birth = Birther.new(self.player, {"base", "world", "race", "subrace", "sex", "class", "subclass" }, function()
+	local birth = Birther.new(self.player, {"base", "difficulty", "world", "race", "subrace", "sex", "class", "subclass" }, function()
 		self.player.wild_x, self.player.wild_y = self.player.default_wilderness[1], self.player.default_wilderness[2]
 		self:changeLevel(1, self.player.starting_zone)
 		print("[PLAYER BIRTH] resolve...")
@@ -219,8 +225,10 @@ function _M:getSaveDescription()
 	return {
 		name = self.player.name,
 		description = ([[%s the level %d %s %s.
+Difficulty: %s
 Exploring level %d of %s.]]):format(
 		self.player.name, self.player.level, self.player.descriptor.subrace, self.player.descriptor.subclass,
+		self.player.descriptor.difficulty,
 		self.level.level, self.zone.name
 		),
 	}
diff --git a/game/modules/tome/class/Player.lua b/game/modules/tome/class/Player.lua
index 904cb1443b5108d5d12d4217d83753fcbee7dbee..c6d551283441608e5103cc85170923d65265f508 100644
--- a/game/modules/tome/class/Player.lua
+++ b/game/modules/tome/class/Player.lua
@@ -193,6 +193,19 @@ function _M:onTakeHit(value, src)
 	return ret
 end
 
+function _M:heal(value, src)
+	-- Difficulty settings
+	if game.difficulty == game.DIFFICULTY_EASY then
+		value = value * 1.1
+	elseif game.difficulty == game.DIFFICULTY_NIGHTMARE then
+		value = value * 0.9
+	elseif game.difficulty == game.DIFFICULTY_INSANE then
+		value = value * 0.8
+	end
+
+	mod.class.Actor.heal(self, value, src)
+end
+
 function _M:die(src)
 	if self.game_ender then
 		engine.interface.ActorLife.die(self, src)
diff --git a/game/modules/tome/data/birth/descriptors.lua b/game/modules/tome/data/birth/descriptors.lua
index c591f676acccc8fe465c464d9499373a543f68e1..3a024b9ec1dd24b98415c5eca29692dc594385f7 100644
--- a/game/modules/tome/data/birth/descriptors.lua
+++ b/game/modules/tome/data/birth/descriptors.lua
@@ -57,6 +57,54 @@ newBirthDescriptor{
 	},
 }
 
+--------------- Difficulties
+newBirthDescriptor{
+	type = "difficulty",
+	name = "Easy",
+	desc =
+	{
+		"Easy game setting",
+		"All damage done to the player reduced by 20%",
+		"All healing for the player increased by 10%",
+	},
+	copy = { resolvers.generic(function() game.difficulty = game.DIFFICULTY_EASY end) },
+}
+newBirthDescriptor{
+	type = "difficulty",
+	name = "Normal",
+	selection_default = true,
+	desc =
+	{
+		"Normal game setting",
+		"No changes to the rules.",
+	},
+	copy = { resolvers.generic(function() game.difficulty = game.DIFFICULTY_NORMAL end) },
+}
+newBirthDescriptor{
+	type = "difficulty",
+	name = "Nightmare",
+	desc =
+	{
+		"Hard game setting",
+		"All damage done to the player increased by 20%",
+		"All healing for the player decreased by 10%",
+	},
+	copy = { resolvers.generic(function() game.difficulty = game.DIFFICULTY_NIGHTMARE end) },
+}
+newBirthDescriptor{
+	type = "difficulty",
+	name = "Insane",
+	desc =
+	{
+		"Absolutly unfair game setting",
+		"All damage done to the player increased by 20%",
+		"All damage done by the player decreased by 20%",
+		"All healing for the player decreased by 20%",
+	},
+	copy = { resolvers.generic(function() game.difficulty = game.DIFFICULTY_INSANE end) },
+}
+
+
 -- Worlds
 load("/data/birth/worlds.lua")
 
diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua
index 016318ecfb3a3465af2c4c363877ad481cd34517..6c46b9ac4a280de084f4a3a9d5df9b7e57d7fe8c 100644
--- a/game/modules/tome/data/damage_types.lua
+++ b/game/modules/tome/data/damage_types.lua
@@ -21,6 +21,19 @@
 setDefaultProjector(function(src, x, y, type, dam)
 	local target = game.level.map(x, y, Map.ACTOR)
 	if target then
+		print("[PROJECTOR] starting dam", dam)
+
+		-- Difficulty settings
+		if game.difficulty == game.DIFFICULTY_EASY and target.player then
+			dam = dam * 0.8
+		elseif game.difficulty == game.DIFFICULTY_NIGHTMARE and target.player then
+			dam = dam * 1.2
+		elseif game.difficulty == game.DIFFICULTY_INSANE then
+			if target.player then dam = dam * 1.2
+			elseif src.player then dam = dam * 0.8 end
+		end
+		print("[PROJECTOR] after difficulty dam", dam)
+
 		-- Increases damage
 		if src.inc_damage then
 			local inc = src.inc_damage[type] or 0