diff --git a/Assets/Scripts/InteractionEngine/FactHandling/FactSpawner.cs b/Assets/Scripts/InteractionEngine/FactHandling/FactSpawner.cs
index 426931bee8096cffa5e3b41068e05cba67f03b7c..5ab66dde863c8d585cb08b05d99352fa51802f63 100644
--- a/Assets/Scripts/InteractionEngine/FactHandling/FactSpawner.cs
+++ b/Assets/Scripts/InteractionEngine/FactHandling/FactSpawner.cs
@@ -258,7 +258,7 @@ IEnumerator __BlossomAndDiePerFrame(FunctionCallFact FCF)
 
                     List<Fact> factlist = new();
                     foreach (object i in result)
-                        factlist.AddRange(Fact.MakeFact(i, null, StageStatic.stage.factState, true));
+                        Fact.MakeFact(factlist, i, null, StageStatic.stage.factState, true);
 
                     foreach (Fact fact in factlist)
                         SpawnFactRepresentation(fact);
@@ -282,7 +282,7 @@ IEnumerator __BlossomDragAndDie(FunctionCallFact FCF)
 
                 object[] result = FCF.Call(FCF.Domain.t_0);
                 foreach (object i in result)
-                    factlist.AddRange(Fact.MakeFact(i, null, StageStatic.stage.factState, true));
+                    Fact.MakeFact(factlist, i, null, StageStatic.stage.factState, true);
 
                 foreach (Fact fact in factlist)
                     SpawnFactRepresentation(fact);
@@ -295,7 +295,7 @@ IEnumerator __BlossomDragAndDie(FunctionCallFact FCF)
 
                     object[] result_media = FCF.Call(current_time);
                     foreach (object i in result_media)
-                        factlist_media.AddRange(Fact.MakeFact(i, null, StageStatic.stage.factState, true));
+                        Fact.MakeFact(factlist_media, i, null, StageStatic.stage.factState, true);
 
                     for (int i = 0; i < math.min(factlist.Count, factlist_media.Count); i++)
                     {
diff --git a/Assets/Scripts/InteractionEngine/FactHandling/Facts/AbstractAngleFact.cs b/Assets/Scripts/InteractionEngine/FactHandling/Facts/AbstractAngleFact.cs
index 50ec738dde1ee81cf8e40ec00926c1c5e69d42b9..8692997e9f1d39f199ab1b5b9466c7f8194c8aee 100644
--- a/Assets/Scripts/InteractionEngine/FactHandling/Facts/AbstractAngleFact.cs
+++ b/Assets/Scripts/InteractionEngine/FactHandling/Facts/AbstractAngleFact.cs
@@ -1,6 +1,7 @@
 using Newtonsoft.Json;
 using REST_JSON_API;
 using System;
+using System.Collections;
 using System.Collections.Generic;
 using TMPro;
 using UnityEngine;
@@ -168,13 +169,13 @@ public override MMTFact MakeMMTDeclaration()
     }
 
     /// \copydoc Fact.parseFact(ScrollFact)
-    public new static List<Fact> parseFact(MMTFact fact)
+    public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact)
     {
         if (fact is not MMTValueFact value_fact) //If angle is a 90Degree-Angle
             throw new ArgumentException("Angle 90 degrees parsed. This shouldn't happen anymore");
 
         if (value_fact.lhs is not OMA lhs)
-            return new();
+            yield break;
 
         float angle = value_fact.value == null
             ? -0
@@ -187,9 +188,9 @@ public override MMTFact MakeMMTDeclaration()
         if (!FactRecorder.AllFacts.ContainsKey(pointAUri)
          || !FactRecorder.AllFacts.ContainsKey(pointBUri)
          || !FactRecorder.AllFacts.ContainsKey(pointCUri))
-            return new();
+            yield break;
 
-        return new() { new AngleFact(pointAUri, pointBUri, pointCUri, angle, fact.@ref, StageStatic.stage.factState) };
+        ret.Add(new AngleFact(pointAUri, pointBUri, pointCUri, angle, fact.@ref, StageStatic.stage.factState));
     }
 
     /// \copydoc Fact.generateLabel
@@ -266,9 +267,9 @@ public override MMTFact MakeMMTDeclaration()
         return new MMTGeneralFact(Label, tp, df);
 }
 
-/// \copydoc Fact.parseFact(ScrollFact)
-public new static List<Fact> parseFact(MMTFact fact)
-{
+    /// \copydoc Fact.parseFact(ScrollFact)
+    public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact)
+    {
     if (((MMTGeneralFact)fact).type
             is not OMA proof_OMA // proof DED
         || proof_OMA.arguments[0]
@@ -278,7 +279,7 @@ is not OMA rightAngleOMA // rightAngle OMA
         || rightAngleOMA.arguments[0]
             is not OMS // rightAngle Arg0
     )
-        return new();
+        yield break;
 
     string Point1Uri = ((OMS)rightAngleOMA.arguments[0]).uri;
     string Point2Uri = ((OMS)rightAngleOMA.arguments[1]).uri;
@@ -287,9 +288,9 @@ is not OMS // rightAngle Arg0
     if (!FactRecorder.AllFacts.ContainsKey(Point1Uri)
      || !FactRecorder.AllFacts.ContainsKey(Point2Uri)
      || !FactRecorder.AllFacts.ContainsKey(Point3Uri))
-        return new();
+        yield break;
 
-    return new() { new RightAngleFact(Point1Uri, Point2Uri, Point3Uri, fact.@ref, StageStatic.stage.factState) };
+    ret.Add(new RightAngleFact(Point1Uri, Point2Uri, Point3Uri, fact.@ref, StageStatic.stage.factState));
 }
 
 /// \copydoc Fact.generateLabel
