diff --git a/src/main/java/controller/GridController.java b/src/main/java/controller/GridController.java
new file mode 100644
index 0000000000000000000000000000000000000000..a0995b565676a708ce6615de7f64fdc246f59c2a
--- /dev/null
+++ b/src/main/java/controller/GridController.java
@@ -0,0 +1,22 @@
+package controller;
+
+import javafx.fxml.FXML;
+import javafx.scene.paint.Color;
+import model.RandomWangConstrainedTileGenerator;
+import view.GridTileCanvas;
+
+import java.util.List;
+import java.util.Random;
+
+public class GridController {
+  @FXML
+  public GridTileCanvas gridTileCanvas;
+
+  public void initialize() {
+    gridTileCanvas.initializeGrid(new RandomWangConstrainedTileGenerator(List.of(Color.BLUE, Color.RED, Color.BLACK, Color.GREEN),
+            new Random(0)));
+  }
+  public void draw() {
+    gridTileCanvas.drawGrid();
+  }
+}
diff --git a/src/main/java/controller/MainPaneController.java b/src/main/java/controller/MainPaneController.java
deleted file mode 100644
index 6653ae48637f84f6e4915aeeef1c773d670202e0..0000000000000000000000000000000000000000
--- a/src/main/java/controller/MainPaneController.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package controller;
-
-import javafx.fxml.FXML;
-import main.MainApp;
-import view.GridTileCanvas;
-
-public class MainPaneController {
-  @FXML
-  public GridTileCanvas gridTileCanvas;
-
-  private MainApp mainApp;
-
-  public void initializeGrid() {
-    gridTileCanvas.initializeGrid();
-  }
-
-}
diff --git a/src/main/java/main/MainApp.java b/src/main/java/main/MainApp.java
index bc106af65c0aacb0cffd24d60c170006644a69aa..941edde50e0c32dc935bc8a4744f2dbbb631a075 100644
--- a/src/main/java/main/MainApp.java
+++ b/src/main/java/main/MainApp.java
@@ -1,6 +1,6 @@
 package main;
 
-import controller.MainPaneController;
+import controller.GridController;
 import javafx.application.Application;
 import javafx.fxml.FXMLLoader;
 import javafx.scene.Scene;
