diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index f45a50d29ec0034b4752bc9ed6361d393ade9f49..9d362167fe356ee49a87ecb4c0774f027ceea4c5 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -1751,7 +1751,7 @@ function _M:onTakeHit(value, src)
 				if e.power * e.dur < value then
 					game:onTickEnd(function() self:removeEffect(eff[2]) end) -- Happens on tick end so Night Terror can work properly
 				else
-					e.dur = e.dur - math.ceil(value/e.power)
+					e.dur = math.max(0, e.dur - math.ceil(value/e.power))
 				end
 			end
 		end
diff --git a/game/modules/tome/data/birth/classes/psionic.lua b/game/modules/tome/data/birth/classes/psionic.lua
index 7d62f8086272279de92bbe44063e326f0ef4f07a..64dad34645445589936ba0130dd3ebd3faa15438 100644
--- a/game/modules/tome/data/birth/classes/psionic.lua
+++ b/game/modules/tome/data/birth/classes/psionic.lua
@@ -148,21 +148,22 @@ newBirthDescriptor{
 		life_rating = -4,
 	},
 }
-
+-- Edge TODO: Unlock stuff
 newBirthDescriptor{
 	type = "subclass",
 	name = "Solipsist",
 	locked = function() return profile.mod.allow_build.psionic_solipsist and true or "hide"  end,
-	locked_desc = "TODO",
+	locked_desc = "The world as we know it is the collective dream of those that live in it.  Find and wake the sleeper and you'll unlock the potential of your dreams.",
 	desc = {
-		"blahblah",
+		"The Solipsist has awakened to the truth of reality, that it's malleable, nothing more than the collective vision of those that experience it.",
+		"They wield this knowledge to both create and destory, to invade the minds of others, and to manipulate the dreams of the unenlightened.",
+		"This knowledge comes with a heavy price and the Solipsist must guard his thoughts, lest he come to believe that the world exists only within his own mind.",
 		"Their most important stats are: Willpower and Cunning",
 		"#GOLD#Stat modifiers:",
 		"#LIGHT_BLUE# * +0 Strength, +0 Dexterity, +0 Constitution",
 		"#LIGHT_BLUE# * +0 Magic, +5 Willpower, +4 Cunning",
 		"#GOLD#Life per level:#LIGHT_BLUE# -4 (*special*)",
 	},
-	not_on_random_boss = true, -- remove later, this is here so half-finished talents don't end up on bosses
 	power_source = {psionic=true},
 	stats = { str=0, wil=5, cun=4, },
 	talents_types = {
diff --git a/game/modules/tome/data/talents/psionic/discharge.lua b/game/modules/tome/data/talents/psionic/discharge.lua
index 97d583259591f6b94037c112dab1c69cbde9824a..fa792b8a1a6594c2cabe398556c312a87c1682f8 100644
--- a/game/modules/tome/data/talents/psionic/discharge.lua
+++ b/game/modules/tome/data/talents/psionic/discharge.lua
@@ -17,8 +17,6 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
--- Edge TODO: Sounds
-
 newTalent{
 	name = "Mind Storm",
 	type = {"psionic/discharge", 1},
@@ -86,6 +84,7 @@ newTalent{
 		
 	end,
 	activate = function(self, t)
+		game:playSoundNear(self, "talents/thunderstorm")
 		local ret = {
 			overcharge = 0,
 			particles = self:addParticles(Particles.new("ultrashield", 1, {rm=255, rM=255, gm=180, gM=255, bm=0, bM=0, am=35, aM=90, radius=0.2, density=15, life=28, instop=10}))
@@ -121,6 +120,7 @@ newTalent{
 	action = function(self, t)
 		local wrath = self:hasEffect(self.EFF_FOCUSED_WRATH)
 		self:setEffect(self.EFF_FEEDBACK_LOOP, self:mindCrit(t.getDuration(self, t), nil, wrath and wrath.power or 0), {})
+		game:playSoundNear(self, "talents/heal")
 		return true
 	end,
 	info = function(self, t)
@@ -196,6 +196,7 @@ newTalent{
 		self:setEffect(self.EFF_FOCUSED_WRATH, t.getDuration(self, t), {target=target, power=t.getCritBonus(self, t)/100})
 
 		game.level.map:particleEmitter(self.x, self.y, 1, "generic_charge", {rm=255, rM=255, gm=180, gM=255, bm=0, bM=0, am=35, aM=90})
+		game:playSoundNear(self, "talents/fireflash")
 		return true
 	end,
 	info = function(self, t)
diff --git a/game/modules/tome/data/talents/psionic/distortion.lua b/game/modules/tome/data/talents/psionic/distortion.lua
index 94bc626c3f488e7f45a04428c27ebc988e648a04..8f342f4218f8aeedd5e5ab585f06c9dfd78c2619 100644
--- a/game/modules/tome/data/talents/psionic/distortion.lua
+++ b/game/modules/tome/data/talents/psionic/distortion.lua
@@ -17,8 +17,6 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
--- Edge TODO: Sounds
-
 local Object = require "mod.class.Object"
 
 newTalent{
@@ -42,6 +40,7 @@ newTalent{
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
 		self:projectile(tg, x, y, DamageType.DISTORTION, {dam=self:mindCrit(t.getDamage(self, t)), explosion=t.getDetonateDamage(self, t), penetrate=true, radius=self:getTalentRadius(t)})
+		game:playSoundNear(self, "talents/distortion")
 		return true
 	end,
 	info = function(self, t)
@@ -76,6 +75,7 @@ newTalent{
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
 		self:project(tg, x, y, DamageType.DISTORTION, {dam=self:mindCrit(t.getDamage(self, t)), knockback=t.getPower(self, t), stun=t.getPower(self, t)})
+		game:playSoundNear(self, "talents/warp")
 		game.level.map:particleEmitter(self.x, self.y, tg.radius, "generic_wave", {radius=tg.radius, tx=x-self.x, ty=y-self.y, rm=255, rM=255, gm=180, gM=255, bm=180, bM=255, am=35, aM=90})
 		return true
 	end,
@@ -118,9 +118,8 @@ newTalent{
 		if target:hasEffect(target.EFF_DISTORTION) then
 			ravage = true
 		end
-		
 		target:setEffect(target.EFF_RAVAGE, t.getDuration(self, t), {src=self, dam=self:mindCrit(t.getDamage(self, t)), ravage=ravage, apply_power=self:combatMindpower()})
-							
+		game:playSoundNear(self, "talents/echo")
 		return true
 	end,
 	info = function(self, t)
@@ -212,7 +211,7 @@ newTalent{
 		game.level.map(x, y, Map.TERRAIN, e)
 		game.nicer_tiles:updateAround(game.level, x, y)
 		game.level.map:updateMap(x, y)
-		game:playSoundNear(self, "talents/fire")
+		game:playSoundNear(self, "talents/lightning_loud")
 		return true
 	end,
 	info = function(self, t)
diff --git a/game/modules/tome/data/talents/psionic/dreaming.lua b/game/modules/tome/data/talents/psionic/dreaming.lua
index 1788ae424079965621cdc24da13d61c7567bc078..f72626a2e5b590d5cb6e11cf51c500fc2b4353cd 100644
--- a/game/modules/tome/data/talents/psionic/dreaming.lua
+++ b/game/modules/tome/data/talents/psionic/dreaming.lua
@@ -17,8 +17,6 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
--- Edge TODO: Sounds
-
 newTalent{
 	name = "Sleep",
 	type = {"psionic/dreaming", 1},
@@ -36,7 +34,7 @@ newTalent{
 	getInsomniaPower= function(self, t)
 		local t = self:getTalentFromId(self.T_SANDMAN)
 		local reduction = t.getInsomniaPower(self, t)
-		return 10 - reduction
+		return 20 - reduction
 	end,
 	getSleepPower = function(self, t) 
 		local power = self:combatTalentMindDamage(t, 5, 25)
@@ -84,6 +82,7 @@ newTalent{
 				end
 			end
 		end)
+		game:playSoundNear(self, "talents/dispel")
 		return true
 	end,
 	info = function(self, t)
@@ -207,7 +206,7 @@ newTalent{
 	getDrain = function(self, t) return 10 - math.min(8, math.ceil(self:getTalentLevel(t))) end,
 	remove_on_zero = true,
 	activate = function(self, t)
-		game:playSoundNear(self, "talents/heal")
+		game:playSoundNear(self, "talents/spell_generic")
 		local ret = {
 			drain = self:addTemporaryValue("psi_regen", -t.getDrain(self, t)),
 			particles = self:addParticles(engine.Particles.new("ultrashield", 1, {rm=0, rM=0, gm=180, gM=255, bm=180, bM=255, am=70, aM=180, radius=0.8, density=60, life=14, instop=20, static=80}))
diff --git a/game/modules/tome/data/talents/psionic/feedback.lua b/game/modules/tome/data/talents/psionic/feedback.lua
index 0b47a699b161500b2603ddd29dc49d5b87e5b920..8016baa2ee58243cbeb63065ec93c21e2cc927ff 100644
--- a/game/modules/tome/data/talents/psionic/feedback.lua
+++ b/game/modules/tome/data/talents/psionic/feedback.lua
@@ -17,8 +17,6 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
--- Edge TODO: Sounds
-
 newTalent{
 	name = "Biofeedback",
 	type = {"psionic/feedback", 1},
@@ -45,6 +43,7 @@ newTalent{
 	getShieldPower = function(self, t) return self:combatTalentMindDamage(t, 30, 470) end,
 	action = function(self, t)
 		self:setEffect(self.EFF_RESONANCE_FIELD, 10, {power = self:mindCrit(t.getShieldPower(self, t))})
+		game:playSoundNear(self, "talents/spell_generic2")
 		return true
 	end,
 	info = function(self, t)
@@ -113,6 +112,7 @@ newTalent{
 			end
 		end
 		game.level.map:particleEmitter(self.x, self.y, 1, "generic_charge", {rm=255, rM=255, gm=180, gM=255, bm=0, bM=0, am=35, aM=90})
+		game:playSoundNear(self, "talents/heal")
 		return true
 	end,
 	info = function(self, t)
diff --git a/game/modules/tome/data/talents/psionic/mentalism.lua b/game/modules/tome/data/talents/psionic/mentalism.lua
index 0f011aec9e75c197749a1c3ef10f87514621e63d..0013ba7a3190ddbbae3914736e7cffed39ae3743 100644
--- a/game/modules/tome/data/talents/psionic/mentalism.lua
+++ b/game/modules/tome/data/talents/psionic/mentalism.lua
@@ -17,8 +17,6 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
--- Edge TODO: Sounds
-
 local Map = require "engine.Map"
 
 newTalent{
@@ -96,6 +94,7 @@ newTalent{
 		end
 		
 		game.logSeen(self, "%s's mind is clear!", self.name:capitalize())
+		game:playSoundNear(self, "talents/heal")
 		return true
 	end,
 	info = function(self, t)
@@ -176,6 +175,8 @@ newTalent{
 		m.on_takehit = function(self, value, src) self.summoner:takeHit(value, src) return value end
 		
 		game.zone:addEntity(game.level, m, "actor", x, y)
+		game.level.map:particleEmitter(m.x, m.y, 1, "generic_teleport", {rm=0, rM=0, gm=100, gM=180, bm=180, bM=255, am=35, aM=90})
+		game:playSoundNear(self, "talents/teleport")
 	
 		if game.party:hasMember(self) then
 			game.party:addMember(m, {
@@ -189,9 +190,13 @@ newTalent{
 					self.summoner.ai = "none"
 				end,
 				on_uncontrol = function(self)
-					self.summoner.ai = self.summoner.projection_ai
-					self.summon_time = 0
-					game:onTickEnd(function() game.party:removeMember(self) end)
+					game:onTickEnd(function() 
+						self.summoner.ai = self.summoner.projection_ai
+						self.energy.value = 0
+						self.summon_time = 0
+						game.party:removeMember(self)
+						game.level.map:particleEmitter(self.summoner.x, self.summoner.y, 1, "generic_teleport", {rm=0, rM=0, gm=100, gM=180, bm=180, bM=255, am=35, aM=90})
+					end)
 				end,
 			})
 		end
@@ -240,6 +245,7 @@ newTalent{
 		
 		game.level.map:particleEmitter(self.x, self.y, 1, "generic_discharge", {rm=0, rM=0, gm=100, gM=180, bm=180, bM=255, am=35, aM=90})
 		game.level.map:particleEmitter(target.x, target.y, 1, "generic_discharge", {rm=0, rM=0, gm=100, gM=180, bm=180, bM=255, am=35, aM=90})
+		game:playSoundNear(self, "talents/echo")
 		
 		local ret = {
 			target = target,
diff --git a/game/modules/tome/data/talents/psionic/nightmare.lua b/game/modules/tome/data/talents/psionic/nightmare.lua
index b2c650a4f1b4fdb6f7ced9bed757070c1d93b766..986e04de99043e7c7c2743ee0acbc3a17ac6da5a 100644
--- a/game/modules/tome/data/talents/psionic/nightmare.lua
+++ b/game/modules/tome/data/talents/psionic/nightmare.lua
@@ -17,8 +17,6 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
--- Edge TODO: Sounds
-
 newTalent{
 	name = "Nightmare",
 	type = {"psionic/nightmare", 1},
@@ -35,7 +33,7 @@ newTalent{
 	getInsomniaPower= function(self, t)
 		local t = self:getTalentFromId(self.T_SANDMAN)
 		local reduction = t.getInsomniaPower(self, t)
-		return 10 - reduction
+		return 20 - reduction
 	end,
 	getSleepPower = function(self, t) 
 		local power = self:combatTalentMindDamage(t, 5, 25)
@@ -71,7 +69,7 @@ newTalent{
 		end)
 		
 		game.level.map:particleEmitter(self.x, self.y, tg.radius, "generic_wave", {radius=tg.radius, tx=x-self.x, ty=y-self.y, rm=60, rM=130, gm=20, gM=110, bm=90, bM=130, am=35, aM=90})
-		
+		game:playSoundNear(self, "talents/breath")
 		return true
 	end,
 	info = function(self, t)
@@ -199,7 +197,8 @@ newTalent{
 		else
 			game.logSeen(target, "%s resists the demons!", target.name:capitalize())
 		end
-
+		
+		game:playSoundNear(self, "talents/arcane")
 		return true
 	end,
 	info = function(self, t)
@@ -243,6 +242,7 @@ newTalent{
 			game.logSeen(target, "%s resists the nightmare!", target.name:capitalize())
 		end
 
+		game:playSoundNear(self, "talents/arcane")
 		return true
 	end,
 	info = function(self, t)
@@ -330,7 +330,7 @@ newTalent{
 
 	end,
 	activate = function(self, t)
-		game:playSoundNear(self, "talents/heal")
+		game:playSoundNear(self, "talents/spell_generic")
 		local ret = {
 			damage = self:addTemporaryValue("night_terror", t.getDamageBonus(self, t)),
 			particle = self:addParticles(Particles.new("ultrashield", 1, {rm=60, rM=130, gm=20, gM=110, bm=90, bM=130, am=70, aM=180, radius=0.4, density=60, life=14, instop=20})),
diff --git a/game/modules/tome/data/talents/psionic/psychic-assault.lua b/game/modules/tome/data/talents/psionic/psychic-assault.lua
index ca15e3dd852bafafd33639bfbb85d738a48d76c3..5f73e9a4daa310d2e6b9a5a9716c8be4e1c40ba3 100644
--- a/game/modules/tome/data/talents/psionic/psychic-assault.lua
+++ b/game/modules/tome/data/talents/psionic/psychic-assault.lua
@@ -17,8 +17,6 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
--- Edge TODO: Sounds
-
 newTalent{
 	name = "Sunder Mind",
 	type = {"psionic/psychic-assault", 1},
@@ -27,7 +25,7 @@ newTalent{
 	cooldown = 2,
 	psi = 5,
 	tactical = { ATTACK = { MIND = 2}, DISABLE = 1},
-	range = 10,
+	range = 7,
 	requires_target = true,
 	getDamage = function(self, t) return self:combatTalentMindDamage(t, 10, 150) end,
 	target = function(self, t)
@@ -44,7 +42,8 @@ newTalent{
 		local dam =self:mindCrit(t.getDamage(self, t))
 		self:project(tg, x, y, DamageType.MIND, {dam=dam, alwaysHit=true}, {type="mind"})
 		target:setEffect(target.EFF_SUNDER_MIND, 2, {power=dam/10})
-			
+		
+		game:playSoundNear(self, "talents/warp")
 		return true
 	end,
 	info = function(self, t)
@@ -62,11 +61,11 @@ newTalent{
 	require = psi_wil_req2,
 	points = 5,
 	cooldown = 10,
-	psi = 25,
+	psi = 10,
 	range = 0,
 	direct_hit = true,
 	requires_target = true,
-	radius = function(self, t) return math.min(10, 3 + math.ceil(self:getTalentLevel(t))) end,
+	radius = function(self, t) return math.min(10, 3 + math.ceil(self:getTalentLevel(t)/2)) end,
 	target = function(self, t) return {type="ball", radius=self:getTalentRadius(t), range=self:getTalentRange(t), talent=t, selffire=false} end,
 	tactical = { ATTACKAREA = { MIND = 3 }, DISABLE=1 },
 	getDamage = function(self, t) return self:combatTalentMindDamage(t, 20, 200) end,
@@ -74,7 +73,7 @@ newTalent{
 		local tg = self:getTalentTarget(t)
 		self:project(tg, self.x, self.y, DamageType.MIND, {dam=self:mindCrit(self:combatTalentMindDamage(t, 20, 200)), crossTierChance=100} )
 		game.level.map:particleEmitter(self.x, self.y, self:getTalentRadius(t), "generic_ball", {radius=self:getTalentRadius(t), rm=100, rM=125, gm=100, gM=125, bm=100, bM=125, am=200, aM=255})
-		game:playSoundNear(self, "talents/spell_generic")
+		game:playSoundNear(self, "talents/echo")
 		return true
 	end,
 	info = function(self, t)
@@ -90,15 +89,15 @@ newTalent{
 	type = {"psionic/psychic-assault", 3},
 	require = psi_wil_req3,
 	points = 5,
-	cooldown = 6,
-	range = 10,
+	cooldown = 8,
+	range = 7,
 	psi = 10,
 	direct_hit = true,
 	requires_target = true,
 	tactical = { ATTACK = { MIND = 2 }, DISABLE = { confusion = 2 } },
 	getDamage = function(self, t) return self:combatTalentMindDamage(t, 20, 200) end,
 	getPower = function(self, t) return self:combatTalentMindDamage(t, 20, 60) end,
-	getDuration = function(self, t) return math.floor(self:getTalentLevel(t)) end,
+	getDuration = function(self, t) return 1 + math.floor(self:getTalentLevel(t)) end,
 	no_npc = true,
 	action = function(self, t)
 		local tg = {type="hit", range=self:getTalentRange(t), talent=t}
@@ -116,6 +115,7 @@ newTalent{
 			game.logSeen(target, "%s resists the lobotomy!", target.name:capitalize())
 		end
 
+		game:playSoundNear(self, "talents/cloud")
 		return true
 	end,
 	info = function(self, t)
diff --git a/game/modules/tome/data/talents/psionic/slumber.lua b/game/modules/tome/data/talents/psionic/slumber.lua
index 5b8068b8b78830cb9baf88c3aa6351fd4d032199..3b320948d4704d2d472510bd1f68680da852ea5a 100644
--- a/game/modules/tome/data/talents/psionic/slumber.lua
+++ b/game/modules/tome/data/talents/psionic/slumber.lua
@@ -17,8 +17,6 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
--- Edge TODO: Sounds
-
 newTalent{
 	name = "Slumber",
 	type = {"psionic/slumber", 1},
@@ -35,7 +33,7 @@ newTalent{
 	getInsomniaPower = function(self, t)
 		local t = self:getTalentFromId(self.T_SANDMAN)
 		local reduction = t.getInsomniaPower(self, t)
-		return 10 - reduction
+		return 20 - reduction
 	end,
 	getSleepPower = function(self, t) 
 		local power = self:combatTalentMindDamage(t, 10, 100)
@@ -67,6 +65,7 @@ newTalent{
 		else
 			game.logSeen(self, "%s resists the sleep!", target.name:capitalize())
 		end
+		game:playSoundNear(self, "talents/dispel")
 		return true
 	end,
 	info = function(self, t)
@@ -100,7 +99,7 @@ newTalent{
 	require = psi_wil_req3,
 	mode = "passive",
 	getSleepPowerBonus = function(self, t) return self:combatTalentMindDamage(t, 5, 25) end,
-	getInsomniaPower = function(self, t) return math.min(5, self:getTalentLevelRaw(t)) end,
+	getInsomniaPower = function(self, t) return math.min(10, self:getTalentLevel(t) * 1.2) end,
 	info = function(self, t)
 		local power_bonus = t.getSleepPowerBonus(self, t)
 		local insomnia = t.getInsomniaPower(self, t)
@@ -217,12 +216,13 @@ newTalent{
 		
 		local power = self:mindCrit(t.getPower(self, t))
 		self:setEffect(self.EFF_DREAMSCAPE, t.getDuration(self, t), {target=target, power=power, projections_killed=0, x=self.x, y=self.y, tx=target.x, ty=target.y})
+		game:playSoundNear(self, "talents/teleport")
 		return true
 	end,
 	info = function(self, t)
 		local duration = t.getDuration(self, t)
 		local power = t.getPower(self, t)
-		return([[Enter a sleeping target's dreams for %d turns.  While in the dreamscape you'll encounter the target's invulnerable sleeping form as well as dream projections that it will spawn every four turns to defend it's mind.  When the dreamscape ends the target's life will be reduced by 20%% and it will to be brainlocked for one turn for each projection destroyed.
+		return([[Enter a sleeping target's dreams for %d turns.  While in the dreamscape you'll encounter the target's invulnerable sleeping form as well as dream projections that it will spawn every four turns to defend it's mind.  When the dreamscape ends the target's life will be reduced by 10%% and it will to be brainlocked for one turn for each projection destroyed.
 		Lucid dreamers will spawn projections every two turns instead of every four and their projections will deal more damage (generally projections have a 50%% penalty to all damage).
 		In the dreamscape your damage will be improved by %d%%.
 		The damage bonus will improve with your mindpower.]]):format(duration, power)
diff --git a/game/modules/tome/data/talents/psionic/solipsism.lua b/game/modules/tome/data/talents/psionic/solipsism.lua
index a34826e1292996686b153225244839722bf838e8..b8b808de5d25762cf4467a44dce6d9e494e8f394 100644
--- a/game/modules/tome/data/talents/psionic/solipsism.lua
+++ b/game/modules/tome/data/talents/psionic/solipsism.lua
@@ -17,9 +17,6 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
-
--- Edge TODO: Sounds
-
 newTalent{
 	name = "Solipsism",
 	type = {"psionic/solipsism", 1},
@@ -27,7 +24,7 @@ newTalent{
 	require = psi_wil_req1,
 	mode = "passive",
 	no_unlearn_last = true,
-	getConversionRatio = function(self, t) return math.min(self:getTalentLevel(t) * 0.13, 1) end,
+	getConversionRatio = function(self, t) return math.min(0.25 + self:getTalentLevel(t) * 0.1, 1) end,
 	on_learn = function(self, t)
 		if self:getTalentLevelRaw(t) == 1 then
 			self:incMaxPsi((self:getWil()-10) * 1)
@@ -63,7 +60,7 @@ newTalent{
 	points = 5, 
 	require = psi_wil_req2,
 	mode = "passive",
-	getBalanceRatio = function(self, t) return math.min(self:getTalentLevel(t) * 0.13, 1) end,
+	getBalanceRatio = function(self, t) return math.min(0.25 + self:getTalentLevel(t) * 0.1, 1) end,
 	on_learn = function(self, t)
 		if self:getTalentLevelRaw(t) == 1 then
 			self:incMaxPsi((self:getWil()-10) * 1)
@@ -96,7 +93,7 @@ newTalent{
 	points = 5, 
 	require = psi_wil_req3,
 	mode = "passive",
-	getClarityThreshold = function(self, t) return math.max(0.5, 1 - self:getTalentLevel(t) / 15) end,
+	getClarityThreshold = function(self, t) return math.max(0.95 - self:getTalentLevel(t) * 0.06, 0.5) end,
 	on_learn = function(self, t)
 		self.clarity_threshold = t.getClarityThreshold(self, t)
 		if self:getTalentLevelRaw(t) == 1 then
@@ -133,7 +130,7 @@ newTalent{
 	points = 5, 
 	require = psi_wil_req4,
 	mode = "passive",
-	getSavePercentage = function(self, t) return math.min(2, self:getTalentLevel(t)/4) end,
+	getSavePercentage = function(self, t) return math.min(0.4 + self:getTalentLevel(t) * 0.16, 1.5) end,
 	on_learn = function(self, t)
 		if self:getTalentLevelRaw(t) == 1 then
 			self:incMaxPsi((self:getWil()-10) * 1)
diff --git a/game/modules/tome/data/talents/psionic/thought-forms.lua b/game/modules/tome/data/talents/psionic/thought-forms.lua
index a458408ba19fc2c59b90d44ccfd462e3f514262d..5af9d1622086d04f431a9a214364ba93001830bd 100644
--- a/game/modules/tome/data/talents/psionic/thought-forms.lua
+++ b/game/modules/tome/data/talents/psionic/thought-forms.lua
@@ -17,8 +17,6 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
--- Edge TODO: Sounds
-
 -- Thought Forms
 newTalent{
 	name = "Thought-Form: Bowman",
@@ -522,11 +520,15 @@ newTalent{
 				if self.summoner:isTalentActive(self.summoner.T_OVER_MIND) then
 					self.summoner:forceUseTalent(self.summoner.T_OVER_MIND, {ignore_energy=true})
 				end
+				game.level.map:particleEmitter(self.x, self.y, 1, "generic_discharge", {rm=225, rM=255, gm=225, gM=255, bm=225, bM=255, am=35, aM=90})
+				game.level.map:particleEmitter(self.summoner.x, self.summoner.y, 1, "generic_discharge", {rm=225, rM=255, gm=225, gM=255, bm=225, bM=255, am=35, aM=90})
 			end
 			game.level.map:particleEmitter(target.x, target.y, 1, "generic_discharge", {rm=225, rM=255, gm=225, gM=255, bm=225, bM=255, am=35, aM=90})
 			game.party:setPlayer(target)
 			self:resetCanSeeCache()
 		end)
+		
+		game:playSoundNear(self, "talents/teleport")
 			
 		local ret = {
 			target = target, old_control = old_control,
diff --git a/game/modules/tome/data/timed_effects/mental.lua b/game/modules/tome/data/timed_effects/mental.lua
index e6c718eacfbad56a9a829826d6109da9c971be5c..e7edf0c872825d90402272b645fdeca107498b2f 100644
--- a/game/modules/tome/data/timed_effects/mental.lua
+++ b/game/modules/tome/data/timed_effects/mental.lua
@@ -2447,7 +2447,7 @@ newEffect{
 	end,
 	activate = function(self, eff)
 		eff.insomnia_duration = 0
-		eff.sid = self:addTemporaryValue("sleep", eff.power)
+		eff.sid = self:addTemporaryValue("sleep", 1)
 	end,
 	deactivate = function(self, eff)
 		self:removeTemporaryValue("sleep", eff.sid)
@@ -2495,7 +2495,7 @@ newEffect{
 	end,
 	activate = function(self, eff)
 		eff.insomnia_duration = 0
-		eff.sid = self:addTemporaryValue("sleep", eff.power)
+		eff.sid = self:addTemporaryValue("sleep", 1)
 	end,
 	deactivate = function(self, eff)
 		self:removeTemporaryValue("sleep", eff.sid)
@@ -2552,14 +2552,14 @@ newEffect{
 	end,
 	activate = function(self, eff)
 		eff.insomnia_duration = 0
-		eff.sid = self:addTemporaryValue("sleep", eff.power)
+		eff.sid = self:addTemporaryValue("sleep", 1)
 	end,
 	deactivate = function(self, eff)
 		self:removeTemporaryValue("sleep", eff.sid)
 		if not self:attr("lucid_dreamer") and eff.insomnia_duration > 0 then
 			self:setEffect(self.EFF_INSOMNIA, eff.insomnia_duration, {power=eff.insomnia})
 		end
-		if not self:attr("sleep") and eff.waking > 0 then
+		if not self:attr("sleep") or self:attr("sleep") < 0  and eff.waking > 0 then
 			DamageType:get(DamageType.MIND).projector(eff.src or self, self.x, self.y, DamageType.MIND, eff.src:mindCrit(eff.waking))
 			game.level.map:particleEmitter(self.x, self.y, 1, "generic_discharge", {rm=180, rM=200, gm=100, gM=120, bm=30, bM=50, am=70, aM=180})
 		end
@@ -2591,7 +2591,7 @@ newEffect{
 	end,
 	on_timeout = function(self, eff)
 		-- Insomnia only ticks when we're awake
-		if self:attr("sleep") then
+		if self:attr("sleep") and self:attr("sleep") > 0 then
 			eff.dur = eff.dur + 1
 		else
 			-- Deincrement the power
diff --git a/game/modules/tome/data/timed_effects/other.lua b/game/modules/tome/data/timed_effects/other.lua
index 424a8d55214f1cfae87a4df83f6811c335b3e917..6bf32080815db027d65ac458271c638245490b4d 100644
--- a/game/modules/tome/data/timed_effects/other.lua
+++ b/game/modules/tome/data/timed_effects/other.lua
@@ -1772,7 +1772,7 @@ newEffect{
 
 			-- Apply Dreamscape hit
 			if eff.projections_killed > 0 then
-				eff.target:takeHit(eff.target.max_life/5 * eff.projections_killed, self)
+				eff.target:takeHit(eff.target.max_life/10 * eff.projections_killed, self)
 				eff.target:setEffect(eff.target.EFF_BRAINLOCKED, eff.projections_killed, {})
 			end
 		end)
diff --git a/game/modules/tome/data/zones/infinite-dungeon/objects.lua b/game/modules/tome/data/zones/infinite-dungeon/objects.lua
index f6a242eeeb047c24a506927a45905919df9e0dab..7ca0977e9f428e6a8b023b7af8f323becad03c2d 100644
--- a/game/modules/tome/data/zones/infinite-dungeon/objects.lua
+++ b/game/modules/tome/data/zones/infinite-dungeon/objects.lua
@@ -55,3 +55,51 @@ newEntity{
 		return {used=true, id=true, destroy=true}
 	end},
 }
+
+newEntity{
+	power_source = {technique=true},
+	unique = true,
+	type = "potion", subtype="potion",
+	name = "Antimagic Wyrm Bile Extract",
+	unided_name = "phial filled with slimy liquid",
+	level_range = {10, 50},
+	display = '!', color=colors.VIOLET, image="object/elixir_of_avoidance.png",
+	encumber = 0.4,
+	rarity = 150,
+	desc = [[This potent elixir extracted from a powerful wyrm can grant the power to repel arcane forces.]],
+	cost = 500,
+
+	use_simple = { name = "quaff the elixir", use = function(self, who, inven, item)
+		local d = require("engine.ui.Dialog"):yesnoLongPopup("Antimagic", [[Quaffing this potion will grant you access to the antimagic talents but at the cost of all access to runes, arcane items and spells.]], 500, function(ret)
+			if ret then
+				game.logSeen(who, "%s quaffs the %s!", who.name:capitalize(), self:getName())
+
+				who:removeObject(inven, item)
+
+				for tid, _ in pairs(who.sustain_talents) do
+					local t = who:getTalentFromId(tid)
+					if t.is_spell then who:forceUseTalent(tid, {ignore_energy=true}) end
+				end
+
+				-- Remove equipment
+				for inven_id, inven in pairs(who.inven) do
+					for i = #inven, 1, -1 do
+						local o = inven[i]
+						if o.power_source and o.power_source.arcane then
+							game.logPlayer(who, "You can not use your %s anymore, it is tainted by magic.", o:getName{do_color=true})
+							local o = who:removeObject(inven, i, true)
+							who:addObject(who.INVEN_INVEN, o)
+							who:sortInven()
+						end
+					end
+				end
+
+				who:attr("forbid_arcane", 1)
+				who:learnTalentType("wild-gift/antimagic", true)
+				who:learnTalent(who.T_RESOLVE, true, nil, {no_unlearn=true})
+			end
+		end)
+
+		return {used=true, id=true}
+	end},
+}