diff --git a/Assets/Scripts/InteractionEngine/FactHandling/Facts/AbstractLineFact.cs b/Assets/Scripts/InteractionEngine/FactHandling/Facts/AbstractLineFact.cs
index 888f386c20121d631846f58eb6ddf98b12b2764b..37db0c761674029f971c4016b88ad2305716e4ff 100644
--- a/Assets/Scripts/InteractionEngine/FactHandling/Facts/AbstractLineFact.cs
+++ b/Assets/Scripts/InteractionEngine/FactHandling/Facts/AbstractLineFact.cs
@@ -1,5 +1,6 @@
 using Newtonsoft.Json;
 using REST_JSON_API;
+using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 
@@ -87,7 +88,7 @@ protected override void RecalculateTransform()
     public override bool HasDependentFacts => true;
 
     /// \copydoc Fact.getDependentFactIds
-    protected override string[] GetDependentFactIds() 
+    protected override string[] GetDependentFactIds()
         => new string[] { Pid1, Pid2 };
 }
 
@@ -154,16 +155,16 @@ public override MMTFact MakeMMTDeclaration()
     }
 
     /// \copydoc Fact.parseFact(ScrollFact)
-    public new static List<Fact> parseFact(MMTFact fact)
+    public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact)
     {
         string pointAUri = ((OMS)((OMA)((MMTValueFact)fact).lhs).arguments[0]).uri;
         string pointBUri = ((OMS)((OMA)((MMTValueFact)fact).lhs).arguments[1]).uri;
 
         if (!FactRecorder.AllFacts.ContainsKey(pointAUri)
          || !FactRecorder.AllFacts.ContainsKey(pointBUri))
-            return new();
+            yield break;
 
-        return new() { new LineFact(pointAUri, pointBUri, fact.@ref, StageStatic.stage.factState) };
+        ret.Add(new LineFact(pointAUri, pointBUri, fact.@ref, StageStatic.stage.factState));
     }
 
     /// \copydoc Fact.generateLabel
@@ -203,7 +204,7 @@ public RayFact(string pid1, string pid2, FactRecorder organizer) : base(pid1, pi
     public override MMTFact MakeMMTDeclaration()
     {
         SOMDoc type = new OMS(MMTConstants.LineType);
-        SOMDoc defines = 
+        SOMDoc defines =
             new OMA(
                 new OMS(MMTConstants.LineOf),
                 new[] {
@@ -215,19 +216,19 @@ public override MMTFact MakeMMTDeclaration()
     }
 
     /// \copydoc Fact.parseFact(ScrollFact)
-    public new static List<Fact> parseFact(MMTFact fact)
+    public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact)
     {
         if (((MMTGeneralFact)fact).defines is not OMA defines)
-            return new();
+            yield break;
 
         string pointAUri = ((OMS)defines.arguments[0]).uri;
         string pointBUri = ((OMS)defines.arguments[1]).uri;
 
         if (!FactRecorder.AllFacts.ContainsKey(pointAUri)
          || !FactRecorder.AllFacts.ContainsKey(pointBUri))
-            return new();
+            yield break;
 
-        return new() { new RayFact(pointAUri, pointBUri, fact.@ref, StageStatic.stage.factState) };
+        ret.Add(new RayFact(pointAUri, pointBUri, fact.@ref, StageStatic.stage.factState));
     }
 
     protected override void RecalculateTransform()
diff --git a/Assets/Scripts/InteractionEngine/FactHandling/Facts/CircleFact.cs b/Assets/Scripts/InteractionEngine/FactHandling/Facts/CircleFact.cs
index ece3b887d9d8eef0bcdb57e4ae9e8bafc777145c..9de6902bdfc9277983c4287c6135755eca3ac517 100644
--- a/Assets/Scripts/InteractionEngine/FactHandling/Facts/CircleFact.cs
+++ b/Assets/Scripts/InteractionEngine/FactHandling/Facts/CircleFact.cs
@@ -3,6 +3,7 @@
 using UnityEngine;
 using Newtonsoft.Json;
 using REST_JSON_API;
+using System.Collections;
 
 /// <summary>
 /// A Circle that is made out of a middle point, a plane and a radius
@@ -90,10 +91,10 @@ public CircleFact(string Pid1, string Pid2, float radius, Vector3 normal, SOMDoc
     /// parses the Circlefact response of the MMT-Server
     /// </summary>
     /// \copydoc Fact.parseFact(ScrollFact) 
-    public new static List<Fact> parseFact(MMTFact fact)
+    public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact)
     {
         if (((MMTGeneralFact)fact).defines is not OMA df)
-            return new();
+            yield break;
 
         OMA planeOMA = (OMA)df.arguments[0];
         string planeApplicant = ((OMS)planeOMA.applicant).uri;
@@ -125,9 +126,9 @@ public CircleFact(string Pid1, string Pid2, float radius, Vector3 normal, SOMDoc
 
         if (!FactRecorder.AllFacts.ContainsKey(M_uri)
          || !FactRecorder.AllFacts.ContainsKey(A_uri))
-            return new(); //If dependent facts do not exist return null
+            yield break; //If dependent facts do not exist return null
 
-        return new() { new CircleFact(M_uri, A_uri, radius, normal, fact.@ref, StageStatic.stage.factState) };
+        ret.Add(new CircleFact(M_uri, A_uri, radius, normal, fact.@ref, StageStatic.stage.factState));
     }
 
     /// \copydoc Fact.generateLabel
@@ -252,14 +253,14 @@ public RadiusFact(string Cid1, SOMDoc _ServerDefinition, FactRecorder organizer)
     }
 
     /// \copydoc Fact.parseFact(ScrollFact)
-    public new static List<Fact> parseFact(MMTFact fact)
+    public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact)
     {
         string CircleUri = ((OMS)((OMA)((MMTValueFact)fact).lhs).arguments[0]).uri;
 
         if (!FactRecorder.AllFacts.ContainsKey(CircleUri))
-            return new();
+            yield break;
 
-        return new() { new RadiusFact(CircleUri, fact.@ref, StageStatic.stage.factState) };
+        ret.Add(new RadiusFact(CircleUri, fact.@ref, StageStatic.stage.factState));
     }
 
     /// \copydoc Fact.generateLabel
@@ -361,14 +362,14 @@ public AreaCircleFact(string Cid1, SOMDoc _ServerDefinition, FactRecorder organi
     }
 
     /// \copydoc Fact.parseFact(ScrollFact)
-    public new static List<Fact> parseFact(MMTFact fact)
+    public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact)
     {
         string CircleUri = ((OMS)((OMA)((MMTValueFact)fact).lhs).arguments[0]).uri;
 
         if (!FactRecorder.AllFacts.ContainsKey(CircleUri))
-            return new();
+            yield break;
 
-        return new() { new AreaCircleFact(CircleUri, fact.@ref, StageStatic.stage.factState) };
+        ret.Add(new AreaCircleFact(CircleUri, fact.@ref, StageStatic.stage.factState));
     }
 
     /// \copydoc Fact.generateLabel
