diff --git a/src/main/java/SimulatorApplication.java b/src/main/java/SimulatorApplication.java
index 1e2f7b34dadbe4ce66bfd4f13200e43cdef09ff5..6f4bae3dadd4ef98be52b754c7eb42777c572d2e 100644
--- a/src/main/java/SimulatorApplication.java
+++ b/src/main/java/SimulatorApplication.java
@@ -9,6 +9,8 @@ import javafx.stage.Stage;
 import model.CellularAutomatonSimulation;
 import model.automata.BiColorAutomaton;
 import model.automata.SeedsAutomaton;
+import model.automata.WireWorldAutomata;
+import model.automata.WireWorldState;
 
 import java.io.IOException;
 import java.net.URL;
@@ -38,7 +40,7 @@ public class SimulatorApplication extends Application {
   public SimulatorApplication() {
     this.simulation =
       new CellularAutomatonSimulation<>(
-              new BiColorAutomaton(NUMBER_OF_COLUMNS,NUMBER_OF_ROWS),
+              new WireWorldAutomata(NUMBER_OF_COLUMNS,NUMBER_OF_ROWS),
               GENERATOR
       );
   }
diff --git a/src/main/java/model/automata/WireWorldAutomata.java b/src/main/java/model/automata/WireWorldAutomata.java
new file mode 100644
index 0000000000000000000000000000000000000000..f476a25fcc321a80deb0a1141f14a679acddbf96
--- /dev/null
+++ b/src/main/java/model/automata/WireWorldAutomata.java
@@ -0,0 +1,39 @@
+package model.automata;
+
+import model.CellularAutomaton;
+
+import java.util.Random;
+
+public class WireWorldAutomata implements CellularAutomaton<WireWorldState> {
+
+    private final int numberOfColumns;
+    private final int numberOfRows;
+
+    public WireWorldAutomata(int numberOfColumns, int numberOfRows) {
+        this.numberOfColumns = numberOfColumns;
+        this.numberOfRows = numberOfRows;
+    }
+
+    @Override
+    public int numberOfColumns() {
+        return this.numberOfColumns;
+    }
+
+    @Override
+    public int numberOfRows() {
+        return this.numberOfRows;
+    }
+
+    @Override
+    public WireWorldState defaultState() {
+        return WireWorldState.DEAD;
+    }
+
+    @Override
+    public WireWorldState randomState(Random generator) {
+        int r = generator.nextInt(18);
+        return r < 5 ? WireWorldState.CONDUCTOR:
+               r == 5 ? WireWorldState.HEAD:
+                 WireWorldState.DEAD;
+    }
+}
diff --git a/src/main/java/model/automata/WireWorldState.java b/src/main/java/model/automata/WireWorldState.java
new file mode 100644
index 0000000000000000000000000000000000000000..63b89a2f55126f2a9b01f85f64748ece78ae97ea
--- /dev/null
+++ b/src/main/java/model/automata/WireWorldState.java
@@ -0,0 +1,43 @@
+package model.automata;
+
+import javafx.scene.paint.Color;
+import model.State;
+
+import java.util.List;
+
+public enum WireWorldState implements State<WireWorldState> {
+    DEAD, CONDUCTOR, HEAD, TAIL;
+
+    @Override
+    public Color getColor() {
+        return switch (this) {
+            case DEAD -> Color.BLACK;
+            case CONDUCTOR -> Color.GOLD;
+            case HEAD -> Color.BLUE;
+            case TAIL -> Color.RED;
+        };
+    }
+
+    @Override
+    public WireWorldState next() {
+        return switch (this) {
+            case DEAD -> CONDUCTOR;
+            case CONDUCTOR -> HEAD;
+            case HEAD -> TAIL;
+            case TAIL -> DEAD;
+        };
+    }
+
+    @Override
+    public WireWorldState update(List<WireWorldState> neighbours) {
+        return switch (this) {
+            case DEAD -> DEAD;
+            case CONDUCTOR -> {
+                int heads = State.count(HEAD,neighbours);
+                yield heads == 1 || heads == 2 ? HEAD: CONDUCTOR;
+            }
+            case HEAD -> TAIL;
+            case TAIL -> CONDUCTOR;
+        };
+    }
+}