diff --git a/src/main/java/model/automata/BiColorGameOfLifeAutomaton.java b/src/main/java/model/automata/BiColorGameOfLifeAutomaton.java
new file mode 100644
index 0000000000000000000000000000000000000000..e3f4130f2f6ce61e224f5e59a93439beb85d6f7d
--- /dev/null
+++ b/src/main/java/model/automata/BiColorGameOfLifeAutomaton.java
@@ -0,0 +1,38 @@
+package model.automata;
+import model.CellularAutomaton;
+
+import java.util.Random;
+
+public class BiColorGameOfLifeAutomaton implements CellularAutomaton<BiColorGameOfLifeState> {
+    private final int rows;
+    private final int columns;
+
+    public BiColorGameOfLifeAutomaton(int rows, int columns) {
+        this.rows = rows;
+        this.columns = columns;
+    }
+
+    @Override
+    public int numberOfColumns() {
+        return columns;
+    }
+
+    @Override
+    public int numberOfRows() {
+        return rows;
+    }
+
+    @Override
+    public BiColorGameOfLifeState defaultState() {
+        return new BiColorGameOfLifeState(BiColorGameOfLifeState.StateType.DEAD);
+    }
+
+    @Override
+    public BiColorGameOfLifeState randomState(Random generator) {
+        return generator.nextDouble() < 0.5
+                ? new BiColorGameOfLifeState(BiColorGameOfLifeState.StateType.DEAD)
+                : (generator.nextDouble() < 0.5
+                ? new BiColorGameOfLifeState(BiColorGameOfLifeState.StateType.ALIVE_RED)
+                : new BiColorGameOfLifeState(BiColorGameOfLifeState.StateType.ALIVE_BLUE));
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/model/automata/BiColorGameOfLifeState.java b/src/main/java/model/automata/BiColorGameOfLifeState.java
new file mode 100644
index 0000000000000000000000000000000000000000..a2a9e9e7b15aa141bc8282546ba466023ae89c52
--- /dev/null
+++ b/src/main/java/model/automata/BiColorGameOfLifeState.java
@@ -0,0 +1,45 @@
+package model.automata;
+import javafx.scene.paint.Color;
+import model.State;
+
+import java.util.List;
+public class BiColorGameOfLifeState implements State<BiColorGameOfLifeState> {
+    public enum StateType {
+        DEAD,
+        ALIVE_RED,
+        ALIVE_BLUE }
+
+    private final StateType currentState;
+
+    public BiColorGameOfLifeState(StateType state) {
+        this.currentState = state;
+    }
+
+    @Override
+    public Color getColor() {
+        return switch (currentState) {
+            case DEAD -> Color.WHITE;
+            case ALIVE_RED -> Color.RED;
+            case ALIVE_BLUE -> Color.BLUE;
+        };
+    }
+    @Override
+    public BiColorGameOfLifeState next() {
+        return new BiColorGameOfLifeState(currentState == StateType.ALIVE_RED ? StateType.ALIVE_BLUE : StateType.ALIVE_RED);
+    }
+    @Override
+    public BiColorGameOfLifeState update(List<BiColorGameOfLifeState> neighbours) {
+        int redCount = State.count(new BiColorGameOfLifeState(StateType.ALIVE_RED), neighbours);
+        int blueCount = State.count(new BiColorGameOfLifeState(StateType.ALIVE_BLUE), neighbours);
+        int liveCount = redCount + blueCount;
+
+        if (currentState == StateType.DEAD && liveCount == 3) {
+            return new BiColorGameOfLifeState(redCount > blueCount ? StateType.ALIVE_RED : StateType.ALIVE_BLUE);
+        } else if (currentState != StateType.DEAD && (liveCount == 2 || liveCount == 3)) {
+            return this;
+        } else {
+            return new BiColorGameOfLifeState(StateType.DEAD);
+        }
+    }
+}
+
diff --git a/src/main/java/model/automata/BrianBrainAutomaton.java b/src/main/java/model/automata/BrianBrainAutomaton.java
new file mode 100644
index 0000000000000000000000000000000000000000..e500716682f69f21b6a036f8d9045219681ae01e
--- /dev/null
+++ b/src/main/java/model/automata/BrianBrainAutomaton.java
@@ -0,0 +1,37 @@
+package model.automata;
+import model.CellularAutomaton;
+
+import java.util.Random;
+
+public class BrianBrainAutomaton implements CellularAutomaton<BrianBrainState> {
+    private final int rows;
+    private final int columns;
+
+    public BrianBrainAutomaton(int rows, int columns) {
+        this.rows = rows;
+        this.columns = columns;
+    }
+
+    @Override
+    public int numberOfColumns() {
+        return columns;
+    }
+
+    @Override
+    public int numberOfRows() {
+        return rows;
+    }
+
+    @Override
+    public BrianBrainState defaultState() {
+        return new BrianBrainState(BrianBrainState.StateType.DEAD);
+    }
+
+    @Override
+    public BrianBrainState randomState(Random generator) {
+        return generator.nextDouble() < 0.5
+                ? new BrianBrainState(BrianBrainState.StateType.DEAD)
+                : new BrianBrainState(BrianBrainState.StateType.READY_TO_FIRE);
+    }
+}
+
diff --git a/src/main/java/model/automata/BrianBrainState.java b/src/main/java/model/automata/BrianBrainState.java
new file mode 100644
index 0000000000000000000000000000000000000000..412e1386d7f62a64ddd0424e13cffe49543ddece
--- /dev/null
+++ b/src/main/java/model/automata/BrianBrainState.java
@@ -0,0 +1,44 @@
+package model.automata;
+
+import javafx.scene.paint.Color;
+import model.State;
+
+import java.util.List;
+
+public class BrianBrainState implements State<BrianBrainState> {
+    enum StateType { DEAD,
+        FIRE,
+        READY_TO_FIRE }
+
+    private final StateType currentState;
+
+    public BrianBrainState(StateType state) {
+        this.currentState = state;
+    }
+
+    @Override
+    public Color getColor() {
+        return switch (currentState) {
+            case DEAD -> Color.WHITE;
+            case FIRE -> Color.RED;
+            case READY_TO_FIRE -> Color.YELLOW;
+        };
+    }
+    @Override
+    public BrianBrainState next() {
+        return new BrianBrainState(currentState == StateType.FIRE ? StateType.DEAD : StateType.FIRE);
+    }
+    @Override
+    public BrianBrainState update(List<BrianBrainState> neighbours) {
+        int fireCount = (int) neighbours.stream().filter(n -> n.currentState == StateType.FIRE).count();
+
+        if (currentState == StateType.READY_TO_FIRE && fireCount > 0) {
+            return new BrianBrainState(StateType.FIRE);
+        } else if (currentState == StateType.FIRE) {
+            return new BrianBrainState(StateType.DEAD);
+        } else {
+            return this;
+        }
+    }
+}
+