diff --git a/Assets/Scripts/InteractionEngine/CommunicationEvents.cs b/Assets/Scripts/InteractionEngine/CommunicationEvents.cs
index c861fa17148827511f4b54b25cf5deb1ae586602..e38a240a28756860bf54abcfcf37c6d0365892f4 100644
--- a/Assets/Scripts/InteractionEngine/CommunicationEvents.cs
+++ b/Assets/Scripts/InteractionEngine/CommunicationEvents.cs
@@ -65,8 +65,9 @@ public class AnimationEventWithUris : UnityEvent<List<string>>
     //TODO: Remove this event after CompletionsDemo isn't necessary anymore
     public static AnimationEventWithUri parameterDisplayHint = new AnimationEventWithUri();
 
-    public static AnimationEvent CompletionsHintEvent = new AnimationEvent();
+    public static AnimationEvent ScrollFactHintEvent = new AnimationEvent();
     public static FactEvent AnimateExistingFactEvent = new FactEvent();
+    public static FactEvent AnimateNonExistingFactEvent = new FactEvent();
     public static AnimationEventWithUris HintAvailableEvent = new AnimationEventWithUris();
 
 
diff --git a/Assets/Scripts/InteractionEngine/Fact.cs b/Assets/Scripts/InteractionEngine/Fact.cs
index c576b07c83143d3bd4218bb084aece3aa070e178..bc281491985f8832e68a41f707b2cd11ff5e563b 100644
--- a/Assets/Scripts/InteractionEngine/Fact.cs
+++ b/Assets/Scripts/InteractionEngine/Fact.cs
@@ -9,7 +9,9 @@ public class ParsingDictionary {
     public static Dictionary<string, Func<Scroll.ScrollFact, Fact>> parseFactDictionary = new Dictionary<string, Func<Scroll.ScrollFact, Fact>>() {
         {MMTURIs.Point, PointFact.parseFact},
         {MMTURIs.Metric, LineFact.parseFact},
-        {MMTURIs.Angle, AngleFact.parseFact}
+        {MMTURIs.Angle, AngleFact.parseFact},
+        //90Degree-Angle
+        {MMTURIs.Ded, AngleFact.parseFact}
     };
 
 }
@@ -36,6 +38,15 @@ public string format(float t)
     {
         return t.ToString("0.0000").Replace(',', '.');
     }
+
+    //If FactType depends on other Facts, e.g. AngleFacts depend on 3 PointFacts
+    public abstract Boolean hasDependentFacts();
+
+    public abstract int[] getDependentFactIds();
+
+    public abstract override bool Equals(System.Object obj);
+
+    public abstract override int GetHashCode();
 }
 
 public abstract class DirectedFact : Fact
@@ -122,12 +133,45 @@ public PointFact(float a, float b, float c, string uri)
 
     public static PointFact parseFact(Scroll.ScrollFact fact) {
         String uri = fact.@ref.uri;
-        float a = (float) ((OMF)((OMA)((Scroll.ScrollSymbolFact)fact).df).arguments[0]).f;
-        float b = (float) ((OMF)((OMA)((Scroll.ScrollSymbolFact)fact).df).arguments[1]).f;
-        float c = (float) ((OMF)((OMA)((Scroll.ScrollSymbolFact)fact).df).arguments[2]).f;
-        return new PointFact(a, b, c, uri);
+        OMA df = (OMA)((Scroll.ScrollSymbolFact)fact).df;
+        if (df != null)
+        {
+            float a = (float)((OMF)df.arguments[0]).f;
+            float b = (float)((OMF)df.arguments[1]).f;
+            float c = (float)((OMF)df.arguments[2]).f;
+            return new PointFact(a, b, c, uri);
+        }
+        else {
+            return null;
+        }
     }
 
