diff --git a/Assets/Resources/Prefabs/Facts/Angle.prefab b/Assets/Resources/Prefabs/Facts/Angle.prefab
index b3179be4757731aa8cb9e01a576ea50beafa456e..97ed6895f00fe59572c344f38561c3711ef1ed86 100644
--- a/Assets/Resources/Prefabs/Facts/Angle.prefab
+++ b/Assets/Resources/Prefabs/Facts/Angle.prefab
@@ -200,7 +200,7 @@ Transform:
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 3394522495515098197}
-  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalRotation: {x: 0, y: -0.7071068, z: 0, w: 0.7071068}
   m_LocalPosition: {x: 0, y: 0, z: 0}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
@@ -208,7 +208,7 @@ Transform:
   - {fileID: 3394522496185282011}
   m_Father: {fileID: 5781467132517744785}
   m_RootOrder: 0
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_LocalEulerAnglesHint: {x: 0, y: -90, z: 0}
 --- !u!33 &3394522495515098201
 MeshFilter:
   m_ObjectHideFlags: 0
diff --git a/Assets/Resources/Prefabs/Facts/Angle_Old.prefab b/Assets/Resources/Prefabs/Facts/Angle_Old.prefab
deleted file mode 100644
index 8db326a77d14b2984d72395357287df4c6c590c4..0000000000000000000000000000000000000000
--- a/Assets/Resources/Prefabs/Facts/Angle_Old.prefab
+++ /dev/null
@@ -1,598 +0,0 @@
-%YAML 1.1
-%TAG !u! tag:unity3d.com,2011:
---- !u!1 &1047820262597827614
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 776204628661091474}
-  - component: {fileID: 1611341617565119760}
-  - component: {fileID: 3727883962287805668}
-  - component: {fileID: 8678993674720081185}
-  m_Layer: 12
-  m_Name: AngleText_Back
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!224 &776204628661091474
-RectTransform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1047820262597827614}
-  m_LocalRotation: {x: -0.5, y: -0.5, z: -0.5, w: 0.5}
-  m_LocalPosition: {x: 0, y: 0, z: 0}
-  m_LocalScale: {x: 1, y: 1, z: 0.25}
-  m_Children: []
-  m_Father: {fileID: 4650993679319476103}
-  m_RootOrder: 1
-  m_LocalEulerAnglesHint: {x: -90, y: -90, z: 0}
-  m_AnchorMin: {x: 0.5, y: 0.5}
-  m_AnchorMax: {x: 0.5, y: 0.5}
-  m_AnchoredPosition: {x: 0.7, y: -1.5}
-  m_SizeDelta: {x: 1, y: 1}
-  m_Pivot: {x: 0.5, y: 0.5}
---- !u!23 &1611341617565119760
-MeshRenderer:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1047820262597827614}
-  m_Enabled: 1
-  m_CastShadows: 0
-  m_ReceiveShadows: 0
-  m_DynamicOccludee: 1
-  m_MotionVectors: 1
-  m_LightProbeUsage: 1
-  m_ReflectionProbeUsage: 1
-  m_RayTracingMode: 2
-  m_RayTraceProcedural: 0
-  m_RenderingLayerMask: 1
-  m_RendererPriority: 0
-  m_Materials:
-  - {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
-  m_StaticBatchInfo:
-    firstSubMesh: 0
-    subMeshCount: 0
-  m_StaticBatchRoot: {fileID: 0}
-  m_ProbeAnchor: {fileID: 0}
-  m_LightProbeVolumeOverride: {fileID: 0}
-  m_ScaleInLightmap: 1
-  m_ReceiveGI: 1
-  m_PreserveUVs: 0
-  m_IgnoreNormalsForChartDetection: 0
-  m_ImportantGI: 0
-  m_StitchLightmapSeams: 0
-  m_SelectedEditorRenderState: 3
-  m_MinimumChartSize: 4
-  m_AutoUVMaxDistance: 0.5
-  m_AutoUVMaxAngle: 89
-  m_LightmapParameters: {fileID: 0}
-  m_SortingLayerID: 0
-  m_SortingLayer: 0
-  m_SortingOrder: 1
-  m_AdditionalVertexStreams: {fileID: 0}
---- !u!222 &3727883962287805668
-CanvasRenderer:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1047820262597827614}
-  m_CullTransparentMesh: 0
---- !u!114 &8678993674720081185
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 1047820262597827614}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 9541d86e2fd84c1d9990edf0852d74ab, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Material: {fileID: 0}
-  m_Color: {r: 1, g: 1, b: 1, a: 1}
-  m_RaycastTarget: 1
-  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
-  m_Maskable: 1
-  m_OnCullStateChanged:
-    m_PersistentCalls:
-      m_Calls: []
-  m_text: Test
-  m_isRightToLeft: 0
-  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
-  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
-  m_fontSharedMaterials: []
-  m_fontMaterial: {fileID: 0}
-  m_fontMaterials: []
-  m_fontColor32:
-    serializedVersion: 2
-    rgba: 4293282880
-  m_fontColor: {r: 0.25, g: 0.3, b: 0.9, a: 1}
-  m_enableVertexGradient: 0
-  m_colorMode: 3
-  m_fontColorGradient:
-    topLeft: {r: 1, g: 1, b: 1, a: 1}
-    topRight: {r: 1, g: 1, b: 1, a: 1}
-    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
-    bottomRight: {r: 1, g: 1, b: 1, a: 1}
-  m_fontColorGradientPreset: {fileID: 0}
-  m_spriteAsset: {fileID: 0}
-  m_tintAllSprites: 0
-  m_StyleSheet: {fileID: 0}
-  m_TextStyleHashCode: -1183493901
-  m_overrideHtmlColors: 0
-  m_faceColor:
-    serializedVersion: 2
-    rgba: 4294967295
-  m_fontSize: 2
-  m_fontSizeBase: 2
-  m_fontWeight: 400
-  m_enableAutoSizing: 0
-  m_fontSizeMin: 18
-  m_fontSizeMax: 72
-  m_fontStyle: 0
-  m_HorizontalAlignment: 2
-  m_VerticalAlignment: 512
-  m_textAlignment: 65535
-  m_characterSpacing: 0
-  m_wordSpacing: 0
-  m_lineSpacing: 0
-  m_lineSpacingMax: 0
-  m_paragraphSpacing: 0
-  m_charWidthMaxAdj: 0
-  m_enableWordWrapping: 1
-  m_wordWrappingRatios: 0.4
-  m_overflowMode: 0
-  m_linkedTextComponent: {fileID: 0}
-  parentLinkedComponent: {fileID: 0}
-  m_enableKerning: 1
-  m_enableExtraPadding: 0
-  checkPaddingRequired: 0
-  m_isRichText: 1
-  m_parseCtrlCharacters: 1
-  m_isOrthographic: 0
-  m_isCullingEnabled: 0
-  m_horizontalMapping: 0
-  m_verticalMapping: 0
-  m_uvLineOffset: 0
-  m_geometrySortingOrder: 0
-  m_IsTextObjectScaleStatic: 0
-  m_VertexBufferAutoSizeReduction: 1
-  m_useMaxVisibleDescender: 1
-  m_pageToDisplay: 1
-  m_margin: {x: 0, y: 0, z: 0, w: 0}
-  m_isUsingLegacyAnimationComponent: 0
-  m_isVolumetricText: 0
-  m_hasFontAssetChanged: 0
-  m_renderer: {fileID: 1611341617565119760}
-  m_maskType: 0
-  _SortingLayer: 0
-  _SortingLayerID: 0
-  _SortingOrder: 0
---- !u!1 &4650993678488610235
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 4650993678488610234}
-  - component: {fileID: 4650993678488610228}
-  - component: {fileID: 4650993678488610229}
-  - component: {fileID: 4650993678488610230}
-  - component: {fileID: 4650993678488610231}
-  m_Layer: 12
-  m_Name: AngleOuter
-  m_TagString: Selectable
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!4 &4650993678488610234
-Transform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 4650993678488610235}
-  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
-  m_LocalPosition: {x: 0, y: 0, z: 0}
-  m_LocalScale: {x: 1, y: 0.02, z: 1}
-  m_Children:
-  - {fileID: 4650993679319476103}
-  m_Father: {fileID: 4650993679089994826}
-  m_RootOrder: 0
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
---- !u!33 &4650993678488610228
-MeshFilter:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 4650993678488610235}
-  m_Mesh: {fileID: 4300000, guid: 4fe93ee2ed2d8c64389611c85232bf23, type: 2}
---- !u!23 &4650993678488610229
-MeshRenderer:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 4650993678488610235}
-  m_Enabled: 1
-  m_CastShadows: 1
-  m_ReceiveShadows: 1
-  m_DynamicOccludee: 1
-  m_MotionVectors: 1
-  m_LightProbeUsage: 1
-  m_ReflectionProbeUsage: 1
-  m_RayTracingMode: 2
-  m_RayTraceProcedural: 0
-  m_RenderingLayerMask: 1
-  m_RendererPriority: 0
-  m_Materials:
-  - {fileID: 2100000, guid: 8ae9adf4dc782964387385c1e8c0eb72, type: 2}
-  m_StaticBatchInfo:
-    firstSubMesh: 0
-    subMeshCount: 0
-  m_StaticBatchRoot: {fileID: 0}
-  m_ProbeAnchor: {fileID: 0}
-  m_LightProbeVolumeOverride: {fileID: 0}
-  m_ScaleInLightmap: 1
-  m_ReceiveGI: 1
-  m_PreserveUVs: 0
-  m_IgnoreNormalsForChartDetection: 0
-  m_ImportantGI: 0
-  m_StitchLightmapSeams: 0
-  m_SelectedEditorRenderState: 3
-  m_MinimumChartSize: 4
-  m_AutoUVMaxDistance: 0.5
-  m_AutoUVMaxAngle: 89
-  m_LightmapParameters: {fileID: 0}
-  m_SortingLayerID: 0
-  m_SortingLayer: 0
-  m_SortingOrder: 0
-  m_AdditionalVertexStreams: {fileID: 0}
---- !u!114 &4650993678488610230
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 4650993678488610235}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 626c435b76e0d334f959ede8b54b07ac, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  URI: 
---- !u!64 &4650993678488610231
-MeshCollider:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 4650993678488610235}
-  m_Material: {fileID: 0}
-  m_IsTrigger: 1
-  m_Enabled: 1
-  serializedVersion: 4
-  m_Convex: 1
-  m_CookingOptions: 30
-  m_Mesh: {fileID: 4300000, guid: 4fe93ee2ed2d8c64389611c85232bf23, type: 2}
---- !u!1 &4650993679089994827
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 4650993679089994826}
-  m_Layer: 12
-  m_Name: Angle_Old
-  m_TagString: Selectable
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!4 &4650993679089994826
-Transform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 4650993679089994827}
-  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
-  m_LocalPosition: {x: 0, y: 0, z: 0}
-  m_LocalScale: {x: 1, y: 1, z: 1}
-  m_Children:
-  - {fileID: 4650993678488610234}
-  m_Father: {fileID: 0}
-  m_RootOrder: 0
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
---- !u!1 &4650993679319476100
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 4650993679319476103}
-  - component: {fileID: 4650993679319476097}
-  - component: {fileID: 4650993679319476102}
-  - component: {fileID: 7310199272454353937}
-  m_Layer: 12
-  m_Name: AngleInner
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!4 &4650993679319476103
-Transform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 4650993679319476100}
-  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
-  m_LocalPosition: {x: 0, y: 0, z: 0}
-  m_LocalScale: {x: 0.95, y: 0.5, z: 0.95}
-  m_Children:
-  - {fileID: 6834100498144429849}
-  - {fileID: 776204628661091474}
-  m_Father: {fileID: 4650993678488610234}
-  m_RootOrder: 0
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
---- !u!33 &4650993679319476097
-MeshFilter:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 4650993679319476100}
-  m_Mesh: {fileID: 4300000, guid: 4fe93ee2ed2d8c64389611c85232bf23, type: 2}
---- !u!23 &4650993679319476102
-MeshRenderer:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 4650993679319476100}
-  m_Enabled: 1
-  m_CastShadows: 1
-  m_ReceiveShadows: 1
-  m_DynamicOccludee: 1
-  m_MotionVectors: 1
-  m_LightProbeUsage: 1
-  m_ReflectionProbeUsage: 1
-  m_RayTracingMode: 2
-  m_RayTraceProcedural: 0
-  m_RenderingLayerMask: 1
-  m_RendererPriority: 0
-  m_Materials:
-  - {fileID: 2100000, guid: 8a28cccde2536794c97ec91954e34e90, type: 2}
-  m_StaticBatchInfo:
-    firstSubMesh: 0
-    subMeshCount: 0
-  m_StaticBatchRoot: {fileID: 0}
-  m_ProbeAnchor: {fileID: 0}
-  m_LightProbeVolumeOverride: {fileID: 0}
-  m_ScaleInLightmap: 1
-  m_ReceiveGI: 1
-  m_PreserveUVs: 0
-  m_IgnoreNormalsForChartDetection: 0
-  m_ImportantGI: 0
-  m_StitchLightmapSeams: 0
-  m_SelectedEditorRenderState: 3
-  m_MinimumChartSize: 4
-  m_AutoUVMaxDistance: 0.5
-  m_AutoUVMaxAngle: 89
-  m_LightmapParameters: {fileID: 0}
-  m_SortingLayerID: 0
-  m_SortingLayer: 0
-  m_SortingOrder: 0
-  m_AdditionalVertexStreams: {fileID: 0}
---- !u!114 &7310199272454353937
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 4650993679319476100}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: a6b9fc46f5bfe6b4eb4adf01e6b65bac, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
---- !u!1 &7003220517868882106
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 6834100498144429849}
-  - component: {fileID: 2708246422010202965}
-  - component: {fileID: 8080899974220995652}
-  - component: {fileID: 3620593617881097249}
-  m_Layer: 12
-  m_Name: AngleText_Front
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!224 &6834100498144429849
-RectTransform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 7003220517868882106}
-  m_LocalRotation: {x: 0.5, y: 0.5, z: -0.5, w: 0.5}
-  m_LocalPosition: {x: 0, y: 0, z: 0}
-  m_LocalScale: {x: 1, y: 1, z: 0.25}
-  m_Children: []
-  m_Father: {fileID: 4650993679319476103}
-  m_RootOrder: 0
-  m_LocalEulerAnglesHint: {x: 90, y: 90, z: 0}
-  m_AnchorMin: {x: 0.5, y: 0.5}
-  m_AnchorMax: {x: 0.5, y: 0.5}
-  m_AnchoredPosition: {x: 0.7, y: 1.5}
-  m_SizeDelta: {x: 1, y: 1}
-  m_Pivot: {x: 0.5, y: 0.5}
---- !u!23 &2708246422010202965
-MeshRenderer:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 7003220517868882106}
-  m_Enabled: 1
-  m_CastShadows: 0
-  m_ReceiveShadows: 0
-  m_DynamicOccludee: 1
-  m_MotionVectors: 1
-  m_LightProbeUsage: 1
-  m_ReflectionProbeUsage: 1
-  m_RayTracingMode: 2
-  m_RayTraceProcedural: 0
-  m_RenderingLayerMask: 1
-  m_RendererPriority: 0
-  m_Materials:
-  - {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
-  m_StaticBatchInfo:
-    firstSubMesh: 0
-    subMeshCount: 0
-  m_StaticBatchRoot: {fileID: 0}
-  m_ProbeAnchor: {fileID: 0}
-  m_LightProbeVolumeOverride: {fileID: 0}
-  m_ScaleInLightmap: 1
-  m_ReceiveGI: 1
-  m_PreserveUVs: 0
-  m_IgnoreNormalsForChartDetection: 0
-  m_ImportantGI: 0
-  m_StitchLightmapSeams: 0
-  m_SelectedEditorRenderState: 3
-  m_MinimumChartSize: 4
-  m_AutoUVMaxDistance: 0.5
-  m_AutoUVMaxAngle: 89
-  m_LightmapParameters: {fileID: 0}
-  m_SortingLayerID: 0
-  m_SortingLayer: 0
-  m_SortingOrder: 1
-  m_AdditionalVertexStreams: {fileID: 0}
---- !u!222 &8080899974220995652
-CanvasRenderer:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 7003220517868882106}
-  m_CullTransparentMesh: 0
---- !u!114 &3620593617881097249
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 7003220517868882106}
-  m_Enabled: 1
-  m_EditorHideFlags: 0
-  m_Script: {fileID: 11500000, guid: 9541d86e2fd84c1d9990edf0852d74ab, type: 3}
-  m_Name: 
-  m_EditorClassIdentifier: 
-  m_Material: {fileID: 0}
-  m_Color: {r: 1, g: 1, b: 1, a: 1}
-  m_RaycastTarget: 1
-  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
-  m_Maskable: 1
-  m_OnCullStateChanged:
-    m_PersistentCalls:
-      m_Calls: []
-  m_text: Test
-  m_isRightToLeft: 0
-  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
-  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
-  m_fontSharedMaterials: []
-  m_fontMaterial: {fileID: 0}
-  m_fontMaterials: []
-  m_fontColor32:
-    serializedVersion: 2
-    rgba: 4293282880
-  m_fontColor: {r: 0.25, g: 0.3, b: 0.9, a: 1}
-  m_enableVertexGradient: 0
-  m_colorMode: 3
-  m_fontColorGradient:
-    topLeft: {r: 1, g: 1, b: 1, a: 1}
-    topRight: {r: 1, g: 1, b: 1, a: 1}
-    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
-    bottomRight: {r: 1, g: 1, b: 1, a: 1}
-  m_fontColorGradientPreset: {fileID: 0}
-  m_spriteAsset: {fileID: 0}
-  m_tintAllSprites: 0
-  m_StyleSheet: {fileID: 0}
-  m_TextStyleHashCode: -1183493901
-  m_overrideHtmlColors: 0
-  m_faceColor:
-    serializedVersion: 2
-    rgba: 4294967295
-  m_fontSize: 2
-  m_fontSizeBase: 2
-  m_fontWeight: 400
-  m_enableAutoSizing: 0
-  m_fontSizeMin: 18
-  m_fontSizeMax: 72
-  m_fontStyle: 0
-  m_HorizontalAlignment: 2
-  m_VerticalAlignment: 512
-  m_textAlignment: 65535
-  m_characterSpacing: 0
-  m_wordSpacing: 0
-  m_lineSpacing: 0
-  m_lineSpacingMax: 0
-  m_paragraphSpacing: 0
-  m_charWidthMaxAdj: 0
-  m_enableWordWrapping: 1
-  m_wordWrappingRatios: 0.4
-  m_overflowMode: 0
-  m_linkedTextComponent: {fileID: 0}
-  parentLinkedComponent: {fileID: 0}
-  m_enableKerning: 1
-  m_enableExtraPadding: 0
-  checkPaddingRequired: 0
-  m_isRichText: 1
-  m_parseCtrlCharacters: 1
-  m_isOrthographic: 0
-  m_isCullingEnabled: 0
-  m_horizontalMapping: 0
-  m_verticalMapping: 0
-  m_uvLineOffset: 0
-  m_geometrySortingOrder: 0
-  m_IsTextObjectScaleStatic: 0
-  m_VertexBufferAutoSizeReduction: 1
-  m_useMaxVisibleDescender: 1
-  m_pageToDisplay: 1
-  m_margin: {x: 0, y: 0, z: 0, w: 0}
-  m_isUsingLegacyAnimationComponent: 0
-  m_isVolumetricText: 0
-  m_hasFontAssetChanged: 0
-  m_renderer: {fileID: 2708246422010202965}
-  m_maskType: 0
-  _SortingLayer: 0
-  _SortingLayerID: 0
-  _SortingOrder: 0
diff --git a/Assets/Resources/Prefabs/Facts/Angle_Old.prefab.meta b/Assets/Resources/Prefabs/Facts/Angle_Old.prefab.meta
deleted file mode 100644
index 0fe7520528e8f31614a9ac4db59bdc0c2bda2ce7..0000000000000000000000000000000000000000
--- a/Assets/Resources/Prefabs/Facts/Angle_Old.prefab.meta
+++ /dev/null
@@ -1,7 +0,0 @@
-fileFormatVersion: 2
-guid: 88cc44a1ed1ae2444b3bd45c300ad7da
-PrefabImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/Assets/Resources/Prefabs/Facts/Circle.prefab b/Assets/Resources/Prefabs/Facts/Circle.prefab
index 2ec57bc1b6addd91dd80ea2da82cf6a6f5c20768..f3223214b818003441e53677c88042e88cd413f4 100644
--- a/Assets/Resources/Prefabs/Facts/Circle.prefab
+++ b/Assets/Resources/Prefabs/Facts/Circle.prefab
@@ -28,7 +28,7 @@ Transform:
   m_GameObject: {fileID: 5866155945383417828}
   m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
   m_LocalPosition: {x: 0, y: 0, z: 0}