@@ -469,19 +470,19 @@ public OnCircleFact(string pid, string cid, SOMDoc _ServerDefinition, FactRecord
     }
 
     /// \copydoc Fact.parseFact(ScrollFact)
-    public new static List<Fact> parseFact(MMTFact fact)
+    public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact)
     {
         if (((MMTGeneralFact)fact).type is not OMA type)
-            return new();
+            yield break;
 
         string circleUri = ((OMS)((OMA)type.arguments[0]).arguments[0]).uri;
         string pointUri = ((OMS)((OMA)type.arguments[0]).arguments[1]).uri;
 
         if (!FactRecorder.AllFacts.ContainsKey(pointUri)
          || !FactRecorder.AllFacts.ContainsKey(circleUri))
-            return new();
+            yield break;
 
-        return new() { new OnCircleFact(pointUri, circleUri, fact.@ref, StageStatic.stage.factState) };
+        ret.Add(new OnCircleFact(pointUri, circleUri, fact.@ref, StageStatic.stage.factState));
     }
 
     /// \copydoc Fact.generateLabel
@@ -614,10 +615,10 @@ public AngleCircleLineFact(string Cid1, string Rid2, float angle, SOMDoc _Server
     }
 
     /// \copydoc Fact.parseFact(ScrollFact)
-    public new static List<Fact> parseFact(MMTFact fact)
+    public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact)
     {
         if (((MMTValueFact)fact).lhs is not OMA lhs)
-            return new();
+            yield break;
 
         // init it with 0 degrees, so we don't accidentally generate orthogonalfacts 
         // and the parsing works correctly if smb ever adds a scroll for this
@@ -631,9 +632,9 @@ public AngleCircleLineFact(string Cid1, string Rid2, float angle, SOMDoc _Server
 
         if (!FactRecorder.AllFacts.ContainsKey(CircleUri)
          || !FactRecorder.AllFacts.ContainsKey(RayUri))
-            return new();
+            yield break;
 
-        return new() { new AngleCircleLineFact(CircleUri, RayUri, angle, fact.@ref, StageStatic.stage.factState) };
+        ret.Add(new AngleCircleLineFact(CircleUri, RayUri, angle, fact.@ref, StageStatic.stage.factState));
     }
 
     /// \copydoc Fact.generateLabel
@@ -752,19 +753,19 @@ public OrthogonalCircleLineFact(string Cid1, string Lid1, SOMDoc _ServerDefiniti
     }
 
     /// \copydoc Fact.parseFact(ScrollFact)
-    public new static List<Fact> parseFact(MMTFact fact)
+    public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact)
     {
         if (((MMTGeneralFact)fact).type is not OMA type)
-            return new();
+            yield break;
 
         string CircleUri = ((OMS)((OMA)type.arguments[0]).arguments[0]).uri;
         string LineUri = ((OMS)((OMA)type.arguments[0]).arguments[1]).uri;
 
         if (!FactRecorder.AllFacts.ContainsKey(CircleUri)
          || !FactRecorder.AllFacts.ContainsKey(LineUri))
-            return new();
+            yield break;
 
-        return new() { new OrthogonalCircleLineFact(CircleUri, LineUri, fact.@ref, StageStatic.stage.factState) };
+        ret.Add(new OrthogonalCircleLineFact(CircleUri, LineUri, fact.@ref, StageStatic.stage.factState));
     }
 
     /// \copydoc Fact.generateLabel
@@ -867,10 +868,10 @@ public EqualCirclesFact(string Cid1, string Cid2, SOMDoc _ServerDefinition, Fact
     }
 
     /// \copydoc Fact.parseFact(ScrollFact)