+    public override Boolean hasDependentFacts() {
+        return false;
+    }
+
+    public override int[] getDependentFactIds() {
+        return null;
+    }
+
+    public override bool Equals(System.Object obj)
+    {
+        //Check for null and compare run-time types.
+        if ((obj == null) || !this.GetType().Equals(obj.GetType()))
+        {
+            return false;
+        }
+        else
+        {
+            PointFact p = (PointFact)obj;
+            return this.Point.Equals(p.Point) && this.Normal.Equals(p.Normal);
+        }
+    }
+
+    public override int GetHashCode()
+    {
+        return this.Point.GetHashCode() ^ this.Normal.GetHashCode();
+    }
 }
 
 public class LineFact : DirectedFact
@@ -186,9 +230,46 @@ public static LineFact parseFact(Scroll.ScrollFact fact)
         String uri = fact.@ref.uri;
         String pointAUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[0]).uri;
         String pointBUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[1]).uri;
-        int pid1 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointAUri)).Id;
-        int pid2 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointBUri)).Id;
-        return new LineFact(pid1, pid2, uri);
+        if (CommunicationEvents.Facts.Exists(x => x.backendURI.Equals(pointAUri)) &&
+            CommunicationEvents.Facts.Exists(x => x.backendURI.Equals(pointBUri)))
+        {
+            int pid1 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointAUri)).Id;
+            int pid2 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointBUri)).Id;
+            return new LineFact(pid1, pid2, uri);
+        }
+        //If dependent facts do not exist return null
+        else {
+            return null;
+        }
+    }
+
+    public override Boolean hasDependentFacts()
+    {
+        return true;
+    }
+
+    public override int[] getDependentFactIds()
+    {
+        return new int[] { Pid1, Pid2 };
+    }
+
+    public override bool Equals(System.Object obj)
+    {
+        //Check for null and compare run-time types.
+        if ((obj == null) || !this.GetType().Equals(obj.GetType()))
+        {
+            return false;
+        }
+        else
+        {
+            LineFact l = (LineFact)obj;
+            return this.Pid1.Equals(l.Pid1) && this.Pid2.Equals(l.Pid2);
+        }
+    }
+
+    public override int GetHashCode()
+    {
+        return this.Pid1 ^ this.Pid2;
     }
 }
 
@@ -197,6 +278,35 @@ public class OpenLineFact : Fact
     //R: this is called RayFact for now (see below), feel free to change
     //an infinite Line through the Points Pid1 and Pid2
     public int Pid1, Pid2;
+
+    public override Boolean hasDependentFacts()
+    {
+        return true;
+    }
+
+    public override int[] getDependentFactIds()
+    {
+        return new int[] { Pid1, Pid2 };
+    }
+
+    public override bool Equals(System.Object obj)
+    {
+        //Check for null and compare run-time types.
+        if ((obj == null) || !this.GetType().Equals(obj.GetType()))
+        {
+            return false;
+        }
+        else
+        {
+            OpenLineFact o = (OpenLineFact)obj;
+            return this.Pid1.Equals(o.Pid1) && this.Pid2.Equals(o.Pid2);
+        }
+    }
+
+    public override int GetHashCode()
+    {
+        return this.Pid1 ^ this.Pid2;
+    }
 }
 
 public class RayFact : Fact
@@ -232,7 +342,34 @@ public RayFact(int i, int pid1, int pid2, string uri, string valuri)
         this.backendValueURI = valuri;
     }
 
+    public override Boolean hasDependentFacts()
+    {
+        return true;
+    }
+
+    public override int[] getDependentFactIds()
+    {
+        return new int[] { Pid1, Pid2 };
+    }
 
+    public override bool Equals(System.Object obj)
+    {
+        //Check for null and compare run-time types.
+        if ((obj == null) || !this.GetType().Equals(obj.GetType()))
+        {
+            return false;
+        }
+        else
+        {
+            RayFact r = (RayFact)obj;
+            return this.Pid1.Equals(r.Pid1) && this.Pid2.Equals(r.Pid2);
+        }
+    }
+
+    public override int GetHashCode()
+    {
+        return this.Pid1 ^ this.Pid2;
+    }
 }
 
 
