diff --git a/game/modules/tome/data/talents/chronomancy/spacetime-folding.lua b/game/modules/tome/data/talents/chronomancy/spacetime-folding.lua
index 4dce3c377e797fcd25cf404d2fadc75e9cdaee08..0f4a0372fab617f9506b52c14a642ded117ed151 100644
--- a/game/modules/tome/data/talents/chronomancy/spacetime-folding.lua
+++ b/game/modules/tome/data/talents/chronomancy/spacetime-folding.lua
@@ -36,7 +36,7 @@ makeWarpMine = function(self, t, x, y, type)
 		type = "temporal", id_by_type=true, unided_name = "trap",
 		display = '^', color=colors.BLUE, image = ("trap/chronomine_%s_0%d.png"):format(type == "toward" and "blue" or "red", rng.avg(1, 4, 3)),
 		shader = "shadow_simulacrum", shader_args = { color = {0.2, 0.2, 0.2}, base = 0.8, time_factor = 1500 },
-		dam = dam, t=t.id, power = power, dest_power = dest_power,
+		dam = dam, talent=t, power = power, dest_power = dest_power,
 		temporary = duration,
 		x = x, y = y, type = type,
 		summoner = self, summoner_gain_exp = true,
@@ -47,7 +47,7 @@ makeWarpMine = function(self, t, x, y, type)
 		end,
 		triggered = function(self, x, y, who)
 			-- Project our damage
-			self.summoner:project({type="hit",x=x,y=y, talent=self.t}, x, y, engine.DamageType.WARP, self.dam)
+			self.summoner:project({type="hit",x=x,y=y, talent=self.talent}, x, y, engine.DamageType.WARP, self.dam)
 			
 			-- Teleport?
 			if not who.dead then
@@ -111,7 +111,7 @@ newTalent{
 	points = 5,
 	mode = "passive",
 	require = chrono_req1,
-	getRange = function(self, t) return 10 end,
+	getRange = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9, 0.5, 0, 1)) end,
 	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 200, getParadoxSpellpower(self, t)) end,
 	getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 6, 10))) end, -- Duration of mines
 	trapPower = function(self,t) return math.max(1,self:combatScale(self:getTalentLevel(t) * self:getMag(15, true), 0, 0, 75, 75)) end, -- Used to determine detection and disarm power, about 75 at level 50
@@ -135,11 +135,12 @@ newTalent{
 		local detect = t.trapPower(self,t)*0.8
 		local disarm = t.trapPower(self,t)
 		local duration = t.getDuration(self, t)
-		return ([[Learn to lay Warp Mines in a radius of 1 out to a range of %d.
-		Warp Mines teleport targets that trigger them either toward you or away from you depending on the type of mine used and inflict %0.2f physical and %0.2f temporal (warp) damage.
-		The mines are hidden traps (%d detection and %d disarm power based on your Magic), last for %d turns, and share a four turn cooldown.
-		The damage caused by your Warp Mines will improve with your Spellpower.]]):
-		format(range, damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage), detect, disarm, duration) --I5
+		return ([[Learn to lay Warp Mines in a radius of 1.  Warp Mines teleport targets that trigger them either toward you or away from you depending on the type of mine used and inflict %0.2f physical and %0.2f temporal (warp) damage.
+		The mines are hidden traps (%d detection and %d disarm power based on your Magic), last for %d turns, and share a ten turn cooldown.
+		The damage caused by your Warp Mines will improve with your Spellpower.
+		Investing in this talent improves the range of all Spacetime Folding talents.
+		Current Range: %d]]):
+		format(damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage), detect, disarm, duration, range) --I5
 	end,
 }
 