-  m_LocalScale: {x: 0.96, y: 0.51, z: 0.96}
+  m_LocalScale: {x: 0.96, y: 1, z: 0.96}
   m_ConstrainProportionsScale: 0
   m_Children: []
   m_Father: {fileID: 142224692930156368}
@@ -110,6 +110,7 @@ GameObject:
   - component: {fileID: 142224692930156368}
   - component: {fileID: 7167210412035754299}
   - component: {fileID: 1078883255209641429}
+  - component: {fileID: 7621282258514180204}
   - component: {fileID: 5602986836502461330}
   - component: {fileID: 8419554499757686208}
   - component: {fileID: 8526453253978894086}
@@ -186,6 +187,21 @@ MeshRenderer:
   m_SortingLayer: 0
   m_SortingOrder: 0
   m_AdditionalVertexStreams: {fileID: 0}
+--- !u!114 &7621282258514180204
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6262947649539239553}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 405087c38b8537e43bcc99727c5325ec, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  radius: 1
+  sideCount: 500
+  circleMesh: {fileID: 7167210412035754299}
 --- !u!114 &5602986836502461330
 MonoBehaviour:
   m_ObjectHideFlags: 0
diff --git a/Assets/Scripts/InteractionEngine/FactHandling/AbstractLineFact.cs b/Assets/Scripts/InteractionEngine/FactHandling/AbstractLineFact.cs
index 0b91a3a2a640aacbd329b5bdc5892c03e52d9417..59acbab4fa4a1ca6fdf68e06ed45cce490bea85b 100644
--- a/Assets/Scripts/InteractionEngine/FactHandling/AbstractLineFact.cs
+++ b/Assets/Scripts/InteractionEngine/FactHandling/AbstractLineFact.cs
@@ -20,6 +20,10 @@ public abstract class AbstractLineFact : FactWrappedCRTP<AbstractLineFact>
     [JsonIgnore]
     public PointFact Point2 { get => (PointFact)_Facts[Pid2]; }
 