@@ -257,7 +394,34 @@ public OnLineFact(int i, int pid, int lid)
         Debug.Log("created onLine" + this.backendURI + " " + this.backendValueURI);
     }
 
+    public override Boolean hasDependentFacts()
+    {
+        return true;
+    }
+
+    public override int[] getDependentFactIds()
+    {
+        return new int[] { Pid, Lid };
+    }
+
+    public override bool Equals(System.Object obj)
+    {
+        //Check for null and compare run-time types.
+        if ((obj == null) || !this.GetType().Equals(obj.GetType()))
+        {
+            return false;
+        }
+        else
+        {
+            OnLineFact o = (OnLineFact)obj;
+            return this.Pid.Equals(o.Pid) && this.Lid.Equals(o.Lid);
+        }
+    }
 
+    public override int GetHashCode()
+    {
+        return this.Pid ^ this.Lid;
+    }
 }
 
 
@@ -322,13 +486,52 @@ public AngleFact(int Pid1, int Pid2, int Pid3, string backendURI)
 
     public static AngleFact parseFact(Scroll.ScrollFact fact)
     {
-        String uri = fact.@ref.uri;
-        String pointAUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[0]).uri;
-        String pointBUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[1]).uri;
-        String pointCUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[2]).uri;
-        int pid1 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointAUri)).Id;
-        int pid2 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointBUri)).Id;
-        int pid3 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointCUri)).Id;
+        String uri;
+        String pointAUri;
+        String pointBUri;
+        String pointCUri;
+        int pid1;
+        int pid2;
+        int pid3;
+
+        //If angle is not a 90Degree-Angle
+        if (fact.GetType().Equals(typeof(Scroll.ScrollValueFact)))
+        {
+            uri = fact.@ref.uri;
+            pointAUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[0]).uri;
+            pointBUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[1]).uri;
+            pointCUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[2]).uri;
+            //If dependent facts do not exist return null
+            if (!CommunicationEvents.Facts.Exists(x => x.backendURI.Equals(pointAUri)) |
+                !CommunicationEvents.Facts.Exists(x => x.backendURI.Equals(pointBUri)) |
+                !CommunicationEvents.Facts.Exists(x => x.backendURI.Equals(pointCUri)))
+            {
+                return null;
+            }
+
+            pid1 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointAUri)).Id;
+            pid2 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointBUri)).Id;
+            pid3 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointCUri)).Id;
+        }
+        //If angle is a 90Degree-Angle
+        else {
+            uri = fact.@ref.uri;
+            pointAUri = ((OMS)((OMA)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[1]).arguments[0]).uri;
+            pointBUri = ((OMS)((OMA)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[1]).arguments[1]).uri;
+            pointCUri = ((OMS)((OMA)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[1]).arguments[2]).uri;
+            //If dependent facts do not exist return null
+            if (!CommunicationEvents.Facts.Exists(x => x.backendURI.Equals(pointAUri)) |
+                !CommunicationEvents.Facts.Exists(x => x.backendURI.Equals(pointBUri)) |
+                !CommunicationEvents.Facts.Exists(x => x.backendURI.Equals(pointCUri)))
+            {
+                return null;
+            }
+
+            pid1 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointAUri)).Id;
+            pid2 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointBUri)).Id;
+            pid3 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointCUri)).Id;
+        }
+
         return new AngleFact(pid1, pid2, pid3, uri);
     }
 
@@ -373,6 +576,35 @@ private MMTDeclaration generateNot90DegreeAngleDeclaration(float val, string p1U
         
         return new MMTValueDeclaration(this.Label, lhs, valueTp, value);
     }
