diff --git a/Grid.java b/Grid.java
index 939e05fd8e4207e92eb7ffaedebfcd6d4d0f6d0b..7d3d88e936c9c0a62cb4f3a3c85ccfcb2f2ca504 100644
--- a/Grid.java
+++ b/Grid.java
@@ -1,7 +1,4 @@
-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>.
@@ -87,7 +84,7 @@ public class Grid implements Iterable<Cell> {
      * <ul>
      * <li>Any live {@link Cell} with fewer than two live neighbours dies, i.e. underpopulation.</li>
      * <li>Any live {@link Cell} with two or three live neighbours lives on to the next
-     * generation.</li>
+     *      * generation.</li>
      * <li>Any live {@link Cell} with more than three live neighbours dies, i.e. overpopulation.</li>
      * <li>Any dead {@link Cell} with exactly three live neighbours becomes a live cell, i.e.
      * reproduction.</li>
@@ -96,31 +93,69 @@ public class Grid implements Iterable<Cell> {
     void nextGeneration() {
         goToNextState(calculateNextStates());
     }
+    public List<Cell> getNeighbours(int rowIndex, int colummIndex) {
+        List<Cell> listofNeighbours= new ArrayList<Cell>(0);
+        listofNeighbours.add(getCell(rowIndex+1,colummIndex-1));
+        listofNeighbours.add(getCell(rowIndex+1,colummIndex));
+        listofNeighbours.add(getCell(rowIndex+1,colummIndex+1));
+        listofNeighbours.add(getCell(rowIndex,colummIndex+1));
+        listofNeighbours.add(getCell(rowIndex-1,colummIndex+1));
+        listofNeighbours.add(getCell(rowIndex-1,colummIndex));
+        listofNeighbours.add(getCell(rowIndex-1,colummIndex-1));
+        listofNeighbours.add(getCell(rowIndex,colummIndex-1));
+        return listofNeighbours;
 
-    private boolean[][] calculateNextStates() {
-        return null;
     }
+    private int countAliveNeighbours(int rowIndex, int columnIndex) {
+        int AliveNeighbours=0;
+        for (Cell Neighbour  :  getNeighbours(rowIndex,columnIndex)){
+            if (Neighbour.isAlive())
+                AliveNeighbours++;
+        }
+        return AliveNeighbours;
+    }
+    private boolean calculateNextState(int rowIndex, int columnIndex){
+        if (countAliveNeighbours(rowIndex,columnIndex)==3 && !getCell(rowIndex,columnIndex).isAlive())
+            return true;
 
-    private boolean calculateNextState(int rowIndex, int columnIndex, Cell cell) {
-	return false;
+        if (getCell(rowIndex,columnIndex).isAlive() && (countAliveNeighbours(rowIndex,columnIndex)==2 || countAliveNeighbours(rowIndex,columnIndex) == 3))
+            return true;
+        else
+            return false;
     }
 
-    private int countAliveNeighbours(int rowIndex, int columnIndex) {
-        return 0;
+    private boolean[][] calculateNextStates() {
+        boolean[][] tableau=new boolean[numberOfRows][numberOfColumns];
+        for (int row=0;row<numberOfRows;row++){
+            for (int column=0;column<numberOfColumns;column++){
+                tableau[row][column]=calculateNextState(row,column);
+            }
+        }
+        return tableau;
     }
 
 
-    private List<Cell> getNeighbours(int rowIndex, int columnIndex) {
-	return null;
-    }
 
     private void goToNextState(boolean[][] nextState) {
+        for (int i = 0; i <numberOfRows ; i++) {
+            for (int j = 0; j <numberOfColumns ; j++) {
+                if (nextState[i][j])
+                    getCell(i,j).setAlive();
+                else
+                getCell(i,j).setDead();
+            }
+        }
     }
 
     /**
      * Sets all {@link Cell}s in this {@code Grid} as dead.
      */
     void clear() {
+        for (int i = 0; i <numberOfRows ; i++) {
+            for (int j = 0; j <numberOfColumns ; j++) {
+                getCell(i,j).setDead();
+            }
+        }
     }
 
     /**
@@ -131,6 +166,16 @@ public class Grid implements Iterable<Cell> {
      */
  
     void randomGeneration(Random random) {
+        for (int i = 0; i <numberOfRows ; i++) {
+            for (int j = 0; j <numberOfColumns ; j++) {
+                if (random.nextBoolean())
+                    getCell(i,j).setAlive();
+                else
+                getCell(i,j).setDead();
+
+            }
+
+        }
     }
 
 }