diff --git a/bin/de/deadlocker8/roadgame/logic/Board.class b/bin/de/deadlocker8/roadgame/logic/Board.class
index b0cad02dd0c19c783c02615a51dc74bcff218e5a..d98dedf6e198e2131c10ee4bbacd6e4483d7784a 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/ui/Controller$1.class b/bin/de/deadlocker8/roadgame/ui/Controller$1.class
index fac104422568b470fecae66091041010efa41bb4..cfb79b3ebe672258cd982406cfe74a6e79ff7743 100644
Binary files a/bin/de/deadlocker8/roadgame/ui/Controller$1.class and b/bin/de/deadlocker8/roadgame/ui/Controller$1.class differ
diff --git a/bin/de/deadlocker8/roadgame/ui/Controller$2.class b/bin/de/deadlocker8/roadgame/ui/Controller$2.class
index e08927c5a6515dd52686bd09aa54fa43cf73acaf..34fbdfc7aefd4d041e5cb62f6dec9a90b3d2bf9a 100644
Binary files a/bin/de/deadlocker8/roadgame/ui/Controller$2.class and b/bin/de/deadlocker8/roadgame/ui/Controller$2.class differ
diff --git a/bin/de/deadlocker8/roadgame/ui/Controller$3.class b/bin/de/deadlocker8/roadgame/ui/Controller$3.class
new file mode 100644
index 0000000000000000000000000000000000000000..b026c7f86ee07594bf44fed040ce539d89a6215e
Binary files /dev/null and b/bin/de/deadlocker8/roadgame/ui/Controller$3.class differ
diff --git a/bin/de/deadlocker8/roadgame/ui/Controller.class b/bin/de/deadlocker8/roadgame/ui/Controller.class
index 44de8aa4615b85fc86feaccaa7df2feaab9db619..6e265d0979e69ea2319d25d6a4e0a313b0dfb1d6 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/GUI.fxml b/bin/de/deadlocker8/roadgame/ui/GUI.fxml
index 0b3219e3994897a4d2113727d45a2dd713e31408..c1748997b89dd8d49f474bf3d52bd3d8fa7c98c4 100644
--- a/bin/de/deadlocker8/roadgame/ui/GUI.fxml
+++ b/bin/de/deadlocker8/roadgame/ui/GUI.fxml
@@ -6,6 +6,7 @@
 <?import javafx.scene.control.Menu?>
 <?import javafx.scene.control.MenuBar?>
 <?import javafx.scene.control.MenuItem?>
+<?import javafx.scene.control.SeparatorMenuItem?>
 <?import javafx.scene.layout.AnchorPane?>
 <?import javafx.scene.layout.HBox?>
 <?import javafx.scene.layout.StackPane?>
@@ -52,9 +53,12 @@
         <menus>
           <Menu mnemonicParsing="false" text="Menu">
             <items>
-              <MenuItem mnemonicParsing="false" onAction="#reset" text="Reset" />
-                  <MenuItem mnemonicParsing="false" onAction="#selectTilePack" text="Select Tilepack" />
-                  <MenuItem mnemonicParsing="false" onAction="#about" text="About" />
+              <MenuItem fx:id="menuItemReset" mnemonicParsing="false" onAction="#reset" text="Reset" />
+                  <MenuItem fx:id="menuItemSelectTilePack" mnemonicParsing="false" onAction="#selectTilePack" text="Select Tilepack" />
+                  <SeparatorMenuItem mnemonicParsing="false" />
+                  <MenuItem fx:id="menuItemAutomaticTilePlacement" mnemonicParsing="false" onAction="#automaticTilePlacement" text="Automatic Tile Placement" />
+                  <SeparatorMenuItem mnemonicParsing="false" />
+                  <MenuItem fx:id="menuItemAbout" mnemonicParsing="false" onAction="#about" text="About" />
             </items>
           </Menu>
         </menus>
