diff --git a/bin/de/deadlocker8/roadgame/logic/Board.class b/bin/de/deadlocker8/roadgame/logic/Board.class
index d98dedf6e198e2131c10ee4bbacd6e4483d7784a..d769c1b96a21bf4de46407cb93bfce16230e4b4f 100644
Binary files a/bin/de/deadlocker8/roadgame/logic/Board.class and b/bin/de/deadlocker8/roadgame/logic/Board.class differ
diff --git a/bin/de/deadlocker8/roadgame/logic/CenterType.class b/bin/de/deadlocker8/roadgame/logic/CenterType.class
index b31e76b38449f2fe3fb3f95b2ff8225b7d0f2c11..65050bad771b43ca35e05a7554646de24ce2d847 100644
Binary files a/bin/de/deadlocker8/roadgame/logic/CenterType.class and b/bin/de/deadlocker8/roadgame/logic/CenterType.class differ
diff --git a/bin/de/deadlocker8/roadgame/logic/EdgeType.class b/bin/de/deadlocker8/roadgame/logic/EdgeType.class
index 9f4e1e0a5de4ad1283c3f0f788cba96bbce0f029..ca53f7a1949f36faf120b94122eb729e723e46fe 100644
Binary files a/bin/de/deadlocker8/roadgame/logic/EdgeType.class and b/bin/de/deadlocker8/roadgame/logic/EdgeType.class differ
diff --git a/bin/de/deadlocker8/roadgame/logic/ScorePosition.class b/bin/de/deadlocker8/roadgame/logic/ScorePosition.class
new file mode 100644
index 0000000000000000000000000000000000000000..1dfdede1104449f8c5cbf5eaa8b4d5eafc142e8a
Binary files /dev/null and b/bin/de/deadlocker8/roadgame/logic/ScorePosition.class differ
diff --git a/bin/de/deadlocker8/roadgame/logic/Tile.class b/bin/de/deadlocker8/roadgame/logic/Tile.class
index 353ec31f90ee61f0bfa879869a966057cf9e4ee5..470d138b908273e7ebc9045cbd0b07ca0aef9c6a 100644
Binary files a/bin/de/deadlocker8/roadgame/logic/Tile.class and b/bin/de/deadlocker8/roadgame/logic/Tile.class differ
diff --git a/bin/de/deadlocker8/roadgame/logic/TileType.class b/bin/de/deadlocker8/roadgame/logic/TileType.class
index 7c39c14ec9f44df69a4dffa6ebc4cfbda6edc71f..cdf5661d7657148b9499a7465e5323098ab47678 100644
Binary files a/bin/de/deadlocker8/roadgame/logic/TileType.class and b/bin/de/deadlocker8/roadgame/logic/TileType.class differ
diff --git a/bin/de/deadlocker8/roadgame/tilepacks/TilePackOneTile.class b/bin/de/deadlocker8/roadgame/tilepacks/TilePackOneTile.class
new file mode 100644
index 0000000000000000000000000000000000000000..3ba3204aaf69ea918c8d3f0f55a53162629f1077
Binary files /dev/null and b/bin/de/deadlocker8/roadgame/tilepacks/TilePackOneTile.class differ
diff --git a/bin/de/deadlocker8/roadgame/tilepacks/TilePackTest2.class b/bin/de/deadlocker8/roadgame/tilepacks/TilePackTest2.class
index 0fc0a42fa46fc5c2b515fc7e081a374a02c49833..3d4179dd775e273a740f495f86066a86bd6f3ff5 100644
Binary files a/bin/de/deadlocker8/roadgame/tilepacks/TilePackTest2.class and b/bin/de/deadlocker8/roadgame/tilepacks/TilePackTest2.class differ
diff --git a/bin/de/deadlocker8/roadgame/ui/Controller.class b/bin/de/deadlocker8/roadgame/ui/Controller.class
index 6e265d0979e69ea2319d25d6a4e0a313b0dfb1d6..6ca952b4bd98b496615477761e4006d0ce8d23c6 100644
Binary files a/bin/de/deadlocker8/roadgame/ui/Controller.class and b/bin/de/deadlocker8/roadgame/ui/Controller.class differ
diff --git a/bin/de/deadlocker8/roadgame/ui/Scoring.class b/bin/de/deadlocker8/roadgame/ui/Scoring.class
new file mode 100644
index 0000000000000000000000000000000000000000..13872ad5e44dc7305784239d595934a8a23e0647
Binary files /dev/null and b/bin/de/deadlocker8/roadgame/ui/Scoring.class differ
diff --git a/src/de/deadlocker8/roadgame/logic/Board.java b/src/de/deadlocker8/roadgame/logic/Board.java
index f95fe9dc96c6fb424827a40e02ace549dbff1bec..92b6647e4a5f381895c91946ac87a12c8a03619c 100644
--- a/src/de/deadlocker8/roadgame/logic/Board.java
+++ b/src/de/deadlocker8/roadgame/logic/Board.java
@@ -11,24 +11,24 @@ public class Board
 	private ArrayList<Tile> tiles;
 
 	public Board(TilePack tilePack)