+
+    public override Boolean hasDependentFacts()
+    {
+        return true;
+    }
+
+    public override int[] getDependentFactIds()
+    {
+        return new int[] { Pid1, Pid2, Pid3 };
+    }
+
+    public override bool Equals(System.Object obj)
+    {
+        //Check for null and compare run-time types.
+        if ((obj == null) || !this.GetType().Equals(obj.GetType()))
+        {
+            return false;
+        }
+        else
+        {
+            AngleFact a = (AngleFact)obj;
+            return this.Pid1.Equals(a.Pid1) && this.Pid2.Equals(a.Pid2) && this.Pid3.Equals(a.Pid3);
+        }
+    }
+
+    public override int GetHashCode()
+    {
+        return this.Pid1 ^ this.Pid2 ^ this.Pid3;
+    }
 }
 
 
diff --git a/Assets/Scripts/InteractionEngine/FactSpawner.cs b/Assets/Scripts/InteractionEngine/FactSpawner.cs
index 6f29c77e49a8284cc9ab9e9980ecc1f7b0d1050e..ec067726e17480f87e9a4f331b4165a9a8362f50 100644
--- a/Assets/Scripts/InteractionEngine/FactSpawner.cs
+++ b/Assets/Scripts/InteractionEngine/FactSpawner.cs
@@ -15,36 +15,38 @@ void Start()
         AddFactEvent.AddListener(FactAction);
         RemoveFactEvent.AddListener(DeleteObject);
 
+        AnimateNonExistingFactEvent.AddListener(animateNonExistingFactTrigger);
+
         //Default FactRepresenation = Sphere-Prefab for Points
         this.FactRepresentation = (GameObject) Resources.Load("Prefabs/Sphere", typeof(GameObject));
 
     }
 
-    public void FactAction(Fact fact)
+    public void FactAction(Fact fact) {
+        getAction(fact)?.Invoke(fact);
+    }
+
+    public Func<Fact, Fact> getAction(Fact fact)
     {
-     
         switch  (fact)
         {
             case PointFact pointFact:
-                SpawnPoint(pointFact);
-                break;
+                return SpawnPoint;
             case LineFact lineFact:
-                SpawnLine(lineFact);
-                break;
+                return SpawnLine;
             case AngleFact angleFact:
-                SpawnAngle(angleFact);
-                break;
+                return SpawnAngle;
             case RayFact rayFact:
-                SpawnRay(rayFact);
-                break;
-
+                return SpawnRay;
+            default:
+                return null;
         }
     }
   
 
-    public void SpawnPoint(PointFact fact)
+    public Fact SpawnPoint(Fact pointFact)
     {
-
+        PointFact fact = ((PointFact)pointFact);
         this.FactRepresentation = (GameObject)Resources.Load("Prefabs/Sphere", typeof(GameObject));
      
         GameObject point = GameObject.Instantiate(FactRepresentation);
@@ -54,10 +56,13 @@ public void SpawnPoint(PointFact fact)
         point.GetComponentInChildren<TextMeshPro>().text = letter;
         point.GetComponent<FactObject>().Id = fact.Id;
         fact.Representation = point;
+        return fact;
     }
 
-    public void SpawnLine(LineFact lineFact)
+    public Fact SpawnLine(Fact fact)
     {
+        LineFact lineFact = ((LineFact)fact);
+
         PointFact pointFact1 = (Facts[lineFact.Pid1] as PointFact);
         PointFact pointFact2 = (Facts[lineFact.Pid2] as PointFact);
         Vector3 point1 = pointFact1.Point;
@@ -87,13 +92,16 @@ public void SpawnLine(LineFact lineFact)
         line.GetComponentInChildren<TextMeshPro>().text += " = " + Math.Round((point1-point2).magnitude, 2) + " m";
         line.GetComponentInChildren<FactObject>().Id = lineFact.Id;
         lineFact.Representation = line;
+        return lineFact;
 
     }
 
