diff --git a/Content.Server/Materials/MaterialReclaimerSystem.cs b/Content.Server/Materials/MaterialReclaimerSystem.cs
index 1e9acbd568..7de0d630e0 100644
--- a/Content.Server/Materials/MaterialReclaimerSystem.cs
+++ b/Content.Server/Materials/MaterialReclaimerSystem.cs
@@ -2,7 +2,6 @@ using Content.Server.Administration.Logs;
using Content.Server.Fluids.EntitySystems;
using Content.Server.Ghost;
using Content.Server.Popups;
-using Content.Server.Repairable;
using Content.Server.Stack;
using Content.Server.Wires;
using Content.Shared.Body.Systems;
@@ -19,6 +18,7 @@ using Content.Shared.Materials;
using Content.Shared.Mind;
using Content.Shared.Nutrition.EntitySystems;
using Content.Shared.Power;
+using Content.Shared.Repairable;
using Content.Shared.Stacks;
using Robust.Server.GameObjects;
using Robust.Shared.Player;
diff --git a/Content.Server/Repairable/RepairableComponent.cs b/Content.Server/Repairable/RepairableComponent.cs
deleted file mode 100644
index bab70f66b5..0000000000
--- a/Content.Server/Repairable/RepairableComponent.cs
+++ /dev/null
@@ -1,42 +0,0 @@
-using Content.Shared.Damage;
-using Content.Shared.Tools;
-using Robust.Shared.Prototypes;
-using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
-
-namespace Content.Server.Repairable
-{
- [RegisterComponent]
- public sealed partial class RepairableComponent : Component
- {
- ///
- /// All the damage to change information is stored in this .
- ///
- ///
- /// If this data-field is specified, it will change damage by this amount instead of setting all damage to 0.
- /// in order to heal/repair the damage values have to be negative.
- ///
- [DataField]
- public DamageSpecifier? Damage;
-
- [DataField]
- public int FuelCost = 5;
-
- [DataField]
- public ProtoId QualityNeeded = "Welding";
-
- [DataField]
- public int DoAfterDelay = 1;
-
- ///
- /// A multiplier that will be applied to the above if an entity is repairing themselves.
- ///
- [DataField]
- public float SelfRepairPenalty = 3f;
-
- ///
- /// Whether or not an entity is allowed to repair itself.
- ///
- [DataField]
- public bool AllowSelfRepair = true;
- }
-}
diff --git a/Content.Server/Repairable/RepairableSystem.cs b/Content.Server/Repairable/RepairableSystem.cs
deleted file mode 100644
index c05a13c387..0000000000
--- a/Content.Server/Repairable/RepairableSystem.cs
+++ /dev/null
@@ -1,87 +0,0 @@
-using Content.Server.Administration.Logs;
-using Content.Shared.Damage;
-using Content.Shared.Database;
-using Content.Shared.Interaction;
-using Content.Shared.Popups;
-using Content.Shared.Repairable;
-using SharedToolSystem = Content.Shared.Tools.Systems.SharedToolSystem;
-
-namespace Content.Server.Repairable
-{
- public sealed class RepairableSystem : SharedRepairableSystem
- {
- [Dependency] private readonly SharedToolSystem _toolSystem = default!;
- [Dependency] private readonly DamageableSystem _damageableSystem = default!;
- [Dependency] private readonly SharedPopupSystem _popup = default!;
- [Dependency] private readonly IAdminLogManager _adminLogger= default!;
-
- public override void Initialize()
- {
- SubscribeLocalEvent(Repair);
- SubscribeLocalEvent(OnRepairFinished);
- }
-
- private void OnRepairFinished(EntityUid uid, RepairableComponent component, RepairFinishedEvent args)
- {
- if (args.Cancelled)
- return;
-
- if (!TryComp(uid, out DamageableComponent? damageable) || damageable.TotalDamage == 0)
- return;
-
- if (component.Damage != null)
- {
- var damageChanged = _damageableSystem.TryChangeDamage(uid, component.Damage, true, false, origin: args.User);
- _adminLogger.Add(LogType.Healed, $"{ToPrettyString(args.User):user} repaired {ToPrettyString(uid):target} by {damageChanged?.GetTotal()}");
- }
-
- else
- {
- // Repair all damage
- _damageableSystem.SetAllDamage(uid, damageable, 0);
- _adminLogger.Add(LogType.Healed, $"{ToPrettyString(args.User):user} repaired {ToPrettyString(uid):target} back to full health");
- }
-
- var str = Loc.GetString("comp-repairable-repair",
- ("target", uid),
- ("tool", args.Used!));
- _popup.PopupEntity(str, uid, args.User);
-
- var ev = new RepairedEvent((uid, component), args.User);
- RaiseLocalEvent(uid, ref ev);
- }
-
- public async void Repair(EntityUid uid, RepairableComponent component, InteractUsingEvent args)
- {
- if (args.Handled)
- return;
-
- // Only try repair the target if it is damaged
- if (!TryComp(uid, out var damageable) || damageable.TotalDamage == 0)
- return;
-
- float delay = component.DoAfterDelay;
-
- // Add a penalty to how long it takes if the user is repairing itself
- if (args.User == args.Target)
- {
- if (!component.AllowSelfRepair)
- return;
-
- delay *= component.SelfRepairPenalty;
- }
-
- // Run the repairing doafter
- args.Handled = _toolSystem.UseTool(args.Used, args.User, uid, delay, component.QualityNeeded, new RepairFinishedEvent(), component.FuelCost);
- }
- }
-
- ///
- /// Event raised on an entity when its successfully repaired.
- ///
- ///
- ///
- [ByRefEvent]
- public readonly record struct RepairedEvent(Entity Ent, EntityUid User);
-
-}
diff --git a/Content.Server/Turrets/DeployableTurretSystem.cs b/Content.Server/Turrets/DeployableTurretSystem.cs
index 9bb382badf..2599285bdc 100644
--- a/Content.Server/Turrets/DeployableTurretSystem.cs
+++ b/Content.Server/Turrets/DeployableTurretSystem.cs
@@ -3,7 +3,6 @@ using Content.Server.DeviceNetwork.Systems;
using Content.Server.NPC.HTN;
using Content.Server.NPC.HTN.PrimitiveTasks.Operators.Combat.Ranged;
using Content.Server.Power.Components;
-using Content.Server.Repairable;
using Content.Server.TurretController;
using Content.Shared.Access;
using Content.Shared.Destructible;
@@ -11,6 +10,7 @@ using Content.Shared.DeviceNetwork;
using Content.Shared.DeviceNetwork.Components;
using Content.Shared.DeviceNetwork.Events;
using Content.Shared.Power;
+using Content.Shared.Repairable;
using Content.Shared.Turrets;
using Content.Shared.Weapons.Ranged.Components;
using Content.Shared.Weapons.Ranged.Events;
diff --git a/Content.Shared/Repairable/RepairableComponent.cs b/Content.Shared/Repairable/RepairableComponent.cs
new file mode 100644
index 0000000000..bc1ccfb7bf
--- /dev/null
+++ b/Content.Shared/Repairable/RepairableComponent.cs
@@ -0,0 +1,53 @@
+using Content.Shared.Damage;
+using Content.Shared.Tools;
+using Robust.Shared.GameStates;
+using Robust.Shared.Prototypes;
+
+namespace Content.Shared.Repairable;
+
+///
+/// Use this component to mark a device as repairable.
+///
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
+public sealed partial class RepairableComponent : Component
+{
+ ///
+ /// All the damage to change information is stored in this .
+ ///
+ ///
+ /// If this data-field is specified, it will change damage by this amount instead of setting all damage to 0.
+ /// in order to heal/repair the damage values have to be negative.
+ ///
+ [DataField, AutoNetworkedField]
+ public DamageSpecifier? Damage;
+
+ ///
+ /// Cost of fuel used to repair this device.
+ ///
+ [DataField, AutoNetworkedField]
+ public int FuelCost = 5;
+
+ ///
+ /// Tool quality necessary to repair this device.
+ ///
+ [DataField, AutoNetworkedField]
+ public ProtoId QualityNeeded = "Welding";
+
+ ///
+ /// The base tool use delay (seconds). This will be modified by the tool's quality
+ ///
+ [DataField, AutoNetworkedField]
+ public int DoAfterDelay = 1;
+
+ ///
+ /// A multiplier that will be applied to the above if an entity is repairing themselves.
+ ///
+ [DataField, AutoNetworkedField]
+ public float SelfRepairPenalty = 3f;
+
+ ///
+ /// Whether an entity is allowed to repair itself.
+ ///
+ [DataField, AutoNetworkedField]
+ public bool AllowSelfRepair = true;
+}
diff --git a/Content.Shared/Repairable/RepairableSystem.cs b/Content.Shared/Repairable/RepairableSystem.cs
new file mode 100644
index 0000000000..7a0f01b9b6
--- /dev/null
+++ b/Content.Shared/Repairable/RepairableSystem.cs
@@ -0,0 +1,87 @@
+using Content.Shared.Administration.Logs;
+using Content.Shared.Damage;
+using Content.Shared.Database;
+using Content.Shared.DoAfter;
+using Content.Shared.Interaction;
+using Content.Shared.Popups;
+using Content.Shared.Tools.Systems;
+using Robust.Shared.Serialization;
+
+namespace Content.Shared.Repairable;
+
+public sealed partial class RepairableSystem : EntitySystem
+{
+ [Dependency] private readonly SharedToolSystem _toolSystem = default!;
+ [Dependency] private readonly DamageableSystem _damageableSystem = default!;
+ [Dependency] private readonly SharedPopupSystem _popup = default!;
+ [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!;
+
+ public override void Initialize()
+ {
+ SubscribeLocalEvent(Repair);
+ SubscribeLocalEvent(OnRepairFinished);
+ }
+
+ private void OnRepairFinished(Entity ent, ref RepairFinishedEvent args)
+ {
+ if (args.Cancelled)
+ return;
+
+ if (!TryComp(ent.Owner, out DamageableComponent? damageable) || damageable.TotalDamage == 0)
+ return;
+
+ if (ent.Comp.Damage != null)
+ {
+ var damageChanged = _damageableSystem.TryChangeDamage(ent.Owner, ent.Comp.Damage, true, false, origin: args.User);
+ _adminLogger.Add(LogType.Healed, $"{ToPrettyString(args.User):user} repaired {ToPrettyString(ent.Owner):target} by {damageChanged?.GetTotal()}");
+ }
+
+ else
+ {
+ // Repair all damage
+ _damageableSystem.SetAllDamage(ent.Owner, damageable, 0);
+ _adminLogger.Add(LogType.Healed, $"{ToPrettyString(args.User):user} repaired {ToPrettyString(ent.Owner):target} back to full health");
+ }
+
+ var str = Loc.GetString("comp-repairable-repair", ("target", ent.Owner), ("tool", args.Used!));
+ _popup.PopupClient(str, ent.Owner, args.User);
+
+ var ev = new RepairedEvent(ent, args.User);
+ RaiseLocalEvent(ent.Owner, ref ev);
+ }
+
+ private void Repair(Entity ent, ref InteractUsingEvent args)
+ {
+ if (args.Handled)
+ return;
+
+ // Only try repair the target if it is damaged
+ if (!TryComp(ent.Owner, out var damageable) || damageable.TotalDamage == 0)
+ return;
+
+ float delay = ent.Comp.DoAfterDelay;
+
+ // Add a penalty to how long it takes if the user is repairing itself
+ if (args.User == args.Target)
+ {
+ if (!ent.Comp.AllowSelfRepair)
+ return;
+
+ delay *= ent.Comp.SelfRepairPenalty;
+ }
+
+ // Run the repairing doafter
+ args.Handled = _toolSystem.UseTool(args.Used, args.User, ent.Owner, delay, ent.Comp.QualityNeeded, new RepairFinishedEvent(), ent.Comp.FuelCost);
+ }
+}
+
+///
+/// Event raised on an entity when its successfully repaired.
+///
+///
+///
+[ByRefEvent]
+public readonly record struct RepairedEvent(Entity Ent, EntityUid User);
+
+[Serializable, NetSerializable]
+public sealed partial class RepairFinishedEvent : SimpleDoAfterEvent;
diff --git a/Content.Shared/Repairable/SharedRepairableSystem.cs b/Content.Shared/Repairable/SharedRepairableSystem.cs
deleted file mode 100644
index 2b0cb670e6..0000000000
--- a/Content.Shared/Repairable/SharedRepairableSystem.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-using Content.Shared.DoAfter;
-using Robust.Shared.Serialization;
-
-namespace Content.Shared.Repairable;
-
-public abstract partial class SharedRepairableSystem : EntitySystem
-{
- [Serializable, NetSerializable]
- protected sealed partial class RepairFinishedEvent : SimpleDoAfterEvent
- {
- }
-}
-