diff --git a/Assets/Resources/Prefabs/Facts/Ring.prefab b/Assets/Resources/Prefabs/Facts/Ring.prefab
new file mode 100644
index 0000000000000000000000000000000000000000..071a3d5dd9fb01439c83426985e3e4460cc00071
--- /dev/null
+++ b/Assets/Resources/Prefabs/Facts/Ring.prefab
@@ -0,0 +1,543 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1001283044610252316
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 8698932133077106484}
+  - component: {fileID: 154494299464322201}
+  - component: {fileID: 1254072669719294581}
+  - component: {fileID: 5033072517473897711}
+  m_Layer: 5
+  m_Name: Text
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &8698932133077106484
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1001283044610252316}
+  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: []
+  m_Father: {fileID: 2014127074789226423}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 1}
+  m_SizeDelta: {x: 4, y: 1}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!23 &154494299464322201
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1001283044610252316}
+  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!114 &1254072669719294581
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1001283044610252316}
+  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: 4294967293
+  m_fontColor: {r: 0.993, g: 1, b: 1, 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: 4
+  m_fontSizeBase: 4
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 256
+  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: 154494299464322201}
+  m_maskType: 0
+  _SortingLayer: 0
+  _SortingLayerID: 0
+  _SortingOrder: 0
+--- !u!114 &5033072517473897711
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1001283044610252316}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 8cf5a358dacd3b54ab093ee289dd9ba2, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  Cam: {fileID: 0}
+--- !u!1 &7067472111420977835
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 3821173845951859578}
+  - component: {fileID: 6307794999199274257}
+  - component: {fileID: 4181090182545414655}
+  - component: {fileID: 8736718377918556088}
+  - component: {fileID: 3274869260965504490}
+  - component: {fileID: 4622529340520030698}
+  m_Layer: 16
+  m_Name: Mesh
+  m_TagString: SnapZone
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &3821173845951859578
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7067472111420977835}
+  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: 5121703917865025706}
+  - {fileID: 4775945639457863304}
+  m_Father: {fileID: 2014127074789226423}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &6307794999199274257
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7067472111420977835}
+  m_Mesh: {fileID: 0}
+--- !u!23 &4181090182545414655
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7067472111420977835}
+  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 &8736718377918556088
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7067472111420977835}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 626c435b76e0d334f959ede8b54b07ac, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  URI: 
+--- !u!64 &3274869260965504490
+MeshCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7067472111420977835}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 0
+  m_Enabled: 1
+  serializedVersion: 4
+  m_Convex: 0
+  m_CookingOptions: 30
+  m_Mesh: {fileID: 0}
+--- !u!95 &4622529340520030698
+Animator:
+  serializedVersion: 3
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7067472111420977835}
+  m_Enabled: 1
+  m_Avatar: {fileID: 0}
+  m_Controller: {fileID: 9100000, guid: 7f5a2c4324ecb83488857feb7887b5a7, type: 2}
+  m_CullingMode: 0
+  m_UpdateMode: 0
+  m_ApplyRootMotion: 0
+  m_LinearVelocityBlending: 0
+  m_WarningMessage: 
+  m_HasTransformHierarchy: 1
+  m_AllowConstantClipSamplingOptimization: 1
+  m_KeepAnimatorControllerStateOnDisable: 0
+--- !u!1 &7320042660989930446
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 4775945639457863304}
+  - component: {fileID: 2239887596765845809}
+  - component: {fileID: 2358573561192576705}
+  - component: {fileID: 7622934778317457235}
+  m_Layer: 16
+  m_Name: LineHighlight
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!4 &4775945639457863304
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7320042660989930446}
+  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.51}
+  m_Children: []
+  m_Father: {fileID: 3821173845951859578}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &2239887596765845809
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7320042660989930446}
+  m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &2358573561192576705
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7320042660989930446}
+  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: 1
+  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 &7622934778317457235
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7320042660989930446}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: a6b9fc46f5bfe6b4eb4adf01e6b65bac, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!1 &7644263571880024739
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2014127074789226423}
+  - component: {fileID: 2449733549921447938}
+  m_Layer: 16
+  m_Name: Ring
+  m_TagString: Selectable
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &2014127074789226423
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7644263571880024739}
+  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: 3821173845951859578}
+  - {fileID: 8698932133077106484}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &2449733549921447938
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7644263571880024739}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 35327f6b479454149a20587eb03337f8, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  torusRadius: 1
+  ringRadius: 0.05
+  ringSegmentCount: 50
+  segmentSideCount: 30
+  torusMesh: {fileID: 6307794999199274257}
+--- !u!1 &8117705180640636930
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5121703917865025706}
+  - component: {fileID: 213008266423099231}
+  - component: {fileID: 2162055944849665559}
+  m_Layer: 16
+  m_Name: LineInner
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!4 &5121703917865025706
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8117705180640636930}
+  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.5}
+  m_Children: []
+  m_Father: {fileID: 3821173845951859578}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &213008266423099231
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8117705180640636930}
+  m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &2162055944849665559
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8117705180640636930}
+  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: a8a7bf60a30970f469a9c9d3ae2de6ef, 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}
diff --git a/Assets/Resources/Prefabs/Facts/Ring.prefab.meta b/Assets/Resources/Prefabs/Facts/Ring.prefab.meta
new file mode 100644
index 0000000000000000000000000000000000000000..1b40fa4116a7d339fd3b3bf488a26bdb9c868429
--- /dev/null
+++ b/Assets/Resources/Prefabs/Facts/Ring.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 0ed2a320a46601c4bab6c097b0b09add
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Resources/Prefabs/MainPlayer.prefab b/Assets/Resources/Prefabs/MainPlayer.prefab
index 52f2044e19d1852d9b14dd1d7ce3fce1dbd6d383..da71fdeb793a6cb6601a3ebc5a6b7cce3c4f46ab 100644
--- a/Assets/Resources/Prefabs/MainPlayer.prefab
+++ b/Assets/Resources/Prefabs/MainPlayer.prefab
@@ -2636,6 +2636,7 @@ MonoBehaviour:
   Line: {fileID: 2317807655120713368, guid: 40cb67df39988e8499ecf4d88171c358, type: 3}
   Ray: {fileID: 2317807655120713368, guid: b4b800ce09755eb47b31018b5d9d8d3a, type: 3}
   Angle: {fileID: 7144232170300037021, guid: 303a593e7b3272a40a7d1a71b1f0639c, type: 3}