-    public void SpawnRay(RayFact lineFact)
+    public Fact SpawnRay(Fact fact)
     {
-        PointFact pointFact1 = (Facts[lineFact.Pid1] as PointFact);
-        PointFact pointFact2 = (Facts[lineFact.Pid2] as PointFact);
+        RayFact rayFact = ((RayFact)fact);
+
+        PointFact pointFact1 = (Facts[rayFact.Pid1] as PointFact);
+        PointFact pointFact2 = (Facts[rayFact.Pid2] as PointFact);
 
  
         Vector3 point1 = pointFact1.Point;
@@ -123,16 +131,18 @@ public void SpawnRay(RayFact lineFact)
         line.transform.GetChild(0).localScale = v3T;
         line.transform.GetChild(0).rotation = Quaternion.FromToRotation(Vector3.right, point2 - point1);
 
-        string letter = ((Char)(64 + lineFact.Id + 1)).ToString();
+        string letter = ((Char)(64 + rayFact.Id + 1)).ToString();
         line.GetComponentInChildren<TextMeshPro>().text = letter;
      
-        line.GetComponentInChildren<FactObject>().Id = lineFact.Id;
-        lineFact.Representation = line;
+        line.GetComponentInChildren<FactObject>().Id = rayFact.Id;
+        rayFact.Representation = line;
+        return rayFact;
     }
     
     //Spawn an angle: point with id = angleFact.Pid2 is the point where the angle gets applied
-    public void SpawnAngle(AngleFact angleFact)
+    public Fact SpawnAngle(Fact fact)
     {
+        AngleFact angleFact = (AngleFact)fact;
 
         Vector3 point1 = (Facts[angleFact.Pid1] as PointFact).Point;
         Vector3 point2 = (Facts[angleFact.Pid2] as PointFact).Point;
@@ -215,6 +225,7 @@ public void SpawnAngle(AngleFact angleFact)
 
         angle.GetComponentInChildren<FactObject>().Id = angleFact.Id;
         angleFact.Representation = angle;
+        return angleFact;
     }
 
     public void DeleteObject(Fact fact)
@@ -222,6 +233,22 @@ public void DeleteObject(Fact fact)
         Debug.Log("delete obj of "+ fact.Id);
         GameObject factRepresentation = fact.Representation;
         GameObject.Destroy(factRepresentation);
-   
+    }
+
+    public void animateNonExistingFactTrigger(Fact fact) {
+        StartCoroutine(animateNonExistingFact(fact));
+    }
+
+    public IEnumerator animateNonExistingFact(Fact fact) {
+        Fact returnedFact = getAction(fact)?.Invoke(fact);
+        if (returnedFact != null)
+        {
+            Animator animator = returnedFact.Representation.GetComponentInChildren<Animator>();
+            animator.SetTrigger("animateHint");
+
+            yield return new WaitForSeconds(7);
+
+            GameObject.Destroy(returnedFact.Representation);
+        }
     }
 }
