diff --git a/src/main/java/view/FillingMouseListener.java b/src/main/java/view/FillingMouseListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..7cd1efd462ab71d01fb43a857698f9c809869f72
--- /dev/null
+++ b/src/main/java/view/FillingMouseListener.java
@@ -0,0 +1,41 @@
+package view;
+
+import javafx.scene.input.MouseEvent;
+import model.Cell;
+import model.CellState;
+
+public class FillingMouseListener implements MouseListener {
+    private final MatrixPane matrix;
+    private final CellState cellState;
+
+    public FillingMouseListener(MatrixPane matrix, CellState cellState) {
+        this.matrix = matrix;
+        this.cellState = cellState;
+    }
+
+    @Override
+    public void onMouseReleased(MouseEvent event, Cell cell) {
+        System.out.println("Filling Release");
+        this.matrix.resetWaitingListener();
+    }
+
+    @Override
+    public void onMouseEntered(MouseEvent event, Cell cell) {
+        System.out.println("Filling Enter");
+        if (!event.isPrimaryButtonDown()) {
+            this.matrix.resetWaitingListener();
+            return;
+        }
+        while (!cellState.equals(cell.getState())) {
+            cell.toggleState();
+        }
+    }
+
+    @Override
+    public void onMousePressed(MouseEvent event, Cell cell) {
+        System.out.println("Filling Pressed");
+        cell.toggleState();
+        CellState state = cell.getState();
+        this.matrix.setMouseListener(new FillingMouseListener(this.matrix, state));
+    }
+}
diff --git a/src/main/java/view/MatrixPane.java b/src/main/java/view/MatrixPane.java
index 03874d390de1806ba1ddb1c21085f946580b8e08..e5c0713bbc1aa839bcd95412ab1490e555962fcd 100644
--- a/src/main/java/view/MatrixPane.java
+++ b/src/main/java/view/MatrixPane.java
@@ -1,5 +1,6 @@
 package view;
 
+import javafx.scene.input.MouseDragEvent;
 import javafx.scene.input.MouseEvent;
 import javafx.scene.layout.GridPane;
 import javafx.scene.shape.Rectangle;
@@ -25,7 +26,7 @@ public class MatrixPane extends GridPane{
         Rectangle rectangleCell = new Rectangle(CELL_SIZE, CELL_SIZE);
         addStatePropertyListener(cell, rectangleCell);
         updateFill(rectangleCell, cell.getState());
-        addClickEventHandler(cell, rectangleCell);
+        addEventHandler(cell, rectangleCell);
         add(rectangleCell, columnIndex, rowIndex);
     }
 
@@ -38,7 +39,37 @@ public class MatrixPane extends GridPane{
         cellRectangle.setFill(newCellState.color);
     }
 
-    private void addClickEventHandler(Cell cell, Rectangle cellRectangle) {
-        cellRectangle.addEventHandler(MouseEvent.MOUSE_CLICKED, event -> cell.toggleState());
+    private void addEventHandler(Cell cell, Rectangle cellRectangle) {
+        cellRectangle.addEventHandler(
+                MouseEvent.MOUSE_PRESSED,
+                event -> mouseListener.onMousePressed(event, cell)
+        );
+        cellRectangle.addEventHandler(
+                MouseEvent.DRAG_DETECTED,
+                event -> {
+                    System.out.println("Full drag start");
+                    this.startFullDrag();
+                }
+        );
+        cellRectangle.addEventHandler(
+                MouseDragEvent.MOUSE_DRAG_RELEASED,
+                event -> mouseListener.onMouseReleased(event, cell)
+        );
+        cellRectangle.addEventHandler(
+                MouseDragEvent.MOUSE_DRAG_ENTERED,
+                event -> mouseListener.onMouseEntered(event, cell)
+        );
+    }
+
+    private MouseListener mouseListener = new WaitingMouseListener(this);
+
+    void setMouseListener(MouseListener mouseListener) {
+        System.out.println("Change listener");
+        this.mouseListener = mouseListener;
+    }
+
+    void resetWaitingListener() {
+        System.out.println("Reset listener");
+        this.mouseListener = new WaitingMouseListener(this);
     }
 }
diff --git a/src/main/java/view/MouseListener.java b/src/main/java/view/MouseListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..d227a11bab758827ba20fe3db220a523e03e4078
--- /dev/null
+++ b/src/main/java/view/MouseListener.java
@@ -0,0 +1,13 @@
+package view;
+
+import javafx.event.EventType;
+import javafx.scene.input.MouseEvent;
+import model.Cell;
+
+interface MouseListener {
+
+    default void onMousePressed(MouseEvent event, Cell cell) {}
+    default void onMouseReleased(MouseEvent event, Cell cell) {}
+    default void onMouseEntered(MouseEvent event, Cell cell) {};
+
+}
diff --git a/src/main/java/view/WaitingMouseListener.java b/src/main/java/view/WaitingMouseListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..39f1f9739a8a4328b83de1ff1126ab43faea2c41
--- /dev/null
+++ b/src/main/java/view/WaitingMouseListener.java
@@ -0,0 +1,22 @@
+package view;
+
+import javafx.scene.input.MouseEvent;
+import model.Cell;
+import model.CellState;
+
+class WaitingMouseListener implements MouseListener {
+
+
+    private final MatrixPane matrix;
+
+    WaitingMouseListener(MatrixPane matrix) {
+        this.matrix = matrix;
+    }
+
+    @Override
+    public void onMousePressed(MouseEvent event, Cell cell) {
+        cell.toggleState();
+        CellState cellState = cell.getState();
+        matrix.setMouseListener(new FillingMouseListener(this.matrix, cellState));
+    }
+}