+  Ring: {fileID: 7644263571880024739, guid: 0ed2a320a46601c4bab6c097b0b09add, type: 3}
 --- !u!114 &7000905242735826308
 MonoBehaviour:
   m_ObjectHideFlags: 0
diff --git a/Assets/Scripts/InteractionEngine/FactHandling/FactSpawner.cs b/Assets/Scripts/InteractionEngine/FactHandling/FactSpawner.cs
index 71d9586da22189ff475df187ff2e5aa5e51e8693..da48ca59fb41c3dc8034d52cbb9e4890ff11f04f 100644
--- a/Assets/Scripts/InteractionEngine/FactHandling/FactSpawner.cs
+++ b/Assets/Scripts/InteractionEngine/FactHandling/FactSpawner.cs
@@ -11,7 +11,8 @@ public GameObject
         Sphere,
         Line,
         Ray,
-        Angle;
+        Angle,
+        Ring;
 
     private GameObject FactRepresentation;
     //private Camera camera;
@@ -37,19 +38,15 @@ public void FactAction(Fact fact) {
 
     public Func<Fact, Fact> getAction(Fact fact)
     {
-        switch  (fact)
+        return fact switch
         {
-            case PointFact pointFact:
-                return SpawnPoint;
-            case LineFact lineFact:
-                return SpawnLine;
-            case AngleFact angleFact:
-                return SpawnAngle;
-            case RayFact rayFact:
-                return SpawnRay;
-            default:
-                return null;
-        }
+            PointFact pointFact => SpawnPoint,
+            LineFact lineFact => SpawnLine,
+            AngleFact angleFact => SpawnAngle,
+            RayFact rayFact => SpawnRay,
+            CircleFact circleFact => SpawnRing,
+            _ => null,
+        };
     }
   
 