-    public new static List<Fact> parseFact(MMTFact fact)
+    public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact)
     {
         if (((MMTGeneralFact)fact).type is not OMA proof_OMA) // proof DED
-            return new();
+            yield break;
 
         OMA parallel_circles_OMA = (OMA)proof_OMA.arguments[0]; // parallel
 
@@ -879,9 +880,9 @@ public EqualCirclesFact(string Cid1, string Cid2, SOMDoc _ServerDefinition, Fact
 
         if (!FactRecorder.AllFacts.ContainsKey(circleAUri)
          || !FactRecorder.AllFacts.ContainsKey(circleBUri))
-            return new();
+            yield break;
 
-        return new() { new EqualCirclesFact(circleAUri, circleBUri, fact.@ref, StageStatic.stage.factState) };
+        ret.Add(new EqualCirclesFact(circleAUri, circleBUri, fact.@ref, StageStatic.stage.factState));
     }
 
     /// \copydoc Fact.generateLabel
@@ -984,10 +985,10 @@ public UnEqualCirclesFact(string Cid1, string Cid2, SOMDoc _ServerDefinition, Fa
     }
 
     /// \copydoc Fact.parseFact(ScrollFact)
-    public new static List<Fact> parseFact(MMTFact fact)
+    public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact)
     {
         if (((MMTGeneralFact)fact).type is not OMA proof_OMA) // proof DED
-            return new();
+            yield break;
 
         OMA unequal_circles_OMA = (OMA)proof_OMA.arguments[0]; // unequal
 
@@ -996,9 +997,9 @@ public UnEqualCirclesFact(string Cid1, string Cid2, SOMDoc _ServerDefinition, Fa
 
         if (!FactRecorder.AllFacts.ContainsKey(circleAUri)
          || !FactRecorder.AllFacts.ContainsKey(circleBUri))
-            return new();
+            yield break;
 
-        return new() { new UnEqualCirclesFact(circleAUri, circleBUri, fact.@ref, StageStatic.stage.factState) };
+        ret.Add(new UnEqualCirclesFact(circleAUri, circleBUri, fact.@ref, StageStatic.stage.factState));
     }
 
     /// \copydoc Fact.generateLabel
diff --git a/Assets/Scripts/InteractionEngine/FactHandling/Facts/Fact.cs b/Assets/Scripts/InteractionEngine/FactHandling/Facts/Fact.cs
index 3164ffd6239dba607ed65291b026cfd8788fe939..84fcffdb3a05dcc102ff767666c4cdafc42ccc63 100644
--- a/Assets/Scripts/InteractionEngine/FactHandling/Facts/Fact.cs
+++ b/Assets/Scripts/InteractionEngine/FactHandling/Facts/Fact.cs
@@ -7,13 +7,14 @@
 using System.Linq;
 using REST_JSON_API;
 using System.Drawing;
+using System.Collections;
 
 public static class ParsingDictionary
 {
     //TODO? get rid of this, use reflection? instead, if possible
     //TODO: docu
 
-    public static Dictionary<string, Func<MMTFact, List<Fact>>> parseFactDictionary = new() {
+    public static Dictionary<string, Func<List<Fact>, MMTFact, IEnumerator>> parseFactDictionary = new() {
         { MMTConstants.Point,
             PointFact.parseFact },
         { MMTConstants.Metric,
@@ -398,7 +399,7 @@ protected virtual string generateLabel()
     /// </summary>
     /// <param name="fact">instance to be parsed</param>
     /// <returns>parsed Fact</returns>
-    public static List<Fact> parseFact(MMTFact fact)
+    public static IEnumerator parseFact(List<Fact> ret, MMTFact fact)
         => null;
 
     /// <summary>
@@ -506,7 +507,7 @@ static string _SendAdd(string path, string body)//, Action<string> uriCallback)
     }
 
     private static uint bypasscc = 0;
-    public static List<Fact> MakeFact(object payload, SOMDoc ServerDefinition, FactRecorder organizer, bool BypassServer)
+    public static void MakeFact(List<Fact> ret, object payload, SOMDoc ServerDefinition, FactRecorder organizer, bool BypassServer)
     {
         Type type = payload.GetType();
 
@@ -514,44 +515,45 @@ public static List<Fact> MakeFact(object payload, SOMDoc ServerDefinition, FactR
         SOMDoc BypassURI = new OMS($"{bypasscc}_{ServerDefinition}");
 
         if (payload is Fact fact)
-            return new() { fact };
+            ret.Add(fact);
         else
         if (payload is float f)
-            return new() { BypassServer
+            ret.Add(BypassServer
                 ? new RealLitFact(f, BypassURI, organizer)
-                : new RealLitFact(f, organizer) };
+                : new RealLitFact(f, organizer));
         else
         if (payload is Vector3 point)
-            return new() { BypassServer
+            ret.Add(BypassServer
                 ? new PointFact(point, BypassURI, organizer)
-                : new PointFact(point, Vector3.up, organizer) };
+                : new PointFact(point, Vector3.up, organizer));
         else
         if (FuncExtensions.IsFuncType(type, out _))
-            return new() {  BypassServer
+            ret.Add(BypassServer
                 ? new FunctionFact(ServerDefinition, BypassURI, organizer)
-                : new FunctionFact(ServerDefinition, organizer)};
+                : new FunctionFact(ServerDefinition, organizer));
         else
         if (TupleExtensions.IsTupleType(type, out _))
-            return BypassServer
+            ret.AddRange(BypassServer
                 ? DynamicTupleFact.MMTFactory(payload, ServerDefinition, SOMDoc.SOMDocType(type), organizer, BypassURI)
-                : DynamicTupleFact.MMTFactory(payload, ServerDefinition, SOMDoc.SOMDocType(type), organizer);
+                : DynamicTupleFact.MMTFactory(payload, ServerDefinition, SOMDoc.SOMDocType(type), organizer));
         else
         if (type.IsGenericType
          && type.GetGenericTypeDefinition() == typeof(List<>))
-            return BypassServer
+            ret.AddRange(BypassServer
                 ? DynamicListFact.MMTFactory((List<dynamic>)payload, ServerDefinition, SOMDoc.SOMDocType(type), organizer, BypassURI)
-                : DynamicListFact.MMTFactory((List<dynamic>)payload, ServerDefinition, SOMDoc.SOMDocType(type), organizer);
+                : DynamicListFact.MMTFactory((List<dynamic>)payload, ServerDefinition, SOMDoc.SOMDocType(type), organizer));
         else
         if (type.IsAnonymousType())
-            return new();
+            return;
         else
             throw new NotImplementedException($"For Type {type}.");
+        return;
     }
 }
 
 public interface IUnpackable
 {
-    public abstract List<Fact> UnpackMe(bool BypassServer);
+    public abstract IEnumerator UnpackMe(List<Fact> ret, bool BypassServer);
 }
 
 /// <summary>
@@ -649,14 +651,14 @@ public PointFact(Vector3 point, SOMDoc _ServerDefinition, FactRecorder organizer
     }
 
     /// \copydoc Fact.parseFact(ScrollFact)
-    public new static List<Fact> parseFact(MMTFact fact)
+    public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact)
     {
         if (((MMTGeneralFact)fact).defines is not OMA defines)
-            return new();
+            yield break;
         ParsingDictionary.parseTermsToId.TryAdd(defines.ToString(), fact.@ref.uri);
 
         Vector3 point = SOMDoc.MakeVector3(defines);
-        return new() { new PointFact(point, fact.@ref, StageStatic.stage.factState) };
+        ret.Add(new PointFact(point, fact.@ref, StageStatic.stage.factState));
     }
 
     /// \copydoc Fact.hasDependentFacts
@@ -766,7 +768,7 @@ public OnLineFact(string pid, string rid, SOMDoc _ServerDefinition, FactRecorder
     }
 
     /// \copydoc Fact.parseFact(ScrollFact)
-    public new static List<Fact> parseFact(MMTFact fact)
+    public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact)
     {
         string pointUri = ((OMS)((OMA)((OMA)((MMTGeneralFact)fact).type).arguments[0]).arguments[1]).uri;
         string lineUri = ((OMA)((OMA)((MMTGeneralFact)fact).type).arguments[0]).arguments[0] is OMS
@@ -777,9 +779,9 @@ public OnLineFact(string pid, string rid, SOMDoc _ServerDefinition, FactRecorder
 
         if (!FactRecorder.AllFacts.ContainsKey(pointUri)
          || !FactRecorder.AllFacts.ContainsKey(lineUri))
-            return new();
+            yield break;
 
-        return new() { new OnLineFact(pointUri, lineUri, fact.@ref, StageStatic.stage.factState) };
+        ret.Add(new OnLineFact(pointUri, lineUri, fact.@ref, StageStatic.stage.factState));
     }
 
     /// \copydoc Fact.generateLabel
@@ -873,10 +875,10 @@ public ParallelLineFact(string Lid1, string Lid2, SOMDoc _ServerDefinition, Fact
     }
 
     /// \copydoc Fact.parseFact(ScrollFact)
-    public new static List<Fact> parseFact(MMTFact fact)
+    public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact)
     {
         if (((MMTGeneralFact)fact).type is not OMA type) // proof DED
-            return new();
+            yield break;
 
         OMA parallel_lines_OMA = (OMA)type.arguments[0]; // parallel
 
@@ -885,9 +887,9 @@ public ParallelLineFact(string Lid1, string Lid2, SOMDoc _ServerDefinition, Fact
 
         if (!FactRecorder.AllFacts.ContainsKey(lineAUri)
          || !FactRecorder.AllFacts.ContainsKey(lineBUri))
-            return new();
+            yield break;
 
-        return new() { new ParallelLineFact(lineAUri, lineBUri, fact.@ref, StageStatic.stage.factState) };
+        ret.Add(new ParallelLineFact(lineAUri, lineBUri, fact.@ref, StageStatic.stage.factState));
     }
 
     /// \copydoc Fact.generateLabel
@@ -989,7 +991,7 @@ private void Init(string[] pid_corners)
     }
 
     /// \copydoc Fact.parseFact(ScrollFact)
-    public new static List<Fact> parseFact(MMTFact fact)
+    public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact)
     {
         throw new NotImplementedException();
     }
@@ -1088,11 +1090,12 @@ public TestFact(string backendURI, FactRecorder organizer) : base(organizer)
     /// parses the Circlefact response of the MMT-Server
     /// </summary>
     /// \copydoc Fact.parseFact(ScrollFact) 
-    public new static List<Fact> parseFact(MMTFact fact)
+    public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact)
     {
         string uri = fact.@ref.uri;
         Debug.Log("TestFact Uri:" + uri);
-        return new() { new TestFact(uri, StageStatic.stage.factState) };
+        ret.Add(new TestFact(uri, StageStatic.stage.factState));
+        yield break;
     }
 
     /// \copydoc Fact.generateLabel