diff --git a/bin/de/deadlocker8/roadgame/ui/SelectTilePackController$2.class b/bin/de/deadlocker8/roadgame/ui/SelectTilePackController$2.class
index 86b2a5605f9b12afb3e9ab47b5b0898dde48a07b..f95ba0457b8968ec53293ba9e86314b84ce9ccbb 100644
Binary files a/bin/de/deadlocker8/roadgame/ui/SelectTilePackController$2.class and b/bin/de/deadlocker8/roadgame/ui/SelectTilePackController$2.class differ
diff --git a/bin/de/deadlocker8/roadgame/ui/SelectTilePackController.class b/bin/de/deadlocker8/roadgame/ui/SelectTilePackController.class
index 6467685473a262965fdbfe36eff88916ae202b39..50b98332774f368733d82a9873f843b890d75d87 100644
Binary files a/bin/de/deadlocker8/roadgame/ui/SelectTilePackController.class and b/bin/de/deadlocker8/roadgame/ui/SelectTilePackController.class differ
diff --git a/src/de/deadlocker8/roadgame/logic/Board.java b/src/de/deadlocker8/roadgame/logic/Board.java
index 81e42e873469d309cff7b698e66095c5fa829cff..f95fe9dc96c6fb424827a40e02ace549dbff1bec 100644
--- a/src/de/deadlocker8/roadgame/logic/Board.java
+++ b/src/de/deadlocker8/roadgame/logic/Board.java
@@ -171,34 +171,32 @@ public class Board
 
 	public boolean tileCanBePlaced(Tile tile)
 	{
-		if(getPossibleLocations(tile).size() == 0)
-		{
-			return false;
-		}
-		
-		tile.rotateRight();
-		if(getPossibleLocations(tile).size() == 0)
-		{
-			tile.rotateLeft();
-			return false;
-		}
-		
-		tile.rotateRight();
-		if(getPossibleLocations(tile).size() == 0)
-		{
-			tile.rotateLeft();
-			tile.rotateLeft();
-			return false;
-		}
-		
-		tile.rotateRight();
 		if(getPossibleLocations(tile).size() == 0)
 		{
 			tile.rotateRight();
-			return false;
+			if(getPossibleLocations(tile).size() == 0)
+			{
+				tile.rotateRight();
+				if(getPossibleLocations(tile).size() == 0)
+				{
+					tile.rotateRight();
+					if(getPossibleLocations(tile).size() == 0)
+					{
+						tile.rotateRight();
+						return false;
+					}
+				}
+				else
+				{
+					tile.rotateLeft();
+					tile.rotateLeft();
+				}
+			}
+			else
+			{
+				tile.rotateLeft();
+			}
 		}
-		
-		tile.rotateRight();
 		return true;
 	}
 	
diff --git a/src/de/deadlocker8/roadgame/ui/Controller.java b/src/de/deadlocker8/roadgame/ui/Controller.java
index 311f0aebcbb1195fe743a70148d5fc57d1dfe415..529a1177743ba7a3638b19e10b18b2a67741f40c 100644
--- a/src/de/deadlocker8/roadgame/ui/Controller.java
+++ b/src/de/deadlocker8/roadgame/ui/Controller.java
@@ -3,6 +3,7 @@ package de.deadlocker8.roadgame.ui;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Locale;
+import java.util.Random;
 import java.util.ResourceBundle;
 
 import de.deadlocker8.roadgame.logic.Board;
@@ -11,6 +12,7 @@ import de.deadlocker8.roadgame.logic.Game;
 import de.deadlocker8.roadgame.logic.Textures;
 import de.deadlocker8.roadgame.logic.Tile;
 import de.deadlocker8.roadgame.tilepacks.TilePack;
+import javafx.application.Platform;
 import javafx.event.EventHandler;
 import javafx.fxml.FXML;
 import javafx.fxml.FXMLLoader;
@@ -21,6 +23,7 @@ import javafx.scene.control.Alert;
 import javafx.scene.control.Alert.AlertType;
 import javafx.scene.control.Button;
 import javafx.scene.control.Label;
+import javafx.scene.control.MenuItem;
 import javafx.scene.image.Image;
 import javafx.scene.image.ImageView;
 import javafx.scene.input.MouseButton;
@@ -30,8 +33,10 @@ import javafx.scene.layout.GridPane;
 import javafx.scene.layout.StackPane;
 import javafx.stage.Modality;
 import javafx.stage.Stage;
