diff --git a/Quick Interactions/Assets/CUI.png b/Quick Interactions/Assets/CUI.png
new file mode 100644
index 0000000..e9f759f
--- /dev/null
+++ b/Quick Interactions/Assets/CUI.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:79204bd67761e8abf0b8ddb0d4f313ae829f963feee896242e3fa465cbcba3e0
+size 5884
diff --git a/Quick Interactions/Assets/Default Styles.xml b/Quick Interactions/Assets/Default Styles.xml
new file mode 100644
index 0000000..521dd16
--- /dev/null
+++ b/Quick Interactions/Assets/Default Styles.xml
@@ -0,0 +1,73 @@
+
+
+
+ CUIPalette.Component.Background
+ CUIPalette.Component.Border
+ CUIPalette.Handle.Background
+ CUIPalette.Handle.Grabbed
+
+
+ CUIPalette.Frame.Background
+ CUIPalette.Frame.Border
+
+
+ CUIPalette.Component.Text
+ Transparent
+ Transparent
+ [4,0]
+
+
+ CUIPalette.Input.Text
+ CUIPalette.Input.Border
+ CUIPalette.Input.Background
+
+
+ CUIPalette.Button.Background
+ CUIPalette.Button.Border
+ CUIPalette.Button.Disabled
+ [4,2]
+ [0.5,0.5]
+
+
+ CUIPalette.Button.Background
+ CUIPalette.Button.Disabled
+
+
+ CUIPalette.Button.Background
+ CUIPalette.Button.Border
+ CUIPalette.Button.Background
+
+
+ CUIPalette.CloseButton.Background
+ Transparent
+
+
+ Transparent
+ Transparent
+ CUIPalette.DDOption.Hover
+ CUIPalette.DDOption.Text
+ [0,0]
+ [4,0]
+
+
+ Transparent
+ Transparent
+
+
+ CUIPalette.Main.Text
+
+
+ White
+ Black
+
+
+ Transparent
+
+
+ Transparent
+
+
+ Transparent
+ Transparent
+
+
\ No newline at end of file
diff --git a/Quick Interactions/Assets/Interaction icons sharp.png b/Quick Interactions/Assets/Interaction icons sharp.png
new file mode 100644
index 0000000..29e7029
--- /dev/null
+++ b/Quick Interactions/Assets/Interaction icons sharp.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f6e6e1f37f5c6d11e034983fd62001a0e7a86ed6200d0031dab8235e5a27e3ef
+size 14791
diff --git a/Quick Interactions/Assets/Interaction icons.png b/Quick Interactions/Assets/Interaction icons.png
new file mode 100644
index 0000000..6730aae
--- /dev/null
+++ b/Quick Interactions/Assets/Interaction icons.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:48e73051969cb0b2b3f534b24dd655d5dad73345931ea5d1f4b3ceb9d4b6bb18
+size 20615
diff --git a/Quick Interactions/Assets/PaletteDemo.xml b/Quick Interactions/Assets/PaletteDemo.xml
new file mode 100644
index 0000000..6ae13d7
--- /dev/null
+++ b/Quick Interactions/Assets/PaletteDemo.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Quick Interactions/Assets/Palettes/Sets/Blue.xml b/Quick Interactions/Assets/Palettes/Sets/Blue.xml
new file mode 100644
index 0000000..331fded
--- /dev/null
+++ b/Quick Interactions/Assets/Palettes/Sets/Blue.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 178,178,255,255
+
+
+
+
+
+
+
+
+
+
+
+
+ 197,178,255,255
+
+
+
+
+
+
+
+
+
+
+
+
+ 178,216,255,255
+
+
+
+
+
+
+
+
+
+
+
+
+ 216,178,255,255
+
+
+
\ No newline at end of file
diff --git a/Quick Interactions/CSharp/Client/CrabUI/Animations/CUIAnimation.cs b/Quick Interactions/CSharp/Client/CrabUI/Animations/CUIAnimation.cs
new file mode 100644
index 0000000..610b572
--- /dev/null
+++ b/Quick Interactions/CSharp/Client/CrabUI/Animations/CUIAnimation.cs
@@ -0,0 +1,260 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Diagnostics;
+using System.IO;
+
+using Barotrauma;
+using Microsoft.Xna.Framework;
+
+namespace QICrabUI
+{
+ ///
+ /// WIP, can animate any property on any object
+ /// Can run back and forth in [0..1] interval and
+ /// interpolate any property between StartValue and EndValue
+ ///
+ public class CUIAnimation
+ {
+ internal static void InitStatic()
+ {
+ CUI.OnDispose += () => ActiveAnimations.Clear();
+ }
+
+ public static HashSet ActiveAnimations = new();
+ ///
+ /// This is called in CUIUpdate
+ ///
+ internal static void UpdateAllAnimations(double time)
+ {
+ foreach (CUIAnimation animation in ActiveAnimations)
+ {
+ animation.Step(time);
+ }
+ }
+
+ public bool Debug { get; set; }
+ public static float StartLambda = 0.0f;
+ public static float EndLambda = 1.0f;
+
+
+ private object target;
+ ///
+ /// Object containing animated property
+ ///
+ public object Target
+ {
+ get => target;
+ set
+ {
+ target = value;
+ UpdateSetter();
+ }
+ }
+ private bool active;
+ public bool Active
+ {
+ get => active;
+ set
+ {
+ if (Blocked || active == value) return;
+ active = value;
+
+ if (active) ActiveAnimations.Add(this);
+ else ActiveAnimations.Remove(this);
+ ApplyValue();
+ }
+ }
+
+ ///
+ /// In seconds
+ ///
+ public double Duration
+ {
+ get => 1.0 / Speed * Timing.Step;
+ set
+ {
+ double steps = value / Timing.Step;
+ Speed = 1.0 / steps;
+ }
+ }
+
+ public double ReverseDuration
+ {
+ get => 1.0 / (BackSpeed ?? 0) * Timing.Step;
+ set
+ {
+ double steps = value / Timing.Step;
+ BackSpeed = 1.0 / steps;
+ }
+ }
+
+ ///
+ /// Will prevent it from starting
+ ///
+ public bool Blocked { get; set; }
+ ///
+ /// Progress of animation [0..1]
+ ///
+ public double Lambda { get; set; }
+ ///
+ /// Lambda increase per update step, calculated when you set Duration
+ ///
+ public double Speed { get; set; } = 0.01;
+ public double? BackSpeed { get; set; }
+ ///
+ /// If true animation won't stop when reaching end, it will change direction
+ ///
+ public bool Bounce { get; set; }
+ ///
+ /// Straight, Reverse
+ ///
+ public CUIDirection Direction { get; set; }
+ ///
+ /// Value will be interpolated between these values
+ ///
+ public object StartValue { get; set; }
+ public object EndValue { get; set; }
+
+ private string property;
+ private Action