+    /// <summary> Distance between <see cref="AbstractLineFact.Pid1"/> and <see cref="AbstractLineFact.Pid2"/></summary>
+    [JsonIgnore]
+    public float Distance;
+
     /// <summary>
     /// Normalized Direction from <see cref="Pid1"/> to <see cref="Pid2"/>.
     /// </summary>
@@ -79,9 +83,12 @@ private void set_public_members(string pid1, string pid2)
     {
         this.Pid1 = pid1;
         this.Pid2 = pid2;
-        PointFact pf1 = _Facts[pid1] as PointFact;
-        PointFact pf2 = _Facts[pid2] as PointFact;
-        this.Dir = (pf2.Point - pf1.Point).normalized;
+        this.Dir = (Point1.Point - Point2.Point).normalized;
+        this.Distance = Dir.magnitude;
+
+        Position = Vector3.Lerp(Point1.Point, Point2.Point, 0.5f);
+        Rotation = Quaternion.LookRotation(Dir, Vector3.up);
+        LocalScale.Set(Distance, 1, 1);
     }
 
     /// \copydoc Fact.hasDependentFacts
@@ -138,25 +145,16 @@ public class LineFact : AbstractLineFactWrappedCRTP<LineFact>
     [JsonProperty]
     protected static new string s_type = "LineFact";
 