+import javafx.stage.WindowEvent;
 import logger.LogLevel;
 import logger.Logger;
+import tools.Worker;
 
 public class Controller
 {
@@ -39,7 +44,11 @@ public class Controller
 	@FXML private StackPane stackPaneCurrentTile;
 	@FXML private Button buttonRotate;
 	@FXML private Label labelTilesRemaining;
-	
+	@FXML private MenuItem menuItemReset;
+	@FXML private MenuItem menuItemSelectTilePack;
+	@FXML private MenuItem menuItemAutomaticTilePlacement;
+	@FXML private MenuItem menuItemAbout;
+
 	private Stage stage;
 	private Image icon = new Image("de/deadlocker8/roadgame/resources/icon.png");
 	private final ResourceBundle bundle = ResourceBundle.getBundle("de/deadlocker8/roadgame/main/", Locale.GERMANY);
@@ -48,30 +57,41 @@ public class Controller
 	private Textures textures;
 	private ZoomableScrollPane scrollPane;
 	private StackPane stackPanePlaceHolder;
-	
+	private final int SLEEP_TIME = 100;
+
 	public void init(Stage stage)
 	{
 		this.stage = stage;
+		
+		this.stage.setOnCloseRequest(new EventHandler<WindowEvent>()
+		{
+			@Override
+			public void handle(WindowEvent event)
+			{
+				Worker.shutdown();
+				System.exit(0);				
+			}
+		});
 		textures = new Textures();
 
 		anchorPaneGame.setStyle("-fx-border-color: #333333; -fx-border-width: 2px");
 		stackPaneCurrentTile.setStyle("-fx-border-color: #333333; -fx-border-width: 2px");
-		
+
 		labelTilesRemaining.setText("0");
-	
+
 		grid = new GridPane();
-		grid.setFocusTraversable(false);	
-		
-		scrollPane = new ZoomableScrollPane(grid);		
-		scrollPane.setPannable(true);		
+		grid.setFocusTraversable(false);
+
+		scrollPane = new ZoomableScrollPane(grid);
+		scrollPane.setPannable(true);
 		scrollPane.setFitToHeight(true);
-		scrollPane.setFitToWidth(true);		
+		scrollPane.setFitToWidth(true);
 		anchorPaneGame.getChildren().add(scrollPane);
 		AnchorPane.setTopAnchor(scrollPane, 0.0);
 		AnchorPane.setRightAnchor(scrollPane, 0.0);
 		AnchorPane.setBottomAnchor(scrollPane, 0.0);
-		AnchorPane.setLeftAnchor(scrollPane, 0.0);		
-		
+		AnchorPane.setLeftAnchor(scrollPane, 0.0);
+
 		anchorPaneGame.setOnMouseClicked(new EventHandler<MouseEvent>()
 		{
 			@Override
@@ -80,10 +100,10 @@ public class Controller
 				if(event.getButton().equals(MouseButton.SECONDARY))
 				{
 					rotateRight();
-				}				
+				}
 			}
 		});
-		
+
 		buttonRotate.setDisable(true);
 		Label labelPlaceHolder = new Label("Please select Tilepack first.");
 		labelPlaceHolder.setStyle("-fx-font-weight: bold; -fx-font-size: 16;");
@@ -160,7 +180,7 @@ public class Controller
 	private void placeTile(int x, int y)
 	{
 		game.placeTile(game.getCurrentTile(), new Point2D(x, y));
-		nextTile();
+		nextTile(false);
 	}
 
 	public StackPane createStackPaneForTile(Tile tile, boolean possible, int x, int y)
