diff --git a/Grid.java b/Grid.java
index 939e05fd8e4207e92eb7ffaedebfcd6d4d0f6d0b..3fd334242d85c21a48a0931ee6dd3e118d49480c 100644
--- a/Grid.java
+++ b/Grid.java
@@ -1,12 +1,9 @@
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Random;
+import java.util.*;
 
 /**
  * {@code Grid} instances represent the grid in <i>The Game of Life</i>.
  */
-public class Grid implements Iterable<Cell> {
+class Grid implements Iterable<Cell> {
 
     private final int numberOfRows;
     private final int numberOfColumns;
@@ -15,7 +12,7 @@ public class Grid implements Iterable<Cell> {
     /**
      * Creates a new {@code Grid} instance given the number of rows and columns.
      *
-     * @param numberOfRows    the number of rows
+     * @param  numberOfRows    the number of rows
      * @param numberOfColumns the number of columns
      * @throws IllegalArgumentException if {@code numberOfRows} or {@code numberOfColumns} are
      *                                  less than or equal to 0
@@ -77,6 +74,7 @@ public class Grid implements Iterable<Cell> {
      * @return the number of columns in this {@code Grid}
      */
     public int getNumberOfColumns() {
+
         return numberOfColumns;
     }
 
@@ -98,29 +96,78 @@ public class Grid implements Iterable<Cell> {
     }
 
     private boolean[][] calculateNextStates() {
-        return null;
+        boolean [][] new_stat = new boolean[getNumberOfRows()][getNumberOfColumns()];
+        for(int row=0; row<getNumberOfRows(); row++){
+            for (int col = 0; col < getNumberOfColumns(); col++)
+                new_stat [row][col] = calculateNextState(row, col);
+            }
+
+        return new_stat;
     }
 
-    private boolean calculateNextState(int rowIndex, int columnIndex, Cell cell) {
-	return false;
+
+
+    private boolean calculateNextState(int rows, int columns) {
+        Cell cellule = getCell(rows, columns);
+        int nbOfVoisinesVivantes = countAliveNeighbours(rows, columns);
+        return cellule.isAliveInNextState(nbOfVoisinesVivantes);
+
     }
 
+
+
+
+
     private int countAliveNeighbours(int rowIndex, int columnIndex) {
-        return 0;
+        List<Cell> voisine =getNeighbours( rowIndex,  columnIndex);
+        Iterator<Cell> iterator = voisine.iterator();
+        int voisine_vivant = 0;
+        while(iterator.hasNext()) {
+            if(iterator.next().isAlive())
+            voisine_vivant = voisine_vivant+1;
+        }
+        return voisine_vivant;
     }
 
 
+
     private List<Cell> getNeighbours(int rowIndex, int columnIndex) {
-	return null;
+        List<Cell> voisine = new LinkedList<Cell>();
+        voisine.add(getCell(rowIndex, columnIndex-1));
+        voisine.add(getCell(rowIndex, columnIndex+1));
+        voisine.add(getCell(rowIndex+1, columnIndex));
+        voisine.add(getCell(rowIndex-1, columnIndex));
+        voisine.add(getCell(rowIndex+1, columnIndex+1));
+        voisine.add(getCell(rowIndex+1, columnIndex-1));
+        voisine.add(getCell(rowIndex-1, columnIndex-1));
+        voisine.add(getCell(rowIndex-1, columnIndex+1));
+
+
+	return voisine;
     }
 
     private void goToNextState(boolean[][] nextState) {
+        for(int row = 0 ; row<this.getNumberOfRows();row++){
+            for(int col = 0 ; col<this.getNumberOfColumns(); col++){
+                Cell stat = getCell(row,col);
+                if (nextState[row][col]){
+                    stat.setAlive();
+                }
+                else{
+                    stat.setDead();
+                }
+            }
+        }
     }
 
     /**
      * Sets all {@link Cell}s in this {@code Grid} as dead.
      */
     void clear() {
+        for(Iterator<Cell> gril = iterator();  gril.hasNext();){
+            Cell cel = gril.next();
+            cel.setDead();
+        }
     }
 
     /**
@@ -131,6 +178,16 @@ public class Grid implements Iterable<Cell> {
      */
  
     void randomGeneration(Random random) {
+        Iterator<Cell> gril = iterator();
+        while (gril.hasNext()){
+            Cell cel = gril.next();
+            boolean aleatoire = random.nextBoolean();
+            if(aleatoire)
+                cel.setAlive();
+            else
+                cel.setDead();
+        }
+
     }
 
 }