diff --git a/src/main/java/view/GridCanvas.java b/src/main/java/view/GridCanvas.java
index 6d77b27b76a13fc531ca3ab3672bd754191f932a..914ac364ea2797f57839cff62a02bd1d1efaeb21 100644
--- a/src/main/java/view/GridCanvas.java
+++ b/src/main/java/view/GridCanvas.java
@@ -13,7 +13,7 @@ public class GridCanvas extends Canvas {
   private final double tileHeight;
   private final Integer numberOfColumns;
   private final Integer numberOfRows;
-  private final Grid tileGrid;
+  private final Grid grid;
   private final GraphicsContext graphicsContext;
 
   public GridCanvas(@NamedArg("tileWidth") Double tileWidth,
@@ -26,7 +26,7 @@ public class GridCanvas extends Canvas {
     this.numberOfRows = numberOfRows;
     this.setWidth(tileWidth * numberOfColumns);
     this.setHeight(tileHeight * numberOfRows);
-    tileGrid = new ArrayGrid(numberOfRows, numberOfColumns);
+    grid = new ArrayGrid(numberOfRows, numberOfColumns);
     graphicsContext = getGraphicsContext2D();
   }
 
@@ -36,7 +36,7 @@ public class GridCanvas extends Canvas {
   }
 
   private void drawGrid(){
-    drawGridTile(tileGrid);
+    draw(grid);
   }
 
   private void clear(){
@@ -44,35 +44,76 @@ public class GridCanvas extends Canvas {
   }
 
   public void fillGrid(TileGenerator tileGenerator){
-    tileGrid.fill(tileGenerator);
+    grid.fill(tileGenerator);
   }
 
-  public void drawGridTile(Grid tileGrid){
+  public void draw(Grid tileGrid){
+    drawSquares(tileGrid);
+    strokeSquares(tileGrid);
+  }
+
+  private void drawSquares(Grid tileGrid) {
     for(int row = 0; row < numberOfRows; row++)
       for(int column = 0; column < numberOfColumns; column++){
-        Tile tile = tileGrid.getSquare(row, column).getTile();
-        drawTile(tile, column * tileWidth, row * tileHeight);
+        Square square = tileGrid.getSquare(row, column);
+        drawSquare(square, column * tileWidth, row * tileHeight);
       }
   }
 
-  private void drawTile(Tile tile, double x, double y) {
+  private void strokeSquares(Grid tileGrid) {
+    for(int row = 0; row < numberOfRows; row++)
+      for(int column = 0; column < numberOfColumns; column++){
+        Square square = tileGrid.getSquare(row, column);
+        strokeSquare(square, column * tileWidth, row * tileHeight);
+      }
+  }
+
+
+  private void strokeSquare(Square square, double x, double y) {
+    PointType[] cornerTypes = PointType.values();
+    double[] xPoints = new double[cornerTypes.length];
+    double[] yPoints = new double[cornerTypes.length];
+    for(int index = 0; index < cornerTypes.length; index++){
+      xPoints[index] =  x + (cornerTypes[index].getXPosition() * tileWidth);
+      yPoints[index] =  y + (cornerTypes[index].getYPosition() * tileHeight);
+    }
+    final int indexCenter = 4;
+    for(CardinalDirection side : CardinalDirection.values()) {
+      int indexCorner0 = side.ordinal();
+      int indexCorner1 = (indexCorner0+1)%4;
+      strokeSquareSide(square, xPoints[indexCorner0], yPoints[indexCorner0], xPoints[indexCorner1], yPoints[indexCorner1], side);
+      strokeInternalTriangleSide(square, xPoints[indexCorner0],yPoints[indexCorner0],xPoints[indexCenter],yPoints[indexCenter], side);
+    }
+  }
+
+  private void strokeSquareSide(Square square, double x0, double y0, double x1, double y1, CardinalDirection side) {
+    if(square.compatibleSides(List.of(square.getTile().side(side)), side).isEmpty())
+      graphicsContext.strokeLine(x0, y0, x1, y1);
+  }
+
+  private void strokeInternalTriangleSide(Square square, double x0, double y0, double x1, double y1, CardinalDirection side) {
+    Tile tile = square.getTile();
+    if(!tile.side(side).accept(tile.side(Rotation.THREE_QUARTER_TURN.rotatedDirection(side))))
+      graphicsContext.strokeLine(x0, y0, x1, y1);
+  }
+
+  private void drawSquare(Square square, double x, double y) {
     for(CardinalDirection side: CardinalDirection.values()){
-      drawSideTriangle(tile, x, y, side);
+      drawSideTriangle(square, x, y, side);
     }
   }
 
-  private void drawSideTriangle(Tile tile, double x, double y, CardinalDirection side){
+  private void drawSideTriangle(Square square, double x, double y, CardinalDirection side){
+    Color color = square.getTile().side(side).color();
     List<PointType> cornerTypes = PointType.trianglePointTypes(side);
-    double[] xPoints = new double[3];
-    double[] yPoints = new double[3];
-    for(int index = 0; index < 3; index++){
+    int size = PointType.trianglePointTypes(side).size();
+    double[] xPoints = new double[size];
+    double[] yPoints = new double[size];
+    for(int index = 0; index < size; index++){
       xPoints[index] =  x + (cornerTypes.get(index).getXPosition() * tileWidth);
       yPoints[index] =  y + (cornerTypes.get(index).getYPosition() * tileHeight);
     }
-
-    Color color = tile.side(side).color();
     graphicsContext.setFill(color);
-    graphicsContext.strokePolygon(xPoints, yPoints, 3);
-    graphicsContext.fillPolygon(xPoints, yPoints, 3);
+    graphicsContext.fillPolygon(xPoints, yPoints, size);
   }
 }
diff --git a/src/main/java/view/PointType.java b/src/main/java/view/PointType.java
index a5309438b5cb7902d6eb072159eb2607b4079cff..54061428e8e5b8f7ad0b110fce55ad335bbcb1c3 100644
--- a/src/main/java/view/PointType.java
+++ b/src/main/java/view/PointType.java
@@ -7,8 +7,8 @@ import java.util.List;
 public enum PointType {
   NORTH_WEST_CORNER(0,0),
   NORTH_EAST_CORNER(1,0),
-  SOUTH_WEST_CORNER(0,1),
   SOUTH_EAST_CORNER(1,1),
+  SOUTH_WEST_CORNER(0,1),
   CENTER(0.5,0.5);
   private final double xPosition;
   private final double yPosition;
@@ -23,7 +23,7 @@ public enum PointType {
         case NORTH -> List.of(PointType.NORTH_WEST_CORNER, PointType.NORTH_EAST_CORNER, PointType.CENTER);
         case EAST -> List.of(PointType.NORTH_EAST_CORNER, PointType.SOUTH_EAST_CORNER, PointType.CENTER);
         case SOUTH -> List.of(PointType.SOUTH_EAST_CORNER, PointType.SOUTH_WEST_CORNER, PointType.CENTER);
-        case WEST -> List.of(PointType.NORTH_WEST_CORNER, PointType.SOUTH_WEST_CORNER, PointType.CENTER);
+        case WEST -> List.of(PointType.SOUTH_WEST_CORNER, PointType.NORTH_WEST_CORNER, PointType.CENTER);
       };
   }