diff --git a/Assets/Scripts/InteractionEngine/FactHandling/Facts/FunctionFact.cs b/Assets/Scripts/InteractionEngine/FactHandling/Facts/FunctionFact.cs
index 6eb37e82884eef8b41a63b3873e14bf75e849dbf..11f92e2769407a8a70577bcac6fd213794bca498 100644
--- a/Assets/Scripts/InteractionEngine/FactHandling/Facts/FunctionFact.cs
+++ b/Assets/Scripts/InteractionEngine/FactHandling/Facts/FunctionFact.cs
@@ -5,6 +5,7 @@
 using System.Linq;
 using REST_JSON_API;
 using System.Linq.Expressions;
+using System.Collections;
 
 public class FunctionCallFact : FactWrappedCRTP<FunctionCallFact>
 {
@@ -169,18 +170,18 @@ public FunctionFact(SOMDoc Function_SOMDoc, SOMDoc _ServerDefinition, FactRecord
     protected override void RecalculateTransform() { }
 
     /// \copydoc Fact.parseFact(ScrollFact)
-    public new static List<Fact> parseFact(MMTFact fact)
+    public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact)
     {// TODO Correctness
 
         if (((MMTGeneralFact)fact).defines is not FUN fun
             && (((MMTGeneralFact)fact).defines is not FallbackWrapper SFW
             || (fun = SFW.SFunction as FUN) == null)
         )
-            return new();
+            yield break;
 
         ParsingDictionary.parseTermsToId.TryAdd(fun.ToString(), fact.@ref.uri);
 
-        return new() { new FunctionFact(fun, fact.@ref, StageStatic.stage.factState) };
+        ret.Add(new FunctionFact(fun, fact.@ref, StageStatic.stage.factState));
     }
 
     /// \copydoc Fact.hasDependentFacts
diff --git a/Assets/Scripts/InteractionEngine/FactHandling/Facts/MMTTypes.cs b/Assets/Scripts/InteractionEngine/FactHandling/Facts/MMTTypes.cs
index cbc3ea9179f739c9d72e7a301d1a5ca8b2523709..bb79a3a9acd627d4f4ef2af7ab6b1c59541d8a96 100644
--- a/Assets/Scripts/InteractionEngine/FactHandling/Facts/MMTTypes.cs
+++ b/Assets/Scripts/InteractionEngine/FactHandling/Facts/MMTTypes.cs
@@ -6,6 +6,7 @@
 using UnityEngine;
 using System.Runtime.CompilerServices;
 using Newtonsoft.Json;
+using System.Collections;
 
 /// <summary>
 /// 
@@ -157,6 +158,7 @@ protected override bool EquivalentWrapped(ListFact f1, ListFact f2)
 
 public class DynamicListFact : FactWrappedCRTP<DynamicListFact>, IUnpackable
 {
+    [JsonIgnore]
     public List<object> payload;
 
     public SOMDoc indirect_payload;
@@ -227,22 +229,20 @@ public override MMTFact MakeMMTDeclaration()
         ? throw new NotSupportedException(nameof(indirect_payload) + " must not be null")
         : new MMTGeneralFact(Label, ListType, indirect_payload);
 
-    public static new List<Fact> parseFact(MMTFact fact)
+    public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact)
     {
         if (fact is not MMTGeneralFact MMTSymbol)
-            return new();
+            yield break;
 
         List<Fact> orig = MMTFactory(null,
             MMTSymbol.defines, MMTSymbol.type,
             StageStatic.stage.factState, MMTSymbol.@ref
         );
 
-        List<Fact> ret = new(orig);
+        ret.AddRange(orig);
         foreach (Fact Fact in orig)
             if (Fact is DynamicListFact pack)
-                ret.AddRange(pack.UnpackMe(true)); //TODO: set to false, once Server can index
-
-        return ret;
+                yield return pack.UnpackMe(ret, true); //TODO: set to false, once Server can index
     }
 
     public SOMDoc SOMDocIndexer(int i)
@@ -253,11 +253,11 @@ public SOMDoc SOMDocIndexer(int i)
                 new OMLIT<float>(i)
         });
 