-	{	
+	{
 		this.tilePack = tilePack;
-		this.tiles = new ArrayList<>();			
+		this.tiles = new ArrayList<>();
 		initBoard();
 	}
-	
+
 	private void initBoard()
-	{		
+	{
 		TileType tileType = getRandomTile();
 		if(tileType != null)
-		{	
+		{
 			Tile startTile = new Tile(tileType);
 			startTile.setPosition(new Point2D(0, 0));
-			
-			tiles.add(startTile);	
-		}	
+
+			tiles.add(startTile);
+		}
 	}
-	
+
 	public TilePack getTilePack()
 	{
 		return tilePack;
@@ -38,7 +38,7 @@ public class Board
 	{
 		return tiles;
 	}
-	
+
 	public Tile getTile(int x, int y)
 	{
 		for(Tile currentTile : tiles)
@@ -48,15 +48,15 @@ public class Board
 				return currentTile;
 			}
 		}
-		
+
 		return null;
 	}
-	
+
 	public TileType getRandomTile()
 	{
 		return tilePack.getRandomTile();
 	}
-	
+
 	public boolean containsTileAtPosition(int x, int y)
 	{
 		for(Tile currentTile : tiles)
@@ -66,108 +66,144 @@ public class Board
 				return true;
 			}
 		}
-		
+
 		return false;
 	}
-	
+
 	public ArrayList<Point2D> getFreeEdges(Tile tile, Tile playerTile)
 	{
 		ArrayList<Point2D> freeEdges = new ArrayList<>();
-		
+
 		int x = (int)tile.getPosition().getX();
 		int y = (int)tile.getPosition().getY();
-		
-		//North
-		if(!containsTileAtPosition(x, y-1))
-		{	
-			if(isCrossCheckValid(playerTile, x, y-1))
-			{
-				freeEdges.add(new Point2D(x, y-1));
-			}			
+
+		// North
+		if(!containsTileAtPosition(x, y - 1))
+		{
+			if(isCrossCheckValid(playerTile, x, y - 1))
+			{
+				freeEdges.add(new Point2D(x, y - 1));
+			}
 		}
-		
-		//East
-		if(!containsTileAtPosition(x+1, y))
+
+		// East
+		if(!containsTileAtPosition(x + 1, y))
 		{
-			if(isCrossCheckValid(playerTile, x+1, y))
+			if(isCrossCheckValid(playerTile, x + 1, y))
 			{
-				freeEdges.add(new Point2D(x+1, y));
-			}		
+				freeEdges.add(new Point2D(x + 1, y));
+			}
 		}
-				
-		//South
-		if(!containsTileAtPosition(x, y+1))
-		{	
-			if(isCrossCheckValid(playerTile, x, y+1))
-			{						
-				freeEdges.add(new Point2D(x, y+1));
-			}			
+
+		// South
+		if(!containsTileAtPosition(x, y + 1))
+		{
+			if(isCrossCheckValid(playerTile, x, y + 1))
+			{
+				freeEdges.add(new Point2D(x, y + 1));
+			}
 		}
-		
-		//West
-		if(!containsTileAtPosition(x-1, y))
+
+		// West
+		if(!containsTileAtPosition(x - 1, y))
 		{
-			if(isCrossCheckValid(playerTile, x-1, y))
+			if(isCrossCheckValid(playerTile, x - 1, y))
 			{
-				freeEdges.add(new Point2D(x-1, y));
-			}		
+				freeEdges.add(new Point2D(x - 1, y));
+			}
 		}
-		
+
 		return freeEdges;
 	}
-	
+
 	private boolean isCrossCheckValid(Tile tile, int x, int y)
 	{
-		//North
-		if(containsTileAtPosition(x, y-1))
-		{			
-			if(!tile.getN().equals(getTile(x, y-1).getS()))
+		// North
+		if(containsTileAtPosition(x, y - 1))
+		{
+			Tile nextTile = getTile(x, y - 1);
+
+			if(tile.getN().equals(EdgeType.CASTLE) || tile.getN().equals(EdgeType.CASTLE_END))
+			{
+				if(!(nextTile.getS().equals(EdgeType.CASTLE_END) || nextTile.getS().equals(EdgeType.CASTLE)))
+				{
+					return false;
+				}
+			}
+			else if(!tile.getN().equals(nextTile.getS()))
 			{
 				return false;
-			}			
+			}
 		}
-		
-		//East
-		if(containsTileAtPosition(x+1, y))
+
+		// East
+		if(containsTileAtPosition(x + 1, y))
 		{
-			if(!tile.getE().equals(getTile(x+1, y).getW()))
+			Tile nextTile = getTile(x + 1, y);
+
+			if(tile.getE().equals(EdgeType.CASTLE) || tile.getE().equals(EdgeType.CASTLE_END))
+			{
+				if(!(nextTile.getW().equals(EdgeType.CASTLE_END) || nextTile.getW().equals(EdgeType.CASTLE)))
+				{
+					return false;
+				}
+			}
+			else if(!tile.getE().equals(nextTile.getW()))
 			{
 				return false;
-			}	
+			}
 		}