@@ -190,28 +210,28 @@ public class Controller
 		else
 		{
 			stack.getChildren().add(new ImageView(textures.getImageGrass()));
-			
-			//North
-			stack.getChildren().add(getImageForEdge(tile.getN()));	
 
-			//East
+			// North
+			stack.getChildren().add(getImageForEdge(tile.getN()));
+
+			// East
 			ImageView imageViewEast = getImageForEdge(tile.getE());
 			imageViewEast.setRotate(90);
-			stack.getChildren().add(imageViewEast);			
+			stack.getChildren().add(imageViewEast);
 
-			//South
+			// South
 			ImageView imageViewSouth = getImageForEdge(tile.getS());
 			imageViewSouth.setRotate(180);
-			stack.getChildren().add(imageViewSouth);			
+			stack.getChildren().add(imageViewSouth);
 
-			//West			
+			// West
 			ImageView imageViewWest = getImageForEdge(tile.getW());
 			imageViewWest.setRotate(270);
-			stack.getChildren().add(imageViewWest);	
-			
-			//Center					
+			stack.getChildren().add(imageViewWest);
+
+			// Center
 			ImageView imageViewCenter = getImageForCenter(tile);
-			stack.getChildren().add(imageViewCenter);	
+			stack.getChildren().add(imageViewCenter);
 		}
 
 		stack.setStyle("-fx-border-color: #cccccc; -fx-border-width: 1px;");
@@ -225,64 +245,64 @@ public class Controller
 			case GRASS:
 				return new ImageView(textures.getImageEmpty());
 			case ROAD:
-				return new ImageView(textures.getImageRoad());			
+				return new ImageView(textures.getImageRoad());
 			case CASTLE:
-				return new ImageView(textures.getImageCastle());			
+				return new ImageView(textures.getImageCastle());
 			default:
 				return new ImageView(textures.getImageEmpty());
 		}
 	}
-	
+
 	public ImageView getImageForCenter(Tile tile)
