diff --git a/src/main/java/model/BorderSquareIterator.java b/src/main/java/model/BorderSquareIterator.java
index 93f0fc9eab40ef81156f97bf8c51e45174a77b55..ce5b0f4c38f73dcedc218315500939a108ad5d60 100644
--- a/src/main/java/model/BorderSquareIterator.java
+++ b/src/main/java/model/BorderSquareIterator.java
@@ -63,7 +63,7 @@ public class BorderSquareIterator implements Iterator<Square> {
       }
     }
     else {
-      if(columnIndex == grid.getNumberOfColumns()-2){
+      if(columnIndex == grid.getNumberOfColumns() - 2){
         rowIndex = grid.getNumberOfRows();
       }
       else{
diff --git a/src/main/java/model/CardinalDirection.java b/src/main/java/model/CardinalDirection.java
index 78d7d061b971f856f5e56a367e8aa54c89a83ab5..5190e2bd8e5b160f1c4152d884cf86a630f18439 100644
--- a/src/main/java/model/CardinalDirection.java
+++ b/src/main/java/model/CardinalDirection.java
@@ -6,12 +6,12 @@ public enum CardinalDirection {
   SOUTH(1, 0),
   WEST(0, -1);
 
-  public final int deltaX;
-  public final int deltaY;
+  public final int deltaRow;
+  public final int deltaColumn;
 
-  CardinalDirection(int deltaX, int deltaY) {
-    this.deltaX = deltaX;
-    this.deltaY = deltaY;
+  CardinalDirection(int deltaRow, int deltaColumn) {
+    this.deltaRow = deltaRow;
+    this.deltaColumn = deltaColumn;
   }
 
   public CardinalDirection oppositeDirection(){
diff --git a/src/main/java/model/RandomTileGenerator.java b/src/main/java/model/RandomTileGenerator.java
index 92ffa8dc6906ad739008b3153395f99974e83544..7f21231790e7571e13cd33038ddfaf7e64ebcc76 100644
--- a/src/main/java/model/RandomTileGenerator.java
+++ b/src/main/java/model/RandomTileGenerator.java
@@ -33,4 +33,12 @@ public class RandomTileGenerator {
     return new Tile(colorsOfTile);
   }
 
+  public Tile nextTileWithColorConstraint(Square square){
+    Color[] colorsOfTile = new Color[4];
+    for(CardinalDirection side : CardinalDirection.values()){
+      colorsOfTile[side.ordinal()] = square.getColorConstraint(side).orElse(randomColor());
+    }
+    return new Tile(colorsOfTile);
+  }
+
 }
diff --git a/src/main/java/model/Square.java b/src/main/java/model/Square.java
index 61f9488b971c06e645464a40b2e13b0c94c421a4..060679133086fb1e37326ea7eddd2680e667018a 100644
--- a/src/main/java/model/Square.java
+++ b/src/main/java/model/Square.java
@@ -1,5 +1,7 @@
 package model;
 
+import javafx.scene.paint.Color;
+
 import java.util.NoSuchElementException;
 import java.util.Optional;
 
@@ -11,7 +13,7 @@ public class Square {
     this.tile = tile;
     this.neighboringSquares = neighboringSquares;
   }
-  private Square(Square[] neighboringSquares) {
+  public Square(Square[] neighboringSquares) {
     this(null, neighboringSquares);
   }
 
@@ -33,4 +35,17 @@ public class Square {
   public boolean hasTile() {
     return tile != null;
   }
+
+  public Optional<Color> getColorConstraint(CardinalDirection side) {
+    if (neighboringSquares == null)
+      throw new NoSuchElementException();
+    Square neighboringSquare = neighboringSquares[side.ordinal()];
+    if(!neighboringSquare.hasTile())
+      return Optional.empty();
+    return Optional.of(neighboringSquare.getTile().getColor(side.oppositeDirection()));
+  }
+
+  public void setNeighboringSquares(Square[] neighboringSquares) {
+    this.neighboringSquares = neighboringSquares;
+  }
 }
diff --git a/src/main/java/model/SquareGrid.java b/src/main/java/model/SquareGrid.java
index f224952497982c8cb837b16b4e746c927f17bf62..8175c5db1e430ba68f6a557a0902b9094aa20551 100644
--- a/src/main/java/model/SquareGrid.java
+++ b/src/main/java/model/SquareGrid.java
@@ -28,19 +28,20 @@ public class SquareGrid implements Iterable<Square> {
   private Square[][] allocateMatrix() {
     Square[][] matrix = new Square[getNumberOfRows()][getNumberOfColumns()];
     for(int row = 0; row < getNumberOfRows(); row++)
-      for(int column = 0; column < getNumberOfRows(); column++)
-        if(!squareIsInternal(row, column))
-          matrix[row][column] = new Square();
-        else {
+      for(int column = 0; column < getNumberOfColumns(); column++)
           matrix[row][column] = new Square();
+    for(int row = 1; row < getNumberOfRows() - 1; row++)
+      for(int column = 1; column < getNumberOfColumns() - 1; column++) {
+          Square[] neighboringSquares = new Square[CardinalDirection.values().length];
+          for (int index = 0; index < neighboringSquares.length; index++){
+            CardinalDirection direction = CardinalDirection.values()[index];
+            neighboringSquares[index] = matrix[row + direction.deltaRow][column + direction.deltaColumn];
+          }
+          matrix[row][column].setNeighboringSquares(neighboringSquares);
         }
     return matrix;
   }
 
-  private boolean squareIsInternal(int row, int column){
-    return 1 <= row && row < getNumberOfRows()-1 && 1 <= column && column < getNumberOfColumns()-1;
-  }
-
   /**
    * Returns an iterator over elements of type {@code T}.
    *
@@ -76,8 +77,9 @@ public class SquareGrid implements Iterable<Square> {
 
   public void fillWithRandomTiles(List<Color> colors, Random randomGenerator){
     RandomTileGenerator randomTileGenerator = new RandomTileGenerator(colors, randomGenerator);
-    internalSquareIterator().forEachRemaining(square -> square.add(randomTileGenerator.nextTile()));
+
     borderSquareIterator().forEachRemaining(square -> square.add(randomTileGenerator.nextUniformTile()));
+    internalSquareIterator().forEachRemaining(square -> square.add(randomTileGenerator.nextTileWithColorConstraint(square)));
   }
 
   public boolean hasTile(int row, int column) {