@@ -147,11 +148,11 @@ newTalent{
 	name = "Warp Mine Toward",
 	type = {"chronomancy/other", 1},
 	points = 1,
-	cooldown = 4,
+	cooldown = 10,
 	paradox = function (self, t) return getParadoxCost(self, t, 10) end,
 	tactical = { ATTACKAREA = { TEMPORAL = 1, PHYSICAL = 1 }, CLOSEIN = 2  },
 	requires_target = true,
-	range = function(self, t) return self:callTalent(self.T_WARP_MINES, "getRange")end,
+	range = function(self, t) return self:callTalent(self.T_WARP_MINES, "getRange") or 5 end,
 	no_unlearn_last = true,
 	target = function(self, t) return {type="ball", nowarning=true, range=self:getTalentRange(t), radius=1, nolock=true, talent=t} end,	
 	action = function(self, t)
@@ -198,11 +199,11 @@ newTalent{
 	name = "Warp Mine Away",
 	type = {"chronomancy/other", 1},
 	points = 1,
-	cooldown = 4,
+	cooldown = 10,
 	paradox = function (self, t) return getParadoxCost(self, t, 10) end,
 	tactical = { ATTACKAREA = { TEMPORAL = 1, PHYSICAL = 1 }, ESCAPE = 2  },
 	requires_target = true,
-	range = function(self, t) return self:callTalent(self.T_WARP_MINES, "getRange") end,
+	range = function(self, t) return self:callTalent(self.T_WARP_MINES, "getRange") or 5 end,
 	no_unlearn_last = true,
 	target = function(self, t) return {type="ball", nowarning=true, range=self:getTalentRange(t), radius=1, nolock=true, talent=t} end,	
 	action = function(self, t)
@@ -252,12 +253,12 @@ newTalent{
 	points = 5,
 	paradox = function (self, t) return getParadoxCost(self, t, 12) end,
 	cooldown = 8,
-	tactical = { DISABLE = 2 },
-	range = 10,
+	tactical = { { ATTACKAREA = { TEMPORAL = 1, PHYSICAL = 1 }, DISABLE = 2 },
+	range = function(self, t) return self:callTalent(self.T_WARP_MINES, "getRange") or 5 end,
 	requires_target = true,
 	getDuration = function (self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 6, 10))) end,
 	getChance = function(self, t) return self:combatTalentLimit(t, 30, 10, 20) end,
-	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 200, getParadoxSpellpower(self, t)) end,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 150, getParadoxSpellpower(self, t)) end,
 	target = function(self, t)
 		return {type="hit", range=self:getTalentRange(t), nowarning=true, talent=t}
 	end,