@@ -199,6 +196,50 @@ public Fact SpawnAngle(Fact fact)
         return angleFact;
     }
 
+    public Fact SpawnRing(Fact fact)
+    {
+        CircleFact circleFact = (CircleFact)fact;
+
+        PointFact middlePointFact = StageStatic.stage.factState[circleFact.Pid1] as PointFact;
+        PointFact basePointFact = StageStatic.stage.factState[circleFact.Pid2] as PointFact;
+
+        Vector3 middlePoint = middlePointFact.Point;
+        Vector3 normal = circleFact.normal;
+        float radius = circleFact.radius;
+
+        //Change FactRepresentation to Ring
+        this.FactRepresentation = Ring;
+        GameObject ring = Instantiate(FactRepresentation);
+
+        var torus = ring.GetComponent<TorusGenerator>();
+        var tmpText = ring.GetComponentInChildren<TextMeshPro>();
+        var FactObj = ring.GetComponentInChildren<FactObject>();
+
+        //Move Ring to middlePoint
+        ring.transform.position = middlePoint;
+
+        //Rotate Ring according to normal
+        ring.transform.rotation = Quaternion.LookRotation(Vector3.forward, normal); // TODO TSc works?
+
+        //Set radii
+        torus.torusRadius = radius;
+
+        //string letter = ((Char)(64 + lineFact.Id + 1)).ToString();
+        //line.GetComponentInChildren<TextMeshPro>().text = letter;
+        string text = 
+            $"\u25EF {middlePointFact.Label}{basePointFact.Label}" +
+            $"r = {radius}, C = {2 * radius * Math.PI}";
+        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);
+
+        FactObj.URI = circleFact.Id;
+        circleFact.Representation = ring;
+
+        return circleFact;
+    }
+
+
     public void DeleteObject(Fact fact)
     {
         GameObject factRepresentation = fact.Representation;
diff --git a/Assets/Scripts/MeshGenerator.meta b/Assets/Scripts/MeshGenerator.meta
new file mode 100644
index 0000000000000000000000000000000000000000..89bb05c3cc8024bb76ff0c3f3adbd5e610971d52
--- /dev/null
+++ b/Assets/Scripts/MeshGenerator.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 5b58b5e5719ff2c42b415975c4c578f6
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/MeshGenerator/CircleGenerator.cs b/Assets/Scripts/MeshGenerator/CircleGenerator.cs
new file mode 100644
index 0000000000000000000000000000000000000000..a7ae73621c7c1814f3649ef3cb920c7d952baede
--- /dev/null
+++ b/Assets/Scripts/MeshGenerator/CircleGenerator.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using System.Linq;
+
+public class CircleGenerator : ShapeGenerator
+{
+    #region InspectorVariables
+    [Header("Circle values")]
+    [Range(0,100)] public Vector3 midPoint = Vector3.zero;
+    [Range(0,100)] public float radius = 1f;
+
+    [Header("Technical")]
+    [Range(3,1000)] public int sideCount = 500;
+
+    [Header("Parts")]
+    public MeshFilter circleMesh;
+    #endregion InspectorVariables
+
+    #region Implementation
+    protected override void GenerateShape()
+    {
+        Vector3[] circle = GetCirclePoints(radius, sideCount, Vector3.zero);
+
+        if (circleMesh.sharedMesh != null)
+            circleMesh.sharedMesh.Clear();
+        circleMesh.mesh = CreateMesh(CreatePlane(circle));
+    }
+    #endregion Implementation
+}
diff --git a/Assets/Scripts/MeshGenerator/CircleGenerator.cs.meta b/Assets/Scripts/MeshGenerator/CircleGenerator.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..541b038577a6b0b8128bdf423ee60d7ebe14a7f1
--- /dev/null
+++ b/Assets/Scripts/MeshGenerator/CircleGenerator.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 405087c38b8537e43bcc99727c5325ec
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/CircleSegmentGenerator.cs b/Assets/Scripts/MeshGenerator/CircleSegmentGenerator.cs
similarity index 100%
rename from Assets/Scripts/CircleSegmentGenerator.cs
rename to Assets/Scripts/MeshGenerator/CircleSegmentGenerator.cs
diff --git a/Assets/Scripts/CircleSegmentGenerator.cs.meta b/Assets/Scripts/MeshGenerator/CircleSegmentGenerator.cs.meta
similarity index 100%
rename from Assets/Scripts/CircleSegmentGenerator.cs.meta
rename to Assets/Scripts/MeshGenerator/CircleSegmentGenerator.cs.meta
diff --git a/Assets/Scripts/MeshGenerator/ConeGenerator.cs b/Assets/Scripts/MeshGenerator/ConeGenerator.cs
new file mode 100644
index 0000000000000000000000000000000000000000..717cd56f47be2883e74198b4da2007083e828bdf
--- /dev/null
+++ b/Assets/Scripts/MeshGenerator/ConeGenerator.cs
@@ -0,0 +1,79 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using System.Linq;
+
+public class ConeGenerator : ShapeGenerator
+{
+    #region InspectorVariables
+    [Header("Cone values")]
+    [Range(0,100)] public float bottomRadius = 1f;
+    [Range(0,100)] public float topRadius = 0f;
+    public Vector3 topPosition = new Vector3(0, 1f, 0);
+
+    [Header("Technical")]
+    [Range(3,1000)] public int sideCount = 500;
+    public bool generateTop = true;
+    public bool generateBottom = false;
+
+    [Header("Parts")]
+    public MeshFilter topMesh;
+    public MeshFilter sideMesh;
+    public MeshFilter bottomMesh;
+    #endregion InspectorVariables
+
+    #region Implementation
+    protected override void GenerateShape()
+    {
+        Vector3[] bottomCircle = GetCirclePoints(bottomRadius, sideCount);
+        Vector3[] topCircle = GetCirclePoints(topRadius, sideCount, topPosition);
+
+        //side
+        if (sideMesh.sharedMesh != null)
+            sideMesh.sharedMesh.Clear();
+        sideMesh.mesh = CreateMesh(CreateConeSide(sideCount, bottomCircle, topCircle));
+
+        //top
+        if (topMesh.sharedMesh != null)
+            topMesh.sharedMesh.Clear();
+        if (generateTop)
+            topMesh.mesh = CreateMesh(CreatePlane(topCircle, false));
+
+        //bottom
+        if (bottomMesh.sharedMesh != null)
+            bottomMesh.sharedMesh.Clear();
+        if (generateBottom)
+            bottomMesh.mesh = CreateMesh(CreatePlane(bottomCircle, true));
+    }
+
+    private static (Vector3[], int[]) CreateConeSide(int sideCount, Vector3[] bottomCircle, Vector3[] topCircle)
+    {
+        Vector3[] vertices = new Vector3[sideCount * 4];
+        int[] triangles = new int[sideCount * 6];
+
+        //generate vertices
+        for (int i = 0; i < sideCount; i++)
+        {
+            vertices[i * 4] = bottomCircle[i];
+            vertices[i * 4 + 1] = bottomCircle[(i + 1) % sideCount];
+            vertices[i * 4 + 2] = topCircle[i];
+            vertices[i * 4 + 3] = topCircle[(i + 1) % sideCount];
+        }
+
+        //generate triangles
+        for (int t = 0, i = 0; t < triangles.Length; t += 6, i += 4)
+        {
+            triangles[t]     = i;
+            triangles[t + 1] = i + 1;
+            triangles[t + 2] = i + 2;
+
+            triangles[t + 3] = i + 1;
+            triangles[t + 4] = i + 3;
+            triangles[t + 5] = i + 2;
+        }
+
+        return (vertices, triangles);
+    }
+    #endregion Implementation
+}
diff --git a/Assets/Scripts/MeshGenerator/ConeGenerator.cs.meta b/Assets/Scripts/MeshGenerator/ConeGenerator.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..051f14ed236df585c4974baea7529a8e48ec2114
--- /dev/null
+++ b/Assets/Scripts/MeshGenerator/ConeGenerator.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 171f36100fbf6384591cca35fc917317
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/MeshGenerator/ShapeGenerator.cs b/Assets/Scripts/MeshGenerator/ShapeGenerator.cs
new file mode 100644
index 0000000000000000000000000000000000000000..95df89967b37667505a2d157decf2a8c03b7c6f5
--- /dev/null
+++ b/Assets/Scripts/MeshGenerator/ShapeGenerator.cs
@@ -0,0 +1,49 @@
+using System.Linq;
+using UnityEngine;
+
+public abstract class ShapeGenerator : MonoBehaviour
+{
+    #region UnityMethods
+    void Start() => GenerateShape();
+
+    void OnValidate() => GenerateShape();
+    #endregion UnityMethods
+
+    protected abstract void GenerateShape();
+
+    #region Helper
+    protected static Mesh CreateMesh((Vector3[] vertices, int[] triangles) meshValues)
+    {
+        Mesh mesh = new Mesh();
+        (mesh.vertices, mesh.triangles) = (meshValues.vertices, meshValues.triangles);
+        mesh.RecalculateNormals(); //fix lighting
+        return mesh;
+    }
+
+    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];
+        float slice = (2f * Mathf.PI) / pointCount;
+        for (int i = 0; i < pointCount; i++)
+        {
+            float angle = i * slice;
+            circle[i] = new Vector3(circleRadius * Mathf.Sin(angle), 0, circleRadius * Mathf.Cos(angle)) + offset;
+        }
+        return circle;
+    }
+
+    protected static (Vector3[], int[]) CreatePlane(Vector3[] points, bool invert = false)
+    {
+        Vector3[] vertices = points;
+        int[] triangles = new int[(vertices.Length - 2) * 3];
+        for (int i = 1; i < vertices.Length - 1; i++)
+        {
+            triangles[(i - 1) * 3 + 0] = 0;
+            triangles[(i - 1) * 3 + 1] = i;
+            triangles[(i - 1) * 3 + 2] = (i + 1);
+        }
+        return (vertices, invert ? triangles.Reverse().ToArray() : triangles);
+    }
+    #endregion Helper
+}
diff --git a/Assets/Scripts/MeshGenerator/ShapeGenerator.cs.meta b/Assets/Scripts/MeshGenerator/ShapeGenerator.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..801bbbe10d583d40817cf8fd256a9ae0e50875cf
--- /dev/null
+++ b/Assets/Scripts/MeshGenerator/ShapeGenerator.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 931a85887ddf84f42879941013774a43
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/MeshGenerator/TorusGenerator.cs b/Assets/Scripts/MeshGenerator/TorusGenerator.cs
new file mode 100644
index 0000000000000000000000000000000000000000..607f783b525d2d3d42e94321ca07337e45aa7594
--- /dev/null
+++ b/Assets/Scripts/MeshGenerator/TorusGenerator.cs
@@ -0,0 +1,70 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using System.Linq;
+using System;
+
+public class TorusGenerator : ShapeGenerator
+{
+    #region InspectorVariables
+    [Header("Torus values")]
+    [Range(0, 100)] public float torusRadius = 1f;
+    [Range(0, 10)]  public float ringRadius = 0.1f;
+
+    [Header("Technical")]
+    [Range(8, 150)] public int ringSegmentCount = 50;
+    [Range(3, 100)] public int segmentSideCount = 30;
+
+    [Header("Parts")]
+    public MeshFilter torusMesh;
+    #endregion InspectorVariables
+
+    #region Implementation
+    protected override void GenerateShape()
+    {
+        if (torusMesh.sharedMesh != null)
+            torusMesh.sharedMesh.Clear();
+        torusMesh.mesh = CreateMesh(CreateTorus(torusRadius, ringRadius, ringSegmentCount, segmentSideCount));
+    }
+
+    private static (Vector3[] vertices, int[] triangles) CreateTorus(float torusRadius, float ringRadius, int ringSegmentCount, int segmentSideCount)
+    {
+        Vector3[] vertices = new Vector3[ringSegmentCount * segmentSideCount * 4];
+        int[] triangles = new int[ringSegmentCount * segmentSideCount * 6];
+
+        //generate vertices
+        float iStep = (2f * Mathf.PI) / ringSegmentCount;
+        float jStep = (2f * Mathf.PI) / segmentSideCount;
+        for (int i = 0; i < ringSegmentCount; i++)
+        {
+            for (int j = 0; j < segmentSideCount; j++)
+            {
+                vertices[(i * segmentSideCount + j) * 4]     = GetPointOnTorus(torusRadius, ringRadius, i * iStep, j * jStep);
+                vertices[(i * segmentSideCount + j) * 4 + 1] = GetPointOnTorus(torusRadius, ringRadius, i * iStep, (j + 1) * jStep);
+                vertices[(i * segmentSideCount + j) * 4 + 2] = GetPointOnTorus(torusRadius, ringRadius, (i + 1) * iStep, j * jStep);
+                vertices[(i * segmentSideCount + j) * 4 + 3] = GetPointOnTorus(torusRadius, ringRadius, (i + 1) * iStep, (j + 1) * jStep);
+            }
+        }
+
+        //generate triangles
+        for (int t = 0, i = 0; t < triangles.Length; t += 6, i += 4)
+        {
+            triangles[t]   = i;
+            triangles[t+1] = i + 1;
+            triangles[t+2] = i + 2;
+
+            triangles[t+3] = i + 1;
+            triangles[t+4] = i + 3;
+            triangles[t+5] = i + 2;
+        }
+
+        return (vertices, triangles);
+    }
+
+    private static Vector3 GetPointOnTorus(float torusRadius, float ringRadius, float u, float v)
+    {
+        float r = (torusRadius + ringRadius * Mathf.Sin(v));
+        return new Vector3(r * Mathf.Sin(u), ringRadius * Mathf.Cos(v), r * Mathf.Cos(u));
+    }
+    #endregion Implementation
+}
\ No newline at end of file
diff --git a/Assets/Scripts/MeshGenerator/TorusGenerator.cs.meta b/Assets/Scripts/MeshGenerator/TorusGenerator.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..18b11716a25ffa239097fb1fb32c93fe67fdb3a8
--- /dev/null
+++ b/Assets/Scripts/MeshGenerator/TorusGenerator.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 35327f6b479454149a20587eb03337f8
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/UserSettings/EditorUserSettings.asset b/UserSettings/EditorUserSettings.asset
index 8938eb318bb43ddcedec33549da5fbd3497d84f9..81152c307bc638438d2d57c3a1ba2f6166d029a1 100644
--- a/UserSettings/EditorUserSettings.asset
+++ b/UserSettings/EditorUserSettings.asset
@@ -18,10 +18,10 @@ EditorUserSettings:
       value: 22424703114646680e0b0227036c721518021d39631b32313f3d2e30f0e53136acf238e0f323
       flags: 0
     RecentlyUsedScenePath-4:
-      value: 22424703114646680e0b0227036c681f041b1c39631a2f26283b2a3cf0ec3076f7e93ffdfe
+      value: 22424703114646680e0b0227036c721518021d39630527392304183df7e57a2decee22f0
       flags: 0
     RecentlyUsedScenePath-5:
-      value: 22424703114646680e0b0227036c721518021d39630527392304183df7e57a2decee22f0
+      value: 22424703114646680e0b0227036c681f041b1c39631a2f26283b2a3cf0ec3076f7e93ffdfe
       flags: 0
     vcSharedLogLevel:
       value: 0d5e400f0650