diff --git a/Content.IntegrationTests/Tests/Commands/RejuvenateTest.cs b/Content.IntegrationTests/Tests/Commands/RejuvenateTest.cs
index e4ec7e907a..53604b2c1e 100644
--- a/Content.IntegrationTests/Tests/Commands/RejuvenateTest.cs
+++ b/Content.IntegrationTests/Tests/Commands/RejuvenateTest.cs
@@ -1,5 +1,4 @@
-using Content.Server.Administration.Commands;
-using Content.Server.Administration.Systems;
+using Content.Shared.Administration.Systems;
using Content.Shared.Damage;
using Content.Shared.Damage.Prototypes;
using Content.Shared.FixedPoint;
diff --git a/Content.Server/Administration/PlayerPanelEui.cs b/Content.Server/Administration/PlayerPanelEui.cs
index 31acd33bf1..7de62ac743 100644
--- a/Content.Server/Administration/PlayerPanelEui.cs
+++ b/Content.Server/Administration/PlayerPanelEui.cs
@@ -2,10 +2,10 @@ using System.Linq;
using Content.Server.Administration.Logs;
using Content.Server.Administration.Managers;
using Content.Server.Administration.Notes;
-using Content.Server.Administration.Systems;
using Content.Server.Database;
using Content.Server.EUI;
using Content.Shared.Administration;
+using Content.Shared.Administration.Systems;
using Content.Shared.Database;
using Content.Shared.Eui;
using Content.Shared.Follower;
diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.cs b/Content.Server/Administration/Systems/AdminVerbSystem.cs
index 61e3013bd9..4232b034f3 100644
--- a/Content.Server/Administration/Systems/AdminVerbSystem.cs
+++ b/Content.Server/Administration/Systems/AdminVerbSystem.cs
@@ -9,6 +9,7 @@ using Content.Server.Prayer;
using Content.Server.Silicons.Laws;
using Content.Server.Station.Systems;
using Content.Shared.Administration;
+using Content.Shared.Administration.Systems;
using Content.Shared.Chemistry.Components.SolutionManager;
using Content.Shared.Chemistry.EntitySystems;
using Content.Shared.Configurable;
diff --git a/Content.Server/Administration/Toolshed/RejuvenateCommand.cs b/Content.Server/Administration/Toolshed/RejuvenateCommand.cs
index 3925badc58..b503e9cb96 100644
--- a/Content.Server/Administration/Toolshed/RejuvenateCommand.cs
+++ b/Content.Server/Administration/Toolshed/RejuvenateCommand.cs
@@ -1,5 +1,5 @@
-using Content.Server.Administration.Systems;
-using Content.Shared.Administration;
+using Content.Shared.Administration;
+using Content.Shared.Administration.Systems;
using Robust.Shared.Toolshed;
using Robust.Shared.Toolshed.Errors;
diff --git a/Content.Server/Administration/Systems/RejuvenateSystem.cs b/Content.Shared/Administration/Systems/RejuvenateSystem.cs
similarity index 54%
rename from Content.Server/Administration/Systems/RejuvenateSystem.cs
rename to Content.Shared/Administration/Systems/RejuvenateSystem.cs
index d25db20bd9..d27ea63ace 100644
--- a/Content.Server/Administration/Systems/RejuvenateSystem.cs
+++ b/Content.Shared/Administration/Systems/RejuvenateSystem.cs
@@ -1,9 +1,12 @@
using Content.Shared.Rejuvenate;
-namespace Content.Server.Administration.Systems;
+namespace Content.Shared.Administration.Systems;
public sealed class RejuvenateSystem : EntitySystem
{
+ ///
+ /// Fully heals the target, removing all damage, debuffs or other negative status effects.
+ ///
public void PerformRejuvenate(EntityUid target)
{
RaiseLocalEvent(target, new RejuvenateEvent());
diff --git a/Content.Shared/Rejuvenate/RejuvenateEvent.cs b/Content.Shared/Rejuvenate/RejuvenateEvent.cs
index a6649c6cda..cead1f6507 100644
--- a/Content.Shared/Rejuvenate/RejuvenateEvent.cs
+++ b/Content.Shared/Rejuvenate/RejuvenateEvent.cs
@@ -1,5 +1,9 @@
namespace Content.Shared.Rejuvenate;
-public sealed class RejuvenateEvent : EntityEventArgs
-{
-}
+///
+/// Raised when an entity is supposed to be rejuvenated,
+/// meaning it should heal all damage, debuffs or other negative status effects.
+/// Systems should handle healing the entity in a subscription to this event.
+/// Used for the Rejuvenate admin verb.
+///
+public sealed class RejuvenateEvent : EntityEventArgs;
diff --git a/Content.Shared/Trigger/Components/Effects/EntityEffectOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/EntityEffectOnTriggerComponent.cs
new file mode 100644
index 0000000000..326312db65
--- /dev/null
+++ b/Content.Shared/Trigger/Components/Effects/EntityEffectOnTriggerComponent.cs
@@ -0,0 +1,24 @@
+using Content.Shared.EntityEffects;
+using Robust.Shared.GameStates;
+
+namespace Content.Shared.Trigger.Components.Effects;
+
+///
+/// Applies a list of entity effects to the owning entity when triggered.
+/// If TargetUser is true then they will be applied to the user instead.
+///
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
+public sealed partial class EntityEffectOnTriggerComponent : BaseXOnTriggerComponent
+{
+ ///
+ /// The effects to apply.
+ ///
+ [DataField, AutoNetworkedField]
+ public EntityEffect[] Effects;
+
+ ///
+ /// Optional scale multiplier for the effects.
+ ///
+ [DataField, AutoNetworkedField]
+ public float Scale = 1f;
+}
diff --git a/Content.Shared/Trigger/Components/Effects/RejuventateOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/RejuventateOnTriggerComponent.cs
new file mode 100644
index 0000000000..5efc50c361
--- /dev/null
+++ b/Content.Shared/Trigger/Components/Effects/RejuventateOnTriggerComponent.cs
@@ -0,0 +1,10 @@
+using Robust.Shared.GameStates;
+
+namespace Content.Shared.Trigger.Components.Effects;
+
+///
+/// Rejuvenates the entity when triggered, which fully heals them, removing all damage, debuffs or other negative status effects.
+/// If TargetUser is true then the user will be rejuvenated instead.
+///
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
+public sealed partial class RejuvenateOnTriggerComponent : BaseXOnTriggerComponent;
diff --git a/Content.Shared/Trigger/Systems/EntityEffectOnTriggerSystem.cs b/Content.Shared/Trigger/Systems/EntityEffectOnTriggerSystem.cs
new file mode 100644
index 0000000000..021b72d86f
--- /dev/null
+++ b/Content.Shared/Trigger/Systems/EntityEffectOnTriggerSystem.cs
@@ -0,0 +1,30 @@
+using Content.Shared.EntityEffects;
+using Content.Shared.Trigger.Components.Effects;
+
+namespace Content.Shared.Trigger.Systems;
+
+public sealed class EntityEffectOnTriggerSystem : EntitySystem
+{
+ [Dependency] private readonly SharedEntityEffectsSystem _effects = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnTrigger);
+ }
+
+ private void OnTrigger(Entity ent, ref TriggerEvent args)
+ {
+ if (args.Key != null && !ent.Comp.KeysIn.Contains(args.Key))
+ return;
+
+ var target = ent.Comp.TargetUser ? args.User : ent.Owner;
+
+ if (target == null)
+ return;
+
+ _effects.ApplyEffects(target.Value, ent.Comp.Effects, ent.Comp.Scale);
+ args.Handled = true;
+ }
+}
diff --git a/Content.Shared/Trigger/Systems/RejuvenateOnTriggerSystem.cs b/Content.Shared/Trigger/Systems/RejuvenateOnTriggerSystem.cs
new file mode 100644
index 0000000000..f1c5fdc57e
--- /dev/null
+++ b/Content.Shared/Trigger/Systems/RejuvenateOnTriggerSystem.cs
@@ -0,0 +1,30 @@
+using Content.Shared.Administration.Systems;
+using Content.Shared.Trigger.Components.Effects;
+
+namespace Content.Shared.Trigger.Systems;
+
+public sealed class RejuvenateOnTriggerSystem : EntitySystem
+{
+ [Dependency] private readonly RejuvenateSystem _rejuvenate = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnTrigger);
+ }
+
+ private void OnTrigger(Entity ent, ref TriggerEvent args)
+ {
+ if (args.Key != null && !ent.Comp.KeysIn.Contains(args.Key))
+ return;
+
+ var target = ent.Comp.TargetUser ? args.User : ent.Owner;
+
+ if (target == null)
+ return;
+
+ _rejuvenate.PerformRejuvenate(target.Value);
+ args.Handled = true;
+ }
+}