diff --git a/Assets/Scripts/InventoryStuff/RenderedScrollFact.cs b/Assets/Scripts/InventoryStuff/RenderedScrollFact.cs
index 09c2f3c37773af7494f86efc9fa1503a1e74f4aa..3263b2603ac84f8db795c714ae024dd201cfe2f9 100644
--- a/Assets/Scripts/InventoryStuff/RenderedScrollFact.cs
+++ b/Assets/Scripts/InventoryStuff/RenderedScrollFact.cs
@@ -33,7 +33,7 @@ void Start()
     }
 
     public void OnClickHintButton() {
-        CompletionsHintEvent.Invoke(this.ScrollParameterObject, factUri);
+        ScrollFactHintEvent.Invoke(this.ScrollParameterObject, factUri);
     }
 
     public void OnHintAvailable(List<string> uris) {
diff --git a/Assets/Scripts/InventoryStuff/Scroll.cs b/Assets/Scripts/InventoryStuff/Scroll.cs
index 8b77dd0d57a66604ec237569156c60ad7222d11a..84679141fccb1dff113e2d7376ba2a961c3b82c0 100644
--- a/Assets/Scripts/InventoryStuff/Scroll.cs
+++ b/Assets/Scripts/InventoryStuff/Scroll.cs
@@ -74,6 +74,8 @@ public class ScrollSymbolFact : ScrollFact
         public override String getType() {
             if (this.tp is OMS)
                 return ((OMS)this.tp).uri;
+            else if (this.tp is OMA)
+                return ((OMS)((OMA)this.tp).applicant).uri;
             else
                 return null;
         }
diff --git a/Assets/Scripts/InventoryStuff/ScrollDetails.cs b/Assets/Scripts/InventoryStuff/ScrollDetails.cs
index a07eb8faff920a5ccf6d2def4caec8c95bc50bcc..5c03486b11b10320a40f403c9d649831fb1852d4 100644
--- a/Assets/Scripts/InventoryStuff/ScrollDetails.cs
+++ b/Assets/Scripts/InventoryStuff/ScrollDetails.cs
@@ -18,6 +18,7 @@ public class ScrollDetails : MonoBehaviour
 
     public static List<GameObject> ParameterDisplays;
     private static List<Scroll.ScrollAssignment> LatestCompletions;
+    private static List<Fact> LatestRenderedHints;
 
     public string currentMmtAnswer;
 
@@ -32,7 +33,7 @@ void Start()
         if (cursor == null) cursor = GameObject.FindObjectOfType<WorldCursor>();
 
         parameterDisplayHint.AddListener(animateScrollParameter);
-        CompletionsHintEvent.AddListener(animateCompletionsHint);
+        ScrollFactHintEvent.AddListener(animateHint);
         NewAssignmentEvent.AddListener(newAssignmentTrigger);
     }
 
@@ -159,11 +160,17 @@ private void readPushout(List<Scroll.ScrollFact> pushoutFacts)
         for (int i = 0; i < pushoutFacts.Count; i++)
         {
             Fact newFact = ParsingDictionary.parseFactDictionary[pushoutFacts[i].getType()].Invoke(pushoutFacts[i]);
-            int id = factManager.GetFirstEmptyID();
-            newFact.Id = id;
-            Facts.Insert(id, newFact);
-            AddFactEvent.Invoke(newFact);
-            PushoutFactEvent.Invoke(newFact);
+            if (newFact != null)
+            {
+                int id = factManager.GetFirstEmptyID();
+                newFact.Id = id;
+                Facts.Insert(id, newFact);
+                AddFactEvent.Invoke(newFact);
+                PushoutFactEvent.Invoke(newFact);
+            }
+            else {
+                Debug.Log("Parsing on pushout-fact returned null -> One of the dependent facts does not exist");
+            }
         }
     }
 
@@ -174,35 +181,60 @@ public void processScrollDynamicInfo(Scroll.ScrollDynamicInfo scrollDynamicInfo)
         else
             LatestCompletions = new List<Scroll.ScrollAssignment>();
 
-        List<string> completionUris = new List<string>();
+        LatestRenderedHints = new List<Fact>();
+
+        List<string> hintUris = new List<string>();
         foreach (Scroll.ScrollAssignment currentCompletion in LatestCompletions) {
-            completionUris.Add(currentCompletion.fact.uri);
+            hintUris.Add(currentCompletion.fact.uri);
         }
 
-        //Show that Hint is available for ScrollParameter
-        HintAvailableEvent.Invoke(completionUris);
+        //Update Scroll, process data for later hints and update Uri-List for which hints are available
+        hintUris = processRenderedScroll(scrollDynamicInfo.rendered, hintUris);
 
-        updateRenderedScroll(scrollDynamicInfo.rendered);
+        //Show that Hint is available for ScrollParameter
+        HintAvailableEvent.Invoke(hintUris);
     }
 