-    /// <summary> Distance between <see cref="AbstractLineFact.Pid1"/> and <see cref="AbstractLineFact.Pid2"/></summary>
-    public float Distance;
-
     /// <summary> \copydoc Fact.Fact </summary>
-    public LineFact() : base()
-    {
-        Distance = 0;
-    }
+    public LineFact() : base() { }
 
     /// <summary> \copydoc AbstractLineFact.AbstractLineFact(AbstractLineFact, Dictionary<string, string>, FactOrganizer) </summary>
     public LineFact(LineFact fact, Dictionary<string, string> old_to_new, FactOrganizer organizer) : base(fact, old_to_new, organizer)
         => init(old_to_new[fact.Pid1], old_to_new[fact.Pid2]);
 
     /// <summary> \copydoc AbstractLineFact.AbstractLineFact(string, string, string, FactOrganizer) </summary>
-    public LineFact(string pid1, string pid2, string backendURI, FactOrganizer organizer) : base(pid1, pid2, backendURI, organizer)
-    {
-        SetDistance();
-        _ = this.Label;
-    }
+    public LineFact(string pid1, string pid2, string backendURI, FactOrganizer organizer) : base(pid1, pid2, backendURI, organizer) 
+        => _ = this.Label;
 
     /// <summary> \copydoc AbstractLineFact.AbstractLineFact(string, string, FactOrganizer) </summary>
     public LineFact(string pid1, string pid2, FactOrganizer organizer) : base(pid1, pid2, organizer)
@@ -169,12 +167,6 @@ public LineFact(string pid1, string pid2, FactOrganizer organizer) : base(pid1,
     /// <param name="pid2">sets <see cref="AbstractLineFact.Pid2"/></param>
     private void init(string pid1, string pid2)
     {
-        SetDistance();
-
-        PointFact pf1 = _Facts[pid1] as PointFact;
-        PointFact pf2 = _Facts[pid2] as PointFact;
-        float v = (pf1.Point - pf2.Point).magnitude;
-
         SOMDoc lhs =
             new OMA(
                 new OMS(MMT_OMS_URI.Metric),
@@ -185,7 +177,7 @@ private void init(string pid1, string pid2)
             );
 
         SOMDoc valueTp = new OMS(MMT_OMS_URI.RealLit);
-        SOMDoc value = new OMF(v);
+        SOMDoc value = new OMF(Distance);
 
         MMTValueDeclaration mmtDecl = new(this.Label, lhs, valueTp, value);
         AddFactResponse.sendAdd(mmtDecl, out this._URI);
@@ -235,10 +227,6 @@ protected override bool EquivalentWrapped(LineFact f1, LineFact f2)
         return (p1f1.Equivalent(p1f2) && p2f1.Equivalent(p2f2))
             ;//|| (p1f1.Equivalent(p2f2) && p2f1.Equivalent(p1f2));
     }
-
-    /// <summary> Calculates and sets <see cref="Distance"/>; <remarks> <see cref="AbstractLineFact.Pid1"/> and <see cref="AbstractLineFact.Pid2"/> needs to be set first.</remarks></summary>
-    private void SetDistance()
-        => this.Distance = Vector3.Distance(((PointFact)_Facts[Pid1]).Point, ((PointFact)_Facts[Pid2]).Point);
 }
 
 /// <summary>