-	{		
+	{
 		switch(tile.getC())
 		{
 			case EMPTY:
 				return new ImageView(textures.getImageEmpty());
 			case CASTLE:
-				return new ImageView(textures.getImageCenterCastle());			
+				return new ImageView(textures.getImageCenterCastle());
 			case CASTLE_TRIANGLE:
-				ImageView iv = new ImageView(textures.getImageCenterCastleTriangle());			
+				ImageView iv = new ImageView(textures.getImageCenterCastleTriangle());
 				if(tile.getN().equals(EdgeType.CASTLE))
 				{
 					if(tile.getW().equals(EdgeType.CASTLE))
 					{
-						//North and West
+						// North and West
 						iv.setRotate(270);
 					}
 				}
-				
+
 				if(tile.getS().equals(EdgeType.CASTLE))
-				{					
+				{
 					if(tile.getE().equals(EdgeType.CASTLE))
 					{
-						//South and East
+						// South and East
 						iv.setRotate(90);
 					}
 					else
 					{
-						//South and West
+						// South and West
 						iv.setRotate(180);
 					}
-				}				
+				}
 				return iv;
 			case CHURCH:
 				return new ImageView(textures.getImageCenterChurch());
 			case ROAD:
-				ImageView ivRoad = new ImageView(textures.getImageCenterRoad());				
-				
+				ImageView ivRoad = new ImageView(textures.getImageCenterRoad());
+
 				if(tile.getE().equals(EdgeType.CASTLE))
-				{				
+				{
 					ivRoad.setRotate(90);
 				}
-				
+
 				if(tile.getS().equals(EdgeType.CASTLE))
-				{					
+				{
 					ivRoad.setRotate(180);
 				}
-				
+
 				if(tile.getW().equals(EdgeType.CASTLE))
-				{					
+				{
 					ivRoad.setRotate(270);
 				}
 				return ivRoad;
@@ -306,45 +326,48 @@ public class Controller
 		return false;
 	}
 
-	private void nextTile()
+	private void nextTile(boolean automaticPlacing)
 	{
 		Tile nextTile = game.getNextTile();
-		if(nextTile == null)		
-		{			
+		if(nextTile == null)
+		{
 			game.setCurrentTile(null);
-			stackPaneCurrentTile.getChildren().clear();			
+			stackPaneCurrentTile.getChildren().clear();
 			updateGrid(game.getBoard(), null);
 			return;
 		}
-			
+
 		game.setCurrentTile(nextTile);
-		
+
 		if(game.tileCanBePlaced(game.getCurrentTile()))
 		{
 			stackPaneCurrentTile.getChildren().clear();
 			stackPaneCurrentTile.getChildren().add(createStackPaneForTile(game.getCurrentTile(), false, 0, 0));
-			
+
 			labelTilesRemaining.setText(String.valueOf(game.getBoard().getTilePack().getNumberOfTiles()));
 
-			updateGrid(game.getBoard(), game.getPossibleLocations(game.getCurrentTile()));	
-		}	
+			updateGrid(game.getBoard(), game.getPossibleLocations(game.getCurrentTile()));
+		}
 		else
 		{
-			Alert alert = new Alert(AlertType.INFORMATION);
-			alert.setTitle("Tile skipped");
-			alert.setHeaderText("");
-			alert.setContentText("The following tile has been skipped because it doesn't fit the current board:");
-			Stage dialogStage = (Stage)alert.getDialogPane().getScene().getWindow();		
-			alert.getDialogPane().setExpandableContent(createStackPaneForTile(game.getCurrentTile(), false, 0, 0));
-			alert.getDialogPane().setExpanded(true);			
-			dialogStage.getIcons().add(icon);
-			dialogStage.centerOnScreen();
-			alert.showAndWait();
-			
+			if(!automaticPlacing)
+			{
+				Alert alert = new Alert(AlertType.INFORMATION);
+				alert.setTitle("Tile skipped");
+				alert.setHeaderText("");
+				alert.setContentText("The following tile has been skipped because it doesn't fit the current board:");
+				Stage dialogStage = (Stage)alert.getDialogPane().getScene().getWindow();
+				alert.getDialogPane().setExpandableContent(createStackPaneForTile(game.getCurrentTile(), false, 0, 0));
+				alert.getDialogPane().setExpanded(true);
+				dialogStage.getIcons().add(icon);
+				dialogStage.centerOnScreen();
+				alert.showAndWait();
+			}
+
 			labelTilesRemaining.setText(String.valueOf(game.getBoard().getTilePack().getNumberOfTiles()));
-			
-			nextTile();
-		}			
+
+			nextTile(automaticPlacing);
+		}
 	}
 
 	public void rotateRight()
@@ -354,16 +377,16 @@ public class Controller
 			game.getCurrentTile().rotateRight();
 			stackPaneCurrentTile.getChildren().clear();
 			stackPaneCurrentTile.getChildren().add(createStackPaneForTile(game.getCurrentTile(), false, 0, 0));
-	
+
 			updateGrid(game.getBoard(), game.getPossibleLocations(game.getCurrentTile()));
 		}
 	}
-	
+
 	public void reset()
 	{
 		init(stage);
 	}
-	
+
 	public void selectTilePack()
 	{
 		try
@@ -387,7 +410,7 @@ public class Controller
 			Logger.log(LogLevel.ERROR, Logger.exceptionToString(io));
 		}
 	}
-	
+
 	public void setTilePack(TilePack tilePack)
 	{
 		buttonRotate.setDisable(false);
@@ -395,12 +418,107 @@ public class Controller
 		{
 			anchorPaneGame.getChildren().remove(stackPanePlaceHolder);
 		}
-		
+
 		game = new Game(tilePack);
-		
+
 		updateGrid(game.getBoard(), null);
 
-		nextTile();
+		nextTile(false);
+	}
+
+	public void automaticTilePlacement()
+	{
+		if(game != null && game.getBoard() != null)
+		{
+			buttonRotate.setDisable(true);
+			menuItemReset.setDisable(true);
+			menuItemSelectTilePack.setDisable(true);
+			menuItemAutomaticTilePlacement.setDisable(true);
+			menuItemAbout.setDisable(true);
+
+			Worker.runLater(() -> {
+				while(game.getCurrentTile() != null)
+				{
+					if(couldPlaceTileAutomatically())
+					{
+						try
+						{
+							Thread.sleep(SLEEP_TIME);
+						}
+						catch(Exception e)
+						{
+						}
+						continue;
+					}
+
+					game.getCurrentTile().rotateRight();
+					if(couldPlaceTileAutomatically())
+					{
+						try
+						{
+							Thread.sleep(SLEEP_TIME);
+						}
+						catch(Exception e)
+						{
+						}
+						continue;
+					}
+
+					game.getCurrentTile().rotateRight();
+					if(couldPlaceTileAutomatically())
+					{
+						try
+						{
+							Thread.sleep(SLEEP_TIME);
+						}
+						catch(Exception e)
+						{
+						}
+						continue;
+					}
+
+					game.getCurrentTile().rotateRight();
+					if(couldPlaceTileAutomatically())
+					{
+						try
+						{
+							Thread.sleep(SLEEP_TIME);
+						}
+						catch(Exception e)
+						{
+						}
+						continue;
+					}
+				}
+				
+				Platform.runLater(()->{
+					buttonRotate.setDisable(false);
+					menuItemReset.setDisable(false);
+					menuItemSelectTilePack.setDisable(false);
+					menuItemAutomaticTilePlacement.setDisable(false);
+					menuItemAbout.setDisable(false);
+				});
+			});
+		}
+	}
+
+	private boolean couldPlaceTileAutomatically()
+	{
+		ArrayList<Point2D> possibleLocations = game.getPossibleLocations(game.getCurrentTile());
+
+		if(possibleLocations.size() > 0)
+		{
+			Random random = new Random();
+			int index = random.nextInt(possibleLocations.size());
+
+			Platform.runLater(() -> {
+				placeTile((int)possibleLocations.get(index).getX(), (int)possibleLocations.get(index).getY());
+				nextTile(true);
+			});
+			return true;
+		}
+
+		return false;
 	}
 
 	public void about()
diff --git a/src/de/deadlocker8/roadgame/ui/GUI.fxml b/src/de/deadlocker8/roadgame/ui/GUI.fxml
index 0b3219e3994897a4d2113727d45a2dd713e31408..c1748997b89dd8d49f474bf3d52bd3d8fa7c98c4 100644
--- a/src/de/deadlocker8/roadgame/ui/GUI.fxml
+++ b/src/de/deadlocker8/roadgame/ui/GUI.fxml
@@ -6,6 +6,7 @@
 <?import javafx.scene.control.Menu?>
 <?import javafx.scene.control.MenuBar?>
 <?import javafx.scene.control.MenuItem?>
+<?import javafx.scene.control.SeparatorMenuItem?>
 <?import javafx.scene.layout.AnchorPane?>
 <?import javafx.scene.layout.HBox?>
 <?import javafx.scene.layout.StackPane?>
@@ -52,9 +53,12 @@
         <menus>
           <Menu mnemonicParsing="false" text="Menu">
             <items>
-              <MenuItem mnemonicParsing="false" onAction="#reset" text="Reset" />
-                  <MenuItem mnemonicParsing="false" onAction="#selectTilePack" text="Select Tilepack" />
-                  <MenuItem mnemonicParsing="false" onAction="#about" text="About" />
+              <MenuItem fx:id="menuItemReset" mnemonicParsing="false" onAction="#reset" text="Reset" />
+                  <MenuItem fx:id="menuItemSelectTilePack" mnemonicParsing="false" onAction="#selectTilePack" text="Select Tilepack" />
+                  <SeparatorMenuItem mnemonicParsing="false" />
+                  <MenuItem fx:id="menuItemAutomaticTilePlacement" mnemonicParsing="false" onAction="#automaticTilePlacement" text="Automatic Tile Placement" />
+                  <SeparatorMenuItem mnemonicParsing="false" />
+                  <MenuItem fx:id="menuItemAbout" mnemonicParsing="false" onAction="#about" text="About" />
             </items>
           </Menu>
         </menus>
diff --git a/src/de/deadlocker8/roadgame/ui/SelectTilePackController.java b/src/de/deadlocker8/roadgame/ui/SelectTilePackController.java
index d64c4973371d2c73e89f5b566d0bd3e7b2b6b988..c48eee0760a78ee1c8e8968dea3d6489efaa1a47 100644
--- a/src/de/deadlocker8/roadgame/ui/SelectTilePackController.java
+++ b/src/de/deadlocker8/roadgame/ui/SelectTilePackController.java
@@ -113,8 +113,8 @@ public class SelectTilePackController
 				{
 					if(event.getButton().equals(MouseButton.PRIMARY))
 					{
-						controller.setTilePack(currentPack);
 						stage.close();
+						controller.setTilePack(currentPack);						
 					}				
 				}
 			});