diff --git a/Assets/Scripts/Loading/Stage.cs b/Assets/Scripts/Loading/Stage.cs
index b053893f3f5c02d74c7e00fb11369b85313b7a97..5830eef2fd2036df69864a8bc2a4401bd58d17d6 100644
--- a/Assets/Scripts/Loading/Stage.cs
+++ b/Assets/Scripts/Loading/Stage.cs
@@ -52,12 +52,46 @@ private static List<Directories>
 
     public Stage()
     {
-        solution = new SolutionOrganizer();
-        player_record = new PlayerRecord(record_name);
-        player_record_list = new Dictionary<string, PlayerRecord>();
+        InitOOP();
     }
 
     public Stage(string category, int number, string name, string description, string scene, bool local = true)
+    {
+        InitFields(category, number, name, description, scene, local);
+        InitOOP();
+    }
+
+    public Stage(Stage get, string category, int number, string name, string description, string scene, bool local = true)
+    {
+        Stage cpy = new Stage();
+        // "DeepCopy" of ref-types, 'cause screw c# and ICloneable
+        load(ref cpy, get.name, null, get.use_install_folder);
+        this.hierarchie = cpy.hierarchie;
+        this.solution = cpy.solution;
+        this.player_record = cpy.player_record;
+        this.player_record_list = cpy.player_record_list;
+
+        InitFields(category, number, name, description, scene, local);
+
+        hierarchie ??= new List<Directories>();
+        hierarchie.AddRange(hierStage.AsEnumerable());
+
+        player_record.load(hierarchie);
+        player_record.name = player_record.name.Replace(get.record_name, record_name);
+        player_record.store(hierarchie, false);
+
+        foreach (var record in player_record_list.Values)
+        {
+            record.load(hierarchie);
+            record.name = record.name.Replace(get.record_name, record_name);
+            record.store(hierarchie, false);
+        }
+
+        hierarchie.RemoveRange(hierarchie.Count - hierStage.Count, hierStage.Count);
+        store(false);
+    }
+
+    public void InitFields(string category, int number, string name, string description, string scene, bool local)
     {
         this.category = category;
         this.number = number;
@@ -65,29 +99,55 @@ public Stage(string category, int number, string name, string description, strin
         this.description = description;
         this.scene = scene;
         this.use_install_folder = !local;
+    }
 
+    private void InitOOP()
+    {
         solution = new SolutionOrganizer();
         player_record = new PlayerRecord(record_name);
         player_record_list = new Dictionary<string, PlayerRecord>();
     }
 
-    public void CopyStates(Stage get)
+    public void ClearAll()
+    {
+        ClearSolution();
+        ClearPlay();
+        ClearALLRecords();
+    }
+
+    public void ClearSolution()
     {
-        this.solution = get.solution;
-        this.player_record = get.player_record;
-        this.player_record_list = get.player_record_list;
+        solution.hardreset(false);
+        solution = new SolutionOrganizer();
     }
 
-    public void deletet_record(PlayerRecord record)
+    public void ClearPlay()
+    {
+        player_record.factState.hardreset(false);
+        player_record = new PlayerRecord(record_name);
+    }
+
+    public void ClearALLRecords()
+    {
+        foreach (var record in player_record_list.Values)
+            deletet_record(record, false);
+
+        player_record_list = new Dictionary<string, PlayerRecord>();
+    }
+
+    public void deletet_record(PlayerRecord record, bool b_store = true)
     {
         hierarchie ??= new List<Directories>();
         hierarchie.AddRange(hierStage.AsEnumerable());
 
+        if (record.factState != null)
+            record.factState.hardreset();
         record.delete(hierarchie);
         player_record_list.Remove(record.name);
 
         hierarchie.RemoveRange(hierarchie.Count - hierStage.Count, hierStage.Count);
-        store();
+        if(b_store)
+            store();
     }
 
     public bool set_record(PlayerRecord record)
@@ -183,13 +243,13 @@ public void delete(bool player_record_too)
         hierarchie.RemoveRange(hierarchie.Count - hierStage.Count, hierStage.Count);
     }
 
-    public void store(bool reset = false)
+    public void store(bool reset_player = false)
     {
         hierarchie ??= new List<Directories>();
         hierarchie.AddRange(hierStage.AsEnumerable());
 
         player_record.name = record_name;
-        if (reset)
+        if (reset_player)
             player_record = new PlayerRecord(record_name);
 
         //if (creatorMode || StageStatic.devel)
@@ -320,14 +380,14 @@ public static Dictionary<string, Stage> Grup(List<Directories> hierarchie = null
 
     public void ResetPlay()
     {
-        player_record = new PlayerRecord(record_name);
+        ClearPlay();
         store(true);
     }
 
     public void ResetSaves()
     {
-        player_record = new PlayerRecord(record_name);
-        player_record_list = new Dictionary<string, PlayerRecord>();
+        ClearPlay();
+        ClearALLRecords();
         store(true);
     }
 
diff --git a/Assets/Scripts/StageBehaviour.cs b/Assets/Scripts/StageBehaviour.cs
index ab8da2ba504b7464a6c03bc1966bcd19ab520dbc..4985a8cae3e2134e08ca426df1eb9f5d5e9d9ea1 100644
--- a/Assets/Scripts/StageBehaviour.cs
+++ b/Assets/Scripts/StageBehaviour.cs
@@ -13,6 +13,8 @@ void Start()
     private void OnDestroy()
     {
         StageStatic.devel = false;
+        StageStatic.stage.solution.hardreset();
+        StageStatic.stage.factState.hardreset();
     }
 
     public void SetDevel(bool devel)
diff --git a/Assets/Scripts/UI/MainMenue/PageLoader/EditLoader.cs b/Assets/Scripts/UI/MainMenue/PageLoader/EditLoader.cs
index 30746e3c76b2b5715854dc7c1c4d0b32c6a49127..ed8f0a58e86fc20eeadd3a143808dcea07de2d68 100644
--- a/Assets/Scripts/UI/MainMenue/PageLoader/EditLoader.cs
+++ b/Assets/Scripts/UI/MainMenue/PageLoader/EditLoader.cs
@@ -61,9 +61,8 @@ private bool _Clone(bool overwrite)
             return false;
         }
 
-        Stage new_stage = new Stage(category, id, name, description, scene, true);
-        new_stage.CopyStates(original_stage);
-        if(!overwrite)
+        Stage new_stage = new Stage(original_stage, category, id, name, description, scene, true);
+        if (!overwrite)
             new_stage.ResetSaves();
 
         StageStatic.stage = new_stage;