-    // Best I can do is Equalness
     protected override bool EquivalentWrapped(DynamicListFact f1, DynamicListFact f2)
-        => f1.payload.Count == f2.payload.Count
+        => f1.payload != null && f2.payload != null
+        && f1.payload.Count == f2.payload.Count
         && f1.ListType.Equivalent(f2.ListType)
-        && f1.payload.Zip(f2.payload, (e1, e2) => e1.Equals(e2)).All(b => b);
+        && f1.payload.SequenceEqual(f2.payload, ApproximationComparer.Instance);
 
     protected override string[] GetDependentFactIds()
         => indirect_payload.GetDependentFactIds();
@@ -267,10 +267,14 @@ protected override void RecalculateTransform() { }
     protected override Fact _ReInitializeMe(Dictionary<string, string> old_to_new, FactRecorder organizer)
         => new DynamicListFact(payload, indirect_payload?.MapURIs(old_to_new), ListType, organizer);
 
-    public List<Fact> UnpackMe(bool BypassServer)
-        => payload.SelectMany((object p, int i) =>
-                MakeFact(p, SOMDocIndexer(i), _Facts, BypassServer)
-            ).ToList();
+    public IEnumerator UnpackMe(List<Fact> ret, bool BypassServer)
+    {
+        for (int i = 0; i < payload.Count; i++)
+        {
+            MakeFact(ret, payload[i], SOMDocIndexer(i), _Facts, BypassServer);
+            yield return null;
+        }
+    }
 }
 
 /// <summary>
