diff --git a/src/main/java/app/SimulatorApplication.java b/src/main/java/app/SimulatorApplication.java
index ac7e53ceed444386d155ce344e0ebfb5f951df9a..25eeaaf70751f919944b904ea7dd19bc165020c4 100644
--- a/src/main/java/app/SimulatorApplication.java
+++ b/src/main/java/app/SimulatorApplication.java
@@ -11,25 +11,28 @@ import java.io.IOException;
 import java.net.URL;
 
 public class SimulatorApplication extends javafx.application.Application {
-  private static final String VIEW_RESOURCE_PATH = "/view/view.fxml";
-  private static final String APP_NAME = "Firefighter simulator";
+  private static final String FIREFIGHTER_VIEW_RESOURCE_PATH = "/view/Firefighterview.fxml";
+  private static final String STONEPAPERSCISSORS_VIEW_RESOURCE_PATH = "/view/StonePaperScissorsview.fxml";
   private static final int ROW_COUNT = 20;
   private static final int COLUMN_COUNT = 20;
   private static final int SQUARE_WIDTH = 50;
   private static final int SQUARE_HEIGHT = 50;
   public static final int INITIAL_FIRE_COUNT = 2;
-  public static final int INITIAL_FIREFIGHTER_COUNT = 3;
-  public static final int INITIAL_MOTORFIREFIGHTER_COUNT = 1;
-  public static final int INITIAL_CLOUD_COUNT = 2;
+  public static final int INITIAL_FIREFIGHTER_COUNT = 5;
+  public static final int INITIAL_MOTORFIREFIGHTER_COUNT = 2;
+  public static final int INITIAL_CLOUD_COUNT = 3;
   public static final int INITIAL_MOUNTAIN_COUNT = 10;
   public static final int INITIAL_ROAD_COUNT = 10;
   public static final int INITIAL_ROCKERIES_COUNT = 10;
+  public static final int INITIAL_STONE_COUNT = 5;
+  public static final int INITIAL_PAPER_COUNT = 5;
+  public static final int INITIAL_SCISSORS_COUNT = 5;
 
   private Stage primaryStage;
   private Parent view;
-  private void initializePrimaryStage(Stage primaryStage) {
+  private void initializePrimaryStage(Stage primaryStage, String appName) {
     this.primaryStage = primaryStage;
-    this.primaryStage.setTitle(APP_NAME);
+    this.primaryStage.setTitle(appName);
     this.primaryStage.setOnCloseRequest(event -> Platform.exit());
     this.primaryStage.setResizable(false);
     this.primaryStage.sizeToScene();
@@ -37,14 +40,15 @@ public class SimulatorApplication extends javafx.application.Application {
 
   @Override
   public void start(Stage primaryStage) throws IOException {
-    initializePrimaryStage(primaryStage);
-    initializeView();
+    initializeFirefighterView(primaryStage);
+    //initializeStonePaperScissorsView(primaryStage);
     showScene();
   }
 
-  private void initializeView() throws IOException {
+  private void initializeFirefighterView(Stage primaryStage) throws IOException {
+    initializePrimaryStage(primaryStage, "Firefighter simulator");
     FXMLLoader loader = new FXMLLoader();
-    URL location = SimulatorApplication.class.getResource(VIEW_RESOURCE_PATH);
+    URL location = SimulatorApplication.class.getResource(FIREFIGHTER_VIEW_RESOURCE_PATH);
     loader.setLocation(location);
     view = loader.load();
     Controller controller = loader.getController();
@@ -53,6 +57,17 @@ public class SimulatorApplication extends javafx.application.Application {
             INITIAL_MOUNTAIN_COUNT, INITIAL_ROAD_COUNT, INITIAL_ROCKERIES_COUNT);
   }
 
+  private void initializeStonePaperScissorsView(Stage primaryStage) throws IOException {
+    initializePrimaryStage(primaryStage, "Stone,Paper,Scissors simulator");
+    FXMLLoader loader = new FXMLLoader();
+    URL location = SimulatorApplication.class.getResource(STONEPAPERSCISSORS_VIEW_RESOURCE_PATH);
+    loader.setLocation(location);
+    view = loader.load();
+    Controller controller = loader.getController();
+    controller.initialize(SQUARE_WIDTH, SQUARE_HEIGHT, COLUMN_COUNT, ROW_COUNT,
+            INITIAL_STONE_COUNT, INITIAL_PAPER_COUNT, INITIAL_SCISSORS_COUNT);
+  }
+
   private void showScene() {
     Scene scene = new Scene(view);
     primaryStage.setScene(scene);
diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java
index 57c09656d3cb18f596c8033f2a3ec14e313c493b..9712cf15176cde812626455e599ba802776bf1cf 100644
--- a/src/main/java/controller/Controller.java
+++ b/src/main/java/controller/Controller.java
@@ -14,6 +14,7 @@ import javafx.util.Duration;
 import model.Board;
 import model.Item;
 import model.FirefighterBoard;
+import model.StonePaperScissorsBoard;
 import util.Position;
 import view.Grid;
 
@@ -52,8 +53,8 @@ public class Controller {
     pauseToggleButton.setSelected(true);
   }
 
-  private void setBoard(FirefighterBoard firefighterBoard) {
-    this.board = requireNonNull(firefighterBoard, "firefighter.model is null");
+  private void setBoard(Board board) {
+    this.board = requireNonNull(board, "board is null");
   }
 
   private void updateBoard(){
@@ -119,6 +120,14 @@ public class Controller {
     repaintGrid();
   }
 
+  public void initialize(int squareWidth, int squareHeight, int columnCount,
+                         int rowCount, int initialStoneCount, int initialPaperCount, int initialScissorsCount) {
+
+    this.setBoard(new StonePaperScissorsBoard(columnCount, rowCount, initialStoneCount, initialPaperCount, initialScissorsCount));
+    grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight);
+    repaintGrid();
+  }
+
   public void oneStepButtonAction() {
     this.pause();
     updateBoard();
diff --git a/src/main/java/model/Board.java b/src/main/java/model/Board.java
index 4edcc1608722953091c701f78aa6f834b8a8863c..3603dcd3b813335329367d708478b6027936d1c5 100644
--- a/src/main/java/model/Board.java
+++ b/src/main/java/model/Board.java
@@ -7,7 +7,7 @@ import java.util.List;
 /**
  * This interface represents a generic board for modeling various state-based systems.
  *
- * @param <S> The type of state represented on the board.
+ *
  */
 public interface Board {
 
@@ -59,5 +59,11 @@ public interface Board {
   Item getItemByPosition(Position position);
   Box getBoxByPosition(Position position);
   void testScreen();
+
+  List<Position> neighbors(Position position);
+
+  List<Position> emptyNeighbors(Position position);
+
+  Position opposite(Position opposite, Position center);
 }
 
diff --git a/src/main/java/model/Box.java b/src/main/java/model/Box.java
index bbd1a237c84d5f47bb6709dc32661bd21b7f6a9d..ea40ae1e2b5f89a7b6289eb1bb59b8cbef07a3c2 100644
--- a/src/main/java/model/Box.java
+++ b/src/main/java/model/Box.java
@@ -2,10 +2,11 @@ package model;
 
 import util.Position;
 import view.FirefighterGrid;
+import view.Grid;
 
 public interface Box {
 
     Position position();
 
-    void paint(FirefighterGrid grid);
+    void paint(Grid grid);
 }
diff --git a/src/main/java/model/Cloud.java b/src/main/java/model/Cloud.java
index 40adb4a068cc70708f4cbeaba95681fd1337e108..60f6e2257b311ef271b7d8f4d4c30f1739981894 100644
--- a/src/main/java/model/Cloud.java
+++ b/src/main/java/model/Cloud.java
@@ -14,7 +14,7 @@ public class Cloud extends Extinguisher implements Item {
     }
 
 
-    List<Position> move(FirefighterBoard board) {
+    List<Position> move(Board board) {
         List<Position> result = new ArrayList<>();
         List<Position> finalNeighborsList = new ArrayList<>();
         List<Position> neighborsList = board.neighbors(position);
diff --git a/src/main/java/model/Extinguisher.java b/src/main/java/model/Extinguisher.java
index af8c779ce504fac84653ac85a24d8f31ac8797dd..d748e40a5fa96b97eb3d1c017b7b9bd007af4084 100644
--- a/src/main/java/model/Extinguisher.java
+++ b/src/main/java/model/Extinguisher.java
@@ -3,6 +3,7 @@ package model;
 import javafx.scene.paint.Color;
 import util.Position;
 import view.FirefighterGrid;
+import view.Grid;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -21,14 +22,14 @@ public abstract class Extinguisher {
     }
 
 
-    public List<Position> update(FirefighterBoard board){
+    public List<Position> update(Board board){
         ArrayList<Position> result = new ArrayList<Position>();
         result.addAll(move(board));
         result.addAll(extinguish(board));
         return result;
     }
 
-    private List<Position> extinguish(FirefighterBoard board) {
+    private List<Position> extinguish(Board board) {
         List<Position> result = new ArrayList<>();
         List<Item> itemList = board.itemList();
         List<Position> neighborsList = board.neighbors(position);
@@ -44,9 +45,9 @@ public abstract class Extinguisher {
         return result;
     }
 
-    abstract List<Position> move(FirefighterBoard board);
+    abstract List<Position> move(Board board);
 
-    public void paint(FirefighterGrid grid){
+    public void paint(Grid grid){
         grid.paintCircle(position.row(), position.column(), color);
     }
 
diff --git a/src/main/java/model/Fire.java b/src/main/java/model/Fire.java
index 2a63ed1555b0e91f2c8b0d8289c4e41c82bf11fc..be758d2e81f805a87827c2ed33986ee528289d8f 100644
--- a/src/main/java/model/Fire.java
+++ b/src/main/java/model/Fire.java
@@ -1,10 +1,8 @@
 package model;
 
-import javafx.scene.layout.HBox;
 import javafx.scene.paint.Color;
 import util.Position;
-import view.FirefighterGrid;
-
+import view.Grid;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -18,7 +16,7 @@ public class Fire implements Item{
         this.position = position;
     }
 
-    public List<Position> update(FirefighterBoard board) {
+    public List<Position> update(Board board) {
         ArrayList<Position> result = new ArrayList<Position>();
         List<Position> neighborslist = board.neighbors(position);
         Box box = board.getBoxByPosition(position);;
@@ -51,7 +49,7 @@ public class Fire implements Item{
         return position;
     }
 
-    public void paint(FirefighterGrid grid){
+    public void paint(Grid grid){
         grid.paintTriangle(position.row(), position.column(), color);
     }
 
diff --git a/src/main/java/model/Firefighter.java b/src/main/java/model/Firefighter.java
index 5659d208213c4667c4bd0808d4868c3ac14a976d..96dc7db27200b3fd5ec330c8bb002bf26096c913 100644
--- a/src/main/java/model/Firefighter.java
+++ b/src/main/java/model/Firefighter.java
@@ -12,7 +12,7 @@ public class Firefighter extends Extinguisher implements Item{
         this.color = Color.BLUE;
     }
 
-    public List<Position> move(FirefighterBoard board) {
+    public List<Position> move(Board board) {
         List<Position> result = new ArrayList<>();
         Set<Position> seen = new HashSet<>();
         HashMap<Position, Position> firstMove = new HashMap<>();
diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java
index bc5745bfcc0ed5ebabe40dd20a2efdc4d9d79ff9..ab836ad7ea832525a6cd006453a4cf00e23585ee 100644
--- a/src/main/java/model/FirefighterBoard.java
+++ b/src/main/java/model/FirefighterBoard.java
@@ -144,6 +144,26 @@ public class FirefighterBoard implements Board {
     return list;
   }
 
+  @Override
+  public List<Position> emptyNeighbors(Position position) {
+    return null;
+  }
+
+  public Position opposite(Position opposite, Position center) {
+    if (opposite.column() == center.column() || opposite.row() == center.row()){
+      if (opposite.column() == (center.column()+1)) {
+        return new Position(center.row(), center.column()-1);
+      } else if (opposite.column() == (center.column()-1)) {
+        return new Position(center.row(), center.column()-1);
+      } else if (opposite.row() == (center.row()+1)) {
+        return new Position(center.row()-1, center.column());
+      } else if (opposite.row() == (center.row()-1)) {
+        return new Position(center.row()+1, center.column());
+      }
+    }
+    return null;
+  }
+
   public void testScreen(){
     Position position;
 
diff --git a/src/main/java/model/Item.java b/src/main/java/model/Item.java
index f4c82a3e1e67d8eb51144bcc4074e3106a8909d0..e79b7b35bcdd099eb3112ac188b0bef22bff7213 100644
--- a/src/main/java/model/Item.java
+++ b/src/main/java/model/Item.java
@@ -2,17 +2,18 @@ package model;
 
 import util.Position;
 import view.FirefighterGrid;
+import view.Grid;
 
 import java.util.ArrayList;
 import java.util.List;
 
 public interface Item {
 
-    List<Position> update(FirefighterBoard board);
+    List<Position> update(Board board);
 
     Position position();
 
-    void paint(FirefighterGrid grid);
+    void paint(Grid grid);
 
     String toString();
 }
diff --git a/src/main/java/model/MotorFirefighter.java b/src/main/java/model/MotorFirefighter.java
index 7e59abd58bda7aec3d4b8474cd9b99c07e503142..9100a55e8ac3d3a5febc2184f8e07a2c3bb15a4f 100644
--- a/src/main/java/model/MotorFirefighter.java
+++ b/src/main/java/model/MotorFirefighter.java
@@ -12,7 +12,7 @@ public class MotorFirefighter extends Extinguisher implements Item{
         this.color = Color.PURPLE;
     }
 
-    public List<Position> move(FirefighterBoard board) {
+    public List<Position> move(Board board) {
         List<Position> result = new ArrayList<>();
         Set<Position> seen = new HashSet<>();
         HashMap<Position, Position> firstMove = new HashMap<>();
diff --git a/src/main/java/model/Mountain.java b/src/main/java/model/Mountain.java
index 837ac033983d4d43c01c72045fad019c7c9251a1..0a28d0f02d3eeec0a1a0ca631de1dc7bb4f84b16 100644
--- a/src/main/java/model/Mountain.java
+++ b/src/main/java/model/Mountain.java
@@ -2,7 +2,7 @@ package model;
 
 import javafx.scene.paint.Color;
 import util.Position;
-import view.FirefighterGrid;
+import view.Grid;
 
 public class Mountain implements Box{
     private final Position position;
@@ -18,7 +18,7 @@ public class Mountain implements Box{
         return position;
     }
 
-    public void paint(FirefighterGrid grid){
+    public void paint(Grid grid){
         grid.paintSquare(position.row(), position.column(), color);
     }
     public String toString(){
diff --git a/src/main/java/model/Paper.java b/src/main/java/model/Paper.java
new file mode 100644
index 0000000000000000000000000000000000000000..06aa9bf3649382dc1acee15323ac56bbfe79e43b
--- /dev/null
+++ b/src/main/java/model/Paper.java
@@ -0,0 +1,26 @@
+package model;
+
+import util.Position;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Paper extends ShifumiElement implements Item{
+    public Paper(Position position) {
+        super(position);
+        iconName = "Paper";
+    }
+
+    public List<Position> reaction(Board board, Item item, Position potentialMove){
+        if (item instanceof Stone){
+            return tryKillAndMove(board, potentialMove);
+        } else if (item instanceof Scissors) {
+            return escape(board, potentialMove);
+        }
+        return new ArrayList<>();
+    }
+
+    public String toString(){
+        return "Paper position : [" + position.row() + ", " + position.column()+ "]";
+    }
+}
diff --git a/src/main/java/model/Road.java b/src/main/java/model/Road.java
index defe96f921249d6b8ea8bad1453f3a9372222e1c..3c658dfe4459e280eb15790b6a9b091723f7e74f 100644
--- a/src/main/java/model/Road.java
+++ b/src/main/java/model/Road.java
@@ -2,10 +2,10 @@ package model;
 
 import javafx.scene.paint.Color;
 import util.Position;
-import view.FirefighterGrid;
+import view.Grid;
 
 public class Road implements Box{
-    private Position position;
+    private final Position position;
     private final Color color = Color.BLACK;
 
     public Road(Position position){
@@ -15,7 +15,7 @@ public class Road implements Box{
         return position;
     }
 
-    public void paint(FirefighterGrid grid){
+    public void paint(Grid grid){
         grid.paintSquare(position.row(), position.column(), color);
     }
 
diff --git a/src/main/java/model/Rockeries.java b/src/main/java/model/Rockeries.java
index 2bf156a028dc7e9eaa4c26b1116bbc3cfc15ad82..d0f5952444ccf2ee83b7e671ce9145d665696ec7 100644
--- a/src/main/java/model/Rockeries.java
+++ b/src/main/java/model/Rockeries.java
@@ -2,7 +2,7 @@ package model;
 
 import javafx.scene.paint.Color;
 import util.Position;
-import view.FirefighterGrid;
+import view.Grid;
 
 public class Rockeries implements Box{
     private final Position position;
@@ -17,7 +17,7 @@ public class Rockeries implements Box{
         return position;
     }
 
-    public void paint(FirefighterGrid grid){
+    public void paint(Grid grid){
         grid.paintSquare(position.row(), position.column(), color);
     }
 
diff --git a/src/main/java/model/Scissors.java b/src/main/java/model/Scissors.java
new file mode 100644
index 0000000000000000000000000000000000000000..69f0a11691288b3f16e80a98cf19d05cbdaaace1
--- /dev/null
+++ b/src/main/java/model/Scissors.java
@@ -0,0 +1,24 @@
+package model;
+
+import util.Position;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Scissors extends ShifumiElement implements Item{
+    public Scissors(Position position) {
+        super(position);
+        iconName = "Scissors";
+    }
+
+    public List<Position> reaction(Board board, Item item, Position potentialMove){
+        if (item instanceof Paper){
+            return tryKillAndMove(board, potentialMove);
+        } else if (item instanceof Stone) {
+            return escape(board, potentialMove);
+        }
+        return new ArrayList<>();
+    }
+
+    public String toString() { return "Scissors position : [" + position.row() + ", " + position.column()+ "]"; }
+}
diff --git a/src/main/java/model/ShifumiElement.java b/src/main/java/model/ShifumiElement.java
new file mode 100644
index 0000000000000000000000000000000000000000..cdc83a23d56cbfab11c83480e972554bd1f91220
--- /dev/null
+++ b/src/main/java/model/ShifumiElement.java
@@ -0,0 +1,92 @@
+package model;
+
+import javafx.geometry.Pos;
+import util.Position;
+import view.Grid;
+
+import java.util.*;
+
+public abstract class ShifumiElement {
+    protected Position position;
+    protected String iconName;
+
+    public ShifumiElement(Position position){
+        this.position = position;
+    }
+
+    public Position position() {
+        return position;
+    }
+
+    public List<Position> update(Board board){
+        List<Position> result = new ArrayList<>();
+        Set<Position> seen = new HashSet<>();
+        HashMap<Position, Position> firstMove = new HashMap<>();
+        Queue<Position> toVisit = new LinkedList<>();
+        for (Position initialMove : board.neighbors(position)) {
+            result = reaction(board, board.getItemByPosition(initialMove), initialMove);
+            if (!result.isEmpty()){
+                return result;
+            }
+            if (board.getItemByPosition(initialMove) == null) {
+                firstMove.put(initialMove, initialMove);
+                toVisit.add(initialMove);
+            }
+        }
+        while (!toVisit.isEmpty()) {
+            Position current = toVisit.poll();
+            result = reaction(board, board.getItemByPosition(current), firstMove.get(current));
+            if (!result.isEmpty()) {
+                break;
+            }
+            for (Position adjacent : board.neighbors(current)) {
+                if (seen.contains(adjacent)) continue;
+                toVisit.add(adjacent);
+                seen.add(adjacent);
+                firstMove.put(adjacent, firstMove.get(current));
+            }
+        }
+        return result;
+    }
+
+
+    public void paint(Grid grid){
+        grid.paintPicture(position.row(), position.column(), "/pictures/"+iconName+".png");
+    }
+
+    public abstract String toString();
+
+    public abstract List<Position> reaction(Board board, Item item, Position potentialMove);
+
+    public List<Position> escape(Board board, Position escapePosition) {
+        List<Position> result = new ArrayList<>();
+        List<Position> neighbors = board.emptyNeighbors(position);
+        neighbors.remove(escapePosition);
+        for (Position neighbor: neighbors) {
+            if (neighbor == board.opposite(escapePosition, position)){
+                result.add(position);
+                position = neighbor;
+                result.add(position);
+                return result;
+            }
+        }
+        if (!neighbors.isEmpty()) {
+            result.add(position);
+            position = neighbors.get(new Random().nextInt(neighbors.size()));
+            result.add(position);
+            return result;
+        }
+        return result;
+    }
+
+    public List<Position> tryKillAndMove(Board board, Position newPosition){
+        List<Position> result = new ArrayList<>();
+        board.itemList().remove(board.getItemByPosition(newPosition));
+        result.add(this.position);
+        position = newPosition;
+        result.add(this.position);
+        return result;
+    }
+}
+
+
diff --git a/src/main/java/model/Stone.java b/src/main/java/model/Stone.java
new file mode 100644
index 0000000000000000000000000000000000000000..fbfe0854df73e1b1c815af78524c2dc2783ed39f
--- /dev/null
+++ b/src/main/java/model/Stone.java
@@ -0,0 +1,26 @@
+package model;
+
+import util.Position;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Stone extends ShifumiElement implements Item{
+    public Stone(Position position) {
+        super(position);
+        iconName = "Stone";
+    }
+
+    public List<Position> reaction(Board board, Item item, Position potentialMove){
+        if (item instanceof Scissors){
+            return tryKillAndMove(board, potentialMove);
+        } else if (item instanceof Paper) {
+            return escape(board, potentialMove);
+        }
+        return new ArrayList<>();
+    }
+
+    public String toString(){
+        return "Stone position : [" + position.row() + ", " + position.column()+ "]";
+    }
+}
diff --git a/src/main/java/model/StonePaperScissorsBoard.java b/src/main/java/model/StonePaperScissorsBoard.java
new file mode 100644
index 0000000000000000000000000000000000000000..18fb1c1bd4e8e419b0e077157318eca44a2fb929
--- /dev/null
+++ b/src/main/java/model/StonePaperScissorsBoard.java
@@ -0,0 +1,165 @@
+package model;
+
+import util.Position;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+public class StonePaperScissorsBoard implements Board {
+    private final int columnCount;
+    private final int rowCount;
+    private final int initialPaperCount;
+    private final int initialScissorsCount;
+    private final int initialStoneCount;
+    private List<Item> itemList;
+    private int step = 0;
+    private final Random randomGenerator = new Random();
+
+    public StonePaperScissorsBoard(int columnCount, int rowCount, int initialPaperCount, int initialScissorsCount, int initialStoneCount) {
+        this.columnCount = columnCount;
+        this.rowCount = rowCount;
+        this.itemList = new ArrayList<>();
+        this.initialPaperCount = initialPaperCount;
+        this.initialScissorsCount = initialScissorsCount;
+        this.initialStoneCount = initialStoneCount;
+        initializeItems();
+    }
+
+    public void initializeItems() {
+        for (int i = 0; i < initialPaperCount; i++){
+            itemList.add(new Paper(randomEmptyPosition()));
+        }
+        for (int i = 0; i < initialScissorsCount; i++){
+            itemList.add(new Scissors(randomEmptyPosition()));
+        }
+        for (int i = 0; i < initialStoneCount; i++){
+            itemList.add(new Stone(randomEmptyPosition()));
+        }
+    }
+
+    private Position randomEmptyPosition() {
+        Position result;
+        for(;;){
+            result = randomPosition();
+            if (getItemByPosition(result) == null) return result;
+        }
+    }
+
+    private Position randomPosition() {
+        return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount));
+    }
+
+    @Override
+    public int rowCount() {
+        return rowCount;
+    }
+
+    @Override
+    public int columnCount() {
+        return columnCount;
+    }
+
+    public List<Position> updateToNextGeneration() {
+        List<Position> result = new ArrayList<Position>();
+        List<Item> actualList = new ArrayList<Item>(itemList);
+        for (Item item : actualList) {
+            if (item instanceof Stone) result.addAll(item.update(this));
+        }
+        actualList = new ArrayList<Item>(itemList);
+        for (Item item : actualList) {
+            if (item instanceof Paper) result.addAll(item.update(this));
+        }
+        actualList = new ArrayList<Item>(itemList);
+        for (Item item : actualList) {
+            if (item instanceof Scissors) result.addAll(item.update(this));
+        }
+        step++;
+        return result;
+    }
+
+    @Override
+    public int stepNumber() { return step; }
+
+    public List<Item> itemList() { return itemList; }
+
+    public Item getItemByPosition(Position position) {
+        for (Item item : itemList) {
+            if (item.position().equals(position)) {
+                return item;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public Box getBoxByPosition(Position position) {
+        return null;
+    }
+
+
+    @Override
+    public void reset() {
+        step = 0;
+        itemList.clear();
+        initializeItems();
+    }
+
+    public List<Position> neighbors(Position position) {
+        List<Position> list = new ArrayList<>();
+        if (position.row() > 0) list.add(new Position(position.row() - 1, position.column()));
+        if (position.column() > 0) list.add(new Position(position.row(), position.column() - 1));
+        if (position.row() < rowCount - 1) list.add(new Position(position.row() + 1, position.column()));
+        if (position.column() < columnCount - 1) list.add(new Position(position.row(), position.column() + 1));
+        return list;
+    }
+
+    public List<Position> emptyNeighbors(Position position) {
+        List<Position> list = new ArrayList<>();
+        if (position.row() > 0 && getItemByPosition(new Position(position.row() - 1, position.column())) == null) list.add(new Position(position.row() - 1, position.column()));
+        if (position.column() > 0 && getItemByPosition(new Position(position.row(), position.column() - 1)) == null) list.add(new Position(position.row(), position.column() - 1));
+        if (position.row() < rowCount - 1 && getItemByPosition(new Position(position.row()+ 1, position.column())) == null) list.add(new Position(position.row() + 1, position.column()));
+        if (position.column() < columnCount - 1 && getItemByPosition(new Position(position.row()+ 1, position.column())) == null) list.add(new Position(position.row(), position.column() + 1));
+        return list;
+    }
+
+    @Override
+    public Position opposite(Position opposite, Position center) {
+        if (opposite != center && (opposite.column() == center.column() || opposite.row() == center.row())){
+            if (opposite.column() == (center.column()+1)) {
+                return new Position(center.row(), center.column()-1);
+            } else if (opposite.column() == (center.column()-1)) {
+                return new Position(center.row(), center.column()-1);
+            } else if (opposite.row() == (center.row()+1)) {
+                return new Position(center.row()-1, center.column());
+            } else if (opposite.row() == (center.row()-1)) {
+                return new Position(center.row()+1, center.column());
+            }
+        }
+        return null;
+    }
+
+    public void testScreen(){
+        Position position;
+
+        System.out.println(itemList.toString());
+
+        for (int row = 0; row < rowCount; row++){
+            for (int column = 0; column < columnCount; column++){
+
+                position = new Position(row,column);
+                if (getItemByPosition(position) == null){
+                    System.out.print("□  ");
+                } else if (getItemByPosition(position) instanceof Stone) {
+                    System.out.print("St ");
+                } else if (getItemByPosition(position) instanceof Paper) {
+                    System.out.print("Pa ");
+                } else if (getItemByPosition(position) instanceof Scissors) {
+                    System.out.print("sc ");
+                }
+            }
+            System.out.println();
+        }
+        System.out.println();
+    }
+}
diff --git a/src/main/java/view/FirefighterGrid.java b/src/main/java/view/FirefighterGrid.java
index aeaa2bfef20bc21eb1470af78bd4fb7e5a11fa08..12f6c4eb63e3e4f8f27f0de79221e9cef296b40d 100644
--- a/src/main/java/view/FirefighterGrid.java
+++ b/src/main/java/view/FirefighterGrid.java
@@ -102,6 +102,10 @@ public class FirefighterGrid extends Canvas implements Grid{
         getGraphicsContext2D().fillRect(column*squareWidth,row*squareHeight, squareWidth, squareHeight);
     }
 
+    @Override
+    public void paintPicture(int row, int column, String iconDirectory) {
+    }
+
     public void paintTriangle(int row, int column, Color color){
         getGraphicsContext2D().setFill(color);
         getGraphicsContext2D().fillPolygon(new double[]{column*squareWidth , column*squareWidth + squareWidth/2, (column+1)*squareWidth},
diff --git a/src/main/java/view/Grid.java b/src/main/java/view/Grid.java
index 599a31208f71d40a4900c1a798f649cd6d953665..db71753bbdfbbcb6c9337dfe5c28fcc99f01e801 100644
--- a/src/main/java/view/Grid.java
+++ b/src/main/java/view/Grid.java
@@ -1,5 +1,6 @@
 package view;
 
+import javafx.scene.paint.Color;
 import javafx.util.Pair;
 import model.Item;
 import util.Position;
@@ -11,8 +12,6 @@ import java.util.List;
 
 /**
  * This interface represents a generic grid structure for displaying two-dimensional data.
- *
- * @param <E> The type of elements stored in the grid.
  */
 public interface Grid {
 
@@ -44,5 +43,13 @@ public interface Grid {
   int rowCount();
 
   void initialize(Board board);
+
+  void paintCircle(int row, int column, Color color);
+
+  void paintSquare(int row, int column, Color color);
+
+  void paintPicture(int row, int column, String iconDirectory);
+
+  void paintTriangle(int row, int column, Color color);
 }
 
diff --git a/src/main/java/view/StonePaperScissorsGrid.java b/src/main/java/view/StonePaperScissorsGrid.java
new file mode 100644
index 0000000000000000000000000000000000000000..bad702ba9487e702db8483d4b01c62ba70daadc9
--- /dev/null
+++ b/src/main/java/view/StonePaperScissorsGrid.java
@@ -0,0 +1,109 @@
+package view;
+
+import javafx.scene.canvas.Canvas;
+import javafx.scene.image.Image;
+import javafx.scene.paint.Color;
+import model.Board;
+import model.Box;
+import model.Item;
+import util.Position;
+
+import java.io.InputStream;
+import java.util.List;
+
+public class StonePaperScissorsGrid extends Canvas implements Grid {
+    private int squareWidth;
+    private int squareHeight;
+    private int columnCount;
+    private int rowCount;
+
+    public void repaint(List<Item> itemList, List<Position> clearList, Board board) {
+        clear(clearList);
+        paintItems(itemList);
+        paintLines();
+    }
+
+    private void clear(List<Position> positions) {
+        for (Position position : positions) {
+            paintSquare(position.row(), position.column(), Color.WHITE);
+        }
+    }
+
+    private void paintItems(List<Item> itemList) {
+        for (Item item : itemList) {
+            item.paint(this);
+        }
+    }
+
+    public void initialize(Board board) {
+        for (int row = 0; row < rowCount; row++){
+            for (int column = 0; column < columnCount; column++){
+                paintSquare(row, column, Color.WHITE);
+            }
+        }
+        paintLines();
+        paintItems(board.itemList());
+    }
+
+    public int columnCount() {
+        return columnCount;
+    }
+
+    public int rowCount() {
+        return rowCount;
+    }
+
+    @Override
+    public void setDimensions(int columnCount, int rowCount, int squareWidth, int squareHeight) {
+        this.squareWidth = squareWidth;
+        this.squareHeight = squareHeight;
+        this.columnCount = columnCount;
+        this.rowCount = rowCount;
+        super.setWidth(squareWidth*columnCount);
+        super.setHeight(squareHeight*rowCount);
+
+    }
+
+    private void paintLines(){
+        paintHorizontalLines();
+        paintVerticalLines();
+    }
+
+    private void paintVerticalLines() {
+        for(int column = 0; column < columnCount; column++)
+            getGraphicsContext2D().strokeLine(column*squareWidth, 0,column*squareWidth, getHeight());
+    }
+
+    private void paintHorizontalLines() {
+        for(int row = 0; row < rowCount; row++)
+            getGraphicsContext2D().strokeLine(0, row*squareHeight, getWidth(), row*squareHeight);
+    }
+
+    public void paintSquare(int row, int column, Color color){
+        getGraphicsContext2D().setFill(color);
+        getGraphicsContext2D().fillRect(column*squareWidth,row*squareHeight, squareWidth, squareHeight);
+    }
+
+    @Override
+    public void paintPicture(int row, int column, String iconDirectory) {
+        InputStream input = this.getClass().getResourceAsStream(iconDirectory);
+        assert input != null;
+        getGraphicsContext2D().drawImage(new Image(input, squareWidth, squareHeight,false, true),column*squareWidth , row*squareHeight);
+    }
+
+    public void paintTriangle(int row, int column, Color color){
+        getGraphicsContext2D().setFill(color);
+        getGraphicsContext2D().fillPolygon(new double[]{column*squareWidth , column*squareWidth + squareWidth/2, (column+1)*squareWidth},
+                new double[]{(row+1)*squareHeight , row*squareHeight, (row+1)*squareHeight},
+                3);
+    }
+
+    public void paintCircle(int row, int column, Color color){
+        getGraphicsContext2D().setFill(color);
+        getGraphicsContext2D().fillOval(column*squareWidth, row*squareHeight, squareHeight, squareWidth);
+    }
+
+    private void clearSquare(int row, int column){
+        getGraphicsContext2D().clearRect(column*squareWidth,row*squareHeight, squareWidth, squareHeight);
+    }
+}
diff --git a/src/main/resources/pictures/Paper.png b/src/main/resources/pictures/Paper.png
new file mode 100644
index 0000000000000000000000000000000000000000..a1d0c20c35dd5134d6e7c4ed2714eb0ace84be81
Binary files /dev/null and b/src/main/resources/pictures/Paper.png differ
diff --git a/src/main/resources/pictures/Scissors.png b/src/main/resources/pictures/Scissors.png
new file mode 100644
index 0000000000000000000000000000000000000000..5a50d1ae4c24691c4a8bc1f01971d8e4d2c8cb56
Binary files /dev/null and b/src/main/resources/pictures/Scissors.png differ
diff --git a/src/main/resources/pictures/Stone.png b/src/main/resources/pictures/Stone.png
new file mode 100644
index 0000000000000000000000000000000000000000..c95af38a86265c54e7bc451116704e5739f273f6
Binary files /dev/null and b/src/main/resources/pictures/Stone.png differ
diff --git a/src/main/resources/view/view.fxml b/src/main/resources/view/Firefighterview.fxml
similarity index 100%
rename from src/main/resources/view/view.fxml
rename to src/main/resources/view/Firefighterview.fxml
diff --git a/src/main/resources/view/StonePaperScissorsView.fxml b/src/main/resources/view/StonePaperScissorsView.fxml
new file mode 100644
index 0000000000000000000000000000000000000000..a93e4635bb04f8e479e7aaa10fb7f4f0c110bb9e
--- /dev/null
+++ b/src/main/resources/view/StonePaperScissorsView.fxml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<?import javafx.scene.control.Button?>
+<?import javafx.scene.layout.HBox?>
+<?import javafx.scene.layout.VBox?>
+<?import view.StonePaperScissorsGrid?>
+
+<?import javafx.scene.control.ToggleButton?>
+<?import javafx.scene.control.Separator?>
+<?import javafx.scene.control.Label?>
+<HBox styleClass="background" stylesheets="@DarkTheme.css"
+      xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml"
+      fx:controller="controller.Controller">
+    <VBox>
+        <Separator maxHeight="-Infinity" maxWidth="-Infinity"
+                   prefHeight="24.0" prefWidth="200.0"/>
+        <Label maxHeight="-Infinity" maxWidth="-Infinity" alignment="CENTER" prefHeight="24.0" prefWidth="200.0"
+               text="Generation number"/>
+        <Label fx:id="generationNumberLabel" alignment="CENTER" contentDisplay="TEXT_ONLY"
+               maxHeight="-Infinity" maxWidth="-Infinity" prefHeight="24.0" prefWidth="200.0"/>
+        <Separator maxHeight="-Infinity" maxWidth="-Infinity"
+                   prefHeight="24.0" prefWidth="200.0"/>
+        <Button fx:id="restartButton" maxHeight="-Infinity" maxWidth="-Infinity"
+                mnemonicParsing="false" onAction="#restartButtonAction" prefHeight="24.0" prefWidth="200.0"
+                text="Restart"/>
+        <Button fx:id="oneStepButton" maxHeight="-Infinity" maxWidth="-Infinity"
+                mnemonicParsing="false" onAction="#oneStepButtonAction" prefHeight="24.0" prefWidth="200.0"
+                text="One step"/>
+        <ToggleButton fx:id="playToggleButton" maxHeight="-Infinity" maxWidth="-Infinity"
+                      mnemonicParsing="false" onAction="#playToggleButtonAction" prefHeight="24.0"
+                      prefWidth="200.0" styleClass="button" text="Play"/>
+        <ToggleButton fx:id="pauseToggleButton" maxHeight="-Infinity" maxWidth="-Infinity"
+                      mnemonicParsing="false" onAction="#pauseToggleButtonAction" prefHeight="24.0"
+                      prefWidth="200.0" styleClass="button" text="Pause"/>
+    </VBox>
+    <StonePaperScissorsGrid fx:id="grid"
+                     xmlns="http://javafx.com/javafx"
+                     xmlns:fx="http://javafx.com/fxml">
+    </StonePaperScissorsGrid>
+</HBox>
\ No newline at end of file