@@ -272,6 +260,8 @@ public RayFact(string pid1, string pid2, FactOrganizer organizer) : base(pid1, p
     /// <param name="pid2">sets <see cref="AbstractLineFact.Pid2"/></param>
     private void init(string pid1, string pid2)
     {
+        LocalScale = new Vector3(float.PositiveInfinity, 1, 1);
+
         SOMDoc tp = new OMS(MMT_OMS_URI.LineType);
         SOMDoc df = new OMA(
             new OMS(MMT_OMS_URI.LineOf),
diff --git a/Assets/Scripts/InteractionEngine/FactHandling/Fact.cs b/Assets/Scripts/InteractionEngine/FactHandling/Fact.cs
index ad5d269b21280c03d780f9294e0a865b179627ae..9534e20b5d9d9b01888e1203430a9f61bf6a9b41 100644
--- a/Assets/Scripts/InteractionEngine/FactHandling/Fact.cs
+++ b/Assets/Scripts/InteractionEngine/FactHandling/Fact.cs
@@ -7,10 +7,7 @@
 using static SOMDocManager;
 using static CommunicationEvents;
 using JsonSubTypes;
-using System.Linq.Expressions;
 using UnityEngine.ProBuilder;
-using System.Reflection;
-using System.Linq;
 
 public class ParsingDictionary
 {
@@ -208,6 +205,14 @@ public string Label
     [JsonIgnore]
     protected FactOrganizer _Facts;
 
+    [JsonIgnore]
+    public Vector3 Position { get; protected set; } = Vector3.zero;
+    [JsonIgnore]
+    public Quaternion Rotation { get; protected set; } = Quaternion.identity;
+    [JsonIgnore]
+    public Vector3 LocalScale { get; protected set; } = Vector3.one;
+
+
     /// <summary>
     /// Only being used by [JsonReader](https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_JsonReader.htm) to initiate empty \ref Fact "Facts".
     /// <seealso cref="SOMDocManager"/>
@@ -254,7 +259,7 @@ protected Fact(Fact fact, FactOrganizer organizer)
     public bool rename(string newLabel)
     // returns true if succeded
     {
-        if (string.IsNullOrEmpty(newLabel))
+        if (string.IsNullOrEmpty(newLabel) && _Facts.GetNumberOfFacts() != 0)
         // switch back to autogenerated
         {
             generateLabel();
@@ -453,6 +458,9 @@ private void init(Vector3 P, Vector3 N)
         this.Point = P;
         this.Normal = N;
 
+        Position = P;
+        Rotation = Quaternion.LookRotation(N);
+
         SOMDoc tp = new OMS(MMT_OMS_URI.Point);
         SOMDoc df = new OMA(
                 new OMS(MMT_OMS_URI.Tuple),
@@ -584,6 +592,23 @@ private void init(string pid, string rid)
         this.Pid = pid;
         this.Rid = rid;
 
+        Position = Point.Position;
+        { //Rotation
+            Vector3 up = Point.Normal;
+            Vector3 forward = Ray.Dir;
+
+            if(Math3d.IsApproximatelyEqual(up, forward))
+            {
+                Vector3 arbitary = Math3d.IsApproximatelyEqual(forward, Vector3.forward) 
+                    ? Vector3.right 
+                    : Vector3.forward;
+
+                up = Vector3.Cross(arbitary, forward);
+            }
+
+            Rotation = Quaternion.LookRotation(forward, up);
+        }
+
         SOMDoc tp = new OMA(
             new OMS(MMT_OMS_URI.Ded), 
             new List<SOMDoc> {
@@ -700,7 +725,8 @@ public class AngleFact : FactWrappedCRTP<AngleFact>
 
     /// <summary> <see langword="true"/>, if AngleFact is approximately 90° or 270°</summary>
     public bool is_right_angle;
-
+    [JsonIgnore]
+    public float angle;
 
     /// <summary> \copydoc Fact.Fact </summary>
     public AngleFact() : base()
@@ -742,9 +768,27 @@ private void init(string pid1, string pid2, string pid3)
         this.Pid2 = pid2;
         this.Pid3 = pid3;
 
-        float v = GetAngle(); // sets is_right_angle
+        ComputeAngle(); // sets is_right_angle, angle
+
+        Position = Point2.Position;
+        { //Rotation
+            Vector3 from = (Point1.Position - Position).normalized;
+            Vector3 to = (Point3.Position - Position).normalized;
+
+            Vector3 up = Vector3.Cross(to, from);
+            Vector3 forwoard = (from + to).normalized;
 
-        MMTDeclaration mmtDecl = generateNot90DegreeAngleDeclaration(v, pid1, pid2, pid3);
+            if (up.sqrMagnitude < Math3d.vectorPrecission)
+            { //Angle is 180° (or 0°)
+                Vector3 arbitary = up.normalized == Vector3.forward ? Vector3.right : Vector3.forward;
+                up = Vector3.Cross(arbitary, to);
+                forwoard = Vector3.Cross(up, to);
+            }
+
+            Rotation = Quaternion.LookRotation(forwoard, up);
+        }
+
+        MMTDeclaration mmtDecl = generateNot90DegreeAngleDeclaration(angle, pid1, pid2, pid3);
         AddFactResponse.sendAdd(mmtDecl, out this._URI);
     }
 
@@ -762,7 +806,7 @@ public AngleFact(string Pid1, string Pid2, string Pid3, string backendURI, FactO
         this.Pid2 = Pid2;
         this.Pid3 = Pid3;
 
-        _ = GetAngle();
+        _ = ComputeAngle();
         this._URI = backendURI;
         _ = this.Label;
     }
@@ -777,7 +821,6 @@ public AngleFact(string Pid1, string Pid2, string Pid3, float angle, string back
         _ = this.Label;
     }
 
-
     /// \copydoc Fact.parseFact(Scroll.ScrollFact)
     public new static AngleFact parseFact(Scroll.ScrollFact fact)
     {
@@ -829,16 +872,16 @@ protected override string generateLabel()
     /// Computes smallest angle and sets <see cref="is_right_angle"/>
     /// </summary>
     /// <returns>Smallets angle between [<see cref="Pid1"/>, <see cref="Pid2"/>] and [<see cref="Pid2"/>, <see cref="Pid3"/>]</returns>
-    private float GetAngle()
+    private float ComputeAngle()
     {
         PointFact pf1 = _Facts[Pid1] as PointFact;
         PointFact pf2 = _Facts[Pid2] as PointFact;
         PointFact pf3 = _Facts[Pid3] as PointFact;
 
-        float v = Vector3.Angle((pf1.Point - pf2.Point), (pf3.Point - pf2.Point));
-        this.is_right_angle = Mathf.Abs(v - 90.0f) < 0.01;
+        angle = Vector3.Angle((pf1.Point - pf2.Point), (pf3.Point - pf2.Point));
+        this.is_right_angle = Mathf.Abs(angle - 90.0f) < 0.01;
 
-        return is_right_angle ? 90f : v;
+        return is_right_angle ? 90f : angle;
     }
 
     /// <summary>
@@ -999,6 +1042,24 @@ private void init(string pid1, string pid2, string pid3)
         this.Pid2 = pid2;
         this.Pid3 = pid3;
 
+        Position = Point2.Position;
+        { //Rotation
+            Vector3 from = (Point1.Position - Position).normalized;
+            Vector3 to = (Point3.Position - Position).normalized;
+
+            Vector3 up = Vector3.Cross(to, from);
+            Vector3 forwoard = (from + to).normalized;
+
+            if (up.sqrMagnitude < Math3d.vectorPrecission)
+            { //Angle is 180° (or 0°)
+                Vector3 arbitary = up.normalized == Vector3.forward ? Vector3.right : Vector3.forward;
+                up = Vector3.Cross(arbitary, to);
+                forwoard = Vector3.Cross(up, to);
+            }
+
+            Rotation = Quaternion.LookRotation(forwoard, up);
+        }
+
         AddFactResponse.sendAdd(generateMMTDeclaration(pid1, pid2, pid3), out this._URI);
     }
 
@@ -1391,6 +1452,10 @@ private void init(string pid1, string pid2, float radius, Vector3 normal)
         this.radius = radius;
         this.normal = normal;
 
+        Position = Point1.Position;
+        Rotation = Quaternion.LookRotation(normal);
+        LocalScale = new Vector3(radius, 1, radius);
+
         MMTDeclaration mmtDecl = generateCircleFactDeclaration(pid1, pid2, radius, normal);
         AddFactResponse.sendAdd(mmtDecl, out this._URI);
     }
@@ -1621,6 +1686,9 @@ private void init(string pid, string cid)
         this.Pid = pid;
         this.Cid = cid;;
 
+        Position = Point.Position;
+        Rotation = Circle.Rotation;
+
         SOMDoc tp = 
             new OMA(
                 new OMS(MMT_OMS_URI.Ded), 
@@ -1735,8 +1803,13 @@ public class AngleCircleLineFact : FactWrappedCRTP<AngleCircleLineFact>
     [JsonIgnore]
     public CircleFact Circle { get => (CircleFact)_Facts[Cid1]; }
 
+    //TODO? deg or rad?
+    [JsonIgnore]
     public float angle;
 
+    [JsonIgnore]
+    public Vector3 intersection;
+
     /// <summary> \copydoc Fact.Fact </summary>
     public AngleCircleLineFact() : base()
     {
@@ -1752,7 +1825,7 @@ public AngleCircleLineFact() : base()
     /// <param name="old_to_new"><c>Dictionary</c> mapping <paramref name="fact"/>.<see cref="getDependentFactIds"/> in <paramref name="fact"/>.<see cref="Fact._Facts"/> to corresponding <see cref="Fact.Id"/> in <paramref name="organizer"/> </param>
     /// <param name="organizer">sets <see cref="_Facts"/></param>
     public AngleCircleLineFact(AngleCircleLineFact fact, Dictionary<string, string> old_to_new, FactOrganizer organizer) : base(fact, organizer)
-        => init(old_to_new[fact.Cid1], old_to_new[fact.Rid2], fact.angle);
+        => init(old_to_new[fact.Cid1], old_to_new[fact.Rid2]);
 
     /// <summary>
     /// Standard Constructor
@@ -1761,8 +1834,8 @@ public AngleCircleLineFact(AngleCircleLineFact fact, Dictionary<string, string>
     /// <param name="rid2">sets <see cref="Rid2"/></param>
     /// <param name="angle"> sets the angle </param>
     /// <param name="organizer">sets <see cref="Fact._Facts"/></param>
-    public AngleCircleLineFact(string cid1, string rid2, float angle, FactOrganizer organizer) : base(organizer)
-        => init(cid1, rid2, angle);
+    public AngleCircleLineFact(string cid1, string rid2, FactOrganizer organizer) : base(organizer)
+        => init(cid1, rid2);
 
     /// <summary>
     /// Initiates <see cref="Cid1"/>, <see cref="Rid2"/>, <see cref="angle"/> <see cref="Fact._URI"/> and creates MMT %Fact Server-Side
@@ -1770,11 +1843,34 @@ public AngleCircleLineFact(string cid1, string rid2, float angle, FactOrganizer
     /// <param name="cid1">sets <see cref="Cid1"/></param>
     /// <param name="rid2">sets <see cref="Rid2"/></param>
     /// <param name="angle"> sets the angle </param>
-    private void init(string cid1, string rid2, float angle)
+    private void init(string cid1, string rid2)
     {
         this.Cid1 = cid1;
         this.Rid2 = rid2;
-        this.angle = angle;
+        this.angle = Math3d.AngleVectorPlane(Ray.Dir, Circle.normal).ToDegrees();
+        Math3d.LinePlaneIntersection(out intersection, Ray.Point1.Position, Ray.Dir, Circle.normal, Circle.Position);
+
+        Position = intersection;
+        { //Rotation
+            Vector3 from = (Circle.Position - Position).normalized;
+
+            Vector3 angle_to = Math3d.IsApproximatelyEqual(intersection, Ray.Point1.Position)
+                ? Ray.Point2.Position
+                : Ray.Point1.Position;
+            Vector3 to = (angle_to - Position).normalized;
+
+            Vector3 up = Vector3.Cross(to, from);
+            Vector3 forwoard = (from + to).normalized;
+
+            if (up.sqrMagnitude < Math3d.vectorPrecission)
+            { //Angle is 180° (or 0°)
+                Vector3 arbitary = up.normalized == Vector3.forward ? Vector3.right : Vector3.forward;
+                up = Vector3.Cross(arbitary, to);
+                forwoard = Vector3.Cross(up, to);
+            }
+
+            Rotation = Quaternion.LookRotation(forwoard, up);
+        }
 
         MMTDeclaration mmtDecl = generateMMTDeclaration(angle, cid1, rid2);
         AddFactResponse.sendAdd(mmtDecl, out this._URI);
@@ -1948,6 +2044,9 @@ private void init(string cid1)
         CircleFact cf1 = _Facts[cid1] as CircleFact;
         this.rad = cf1.radius;
 
+        Position = Circle.Position;
+        Rotation = Circle.Rotation;
+
         MMTDeclaration mmtDecl = generateMMTDeclaration(cid1, this.rad);
         AddFactResponse.sendAdd(mmtDecl, out this._URI);
     }
@@ -2095,6 +2194,9 @@ private void init(string cid1)
         CircleFact cf1 = _Facts[cid1] as CircleFact;
         this.A = cf1.radius * cf1.radius * ((float)System.Math.PI);
 
+        Position = Circle.Position;
+        Rotation = Circle.Rotation;
+
         MMTDeclaration mmtDecl = generateMMTDeclaration(cid1, this.A);
         AddFactResponse.sendAdd(mmtDecl, out this._URI);
     }
@@ -2246,6 +2348,9 @@ private void init(string cid1, string pid1, float vol)
         this.Pid1 = pid1;
         this.vol = vol;
 
+        Position = Point.Position;
+        Rotation = Circle.Rotation;
+
         MMTDeclaration mmtDecl = generateMMTDeclaration(cid1, pid1, vol);
         AddFactResponse.sendAdd(mmtDecl, out this._URI);
     }
@@ -2381,6 +2486,14 @@ public class OrthogonalCircleLineFact : FactWrappedCRTP<OrthogonalCircleLineFact
     [JsonIgnore]
     public AbstractLineFact Ray { get => (AbstractLineFact)_Facts[Lid1]; }
 
+    //TODO? deg or rad?
+    [JsonIgnore]
+    public float angle = 90f;
+
+    [JsonIgnore]
+    public Vector3 intersection;
+
+
     /// <summary> \copydoc Fact.Fact </summary>
     public OrthogonalCircleLineFact() : base()
     {
@@ -2415,6 +2528,21 @@ private void init(string cid1, string lid1)
     {
         this.Cid1 = cid1;
         this.Lid1 = lid1;
+        Math3d.LinePlaneIntersection(out intersection, Ray.Point1.Position, Ray.Dir, Circle.normal, Circle.Position);
+
+        Position = intersection;
+        { //Rotation
+            Vector3 from = (Circle.Position - Position).normalized;
+
+            Vector3 angle_to = Math3d.IsApproximatelyEqual(intersection, Ray.Point1.Position)
+                ? Ray.Point2.Position
+                : Ray.Point1.Position;
+            Vector3 to = (angle_to - Position).normalized;
+
+            Vector3 up = Vector3.Cross(to, from);
+            Vector3 forward = (from + to).normalized;
+            Rotation = Quaternion.LookRotation(forward, up);
+        }
 
         MMTDeclaration mmtDecl = generateMMTDeclaration(cid1, lid1);
         AddFactResponse.sendAdd(mmtDecl, out this._URI);
@@ -2599,6 +2727,9 @@ private void init(string cid1, string cid2, float vol, string unequalproof, OMA
         this.unequalCirclesProof = unequalproof;
         this.vol = vol;
 
+        Position = Circle2.Position;
+        Rotation = Circle2.Rotation;
+
         MMTDeclaration mmtDecl = generateMMTDeclaration(cid1, cid2, vol, unequalproof, proof);
         AddFactResponse.sendAdd(mmtDecl, out this._URI);
     }
@@ -2786,6 +2917,9 @@ private void init(string cid1, string cid2, float vol, string eqProof, OMA proof
         this.equalCirclesProof = eqProof;
         this.vol = vol;
 
+        Position = Circle2.Position;
+        Rotation = Circle2.Rotation;
+
         MMTDeclaration mmtDecl = generateMMTDeclaration(cid1, cid2, vol, eqProof, proof);
         AddFactResponse.sendAdd(mmtDecl, out this._URI);
     }
@@ -2956,6 +3090,9 @@ private void init(string cid1, string cid2)
         this.Cid1 = cid1;
         this.Cid2 = cid2;
 
+        Position = Circle1.Position;
+        Rotation = Circle1.Rotation;
+
         MMTDeclaration mmtDecl = generateEqualCirclesFactDeclaration(cid1, cid2);
         AddFactResponse.sendAdd(mmtDecl, out this._URI);
     }
@@ -3132,6 +3269,9 @@ private void init(string cid1, string cid2)
         this.Cid1 = cid1;
         this.Cid2 = cid2;
 
+        Position = Circle2.Position;
+        Rotation = Circle2.Rotation;
+
         MMTDeclaration mmtDecl = generateUnEqualCirclesFactDeclaration(cid1, cid2);
         AddFactResponse.sendAdd(mmtDecl, out this._URI);
     }
diff --git a/Assets/Scripts/InteractionEngine/FactHandling/FactManager.cs b/Assets/Scripts/InteractionEngine/FactHandling/FactManager.cs
index 1a8844d8a158bd8d419432ec1e3aa3e62c8129d1..1b91647fc9cdff5035de426bfb64ee9859dedb9d 100644
--- a/Assets/Scripts/InteractionEngine/FactHandling/FactManager.cs
+++ b/Assets/Scripts/InteractionEngine/FactHandling/FactManager.cs
@@ -157,7 +157,7 @@ public static AngleCircleLineFact AddAngleCircleLineFact(string cid, string lid,
     {
 
         AngleCircleLineFact angle = (AngleCircleLineFact)AddFactIfNotFound(
-            new AngleCircleLineFact(cid, lid, angleValue, StageStatic.stage.factState)
+            new AngleCircleLineFact(cid, lid, StageStatic.stage.factState)
             , out _, samestep, gadget, scroll_label);
 
         if (Mathf.Approximately(Mathf.Abs(angleValue), 90.0f))
diff --git a/Assets/Scripts/InteractionEngine/FactHandling/FactSpawner.cs b/Assets/Scripts/InteractionEngine/FactHandling/FactSpawner.cs
index 5730c06192420a9fc0c7ec16e95ca118cc4eaeae..7150d6011abbc8902098fcc5cfb1588a60ff64ba 100644
--- a/Assets/Scripts/InteractionEngine/FactHandling/FactSpawner.cs
+++ b/Assets/Scripts/InteractionEngine/FactHandling/FactSpawner.cs
@@ -29,23 +29,23 @@ public Fact SpawnFactRepresentation(Fact fact)
     {
         Func<Fact, Fact> func = fact switch
         {
-            PointFact       => SpawnPoint,
-            LineFact        => SpawnLine,
-            RightAngleFact  => SpawnAngle, //needed for Hint System
-            AngleFact       => SpawnAngle,
-            RayFact         => SpawnRay,
-            CircleFact      => SpawnRingAndCircle,
+            PointFact => SpawnPoint,
+            LineFact => SpawnLine,
+            RightAngleFact => SpawnAngle, //needed for Hint System
+            AngleFact => SpawnAngle,
+            RayFact => SpawnRay,
+            CircleFact => SpawnRingAndCircle,
             _ => null,
         };
 
         return func?.Invoke(fact);
     }
-  
+
 
     public Fact SpawnPoint(Fact pointFact)
     {
         PointFact fact = ((PointFact)pointFact);
-     
+
         GameObject point = GameObject.Instantiate(Sphere);
         point.transform.position = fact.Point;
         point.transform.up = fact.Normal;
@@ -58,30 +58,26 @@ public Fact SpawnPoint(Fact pointFact)
     public Fact SpawnLine(Fact fact)
     {
         LineFact lineFact = ((LineFact)fact);
-
-        Vector3 point1 = lineFact.Point1.Point;
-        Vector3 point2 = lineFact.Point2.Point;
         //Change FactRepresentation to Line
         GameObject line = GameObject.Instantiate(Line);
         //Place the Line in the centre of the two points
-        line.transform.position = Vector3.Lerp(point1, point2, 0.5f);
+        line.transform.position = lineFact.Position;
         //Change scale and rotation, so that the two points are connected by the line
         //Get the Line-GameObject as the first Child of the Line-Prefab -> That's the Collider
         var v3T = line.transform.GetChild(0).localScale;
 
         //For every Coordinate x,y,z we have to devide it by the LocalScale of the Child,
         //because actually the Child should be of this length and not the parent, which is only the Collider
-        v3T.x = (point2 - point1).magnitude / line.transform.GetChild(0).GetChild(0).localScale.x;
+        v3T.x = lineFact.LocalScale.x / line.transform.GetChild(0).GetChild(0).localScale.x;
 
         //Change Scale/Rotation of the Line-GameObject without affecting Scale of the Text
         line.transform.GetChild(0).localScale = v3T;
-        line.transform.GetChild(0).rotation = Quaternion.FromToRotation(Vector3.right, lineFact.Dir);
+        line.transform.GetChild(0).rotation = lineFact.Rotation;
 
-        //string letter = ((Char)(64 + lineFact.Id + 1)).ToString();
-        //line.GetComponentInChildren<TextMeshPro>().text = letter;
-        line.GetComponentInChildren<TextMeshPro>().text = 
-            lineFact.Label + " = " + Math.Round((point1-point2).magnitude, 2) + " m";
+        line.GetComponentInChildren<TextMeshPro>().text =
+            lineFact.Label + " = " + Math.Round(lineFact.Distance, 2) + " m";
         line.GetComponentInChildren<FactObject>().URI = lineFact.Id;
+
         lineFact.Representation = line;
         return lineFact;
 
@@ -90,25 +86,21 @@ public Fact SpawnLine(Fact fact)
     public Fact SpawnRay(Fact fact)
     {
         RayFact rayFact = ((RayFact)fact);
- 
-        Vector3 point1 = rayFact.Point1.Point;
-        Vector3 point2 = rayFact.Point2.Point;
-
         //Change FactRepresentation to Line
         GameObject line = GameObject.Instantiate(Ray);
         //Place the Line in the centre of the two points
-        line.transform.position = Vector3.Lerp(point1, point2, 0.5f);
+        line.transform.position = rayFact.Position;
         //Change scale and rotation, so that the two points are connected by the line
         //Get the Line-GameObject as the first Child of the Line-Prefab -> That's the Collider
         var v3T = line.transform.GetChild(0).localScale;
 
         //For every Coordinate x,y,z we have to devide it by the LocalScale of the Child,
         //because actually the Child should be of this length and not the parent, which is only the Collider
-        v3T.x = (point2 - point1).magnitude * 100 / line.transform.GetChild(0).GetChild(0).localScale.x;
+        v3T.x = rayFact.LocalScale.x / line.transform.GetChild(0).GetChild(0).localScale.x;
 
         //Change Scale/Rotation of the Line-GameObject without affecting Scale of the Text
         line.transform.GetChild(0).localScale = v3T;
-        line.transform.GetChild(0).rotation = Quaternion.FromToRotation(Vector3.right, rayFact.Dir);
+        line.transform.GetChild(0).rotation = rayFact.Rotation;
 
         line.GetComponentInChildren<TextMeshPro>().text = rayFact.Label;
         line.GetComponentInChildren<FactObject>().URI = rayFact.Id;
@@ -116,58 +108,42 @@ public Fact SpawnRay(Fact fact)
         rayFact.Representation = line;
         return rayFact;
     }
-    
+
     //Spawn an angle: point with id = angleFact.Pid2 is the point where the angle gets applied
     public Fact SpawnAngle(Fact fact)
     {
-        Vector3 point1, point2, point3;
+        Vector3 Psotion;
+        Quaternion Rotation;
+        float angleValue;
 
         // TODO: just use simple inheritence or similar!!
         if (fact is RightAngleFact rightangleFact)
         {
-            point1 = rightangleFact.Point1.Point;
-            point2 = rightangleFact.Point2.Point;
-            point3 = rightangleFact.Point3.Point;
+            Psotion = rightangleFact.Position;
+            Rotation = rightangleFact.Rotation;
+            angleValue = 90f;
         }
         else if (fact is AngleFact angleFact)
         {
-            point1 = angleFact.Point1.Point;
-            point2 = angleFact.Point2.Point;
-            point3 = angleFact.Point3.Point;
+            Psotion = angleFact.Position;
+            Rotation = angleFact.Rotation;
+            angleValue = angleFact.angle;
         }
-        else 
+        else
             throw new Exception("Invalid Type:" + fact.GetType().ToString());
 
         //Change FactRepresentation to Angle
         GameObject angle = GameObject.Instantiate(Angle);
 
-        //Calculate Angle:
-        Vector3 from = (point3 - point2).normalized;
-        Vector3 to = (point1 - point2).normalized;
-        float angleValue = Vector3.Angle(from, to); //We always get an angle between 0 and 180° here
-
-        //Change scale and rotation, so that the angle is in between the two lines
-
-        Vector3 forwoard = (from + to).normalized;
-        Vector3 up = Vector3.Cross(to, from);
-
-        if (up.sqrMagnitude < Math3d.vectorPrecission) { //Angle is 180° (or 0°)
-            Vector3 arbitary = up.normalized == Vector3.forward ? Vector3.right : Vector3.forward;
-            up = Vector3.Cross(arbitary, to);
-
-            forwoard = to;
-        } else
-            forwoard = Vector3.Cross(forwoard, up);
-
         //Place the Angle at position of point2
-        angle.transform.SetPositionAndRotation(point2, Quaternion.LookRotation(forwoard, up));
+        angle.transform.SetPositionAndRotation(Psotion, Rotation);
 
         //Set text of angle
         TextMeshPro[] texts = angle.GetComponentsInChildren<TextMeshPro>();
-        foreach (TextMeshPro t in texts) {
-            //Change Text not to the id, but to the angle-value (from both sides) AND change font-size relative to length of the angle (from both sides)
-            t.text = Math.Round((double) angleValue, 2) + "°";
-            t.fontSize = angle.GetComponentInChildren<TextMeshPro>().fontSize * angle.transform.GetChild(0).transform.GetChild(0).localScale.x;
+        foreach (TextMeshPro t in texts)
+        {
+            //Change Text not to the id, but to the angle-value (from both sides)
+            t.text = Math.Round(angleValue, 2) + "°";
         }
 
         //Generate angle mesh
@@ -182,107 +158,52 @@ public Fact SpawnAngle(Fact fact)
 
     public Fact SpawnRingAndCircle(Fact fact)
     {
+        CircleFact circleFact = fact as CircleFact;
+
         var ringAndCircleGO = new GameObject("RingAndCircle");
-        _ = SpawnRing(fact, ringAndCircleGO.transform);
-        var circleFact = SpawnCircle(fact, ringAndCircleGO.transform);
+        SpawnRing(circleFact, ringAndCircleGO.transform);
+        SpawnCircle(circleFact, ringAndCircleGO.transform);
 
-        //TODO check whether this is necessary?
-       // this.FactRepresentation = ringAndCircleGO;
-        circleFact.Representation = ringAndCircleGO;
+        //Move Ring to middlePoint
+        ringAndCircleGO.transform.position = circleFact.Position;
 
-        return circleFact;
+        fact.Representation = ringAndCircleGO;
+        return fact;
     }
 
-    public Fact SpawnRing(Fact fact, Transform parent = null)
+    public void SpawnRing(CircleFact circleFact, Transform parent = null)
     {
-        CircleFact circleFact = (CircleFact)fact;
-
-        PointFact middlePointFact = circleFact.Point1;
-        PointFact basePointFact = circleFact.Point2;
-
-        Vector3 middlePoint = middlePointFact.Point;
-        Vector3 normal = circleFact.normal;
-        float radius = circleFact.radius;
-
-        //Change FactRepresentation to Ring
-        //TODO check whether this is necessary?
-
-        //this.FactRepresentation = Ring;
-        //GameObject ring = Instantiate(FactRepresentation, parent);
-        GameObject ring = GameObject.Instantiate(Ring,parent);
-
+        GameObject ring = GameObject.Instantiate(Ring, parent);
         var tori = ring.GetComponentsInChildren<TorusGenerator>();
         var tmpText = ring.GetComponentInChildren<TextMeshPro>();
         var FactObj = ring.GetComponentInChildren<FactObject>();
 
-        //Move Ring to middlePoint
-        ring.transform.position = middlePoint;
-
-        //Rotate Ring according to normal
-        if (normal.y < 0) // if normal faces downwards use inverted normal instead
-            ring.transform.up = -normal;
-        else
-            ring.transform.up = normal;
-
         //Set radii
         foreach (var torus in tori)
-            torus.torusRadius = radius;
+            torus.torusRadius = circleFact.radius;
 
-        string text = $"â—‹{middlePointFact.Label}";
-        tmpText.text = text;
-        ////move TMP Text so it is on the edge of the circle
-        //tmpText.rectTransform.position = tmpText.rectTransform.position - new Vector3(0, 0, -radius);
+        tmpText.text = $"â—‹{circleFact.Point1.Label}";
 
         FactObj.URI = circleFact.Id;
-        circleFact.Representation = ring;
-
-        return circleFact;
     }
 
-    public Fact SpawnCircle(Fact fact, Transform parent = null)
+    public void SpawnCircle(CircleFact circleFact, Transform parent = null)
     {
-        CircleFact circleFact = (CircleFact)fact;
-
-        PointFact middlePointFact = circleFact.Point1;
-        PointFact basePointFact = circleFact.Point2;
-
-        Vector3 middlePoint = middlePointFact.Point;
-        Vector3 normal = circleFact.normal;
-        float radius = circleFact.radius;
-
-        //TODO check whether this is necessary
-        //Change FactRepresentation to Ring
-       // this.FactRepresentation = Circle;
         GameObject circle = Instantiate(Circle, parent);
-
         var FactObj = circle.GetComponentInChildren<FactObject>();
 
-        //Move Circle to middlePoint
-        circle.transform.position = middlePoint;
-
-        //Rotate Circle according to normal
-        if (normal.y < 0) // if normal faces downwards use inverted normal instead
-            circle.transform.up = -normal;
-        else
-            circle.transform.up = normal;
-
         //Set radius
-        circle.transform.localScale = new Vector3(radius, circle.transform.localScale.y, radius);
+        circle.transform.localScale = Vector3.Scale(circle.transform.localScale, circleFact.LocalScale);
 
         FactObj.URI = circleFact.Id;
-        circleFact.Representation = circle;
-
-        return circleFact;
     }
 
 
     public void DeleteObject(Fact fact)
-    {
-        //print("Deleting: " + fact.Representation?.name);
-        GameObject.Destroy(fact.Representation);
-    }
+        => GameObject.Destroy(fact.Representation);
 
-    public void animateNonExistingFactTrigger(Fact fact) {
+    public void animateNonExistingFactTrigger(Fact fact)
+    {
         StartCoroutine(animateNonExistingFact(fact));
 
         IEnumerator animateNonExistingFact(Fact fact)
diff --git a/Assets/Scripts/MeshGenerator/ShapeGenerator.cs b/Assets/Scripts/MeshGenerator/ShapeGenerator.cs
index 1753f61f28f7cb6ea482b244b4a6d2f72894e0eb..b7309740d44bdaadf2fc29a945825c48cea7ce39 100644
--- a/Assets/Scripts/MeshGenerator/ShapeGenerator.cs
+++ b/Assets/Scripts/MeshGenerator/ShapeGenerator.cs
@@ -26,7 +26,9 @@ protected static Mesh CreateMesh((Vector3[] vertices, int[] triangles) meshValue
         return mesh;
     }
 
-    protected static Vector3[] GetCirclePoints(float circleRadius, int pointCount) => GetCirclePoints(circleRadius, pointCount, Vector3.zero);
+    protected static Vector3[] GetCirclePoints(float circleRadius, int pointCount) 
+        => GetCirclePoints(circleRadius, pointCount, Vector3.zero);
+
     protected static Vector3[] GetCirclePoints(float circleRadius, int pointCount, Vector3 offset)
     {
         Vector3[] circle = new Vector3[pointCount];
diff --git a/Assets/Scripts/MeshGenerator/TorusGenerator.cs b/Assets/Scripts/MeshGenerator/TorusGenerator.cs
index 95ef7746d9b72022d148fa987423136440778261..ab05a78233c7656f78b9b0ebb88aa4dbac822080 100644
--- a/Assets/Scripts/MeshGenerator/TorusGenerator.cs
+++ b/Assets/Scripts/MeshGenerator/TorusGenerator.cs
@@ -24,6 +24,7 @@ protected override void GenerateShape()
     {
         if (torusMesh.sharedMesh != null)
             torusMesh.sharedMesh.Clear();
+
         torusMesh.mesh = CreateMesh(CreateTorus(torusRadius, ringRadius, ringSegmentCount, segmentSideCount));
 
         if (torusMesh.transform.TryGetComponent(out MeshCollider meshCol))