@@ -364,6 +368,7 @@ protected override bool EquivalentWrapped(TupleFact f1, TupleFact f2)
 
 public class DynamicTupleFact : FactWrappedCRTP<DynamicTupleFact>, IUnpackable
 {
+    [JsonIgnore]
     object payload;
 
     int count;
@@ -462,15 +467,16 @@ public override MMTFact MakeMMTDeclaration()
         ? throw new NotSupportedException(nameof(indirect_payload) + " must not be null")
         : new MMTGeneralFact(Label, TupleType, indirect_payload);
 
-    public static new List<Fact> parseFact(MMTFact fact)
+    public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact)
     {
         if (fact is not MMTGeneralFact MMTSymbol)
-            return new();
+            yield break;
 
-        return MMTFactory(null,
-            MMTSymbol.defines, MMTSymbol.type,
-            StageStatic.stage.factState, MMTSymbol.@ref
-        );
+        ret.AddRange(
+            MMTFactory(null,
+                MMTSymbol.defines, MMTSymbol.type,
+                StageStatic.stage.factState, MMTSymbol.@ref
+        ));
     }
 
     public SOMDoc SOMDocIndexer(int i)
@@ -496,15 +502,16 @@ public static SOMDoc SOMDocIndexer(int i, int count, SOMDoc indirect_payload)
             : ret;
     }
 
-    // Best I can do is Equalness
     protected override bool EquivalentWrapped(DynamicTupleFact f1, DynamicTupleFact f2)
     {
         if (f1.count != f2.count
-        || !f1.TupleType.Equivalent(f2.TupleType))
+        || !f1.TupleType.Equivalent(f2.TupleType)
+        || f1.payload == null || f2.payload == null)
             return false;
 
         for (int i = 0; i < f1.count; i++)
-            if (!((ITuple)f1.payload)[i].Equals(((ITuple)f2.payload)[i]))
+            if (!ApproximationComparer.Instance
+                .Equals(((ITuple)f1.payload)[i], ((ITuple)f2.payload)[i]))
                 return false;
 
         return true;
@@ -518,14 +525,13 @@ protected override void RecalculateTransform() { }
     protected override Fact _ReInitializeMe(Dictionary<string, string> old_to_new, FactRecorder organizer)
         => MMTFactory(payload, indirect_payload?.MapURIs(old_to_new), TupleType, organizer)?[0];
 
-    public List<Fact> UnpackMe(bool BypassServer)
+    public IEnumerator UnpackMe(List<Fact> ret, bool BypassServer)
     {
-        List<Fact> ret = new List<Fact>();
-
         for (int i = 0; i < count; i++)
-            ret.AddRange(MakeFact(((ITuple)payload)[i], SOMDocIndexer(i), _Facts, BypassServer));
-
-        return ret;
+        {
+            MakeFact(ret, ((ITuple)payload)[i], SOMDocIndexer(i), _Facts, BypassServer);
+            yield return null;
+        }
     }
 }
 
diff --git a/Assets/Scripts/InteractionEngine/FactHandling/Facts/VolumeFacts.cs b/Assets/Scripts/InteractionEngine/FactHandling/Facts/VolumeFacts.cs
index f9ff1686b55e496d5720441fb4d442d03b686fc3..a26195eda96934d4fd7b86f0f230a65379261af4 100644
--- a/Assets/Scripts/InteractionEngine/FactHandling/Facts/VolumeFacts.cs
+++ b/Assets/Scripts/InteractionEngine/FactHandling/Facts/VolumeFacts.cs
@@ -1,4 +1,5 @@
-using System.Collections.Generic;
+using System.Collections;
+using System.Collections.Generic;
 using Newtonsoft.Json;
 using REST_JSON_API;
 
@@ -70,10 +71,10 @@ public ConeVolumeFact(string Cid1, string Pid1, float volume, SOMDoc _ServerDefi
     }
 
     /// \copydoc Fact.parseFact(ScrollFact)