-				
-		//South
-		if(containsTileAtPosition(x, y+1))
+
+		// South
+		if(containsTileAtPosition(x, y + 1))
 		{
-			if(!tile.getS().equals(getTile(x, y+1).getN()))
+			Tile nextTile = getTile(x, y + 1);
+
+			if(tile.getS().equals(EdgeType.CASTLE) || tile.getS().equals(EdgeType.CASTLE_END))
+			{
+				if(!(nextTile.getN().equals(EdgeType.CASTLE_END) || nextTile.getN().equals(EdgeType.CASTLE)))
+				{
+					return false;
+				}
+			}
+			else if(!tile.getS().equals(nextTile.getN()))
 			{
 				return false;
-			}	
+			}
 		}
-		
-		//West
-		if(containsTileAtPosition(x-1, y))
+
+		// West
+		if(containsTileAtPosition(x - 1, y))
 		{
-			if(!tile.getW().equals(getTile(x-1, y).getE()))
+			Tile nextTile = getTile(x - 1, y);
+
+			if(tile.getW().equals(EdgeType.CASTLE) || tile.getW().equals(EdgeType.CASTLE_END))
+			{
+				if(!(nextTile.getE().equals(EdgeType.CASTLE_END) || nextTile.getE().equals(EdgeType.CASTLE)))
+				{
+					return false;
+				}
+			}
+			else if(!tile.getW().equals(nextTile.getE()))
 			{
 				return false;
-			}	
+			}
 		}
-		
+
 		return true;
 	}
-	
+
 	public ArrayList<Point2D> getPossibleLocations(Tile tile)
 	{
 		ArrayList<Point2D> possibleLocations = new ArrayList<>();
-		
+
 		for(Tile currentTile : tiles)
 		{
 			possibleLocations.addAll(getFreeEdges(currentTile, tile));
-		}		
-		
+		}
+
 		return possibleLocations;
-	}	
+	}
 
 	public boolean tileCanBePlaced(Tile tile)
 	{
@@ -199,40 +235,40 @@ public class Board
 		}
 		return true;
 	}
-	
+
 	public Dimension getDimension()
 	{
 		int minX = 0;
 		int maxX = 0;
 		int minY = 0;
 		int maxY = 0;
-		
+
 		for(Tile currentTile : tiles)
 		{
 			if((int)currentTile.getPosition().getX() < minX)
 			{
 				minX = (int)currentTile.getPosition().getX();
 			}
-			
+
 			if((int)currentTile.getPosition().getX() > maxX)
 			{
 				maxX = (int)currentTile.getPosition().getX();
 			}
-			
+
 			if((int)currentTile.getPosition().getY() < minY)
 			{
 				minY = (int)currentTile.getPosition().getY();
 			}
-			
+
 			if((int)currentTile.getPosition().getY() > maxY)
 			{
 				maxY = (int)currentTile.getPosition().getY();
 			}
-		}	
-		
-		return new Dimension(minX, maxX, minY, maxY);		
+		}
+
+		return new Dimension(minX, maxX, minY, maxY);
 	}
-	
+
 	public void addTile(Tile tile)
 	{
 		tiles.add(tile);
diff --git a/src/de/deadlocker8/roadgame/logic/CenterType.java b/src/de/deadlocker8/roadgame/logic/CenterType.java
index 68afdd92ea85807018409b2bdfe5495f3e76b4ce..502c26ae5c91e49d9531a3c88f61fd1ecb14ac32 100644
--- a/src/de/deadlocker8/roadgame/logic/CenterType.java
+++ b/src/de/deadlocker8/roadgame/logic/CenterType.java
@@ -2,5 +2,5 @@ package de.deadlocker8.roadgame.logic;
 
 public enum CenterType
 {
-	EMPTY, CASTLE, CASTLE_TRIANGLE, CHURCH, ROAD
+	EMPTY, CASTLE, CASTLE_TRIANGLE, CHURCH, ROAD, JUNCTION
 }
\ No newline at end of file
diff --git a/src/de/deadlocker8/roadgame/logic/EdgeType.java b/src/de/deadlocker8/roadgame/logic/EdgeType.java
index 6f049c03c63dd24f5d5667cfa348890cbdafa9d7..c3e4f85ef7a8a1c8651bd235e856c38d30ee3bfa 100644
--- a/src/de/deadlocker8/roadgame/logic/EdgeType.java
+++ b/src/de/deadlocker8/roadgame/logic/EdgeType.java
@@ -2,5 +2,5 @@ package de.deadlocker8.roadgame.logic;
 
 public enum EdgeType
 {
-	GRASS, ROAD, CASTLE
+	GRASS, ROAD, CASTLE, CASTLE_END
 }
\ No newline at end of file
diff --git a/src/de/deadlocker8/roadgame/logic/ScorePosition.java b/src/de/deadlocker8/roadgame/logic/ScorePosition.java
new file mode 100644
index 0000000000000000000000000000000000000000..9c6e337e5feb5f735394419889e23397425d06ce
--- /dev/null
+++ b/src/de/deadlocker8/roadgame/logic/ScorePosition.java
@@ -0,0 +1,6 @@
+package de.deadlocker8.roadgame.logic;
+
+public enum ScorePosition
+{
+	NORTH, EAST, SOUTH, WEST, CENTER
+}
\ No newline at end of file
diff --git a/src/de/deadlocker8/roadgame/logic/Textures.java b/src/de/deadlocker8/roadgame/logic/Textures.java
index 567485195e7f2108780692030a56c45d60ad29aa..c52bf9a88bda32806e41be0abd48fa186bda3a4a 100644
--- a/src/de/deadlocker8/roadgame/logic/Textures.java
+++ b/src/de/deadlocker8/roadgame/logic/Textures.java
@@ -62,5 +62,5 @@ public class Textures
 	public Image getImageCenterRoad()
 	{
 		return imageCenterRoad;
-	}		
+	}	
 }