@@ -39,9 +39,9 @@ public class MainApp extends Application {
       primaryStage.setScene(scene);
 
       // Give the controller access to the main app.
-      MainPaneController controller = loader.getController();
-      controller.initializeGrid();
-
+      GridController controller = loader.getController();
+      controller.initialize();
+      controller.draw();
       primaryStage.show();
     } catch (IOException e) {
       e.printStackTrace();
diff --git a/src/main/java/model/SquareGrid.java b/src/main/java/model/Grid.java
similarity index 84%
rename from src/main/java/model/SquareGrid.java
rename to src/main/java/model/Grid.java
index 5f929aa9a56cd1f1a730272318cb597061bf4c21..6430f15b44acdecc5073aa3c5600ab23a2769c48 100644
--- a/src/main/java/model/SquareGrid.java
+++ b/src/main/java/model/Grid.java
@@ -7,7 +7,7 @@ import java.util.List;
 import java.util.Optional;
 import java.util.Random;
 
-public class SquareGrid implements Iterable<Square> {
+public class Grid implements Iterable<Square> {
   private final int numberOfRows;
   private final int numberOfColumns;
   private final Square[][] squares;
@@ -20,7 +20,7 @@ public class SquareGrid implements Iterable<Square> {
    * @throws IllegalArgumentException if {@code numberOfRows} or {@code numberOfColumns} are
    *                                  less than or equal to 0
    */
-  public SquareGrid(int numberOfRows, int numberOfColumns) {
+  public Grid(int numberOfRows, int numberOfColumns) {
     this.numberOfRows = numberOfRows;
     this.numberOfColumns = numberOfColumns;
     squares = new Square[getNumberOfRows()][getNumberOfColumns()];
@@ -64,7 +64,7 @@ public class SquareGrid implements Iterable<Square> {
     return new SquareIterator(this);
   }
 
-  public Optional<SquareTile> getTile(int rowIndex, int columnIndex) {
+  public Optional<Tile> getTile(int rowIndex, int columnIndex) {
     return getSquare(rowIndex, columnIndex).getSquareTile();
   }
 
@@ -79,10 +79,9 @@ public class SquareGrid implements Iterable<Square> {
     return numberOfColumns;
   }
 
-  public void fillWithRandomTiles(List<Color> colors, Random randomGenerator){
-    RandomWangTileGenerator randomTileGenerator = new RandomWangTileGenerator(colors, randomGenerator);
+  public void fill(TileGenerator tileGenerator){
     for(Square square : this)
-      square.add(randomTileGenerator.nextTileWithNeighborhoodConstraint(square));
+      square.add(tileGenerator.nextTile(square));
   }
 
   public boolean hasTile(int row, int column) {
diff --git a/src/main/java/model/RandomWangTileGenerator.java b/src/main/java/model/RandomWangConstrainedTileGenerator.java
similarity index 70%
rename from src/main/java/model/RandomWangTileGenerator.java
rename to src/main/java/model/RandomWangConstrainedTileGenerator.java
index e47a62bd2efb62332bd4c94415921e32ee8d38c3..d50ab021afe67aa0786c399bef861f633e73b2be 100644
--- a/src/main/java/model/RandomWangTileGenerator.java
+++ b/src/main/java/model/RandomWangConstrainedTileGenerator.java
@@ -6,12 +6,12 @@ import java.util.List;
 import java.util.Optional;
 import java.util.Random;
 
-public class RandomWangTileGenerator implements SquareTileGenerator{
+public class RandomWangConstrainedTileGenerator implements TileGenerator {
 
   private final List<Color> colors;
   private final Random randomGenerator;
 
-  public RandomWangTileGenerator(List<Color> colors, Random randomGenerator) {
+  public RandomWangConstrainedTileGenerator(List<Color> colors, Random randomGenerator) {
     this.colors = colors;
     this.randomGenerator = randomGenerator;
   }
@@ -35,13 +35,13 @@ public class RandomWangTileGenerator implements SquareTileGenerator{
     return new WangTile(colorsOfTile);
   }
   @Override
-  public SquareTile nextTileWithNeighborhoodConstraint(Square square) {
+  public Tile nextTile(Square square) {
     Color[] colorsOfTile = new Color[4];
     for(CardinalDirection side : CardinalDirection.values()){
-      Optional<SquareTile> optionalSquareTile = square.getNeighboringSquare(side);
+      Optional<Tile> optionalSquareTile = square.getNeighboringSquare(side);
       if(optionalSquareTile.isPresent()){
-        SquareTile neighboringSquareTile = optionalSquareTile.get();
-        colorsOfTile[side.ordinal()] = neighboringSquareTile.getSideColor(side.oppositeDirection());
+        Tile neighboringTile = optionalSquareTile.get();
+        colorsOfTile[side.ordinal()] = neighboringTile.getSideColor(side.oppositeDirection());
       }
       else {
         colorsOfTile[side.ordinal()] = randomColor();
diff --git a/src/main/java/model/RotatedTile.java b/src/main/java/model/RotatedTile.java
new file mode 100644
index 0000000000000000000000000000000000000000..290dcaaf8e61f15791a2e2c97467b3ddf3bcd769
--- /dev/null
+++ b/src/main/java/model/RotatedTile.java
@@ -0,0 +1,23 @@
+package model;
+
+import javafx.scene.canvas.GraphicsContext;
+import javafx.scene.paint.Color;
+
+public class RotatedTile implements Tile {
+
+
+  @Override
+  public boolean isCompatibleWith(Tile neighbor, CardinalDirection side) {
+    return false;
+  }
+
+  @Override
+  public Tile rotation(RotationType rotation) {
+    return null;
+  }
+
+  @Override
+  public Color getSideColor(CardinalDirection side) {
+    return null;
+  }
+}
diff --git a/src/main/java/model/Square.java b/src/main/java/model/Square.java
index 377f9c31f28fd8a07270740e2ea43b362bb31b7d..3e11a1be85ad4f5bbc8d990ef560b5b9f7f58a9a 100644
--- a/src/main/java/model/Square.java
+++ b/src/main/java/model/Square.java
@@ -3,11 +3,11 @@ package model;
 import java.util.Optional;
 
 public class Square {
-  private SquareTile squareTile;
+  private Tile tile;
   private Square[] neighboringSquares;
 
-  private Square(SquareTile squareTile, Square[] neighboringSquares) {
-    this.squareTile = squareTile;
+  private Square(Tile tile, Square[] neighboringSquares) {
+    this.tile = tile;
     this.neighboringSquares = neighboringSquares;
   }
 
@@ -16,21 +16,21 @@ public class Square {
   }
 
 
-  public Optional<SquareTile> getSquareTile(){
+  public Optional<Tile> getSquareTile(){
     if(!hasTile())
       return Optional.empty();
-    return Optional.of(squareTile);
+    return Optional.of(tile);
   }
 
-  public void add(SquareTile tile) {
-    this.squareTile = tile;
+  public void add(Tile tile) {
+    this.tile = tile;
   }
 
   public boolean hasTile() {
-    return squareTile != null;
+    return tile != null;
   }
 
-  public Optional<SquareTile> getNeighboringSquare(CardinalDirection side) {
+  public Optional<Tile> getNeighboringSquare(CardinalDirection side) {
     if (neighboringSquares[side.ordinal()] == null)
       return Optional.empty();
     return neighboringSquares[side.ordinal()].getSquareTile();
diff --git a/src/main/java/model/SquareGridCoordinates.java b/src/main/java/model/SquareGridCoordinates.java
deleted file mode 100644
index b42dd2c31979cc315e8d54051d698a7d882e6a8f..0000000000000000000000000000000000000000
--- a/src/main/java/model/SquareGridCoordinates.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package model;
-
-public class SquareGridCoordinates {
-  private int rowIndex;
-  private int columnIndex;
-
-  public SquareGridCoordinates(int rowIndex, int columnIndex) {
-    this.rowIndex = rowIndex;
-    this.columnIndex = columnIndex;
-  }
-
-  public SquareGridCoordinates(){
-    this(0, 0);
-  }
-
-
-
-}
diff --git a/src/main/java/model/SquareIterator.java b/src/main/java/model/SquareIterator.java
index 9581faebfbca92e4f24d03b015c04cc576b586f8..52960a25c7cbe013758b67ffce24d49350801dac 100644
--- a/src/main/java/model/SquareIterator.java
+++ b/src/main/java/model/SquareIterator.java
@@ -5,9 +5,9 @@ import java.util.Iterator;
 public class SquareIterator implements Iterator<Square> {
   private int rowIndex;
   private int columnIndex;
-  private final SquareGrid grid;
+  private final Grid grid;
 
-  SquareIterator(SquareGrid grid) {
+  SquareIterator(Grid grid) {
     this.rowIndex = 0;
     this.columnIndex = 0;
     this.grid = grid;
diff --git a/src/main/java/model/SquareTile.java b/src/main/java/model/SquareTile.java
deleted file mode 100644
index 1165fcd417fd3245a927795c87aa897bc1e007dc..0000000000000000000000000000000000000000
--- a/src/main/java/model/SquareTile.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package model;
-
-import javafx.scene.canvas.GraphicsContext;
-import javafx.scene.paint.Color;
-
-public interface SquareTile {
-  void draw(GraphicsContext graphicsContext, double x, double y, double width, double height);
-  boolean isCompatibleWith(SquareTile neighbor, CardinalDirection side);
-  SquareTile rotation(RotationType rotation);
-  Color getSideColor(CardinalDirection side);
-}
diff --git a/src/main/java/model/SquareTileGenerator.java b/src/main/java/model/SquareTileGenerator.java
deleted file mode 100644
index 2baf21871352b93021e6a9258997f27904dd3444..0000000000000000000000000000000000000000
--- a/src/main/java/model/SquareTileGenerator.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package model;
-
-public interface SquareTileGenerator {
-  SquareTile nextTile();
-  SquareTile nextTileWithNeighborhoodConstraint(Square square);
-  SquareTile nextUniformTile();
-}
diff --git a/src/main/java/model/Tile.java b/src/main/java/model/Tile.java
new file mode 100644
index 0000000000000000000000000000000000000000..c75dcb79c4f435e8f7fc453f04cf79a2ee311837
--- /dev/null
+++ b/src/main/java/model/Tile.java
@@ -0,0 +1,10 @@
+package model;
+
+import javafx.scene.canvas.GraphicsContext;
+import javafx.scene.paint.Color;
+
+public interface Tile {
+  boolean isCompatibleWith(Tile neighbor, CardinalDirection side);
+  Tile rotation(RotationType rotation);
+  Color getSideColor(CardinalDirection side);
+}
diff --git a/src/main/java/model/TileGenerator.java b/src/main/java/model/TileGenerator.java
new file mode 100644
index 0000000000000000000000000000000000000000..e6ac8ab0f0f9155e94bc49267d7ec60ddfe358c4
--- /dev/null
+++ b/src/main/java/model/TileGenerator.java
@@ -0,0 +1,5 @@
+package model;
+
+public interface TileGenerator {
+  Tile nextTile(Square square);
+}
diff --git a/src/main/java/model/WangTile.java b/src/main/java/model/WangTile.java
index 552feb2713d6d588ff4c703761b2779d52b9f6e3..ecfa87b86ae5bfb1531a5662b1ad1d637275b561 100644
--- a/src/main/java/model/WangTile.java
+++ b/src/main/java/model/WangTile.java
@@ -6,7 +6,7 @@ import javafx.scene.paint.Color;
 import java.util.Arrays;
 import java.util.List;
 
-public class WangTile implements SquareTile {
+public class WangTile implements Tile {
   private static final int NUMBER_OF_SIDES = 4;
   private final Color[] colors = new Color[NUMBER_OF_SIDES];
 
@@ -34,33 +34,17 @@ public class WangTile implements SquareTile {
     return Arrays.hashCode(colors);
   }
 
-  @Override
-  public void draw(GraphicsContext graphicsContext, double x, double y, double width, double height) {
-    for(CardinalDirection side: CardinalDirection.values()){
-      drawSideTriangle(graphicsContext, x, y, width, height, side);
-    }
-  }
+
 
   @Override
-  public boolean isCompatibleWith(SquareTile neighbor, CardinalDirection side) {
+  public boolean isCompatibleWith(Tile neighbor, CardinalDirection side) {
     return false;
   }
 
   @Override
-  public SquareTile rotation(RotationType rotation) {
+  public Tile rotation(RotationType rotation) {
     return null;
   }
 
-  private void drawSideTriangle(GraphicsContext graphicsContext, double x, double y, double width, double height,
-                            CardinalDirection side){
-    List<PointType> cornerTypes = PointType.trianglePointTypes(side);
-    double[] xPoints = new double[3];
-    double[] yPoints = new double[3];
-    for(int index = 0; index < 3; index++){
-      xPoints[index] =  x + (cornerTypes.get(index).getXPosition() * width);
-      yPoints[index] =  y + (cornerTypes.get(index).getYPosition() * height);
-    }
-    graphicsContext.setFill(getSideColor(side));
-    graphicsContext.fillPolygon(xPoints, yPoints, 3);
-  }
+
 }
diff --git a/src/main/java/view/GridTileCanvas.java b/src/main/java/view/GridTileCanvas.java
index 58679194e110fe39635a341a0c1fe8d1cf226752..b51c6d03af3eb07133ba1fd39ef5cda2c762bd7c 100644
--- a/src/main/java/view/GridTileCanvas.java
+++ b/src/main/java/view/GridTileCanvas.java
@@ -16,7 +16,8 @@ public class GridTileCanvas extends Canvas {
   private final double tileHeight;
   private final Integer numberOfColumns;
   private final Integer numberOfRows;
-  private final SquareGrid tileGrid;
+  private final Grid tileGrid;
+  private final GraphicsContext graphicsContext;
 
   public GridTileCanvas(@NamedArg("tileWidth") Double tileWidth,
                         @NamedArg("tileHeight") Double tileHeight,
@@ -28,22 +29,47 @@ public class GridTileCanvas extends Canvas {
     this.numberOfRows = numberOfRows;
     this.setWidth(tileWidth * numberOfColumns);
     this.setHeight(tileHeight * numberOfRows);
-    tileGrid = new SquareGrid(numberOfRows, numberOfColumns);
+    tileGrid = new Grid(numberOfRows, numberOfColumns);
+    graphicsContext = getGraphicsContext2D();
   }
 
-  public void initializeGrid(){
-    tileGrid.fillWithRandomTiles(List.of(Color.BLUE, Color.GREEN, Color.BLACK, Color.RED), new Random());
+  public void drawGrid(){
     drawGridTile(tileGrid);
   }
 
-  public void drawGridTile(SquareGrid tileGrid){
+  public void clear(){
+    graphicsContext.clearRect(0, 0, getWidth(), getHeight());
+  }
+
+  public void initializeGrid(TileGenerator tileGenerator){
+    tileGrid.fill(tileGenerator);
+  }
+
+  public void drawGridTile(Grid tileGrid){
     GraphicsContext graphicsContext = getGraphicsContext2D();
     for(int row = 0; row < numberOfRows; row++)
       for(int column = 0; column < numberOfColumns; column++){
-        Optional<SquareTile> tile = tileGrid.getTile(row, column);
+        Optional<Tile> tile = tileGrid.getTile(row, column);
         if(tile.isPresent())
-          tile.get().draw(graphicsContext, column * tileWidth,
-                  row * tileHeight, tileWidth, tileHeight);
+          drawTile(tile.get(), column * tileWidth, row * tileHeight);
       }
   }
+
+  private void drawTile(Tile tile, double x, double y) {
+    for(CardinalDirection side: CardinalDirection.values()){
+      drawSideTriangle(tile, x, y, side);
+    }
+  }
+
+  private void drawSideTriangle(Tile tile, double x, double y, CardinalDirection side){
+    List<PointType> cornerTypes = PointType.trianglePointTypes(side);
+    double[] xPoints = new double[3];
+    double[] yPoints = new double[3];
+    for(int index = 0; index < 3; index++){
+      xPoints[index] =  x + (cornerTypes.get(index).getXPosition() * tileWidth);
+      yPoints[index] =  y + (cornerTypes.get(index).getYPosition() * tileHeight);
+    }
+    graphicsContext.setFill(tile.getSideColor(side));
+    graphicsContext.fillPolygon(xPoints, yPoints, 3);
+  }
 }
diff --git a/src/main/resources/view/GridCanvas.fxml b/src/main/resources/view/GridCanvas.fxml
index a9a9b261d39d6c3786a8a9ded222d9e61403ed04..162854f4a196ce3e5318e1abb5b32ebd8f6ac733 100644
--- a/src/main/resources/view/GridCanvas.fxml
+++ b/src/main/resources/view/GridCanvas.fxml
@@ -9,7 +9,7 @@
 <AnchorPane stylesheets="@DarkTheme.css"
             xmlns="http://javafx.com/javafx"
             xmlns:fx="http://javafx.com/fxml"
-            fx:controller="controller.MainPaneController">
+            fx:controller="controller.GridController">
         <GridTileCanvas xmlns="http://javafx.com/javafx"
                         xmlns:fx="http://javafx.com/fxml"
                         fx:id="gridTileCanvas">