-    public void updateRenderedScroll(Scroll rendered)
+    public List<string> processRenderedScroll(Scroll rendered, List<string> hintUris)
     {
         Transform scroll = gameObject.transform.GetChild(1).transform;
 
+        //Update scroll-description
         scroll.GetChild(0).GetComponent<TextMeshProUGUI>().text = rendered.description;
+
         for (int i = 0; i < rendered.requiredFacts.Count; i++)
         {
+            //Update ScrollParameter label
             var obj = ParameterDisplays.Find(x => x.transform.GetChild(0).GetComponent<RenderedScrollFact>().factUri.Equals(rendered.requiredFacts[i].@ref.uri));
             obj.transform.GetChild(0).GetComponent<RenderedScrollFact>().Label = rendered.requiredFacts[i].label;
+
+            //Check Hint Informations
+            //If ScrollFact is assigned -> No Hint
+            if (obj.transform.GetChild(0).GetComponent<DropHandling>().currentFact == null) {
+                Fact currentFact = ParsingDictionary.parseFactDictionary[rendered.requiredFacts[i].getType()].Invoke(rendered.requiredFacts[i]);
+                //If the fact could not be parsed -> Therefore not all dependent Facts exist -> No Hint
+                //AND if fact has no dependent facts -> No Hint
+                if (currentFact != null && currentFact.hasDependentFacts())
+                {
+                    //Hint available for abstract-problem uri
+                    hintUris.Add(currentFact.backendURI);
+                    LatestRenderedHints.Add(currentFact);
+                }
+            }
         }
+
+        return hintUris;
     }
 
-    public void animateCompletionsHint(GameObject scrollParameter, string scrollParameterUri) {
+    public void animateHint(GameObject scrollParameter, string scrollParameterUri) {
         Scroll.ScrollAssignment suitableCompletion = LatestCompletions.Find(x => x.fact.uri.Equals(scrollParameterUri) );
+        Fact fact;
 
-        if (suitableCompletion != null) {
-            Fact fact = Facts.Find(x => x.backendURI.Equals(suitableCompletion.assignment.uri));
-            if (fact != null) {
+        if (suitableCompletion != null)
+        {
+            fact = Facts.Find(x => x.backendURI.Equals(suitableCompletion.assignment.uri));
+            if (fact != null)
+            {
                 //Animate ScrollParameter
                 scrollParameter.GetComponentInChildren<Animator>().SetTrigger("animateHint");
                 //Animate Fact in FactPanel
@@ -211,6 +243,30 @@ public void animateCompletionsHint(GameObject scrollParameter, string scrollPara
                 fact.Representation.GetComponentInChildren<Animator>().SetTrigger("animateHint");
             }
         }
+        else if (LatestRenderedHints.Exists(x => x.backendURI.Equals(scrollParameterUri))) {
+            fact = LatestRenderedHints.Find(x => x.backendURI.Equals(scrollParameterUri));
+
+            //If there is an equal existing fact -> Animate that fact AND ScrollParameter
+            if (Facts.Exists(x => x.Equals(fact)))
+            {
+                Fact existingFact = Facts.Find(x => x.Equals(fact));
+
+                //Animate ScrollParameter
+                scrollParameter.GetComponentInChildren<Animator>().SetTrigger("animateHint");
+                //Animate Fact in FactPanel
+                AnimateExistingFactEvent.Invoke(existingFact);
+                //Animate factRepresentation in game
+                existingFact.Representation.GetComponentInChildren<Animator>().SetTrigger("animateHint");
+            }
+            //If not -> Generate a Fact-Representation with such dependent facts
+            else
+            {
+                //Animate ScrollParameter
+                scrollParameter.GetComponentInChildren<Animator>().SetTrigger("animateHint");
+                //Generate new FactRepresentation and animate it
+                AnimateNonExistingFactEvent.Invoke(fact);
+            }
+        }
     }
 
     public void animateScrollParameter(string label)