\ No newline at end of file
diff --git a/src/de/deadlocker8/roadgame/logic/Tile.java b/src/de/deadlocker8/roadgame/logic/Tile.java
index a7a52bccc3fa19536ce1ddf9ea8157fa1132b331..af60820e5bc010b94e0a887b5e830e27ec915651 100644
--- a/src/de/deadlocker8/roadgame/logic/Tile.java
+++ b/src/de/deadlocker8/roadgame/logic/Tile.java
@@ -4,35 +4,30 @@ import javafx.geometry.Point2D;
 
 public class Tile
 {
+	private TileType type;
 	private EdgeType N;
 	private EdgeType E;
 	private EdgeType S;
 	private EdgeType W;	
 	private CenterType C;
 	private Point2D position;
+	//TODO use
+	private boolean marked;
 	
-	public Tile(EdgeType N, EdgeType E, EdgeType S, EdgeType W, CenterType C, int x, int y)
+	public Tile(TileType type, int x, int y)
 	{		
-		this.N = N;
-		this.E = E;
-		this.S = S;
-		this.W = W;
-		this.C = C;
+		this.type = type;
+		this.N = type.getN();
+		this.E = type.getE();
+		this.S = type.getS();
+		this.W = type.getW();
+		this.C = type.getC();
 		this.position = new Point2D(x, y);
 	}
 	
-	public Tile(EdgeType N, EdgeType E, EdgeType S, EdgeType W, CenterType C)
-	{		
-		this.N = N;
-		this.E = E;
-		this.S = S;
-		this.W = W;
-		this.C = C;
-		this.position = null;
-	}	
-	
 	public Tile(TileType type)
 	{		
+		this.type = type;
 		this.N = type.getN();
 		this.E = type.getE();
 		this.S = type.getS();
@@ -65,6 +60,11 @@ public class Tile
 	{
 		return C;
 	}
+	
+	public TileType getType()
+	{
+		return type;
+	}
 
 	public Point2D getPosition()
 	{
diff --git a/src/de/deadlocker8/roadgame/logic/TileType.java b/src/de/deadlocker8/roadgame/logic/TileType.java
index 3ce5f9951fbf03d627d05293167a81e2580e7909..8e42011af8641c3e7e922f7ac029e555fdcfaff9 100644
--- a/src/de/deadlocker8/roadgame/logic/TileType.java
+++ b/src/de/deadlocker8/roadgame/logic/TileType.java
@@ -3,11 +3,11 @@ package de.deadlocker8.roadgame.logic;
 public enum TileType
 {
 	//only roads
-	ROAD_END(EdgeType.ROAD, EdgeType.GRASS, EdgeType.GRASS, EdgeType.GRASS, CenterType.EMPTY),
+	ROAD_END(EdgeType.ROAD, EdgeType.GRASS, EdgeType.GRASS, EdgeType.GRASS, CenterType.JUNCTION),
 	ROAD_STRAIGHT(EdgeType.ROAD, EdgeType.GRASS, EdgeType.ROAD, EdgeType.GRASS, CenterType.EMPTY),
 	ROAD_CURVE(EdgeType.ROAD, EdgeType.ROAD, EdgeType.GRASS, EdgeType.GRASS, CenterType.EMPTY),
-	ROAD_T_JUNCTION(EdgeType.ROAD, EdgeType.ROAD, EdgeType.ROAD, EdgeType.GRASS, CenterType.EMPTY),			
-	ROAD_X_JUNCTION(EdgeType.ROAD, EdgeType.ROAD, EdgeType.ROAD, EdgeType.ROAD, CenterType.EMPTY),	
+	ROAD_T_JUNCTION(EdgeType.ROAD, EdgeType.ROAD, EdgeType.ROAD, EdgeType.GRASS, CenterType.JUNCTION),			
+	ROAD_X_JUNCTION(EdgeType.ROAD, EdgeType.ROAD, EdgeType.ROAD, EdgeType.ROAD, CenterType.JUNCTION),	
 	
 	//roads with churches
 	ROAD_END_CHURCH(EdgeType.ROAD, EdgeType.GRASS, EdgeType.GRASS, EdgeType.GRASS, CenterType.CHURCH),
@@ -17,11 +17,11 @@ public enum TileType
 	ROAD_X_JUNCTION_CHURCH(EdgeType.ROAD, EdgeType.ROAD, EdgeType.ROAD, EdgeType.ROAD, CenterType.CHURCH),	
 	
 	//single castles
-	CASTLE_SINGLE(EdgeType.CASTLE, EdgeType.GRASS, EdgeType.GRASS, EdgeType.GRASS,CenterType.EMPTY),
-	CASTLE_TWO_SINGLE_OPPOSITE(EdgeType.CASTLE, EdgeType.GRASS, EdgeType.CASTLE, EdgeType.GRASS, CenterType.EMPTY),
-	CASTLE_TWO_SINGLE_NEIGHBOR(EdgeType.CASTLE, EdgeType.CASTLE, EdgeType.GRASS, EdgeType.GRASS, CenterType.EMPTY),
-	CASTLE_THREE_SINGLE(EdgeType.CASTLE, EdgeType.CASTLE, EdgeType.CASTLE, EdgeType.GRASS, CenterType.EMPTY),
-	CASTLE_FOUR_SINGLE(EdgeType.CASTLE, EdgeType.CASTLE, EdgeType.CASTLE, EdgeType.CASTLE, CenterType.EMPTY),
+	CASTLE_SINGLE(EdgeType.CASTLE_END, EdgeType.GRASS, EdgeType.GRASS, EdgeType.GRASS,CenterType.EMPTY),
+	CASTLE_TWO_SINGLE_OPPOSITE(EdgeType.CASTLE_END, EdgeType.GRASS, EdgeType.CASTLE_END, EdgeType.GRASS, CenterType.EMPTY),
+	CASTLE_TWO_SINGLE_NEIGHBOR(EdgeType.CASTLE_END, EdgeType.CASTLE_END, EdgeType.GRASS, EdgeType.GRASS, CenterType.EMPTY),
+	CASTLE_THREE_SINGLE(EdgeType.CASTLE_END, EdgeType.CASTLE_END, EdgeType.CASTLE_END, EdgeType.GRASS, CenterType.EMPTY),
+	CASTLE_FOUR_SINGLE(EdgeType.CASTLE_END, EdgeType.CASTLE_END, EdgeType.CASTLE_END, EdgeType.CASTLE_END, CenterType.EMPTY),
 	
 	//special castles
 	CASTLE_TRIANGLE(EdgeType.CASTLE, EdgeType.CASTLE, EdgeType.GRASS, EdgeType.GRASS, CenterType.CASTLE_TRIANGLE),
@@ -30,16 +30,16 @@ public enum TileType
 	CASTLE_U(EdgeType.CASTLE, EdgeType.CASTLE, EdgeType.CASTLE, EdgeType.GRASS, CenterType.CASTLE),	
 	
 	//single castles with roads
-	CASTLE_SINGLE_ROAD_STRAIGHT(EdgeType.CASTLE, EdgeType.ROAD, EdgeType.GRASS, EdgeType.ROAD,CenterType.EMPTY),
-	CASTLE_SINGLE_ROAD_CURVE_RIGHT(EdgeType.CASTLE, EdgeType.ROAD, EdgeType.ROAD, EdgeType.GRASS,CenterType.EMPTY),
-	CASTLE_SINGLE_ROAD_CURVE_LEFT(EdgeType.CASTLE, EdgeType.GRASS, EdgeType.ROAD, EdgeType.ROAD,CenterType.EMPTY),
-	CASTLE_SINGLE_ROAD_T_JUNCTION(EdgeType.CASTLE, EdgeType.ROAD, EdgeType.ROAD, EdgeType.ROAD,CenterType.EMPTY),
-	CASTLE_SINGLE_ROAD_END_IN_CASTLE(EdgeType.CASTLE, EdgeType.GRASS, EdgeType.ROAD, EdgeType.GRASS, CenterType.ROAD),
-	CASTLE_SINGLE_ROAD_CURVE_RIGHT_END_IN_CASTLE(EdgeType.CASTLE, EdgeType.ROAD, EdgeType.GRASS, EdgeType.GRASS,CenterType.ROAD),
-	CASTLE_SINGLE_ROAD_CURVE_LEFT_END_IN_CASTLE(EdgeType.CASTLE, EdgeType.GRASS, EdgeType.GRASS, EdgeType.ROAD,CenterType.ROAD),
-	CASTLE_TWO_SINGLE_OPPOSITE_ROAD_STRAIGHT(EdgeType.CASTLE, EdgeType.ROAD, EdgeType.CASTLE, EdgeType.ROAD, CenterType.EMPTY),	
-	CASTLE_TWO_SINGLE_NEIGHBOR_ROAD_CURVE(EdgeType.CASTLE, EdgeType.CASTLE, EdgeType.ROAD, EdgeType.ROAD, CenterType.EMPTY),
-	CASTLE_THREE_SINGLE_ROAD_END(EdgeType.CASTLE, EdgeType.CASTLE, EdgeType.CASTLE, EdgeType.ROAD, CenterType.EMPTY),
+	CASTLE_SINGLE_ROAD_STRAIGHT(EdgeType.CASTLE_END, EdgeType.ROAD, EdgeType.GRASS, EdgeType.ROAD, CenterType.EMPTY),
+	CASTLE_SINGLE_ROAD_CURVE_RIGHT(EdgeType.CASTLE_END, EdgeType.ROAD, EdgeType.ROAD, EdgeType.GRASS, CenterType.EMPTY),
+	CASTLE_SINGLE_ROAD_CURVE_LEFT(EdgeType.CASTLE_END, EdgeType.GRASS, EdgeType.ROAD, EdgeType.ROAD, CenterType.EMPTY),
+	CASTLE_SINGLE_ROAD_T_JUNCTION(EdgeType.CASTLE_END, EdgeType.ROAD, EdgeType.ROAD, EdgeType.ROAD, CenterType.JUNCTION),
+	CASTLE_SINGLE_ROAD_END_IN_CASTLE(EdgeType.CASTLE_END, EdgeType.GRASS, EdgeType.ROAD, EdgeType.GRASS, CenterType.JUNCTION),
+	CASTLE_SINGLE_ROAD_CURVE_RIGHT_END_IN_CASTLE(EdgeType.CASTLE_END, EdgeType.ROAD, EdgeType.GRASS, EdgeType.GRASS, CenterType.ROAD),
+	CASTLE_SINGLE_ROAD_CURVE_LEFT_END_IN_CASTLE(EdgeType.CASTLE_END, EdgeType.GRASS, EdgeType.GRASS, EdgeType.ROAD, CenterType.ROAD),
+	CASTLE_TWO_SINGLE_OPPOSITE_ROAD_STRAIGHT(EdgeType.CASTLE_END, EdgeType.ROAD, EdgeType.CASTLE_END, EdgeType.ROAD, CenterType.EMPTY),	
+	CASTLE_TWO_SINGLE_NEIGHBOR_ROAD_CURVE(EdgeType.CASTLE_END, EdgeType.CASTLE_END, EdgeType.ROAD, EdgeType.ROAD, CenterType.EMPTY),
+	CASTLE_THREE_SINGLE_ROAD_END(EdgeType.CASTLE_END, EdgeType.CASTLE_END, EdgeType.CASTLE_END, EdgeType.ROAD, CenterType.JUNCTION),
 	
 	//special castles with roads
 	CASTLE_TRIANGLE_ROAD_CURVE(EdgeType.CASTLE, EdgeType.CASTLE, EdgeType.ROAD, EdgeType.ROAD, CenterType.CASTLE_TRIANGLE),
diff --git a/src/de/deadlocker8/roadgame/tilepacks/TilePackOneTile.java b/src/de/deadlocker8/roadgame/tilepacks/TilePackOneTile.java
new file mode 100644
index 0000000000000000000000000000000000000000..9f3a1ed2b93dbdcdef303ebc0b63735428a8bfc5
--- /dev/null
+++ b/src/de/deadlocker8/roadgame/tilepacks/TilePackOneTile.java
@@ -0,0 +1,16 @@
+package de.deadlocker8.roadgame.tilepacks;
+
+import java.util.HashMap;
+
+import de.deadlocker8.roadgame.logic.TileType;
+
+public class TilePackOneTile extends TilePack
+{
+	public TilePackOneTile()
+	{
+		super("Test");
+		
+		tiles = new HashMap<>();			
+		tiles.put(TileType.ROAD_X_JUNCTION, 1);			
+	}
+}
\ No newline at end of file
diff --git a/src/de/deadlocker8/roadgame/tilepacks/TilePackTest2.java b/src/de/deadlocker8/roadgame/tilepacks/TilePackTest2.java
index f3c6919237bb2b81f93c1a3b2f31094f301f58c3..32ed8ce013d1f5e1900718c79647387154467de2 100644
--- a/src/de/deadlocker8/roadgame/tilepacks/TilePackTest2.java
+++ b/src/de/deadlocker8/roadgame/tilepacks/TilePackTest2.java
@@ -11,8 +11,7 @@ public class TilePackTest2 extends TilePack
 		super("Test 2");
 		
 		tiles = new HashMap<>();		
-		tiles.put(TileType.ROAD_END, 1);
 		tiles.put(TileType.CASTLE_FULL, 1);
-		tiles.put(TileType.ROAD_CURVE, 1);		
+		tiles.put(TileType.CASTLE_TRIANGLE, 1);		
 	}
 }
\ No newline at end of file
diff --git a/src/de/deadlocker8/roadgame/ui/Controller.java b/src/de/deadlocker8/roadgame/ui/Controller.java
index 529a1177743ba7a3638b19e10b18b2a67741f40c..4aff9702cb13d289403053b119ca8cc098064087 100644
--- a/src/de/deadlocker8/roadgame/ui/Controller.java
+++ b/src/de/deadlocker8/roadgame/ui/Controller.java
@@ -248,6 +248,8 @@ public class Controller
 				return new ImageView(textures.getImageRoad());
 			case CASTLE:
 				return new ImageView(textures.getImageCastle());
+			case CASTLE_END:
+				return new ImageView(textures.getImageCastle());
 			default:
 				return new ImageView(textures.getImageEmpty());
 		}
diff --git a/src/de/deadlocker8/roadgame/ui/Scoring.java b/src/de/deadlocker8/roadgame/ui/Scoring.java
new file mode 100644
index 0000000000000000000000000000000000000000..6ca23643bb360e6b402a503185f2c62c1843fabb
--- /dev/null
+++ b/src/de/deadlocker8/roadgame/ui/Scoring.java
@@ -0,0 +1,328 @@
+package de.deadlocker8.roadgame.ui;
+
+import de.deadlocker8.roadgame.logic.Board;
+import de.deadlocker8.roadgame.logic.CenterType;
+import de.deadlocker8.roadgame.logic.EdgeType;
+import de.deadlocker8.roadgame.logic.ScorePosition;
+import de.deadlocker8.roadgame.logic.Tile;
+import de.deadlocker8.roadgame.logic.TileType;
+import de.deadlocker8.roadgame.tilepacks.TilePackOneTile;
+import javafx.geometry.Point2D;
+
+public class Scoring
+{
+	private Tile tileToScore;
+	private Tile tile;
+	private Board board;
+	private int x;
+	private int y;
+	private int points;
+
+	public Scoring(Tile tile, Board board)
+	{
+		this.tile = tile;
+		this.board = board;
+		Point2D position = tile.getPosition();
+		this.x = (int)position.getX();
+		this.y = (int)position.getY();
+		points = 1;
+		tileToScore = tile;
+		this.tile = tile;
+	}
+	
+	private void setTile(Tile nextTile)
+	{
+		this.tile = nextTile;
+		this.x = (int)nextTile.getPosition().getX();
+		this.y = (int)nextTile.getPosition().getY();
+	}
+
+	public int getScoreForTile(ScorePosition scorePosition)
+	{
+		switch(scorePosition)
+		{
+			case CENTER:
+				scoreCenter();
+				break;
+			case NORTH:
+				scoreEdge(tile.getN(), scorePosition);
+				break;
+			case EAST:
+				scoreEdge(tile.getE(), scorePosition);
+				break;
+			case SOUTH:
+				scoreEdge(tile.getS(), scorePosition);
+				break;
+			case WEST:
+				scoreEdge(tile.getW(), scorePosition);
+				break;
+			default:
+				break;
+		}
+
+		return points;
+	}
+
+	private void scoreEdge(EdgeType edgeType, ScorePosition scorePosition)
+	{
+		switch(edgeType)
+		{
+			case CASTLE:
+				scoreCastle(scorePosition);
+				break;
+			case CASTLE_END:
+				scoreCastle(scorePosition);
+				break;
+			// TODO
+			case GRASS:
+				break;
+			case ROAD:
+				scoreRoad(scorePosition);
+				break;
+			default:
+				break;
+		}
+	}
+
+	private void scoreCenter()
+	{
+		switch(tile.getC())
+		{
+			case CASTLE:
+				scoreCastle(null);
+				break;
+			case CASTLE_TRIANGLE:
+				scoreCastle(null);
+				break;
+			case CHURCH:
+				scoreChurch();
+				break;
+			case JUNCTION:
+				scoreRoad(null);
+				break;
+			case ROAD:
+				scoreRoad(null);
+				break;
+			default:
+				break;
+		}
+	}
+
+	private void scoreChurch()
+	{
+		// North
+		points = board.containsTileAtPosition(x, y - 1) ? points += 1 : points;
+
+		// North-East
+		points = board.containsTileAtPosition(x + 1, y - 1) ? points += 1 : points;
+
+		// East
+		points = board.containsTileAtPosition(x + 1, y) ? points += 1 : points;
+
+		// South-East
+		points = board.containsTileAtPosition(x + 1, y + 1) ? points += 1 : points;
+
+		// South
+		points = board.containsTileAtPosition(x, y + 1) ? points += 1 : points;
+
+		// South-West
+		points = board.containsTileAtPosition(x - 1, y + 1) ? points += 1 : points;
+
+		// West
+		points = board.containsTileAtPosition(x - 1, y) ? points += 1 : points;
+
+		// North-West
+		points = board.containsTileAtPosition(x - 1, y - 1) ? points += 1 : points;
+	}
+
+	private void scoreRoad(ScorePosition scorePosition)
+	{		
+		switch(scorePosition)
+		{
+			case NORTH:
+				if(board.containsTileAtPosition(x, y - 1))
+				{
+					Tile nextTile = board.getTile(x, y - 1);
+					if(nextTile.getS().equals(tile.getN()))
+					{
+						if(nextTile.getC().equals(CenterType.EMPTY))
+						{
+							if(nextTile.getN().equals(EdgeType.ROAD))
+							{
+								setTile(nextTile);
+								scoreRoad(ScorePosition.NORTH);
+								return;
+							}
+
+							if(nextTile.getE().equals(EdgeType.ROAD))
+							{
+								setTile(nextTile);
+								scoreRoad(ScorePosition.EAST);
+								return;
+							}
+
+							if(nextTile.getW().equals(EdgeType.ROAD))
+							{
+								setTile(nextTile);
+								scoreRoad(ScorePosition.WEST);
+								return;
+							}
+						}
+						else
+						{							
+							points++;
+						}
+					}
+					else
+					{
+						points++;
+					}
+				}
+				break;
+			case EAST:
+				if(board.containsTileAtPosition(x + 1, y))
+				{
+					Tile nextTile = board.getTile(x + 1, y);
+					if(nextTile.getW().equals(tile.getE()))
+					{
+						if(nextTile.getC().equals(CenterType.EMPTY))
+						{
+							if(nextTile.getN().equals(EdgeType.ROAD))
+							{
+								setTile(nextTile);
+								scoreRoad(ScorePosition.NORTH);
+								return;
+							}
+
+							if(nextTile.getE().equals(EdgeType.ROAD))
+							{
+								setTile(nextTile);
+								scoreRoad(ScorePosition.EAST);
+								return;
+							}
+
+							if(nextTile.getS().equals(EdgeType.ROAD))
+							{
+								setTile(nextTile);
+								scoreRoad(ScorePosition.SOUTH);
+								return;
+							}
+						}
+						else
+						{
+							points++;
+						}
+					}
+					else
+					{
+						points++;
+					}
+				}
+				break;
+			case SOUTH:
+				if(board.containsTileAtPosition(x, y + 1))
+				{
+					Tile nextTile = board.getTile(x, y + 1);
+					if(nextTile.getN().equals(tile.getS()))
+					{
+						if(nextTile.getC().equals(CenterType.EMPTY))
+						{
+							if(nextTile.getE().equals(EdgeType.ROAD))
+							{
+								setTile(nextTile);
+								scoreRoad(ScorePosition.EAST);
+								return;
+							}
+
+							if(nextTile.getS().equals(EdgeType.ROAD))
+							{
+								setTile(nextTile);
+								scoreRoad(ScorePosition.SOUTH);
+								return;
+							}
+
+							if(nextTile.getW().equals(EdgeType.ROAD))
+							{
+								setTile(nextTile);
+								scoreRoad(ScorePosition.WEST);
+								return;
+							}
+						}
+						else
+						{
+							points++;
+						}
+					}
+					else
+					{
+						points++;
+					}
+				}
+				break;
+			case WEST:
+				if(board.containsTileAtPosition(x - 1, y))
+				{
+					Tile nextTile = board.getTile(x - 1, y);
+					if(nextTile.getN().equals(tile.getS()))
+					{
+						if(nextTile.getC().equals(CenterType.EMPTY))
+						{
+							if(nextTile.getE().equals(EdgeType.ROAD))
+							{
+								setTile(nextTile);
+								scoreRoad(ScorePosition.EAST);
+								return;
+							}
+
+							if(nextTile.getS().equals(EdgeType.ROAD))
+							{
+								setTile(nextTile);
+								scoreRoad(ScorePosition.SOUTH);
+								return;
+							}
+
+							if(nextTile.getN().equals(EdgeType.ROAD))
+							{
+								setTile(nextTile);
+								scoreRoad(ScorePosition.NORTH);
+								return;
+							}
+						}
+						else
+						{
+							points++;
+						}
+					}
+					else
+					{
+						points++;
+					}
+				}
+				break;
+			default:
+				break;
+		}
+	}
+
+	private void scoreCastle(ScorePosition scorePosition)
+	{
+
+	}
+
+	public static void main(String[] args)
+	{
+		Board b = new Board(new TilePackOneTile());
+		Scoring s = new Scoring(b.getTile(0, 0), b);
+
+		Tile t = new Tile(TileType.ROAD_STRAIGHT);
+		t.setPosition(new Point2D(0, -1));
+		if(!t.getN().equals(EdgeType.ROAD))
+		{
+			t.rotateRight();
+		}
+
+		b.addTile(t);
+		System.out.println(b.getTile(0, 0));
+		System.out.println(s.getScoreForTile(ScorePosition.NORTH));
+	}
+}
\ No newline at end of file