diff --git a/src/main/java/CarSimulation.java b/src/main/java/CarSimulation.java
index 108cc9377571a818a18cfa2858519ce9b829d5ec..c3627e6abecc2bde003b95a6e7d69cb51049c7eb 100644
--- a/src/main/java/CarSimulation.java
+++ b/src/main/java/CarSimulation.java
@@ -29,10 +29,10 @@ public class CarSimulation {
         dir.mkdirs();
         configureLogger();
 
-        Routes routes = new Routes();
-        routes.generateRoutes();
-
         if (showUI) {
+            Routes routes = new Routes();
+            routes.generateRoutes();
+
             Simulation simulation = new Simulation("visualized", routes, 1000, 3600, 14400, true);
             Visualizer visualizer = showUI ? new Visualizer(simulation, routes) : null;
             Thread simulationThread = new Thread(simulation);
@@ -47,7 +47,10 @@ public class CarSimulation {
         else {
             for (int carCount = MIN_CAR_COUNT; carCount <= MAX_CAR_COUNT; carCount += CAR_COUNT_CHANGE) {
                 for (int i = 0; i < REPEAT_COUNT; i++) {
-                    simulations.add(new Simulation(String.format("r%d-%d", i, carCount), routes.clone(), carCount, 3600, 14400, false));
+                    Routes routes = new Routes();
+                    routes.generateRoutes();
+
+                    simulations.add(new Simulation(String.format("r%d-%d", i, carCount), routes, carCount, 3600, 14400, false));
                 }
             }
 
diff --git a/src/main/java/simulation/ChargingStation.java b/src/main/java/simulation/ChargingStation.java
index 39d68e8881672aaeec9e0f94a41996a34acdcd60..c10abe5f0b8226b0ee235df4f7d798509d309b1e 100644
--- a/src/main/java/simulation/ChargingStation.java
+++ b/src/main/java/simulation/ChargingStation.java
@@ -2,8 +2,9 @@ package simulation;
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.List;
 
-public class ChargingStation implements Cloneable {
+public class ChargingStation {
 
     public enum ChargerType {
         Type2,
@@ -14,7 +15,7 @@ public class ChargingStation implements Cloneable {
         Tyomaapistoke
     }
 
-    public class Charger implements Comparable, Cloneable {
+    public class Charger implements Comparable {
         private final int power;
         private boolean inUse;
         private ChargerType type;
@@ -158,19 +159,9 @@ public class ChargingStation implements Cloneable {
         return s.toString();
     }
 
-    @Override
-    public ChargingStation clone() {
-        ChargingStation clone = new ChargingStation(
-                name,
-                distance,
-                distanceFromHighway,
-                new boolean[]{hasShop, hasFood, customerExclusive}
-        );
-
-        for (Charger charger : chargers) {
-            clone.addCharger(charger.getPower(), charger.getType());
-        }
-
-        return clone;
+    public ChargingStation createNew() {
+        ChargingStation chargingStation = new ChargingStation(name, distance, distanceFromHighway, new boolean[] {hasShop, hasFood, customerExclusive});
+        chargers.forEach(charger -> chargingStation.addCharger(charger.getPower(), charger.getType()));
+        return chargingStation;
     }
 }
diff --git a/src/main/java/simulation/Route.java b/src/main/java/simulation/Route.java
index 96b7ed971608320d1998bc57d3b2cf1d4140ed8e..a90d5e69ada3a070414514d12d21bae25c02b8ee 100644
--- a/src/main/java/simulation/Route.java
+++ b/src/main/java/simulation/Route.java
@@ -97,7 +97,10 @@ public class Route {
     public Route getFlippedRoute(Routes routes) {
 
         Route route = this;
-        ArrayList<ChargingStation> newChargingStations = (ArrayList<ChargingStation>) route.chargingStations.clone();
+        ArrayList<ChargingStation> newChargingStations = route.chargingStations.stream()
+            .map(ChargingStation::createNew)
+            .collect(Collectors.toCollection(ArrayList::new));
+
         ArrayList<Route> newRootRoutes = route.getRootRoutes();
         Collections.reverse(newChargingStations);
         if (newRootRoutes != null)
@@ -166,19 +169,4 @@ public class Route {
         }
         return s.toString();
     }
-
-    public Route clone(Routes newRoutes) {
-        ArrayList<ChargingStation> newChargingStations = new ArrayList<>();
-        for (ChargingStation station : chargingStations) {
-            newChargingStations.add(station.clone());
-        }
-        return new Route(
-                newRoutes,
-                name,
-                length,
-                newChargingStations,
-                startPoint,
-                endPoint
-        );
-    }
 }
diff --git a/src/main/java/simulation/Routes.java b/src/main/java/simulation/Routes.java
index 1173d9dd9f8068be9d0cca28e02690ce76244fc5..dcfe2feaecec103dcfb744a4fc4b58ab4c12487a 100644
--- a/src/main/java/simulation/Routes.java
+++ b/src/main/java/simulation/Routes.java
@@ -10,7 +10,7 @@ import java.util.List;
 import java.util.logging.Logger;
 import java.util.stream.Collectors;
 
-public class Routes implements Cloneable {
+public class Routes {
     private final Logger logger = Logger.getGlobal();
 
     public HashMap<String, Route> routes = new HashMap<>();
@@ -378,18 +378,4 @@ public class Routes implements Cloneable {
 
         return new Route(this, rootRoutes, startingPoint);
     }
-
-    @Override
-    public Routes clone() {
-        try {
-            Routes clone = (Routes) super.clone();
-            clone.routes = new HashMap<>();
-            for (String key : routes.keySet()) {
-                clone.routes.put(key, routes.get(key).clone(clone));
-            }
-            return clone;
-        } catch (CloneNotSupportedException e) {
-            throw new AssertionError();
-        }
-    }
 }