diff --git a/NeosModLoader/Utility/LocalButtonPressActionExtensions.cs b/NeosModLoader/Utility/LocalButtonPressActionExtensions.cs
new file mode 100644
index 0000000..c47423d
--- /dev/null
+++ b/NeosModLoader/Utility/LocalButtonPressActionExtensions.cs
@@ -0,0 +1,166 @@
+using FrooxEngine.UIX;
+using FrooxEngine;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using BaseX;
+
+namespace NeosModLoader.Utility
+{
+ ///
+ /// Contains extension methods to setup locally defined actions for s which are triggerable by anyone.
+ /// Due to their nature, they will only work while the that creates them hasn't left the session.
+ ///
+ public static class LocalButtonPressActionExtensions
+ {
+ ///
+ /// Creates a using the given and .
+ /// The will be triggerable by anyone, as long as the creating hasn't left the session.
+ ///
+ /// The builder to use for creating the button.
+ /// The text displayed on the button.
+ /// The action to run when pressed.
+ /// The button created by the .
+ public static Button LocalActionButton(this UIBuilder builder, in LocaleString text, Action action)
+ => builder.Button(text).SetupLocalAction(action);
+
+ ///
+ /// Creates a using the given and .
+ /// The will be triggerable by anyone, as long as the creating hasn't left the session.
+ ///
+ /// The builder to use for creating the button.
+ /// The icon displayed on the button.
+ /// The action to run when pressed.
+ /// The button created by the .
+ public static Button LocalActionButton(this UIBuilder builder, Uri icon, Action action)
+ => builder.Button(icon).SetupLocalAction(action);
+
+ ///
+ /// Creates a using the given ,
+ /// and .
+ /// The will be triggerable by anyone, as long as the creating hasn't left the session.
+ ///
+ /// The builder to use for creating the button.
+ /// The icon displayed on the button.
+ /// The text displayed on the button.
+ /// The action to run when pressed.
+ /// The button created by the .
+ public static Button LocalActionButton(this UIBuilder builder, Uri icon, LocaleString text, Action action)
+ => builder.Button(icon, text).SetupLocalAction(action);
+
+ ///
+ /// Creates a using the given ,
+ /// , tints and .
+ /// The will be triggerable by anyone, as long as the creating hasn't left the session.
+ ///
+ /// The builder to use for creating the button.
+ /// The icon displayed on the button.
+ /// The text displayed on the button.
+ /// The background color of the button.
+ /// The tint of the icon.
+ /// The action to run when pressed.
+ /// The button created by the .
+ public static Button LocalActionButton(this UIBuilder builder, Uri icon, LocaleString text, in color tint, in color spriteTint, Action action)
+ => builder.Button(icon, text, tint, spriteTint).SetupLocalAction(action);
+
+ ///
+ /// Creates a using the given and with an extra .
+ /// The will be triggerable by anyone, as long as the creating hasn't left the session.
+ ///
+ /// The type of the extra argument to pass to the action.
+ /// The builder to use for creating the button.
+ /// The text displayed on the button.
+ /// The action to run when pressed.
+ /// The extra argument to pass to the action when this button is pressed.
+ /// The button created by the .
+ public static Button LocalActionButton(this UIBuilder builder, in LocaleString text, Action action, T argument)
+ => builder.Button(text).SetupLocalAction(action, argument);
+
+ ///
+ /// Creates a using the given and with an extra .
+ /// The will be triggerable by anyone, as long as the creating hasn't left the session.
+ ///
+ /// The type of the extra argument to pass to the action.
+ /// The builder to use for creating the button.
+ /// The icon displayed on the button.
+ /// The action to run when pressed.
+ /// The extra argument to pass to the action when this button is pressed.
+ /// The button created by the .
+ public static Button LocalActionButton(this UIBuilder builder, Uri icon, Action action, T argument)
+ => builder.Button(icon).SetupLocalAction(action, argument);
+
+ ///
+ /// Creates a using the given ,
+ /// and with an extra .
+ /// The will be triggerable by anyone, as long as the creating hasn't left the session.
+ ///
+ /// The type of the extra argument to pass to the action.
+ /// The builder to use for creating the button.
+ /// The icon displayed on the button.
+ /// The text displayed on the button.
+ /// The action to run when pressed.
+ /// The extra argument to pass to the action when this button is pressed.
+ /// The button created by the .
+ public static Button LocalActionButton(this UIBuilder builder, Uri icon, LocaleString text, Action action, T argument)
+ => builder.Button(icon, text).SetupLocalAction(action, argument);
+
+ ///
+ /// Creates a using the given ,
+ /// , tints and with an extra .
+ /// The will be triggerable by anyone, as long as the creating hasn't left the session.
+ ///
+ /// The type of the extra argument to pass to the action.
+ /// The builder to use for creating the button.
+ /// The icon displayed on the button.
+ /// The text displayed on the button.
+ /// The background color of the button.
+ /// The tint of the icon.
+ /// The action to run when pressed.
+ /// The extra argument to pass to the action when this button is pressed.
+ /// The button created by the .
+ public static Button LocalActionButton(this UIBuilder builder, Uri icon, LocaleString text, in color tint, in color spriteTint, Action action, T argument)
+ => builder.Button(icon, text, tint, spriteTint).SetupLocalAction(action, argument);
+
+ ///
+ /// Sets up an with the given .
+ /// The will be triggerable by anyone, as long as the creating hasn't left the session.
+ ///
+ /// The specific type of the button.
+ /// The button to set up with an action.
+ /// The action to run when pressed.
+ /// The unchanged button.
+ public static TButton SetupLocalAction(this TButton button, Action action) where TButton : IButton
+ {
+ var valueField = button.Slot.AttachComponent>().Value;
+ valueField.OnValueChange += field => action(button);
+
+ var toggle = button.Slot.AttachComponent();
+ toggle.TargetValue.Target = valueField;
+
+ return button;
+ }
+
+ ///
+ /// Sets up an with the given and extra .
+ /// The will be triggerable by anyone, as long as the creating hasn't left the session.
+ ///
+ /// The specific type of the button.
+ /// The type of the extra argument to pass to the action.
+ /// The button to set up with an action.
+ /// The action to run when pressed.
+ /// The extra argument to pass to the action when this button is pressed.
+ /// The unchanged button.
+ public static TButton SetupLocalAction(this TButton button, Action action, TArgument argument) where TButton : IButton
+ {
+ var valueField = button.Slot.AttachComponent>().Value;
+ valueField.OnValueChange += field => action(button, argument);
+
+ var toggle = button.Slot.AttachComponent();
+ toggle.TargetValue.Target = valueField;
+
+ return button;
+ }
+ }
+}