@@ -272,8 +273,10 @@ newTalent{
 		
 		-- Tether values
 		local power = getParadoxSpellpower(self, t)
+		local dam = self:spellCrit(t.getDamage(self, t))
 		local dest_power = getParadoxSpellpower(self, t, 0.3)
-		
+		local range = self:getTalentRange(t)
+				
 		-- Store the old terrain
 		local oe = game.level.map(target.x, target.y, engine.Map.TERRAIN)
 		if not oe or oe:attr("temporary") then return true end
@@ -285,7 +288,8 @@ newTalent{
 			display = '&', color=colors.LIGHT_BLUE,
 			temporary = t.getDuration(self, t), 
 			power = power, dest_power = dest_power, chance = t.getChance(self, t),
-			x = x, y = y, target = target,
+			x = x, y = y, target = target, 
+			talent = t, range = range, dam =dam,
 			summoner = self, summoner_gain_exp = true,
 			canAct = false,
 			energy = {value=0},
@@ -293,8 +297,15 @@ newTalent{
 				self:useEnergy()
 				self.temporary = self.temporary - 1
 				
-				-- Teleport
 				if not self.target.dead and (game.level and game.level:hasEntity(self.target)) then
+					-- Warp Beam
+					local tg = {type="beam", start_x=self.x, start_y=self.y, talent=talent, range=self.range}
+					self.summoner:project(tg, self.target.x, self.target.y, engine.DamageType.WARP, self.dam)
+					
+					game.level.map:particleEmitter(self.x, self.y, math.max(math.abs(self.target.x-self.x), math.abs(self.target.y-self.y)), "temporal_lightning", {tx=self.target.x-self.x, ty=self.target.y-self.y})
+					game:playSoundNear(self, "talents/lightning")
+					
+					-- Teleport
 					local hit = self.summoner == self.target or (self.summoner:checkHit(self.power, self.target:combatSpellResist() + (self.target:attr("continuum_destabilization") or 0), 0, 95) and self.target:canBe("teleport"))
 					if hit and rng.percent(self.chance * core.fov.distance(self.x, self.y, self.target.x, self.target.y)) then	
 						game.level.map:particleEmitter(self.target.x, self.target.y, 1, "temporal_teleport")
@@ -315,7 +326,7 @@ newTalent{
 				end
 				
 				-- End the effect?
-				if self.temporary <= 0 then
+				if self.temporary <= 0 or self.target.dead then
 					game.level.map(self.x, self.y, engine.Map.TERRAIN, self.old_feat)
 					game.nicer_tiles:updateAround(game.level, self.target.x, self.target.y)
 					game.level:removeEntity(self)
@@ -335,8 +346,11 @@ newTalent{
 	info = function(self, t)
 		local duration = t.getDuration(self, t)
 		local chance = t.getChance(self, t)
-		return ([[Tethers the target to the location for %d turns.  For each tile the target moves away from the target location it has a %d%% chance each turn of being teleported back to the tether.]])
-		:format(duration, chance)
+		local damage = t.getDamage(self, t)/2
+		return ([[Tethers the target to the location for %d turns.  Each turn the tether will inflict %0.2f physical and %0.2f temporal (warp) damage to all targets between itself and the target.
+		For each tile the target moves away from the tether it has a %d%% chance each turn of being teleported back.
+		The damage will scale with your Spellpower.]])
+		:format(duration, damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage), chance)
 	end,
 }
 
@@ -348,7 +362,7 @@ newTalent{
 	paradox = function (self, t) return getParadoxCost(self, t, 20) end,
 	cooldown = 12,
 	tactical = { DISABLE = 2 },
-	range = 10,
+	range = function(self, t) return self:callTalent(self.T_WARP_MINES, "getRange") or 5 end,
 	radius = function(self, t) return math.floor(self:combatTalentScale(t, 2.5, 4.5)) end,
 	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 230, getParadoxSpellpower(self, t)) end,
 	getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 6, 10))) end,
@@ -403,21 +417,24 @@ newTalent{
 	require = chrono_req4,
 	points = 5,
 	paradox = function (self, t) return getParadoxCost(self, t, 12) end,
-	cooldown = 6,
+	cooldown = 10,
 	tactical = { ESCAPE = 2 },
-	range = 0,
+	range = function(self, t) return self:callTalent(self.T_WARP_MINES, "getRange") or 5 end,
 	radius = function(self, t) return math.floor(self:combatTalentScale(t, 2.5, 5.5)) end,
 	getTeleport = function(self, t) return math.floor(self:combatTalentScale(t, 8, 16)) end,
 	target = function(self, t)
-		return {type="ball", range=0, radius=self:getTalentRadius(t), selffire=false, talent=t}
+		return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false, talent=t}
 	end,
 	requires_target = true,
 	direct_hit = true,
 	action = function(self, t)
 		local tg = self:getTalentTarget(t)
+		local x, y = self:getTarget(tg)
+		if not x or not y then return nil end
+		local _ _, _, _, x, y = self:canProject(tg, x, y)
 		local hit = false
 
-		self:project(tg, self.x, self.y, function(px, py)
+		self:project(tg, x, y, function(px, py)
 			local target = game.level.map(px, py, Map.ACTOR)
 			if not target or target == self then return end
 			game.level.map:particleEmitter(target.x, target.y, 1, "temporal_teleport")
@@ -449,7 +466,7 @@ newTalent{
 	info = function(self, t)
 		local radius = self:getTalentRadius(t)
 		local range = t.getTeleport(self, t)
-		return ([[Randomly teleports all targets within a radius of %d around you.  Targets will be teleported between %d and %d tiles from their current location.
+		return ([[Randomly teleports all targets within a radius of %d.  Targets will be teleported between %d and %d tiles from their current location.
 		If no targets are teleported the cooldown will be halved.
 		The chance of teleportion will scale with your Spellpower.]]):format(radius, range / 2, range)
 	end,