diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/Builder.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/Builder.java
index 103ccd220..9f63a69c4 100644
--- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/Builder.java
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/Builder.java
@@ -39,6 +39,15 @@ public abstract class Builder {
 	//builders take a list of rooms and returns them as a connected map
 	//returns null on failure
 	public abstract ArrayList<Room> build(ArrayList<Room> rooms);
+	
+	protected static void findNeighbours(ArrayList<Room> rooms){
+		Room[] ra = rooms.toArray( new Room[0] );
+		for (int i=0; i < ra.length-1; i++) {
+			for (int j=i+1; j < ra.length; j++) {
+				ra[i].addNeigbour( ra[j] );
+			}
+		}
+	}
 
 	//returns a rectangle representing the maximum amount of free space from a specific start point
 	protected static Rect findFreeSpace(Point start, ArrayList<Room> collision, int maxSize){
@@ -125,6 +134,14 @@ public abstract class Builder {
 	}
 
 	private static final double A = 180 / Math.PI;
+	
+	//returns the angle in degrees made by the centerpoints of 2 rooms, with 0 being straight up.
+	protected static float angleBetweenRooms( Room from, Room to){
+		PointF fromCenter = new PointF((from.left + from.right)/2f, (from.top + from.bottom)/2f);
+		PointF toCenter = new PointF((to.left + to.right)/2f, (to.top + to.bottom)/2f);
+		double m = (toCenter.y - fromCenter.y)/(toCenter.x - fromCenter.x);
+		return (float)(A*(Math.atan(m) + Math.PI/2f));
+	}
 
 	//Attempts to place a room such that the angle between the center of the previous room
 	// and it matches the given angle ([0-360), where 0 is straight up) as closely as possible.
@@ -219,9 +236,7 @@ public abstract class Builder {
 
 		//attempt to connect, return the result angle if successful.
 		if (next.connect(prev)){
-			PointF nextCenter = new PointF((next.left + next.right)/2f, (next.top + next.bottom)/2f);
-			double trueM = (nextCenter.y - prevCenter.y)/(nextCenter.x - prevCenter.x);
-			return (float)(A*(Math.atan(trueM) + Math.PI/2f));
+			return angleBetweenRooms(prev, next);
 		} else {
 			return -1;
 		}
diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/LineBuilder.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/LineBuilder.java
index f1e034d78..f10d4c6c0 100644
--- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/LineBuilder.java
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/LineBuilder.java
@@ -26,9 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.ShopRoom;
 import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.standard.EntranceRoom;
 import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.standard.ExitRoom;
 import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.tunnel.TunnelRoom;
-import com.watabou.utils.Point;
 import com.watabou.utils.Random;
-import com.watabou.utils.Rect;
 
 import java.util.ArrayList;
 
@@ -42,7 +40,7 @@ public class LineBuilder extends Builder {
 		return this;
 	}
 
-	//path length is a percentage of total path rooms
+	//path length is the percentage of pathable rooms that are on the path
 	private float pathLength = 0.2f;
 	//The chance weights for extra rooms to be added to the path
 	private float[] pathLenJitterChances = new float[]{1, 1};
@@ -61,6 +59,13 @@ public class LineBuilder extends Builder {
 		branchTunnelChances = branch;
 		return this;
 	}
+	
+	private float extraConnectionChance = 0.1f;
+	
+	public LineBuilder setExtraConnectionChance( float chance ){
+		extraConnectionChance = chance;
+		return this;
+	}
 
 	@Override
 	public ArrayList<Room> build(ArrayList<Room> rooms) {
@@ -174,6 +179,17 @@ public class LineBuilder extends Builder {
 			i++;
 		}
 		
+		findNeighbours(rooms);
+		
+		for (Room r : rooms){
+			for (Room n : r.neigbours){
+				if (!n.connected.containsKey(r)
+						&& Random.Float() < extraConnectionChance){
+					r.connect(n);
+				}
+			}
+		}
+		
 		return rooms;
 	
 	}