-    public new static List<Fact> parseFact(MMTFact fact)
+    public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact)
     {
         if (((MMTValueFact)fact).lhs is not OMA lhs)
-            return new();
+            yield break;
 
         string CircleUri = ((OMS)((OMA)lhs.arguments[0]).arguments[0]).uri;
         string PointUri = ((OMS)((OMA)lhs.arguments[0]).arguments[1]).uri;
@@ -84,9 +85,9 @@ public ConeVolumeFact(string Cid1, string Pid1, float volume, SOMDoc _ServerDefi
 
         if (!FactRecorder.AllFacts.ContainsKey(CircleUri)
          || !FactRecorder.AllFacts.ContainsKey(PointUri))
-            return new();
+            yield break;
 
-        return new() { new ConeVolumeFact(CircleUri, PointUri, volume, fact.@ref, StageStatic.stage.factState) };
+        ret.Add(new ConeVolumeFact(CircleUri, PointUri, volume, fact.@ref, StageStatic.stage.factState));
     }
 
     /// \copydoc Fact.generateLabel
@@ -212,7 +213,7 @@ public TruncatedConeVolumeFact(string Cid1, string Cid2, float volume, string un
     }
 
     /// \copydoc Fact.parseFact(ScrollFact)
-    public new static List<Fact> parseFact(MMTFact fact)
+    public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact)
     {
         string Circle1Uri = ((OMS)((OMA)((OMA)((MMTValueFact)fact).lhs).arguments[0]).arguments[0]).uri;
         string Circle2Uri = ((OMS)((OMA)((OMA)((MMTValueFact)fact).lhs).arguments[0]).arguments[1]).uri;
@@ -223,9 +224,9 @@ public TruncatedConeVolumeFact(string Cid1, string Cid2, float volume, string un
 
         if (!FactRecorder.AllFacts.ContainsKey(Circle1Uri)
          || !FactRecorder.AllFacts.ContainsKey(Circle2Uri))
-            return new();
+            yield break;
 
-        return new() { new TruncatedConeVolumeFact(Circle1Uri, Circle2Uri, volume, UnEqualCirclesProof, proof, fact.@ref, StageStatic.stage.factState) };
+        ret.Add(new TruncatedConeVolumeFact(Circle1Uri, Circle2Uri, volume, UnEqualCirclesProof, proof, fact.@ref, StageStatic.stage.factState));
     }
 
     /// \copydoc Fact.generateLabel
@@ -346,7 +347,7 @@ public CylinderVolumeFact(string Cid1, string Cid2, float volume, string eqProof
     }
 
     /// \copydoc Fact.parseFact(ScrollFact)
-    public new static List<Fact> parseFact(MMTFact fact)
+    public new static IEnumerator parseFact(List<Fact> ret, MMTFact fact)
     {
         string Circle1Uri = ((OMS)((OMA)((OMA)((MMTValueFact)fact).lhs).arguments[0]).arguments[0]).uri;
         string Circle2Uri = ((OMS)((OMA)((OMA)((MMTValueFact)fact).lhs).arguments[0]).arguments[1]).uri;
@@ -357,9 +358,9 @@ public CylinderVolumeFact(string Cid1, string Cid2, float volume, string eqProof
 
         if (!FactRecorder.AllFacts.ContainsKey(Circle1Uri)
          || !FactRecorder.AllFacts.ContainsKey(Circle2Uri))
-            return new();
+            yield break;
 
-        return new() { new CylinderVolumeFact(Circle1Uri, Circle2Uri, volume, EqualCirclesProof, proof, fact.@ref, StageStatic.stage.factState) };
+        ret.Add(new CylinderVolumeFact(Circle1Uri, Circle2Uri, volume, EqualCirclesProof, proof, fact.@ref, StageStatic.stage.factState));
     }
 
     /// \copydoc Fact.generateLabel
diff --git a/Assets/Scripts/InventoryStuff/ScrollDetails.cs b/Assets/Scripts/InventoryStuff/ScrollDetails.cs
index 2f969934178a025ea26ff520e721f4a4bdf71ba6..c00da8310920accec2592f7446c66712772d7539 100644
--- a/Assets/Scripts/InventoryStuff/ScrollDetails.cs
+++ b/Assets/Scripts/InventoryStuff/ScrollDetails.cs
@@ -251,9 +251,10 @@ IEnumerator __GeneratePushoutFacts(List<MMTFact> pushoutFacts)
             bool samestep = false;
             for (int i = 0; i < pushoutFacts.Count; i++)
             {
-                //yield return null;
-                List<Fact> new_list = ParsingDictionary.parseFactDictionary[pushoutFacts[i].getType()]
-                                        (pushoutFacts[i].MapURIs(oldt_to_new));
+                List<Fact> new_list = new();
+                yield return ParsingDictionary.parseFactDictionary[pushoutFacts[i].getType()]
+                                        (new_list, pushoutFacts[i].MapURIs(oldt_to_new));
+
                 if (new_list.Count == 0)
                 {
                     Debug.LogWarning("Parsing on pushout-fact returned empty List -> One of the dependent facts does not exist or parsing failed");
@@ -262,8 +263,6 @@ IEnumerator __GeneratePushoutFacts(List<MMTFact> pushoutFacts)
 
                 foreach (Fact new_fact in new_list)
                 {
-                    //yield return null;
-
                     Fact added = FactAdder.AddFactIfNotFound(new_fact, out bool exists, samestep, null, ActiveScroll.label);
                     if (!exists)
                     {
@@ -276,6 +275,8 @@ IEnumerator __GeneratePushoutFacts(List<MMTFact> pushoutFacts)
                         // AnimateExistingFactEvent.Invoke(_new, FactWrapper.FactMaterials.Hint); // Automaticly done in FactRecorder
                         oldt_to_new.Add(new_fact.Id, added.Id);
                     }
+
+                    yield return null;
                 }
             }
 
@@ -427,9 +428,10 @@ void _processRenderedScroll(Scroll rendered, List<string> hintUris)
                 //If ScrollFact is assigned -> No Hint
                 if (!RenderedScrollFact.IsSet)
                 {
-                    List<Fact> HintFactList =
-                        ParsingDictionary.parseFactDictionary[rendered.requiredFacts[i].getType()]
-                        .Invoke(rendered.requiredFacts[i]);
+                    List<Fact> HintFactList = new();
+                    ParsingDictionary.parseFactDictionary[rendered.requiredFacts[i].getType()]
+                        .Invoke(HintFactList, rendered.requiredFacts[i])
+                        .FastForward();
 
                     foreach (Fact HintFact in HintFactList)
                     {
diff --git a/Assets/Scripts/Utility/Extensions/IEnumeratorExtensions.cs b/Assets/Scripts/Utility/Extensions/IEnumeratorExtensions.cs
index 8ed78a4faf3547ef92289f8b451e785edcbfff1b..5dd0533f370a81219c129ebada9378e7f231670a 100644
--- a/Assets/Scripts/Utility/Extensions/IEnumeratorExtensions.cs
+++ b/Assets/Scripts/Utility/Extensions/IEnumeratorExtensions.cs
@@ -6,7 +6,9 @@ public static class IEnumeratorExtensions
 {
     public static void FastForward(this IEnumerator that)
     {
-        while(that.MoveNext()) ;
+        while (that.MoveNext())
+            if(that.Current is IEnumerator next)
+                next.FastForward();
     }
 
     public static IEnumerator yield_break => _YieldBreak;