diff --git a/Content.Client/Nyanotrasen/ReverseEngineering/ReverseEngineeringMachineBoundUserInterface.cs b/Content.Client/Nyanotrasen/ReverseEngineering/ReverseEngineeringMachineBoundUserInterface.cs
new file mode 100644
index 00000000000..8986e6f9e22
--- /dev/null
+++ b/Content.Client/Nyanotrasen/ReverseEngineering/ReverseEngineeringMachineBoundUserInterface.cs
@@ -0,0 +1,80 @@
+using Content.Shared.ReverseEngineering;
+using Robust.Client.GameObjects;
+using Robust.Shared.Timing;
+
+namespace Content.Client.Nyanotrasen.ReverseEngineering;
+
+public sealed class ReverseEngineeringMachineBoundUserInterface : BoundUserInterface
+{
+ [Dependency] private readonly IEntityManager _entMan = default!;
+ [Dependency] private readonly IGameTiming _timing = default!;
+
+ private ReverseEngineeringMachineMenu? _menu;
+
+ public ReverseEngineeringMachineBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey)
+ {
+ }
+
+ protected override void Open()
+ {
+ base.Open();
+
+ if (_menu != null)
+ return;
+
+ _menu = new ReverseEngineeringMachineMenu(Owner, _entMan, _timing);
+
+ _menu.OnClose += Close;
+ _menu.OpenCentered();
+
+ _menu.OnScanButtonPressed += () =>
+ {
+ // every button flickering is bad so no prediction
+ SendMessage(new ReverseEngineeringScanMessage());
+ };
+
+ _menu.OnSafetyButtonToggled += () =>
+ {
+ SendPredictedMessage(new ReverseEngineeringSafetyMessage());
+ };
+
+ _menu.OnAutoScanButtonToggled += () =>
+ {
+ SendPredictedMessage(new ReverseEngineeringAutoScanMessage());
+ };
+
+ _menu.OnStopButtonPressed += () =>
+ {
+ // see scan button
+ SendMessage(new ReverseEngineeringStopMessage());
+ };
+
+ _menu.OnEjectButtonPressed += () =>
+ {
+ // doesn't sound nice when predicted
+ SendMessage(new ReverseEngineeringEjectMessage());
+ };
+ }
+
+ protected override void UpdateState(BoundUserInterfaceState state)
+ {
+ base.UpdateState(state);
+
+ if (state is not ReverseEngineeringMachineState cast)
+ return;
+
+ _menu?.UpdateState(cast);
+ }
+
+ protected override void Dispose(bool disposing)
+ {
+ base.Dispose(disposing);
+
+ if (!disposing)
+ return;
+
+ _menu?.Close();
+ _menu?.Dispose();
+ }
+}
+
diff --git a/Content.Client/Nyanotrasen/ReverseEngineering/ReverseEngineeringMachineMenu.xaml b/Content.Client/Nyanotrasen/ReverseEngineering/ReverseEngineeringMachineMenu.xaml
new file mode 100644
index 00000000000..f2ebee5657b
--- /dev/null
+++ b/Content.Client/Nyanotrasen/ReverseEngineering/ReverseEngineeringMachineMenu.xaml
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Content.Client/Nyanotrasen/ReverseEngineering/ReverseEngineeringMachineMenu.xaml.cs b/Content.Client/Nyanotrasen/ReverseEngineering/ReverseEngineeringMachineMenu.xaml.cs
new file mode 100644
index 00000000000..77243798d76
--- /dev/null
+++ b/Content.Client/Nyanotrasen/ReverseEngineering/ReverseEngineeringMachineMenu.xaml.cs
@@ -0,0 +1,87 @@
+using Content.Client.UserInterface.Controls;
+using Content.Shared.ReverseEngineering;
+using Robust.Client.AutoGenerated;
+using Robust.Client.GameObjects;
+using Robust.Client.State;
+using Robust.Client.UserInterface.Controls;
+using Robust.Client.UserInterface.XAML;
+using Robust.Shared.Timing;
+
+namespace Content.Client.Nyanotrasen.ReverseEngineering;
+
+[GenerateTypedNameReferences]
+public sealed partial class ReverseEngineeringMachineMenu : FancyWindow
+{
+ private readonly IEntityManager _entMan;
+ private readonly IGameTiming _timing;
+ private readonly SharedReverseEngineeringSystem _revEng;
+
+ private readonly Entity _owner;
+
+ public event Action? OnScanButtonPressed;
+ public event Action? OnSafetyButtonToggled;
+ public event Action? OnAutoScanButtonToggled;
+ public event Action? OnStopButtonPressed;
+ public event Action? OnEjectButtonPressed;
+
+ public ReverseEngineeringMachineMenu(EntityUid owner, IEntityManager entMan, IGameTiming timing)
+ {
+ RobustXamlLoader.Load(this);
+
+ _entMan = entMan;
+ _timing = timing;
+ _revEng = entMan.System();
+
+ _owner = (owner, entMan.GetComponent(owner));
+
+ ScanButton.OnPressed += _ => OnScanButtonPressed?.Invoke();
+ SafetyButton.OnToggled += _ => OnSafetyButtonToggled?.Invoke();
+ AutoScanButton.OnToggled += _ => OnAutoScanButtonToggled?.Invoke();
+ StopButton.OnPressed += _ => OnStopButtonPressed?.Invoke();
+ EjectButton.OnPressed += _ => OnEjectButtonPressed?.Invoke();
+ }
+
+ private void UpdateArtifactIcon(EntityUid? uid)
+ {
+ if (uid == null)
+ {
+ ItemDisplay.Visible = false;
+ return;
+ }
+
+ ItemDisplay.Visible = true;
+ ItemDisplay.SetEntity(uid);
+ }
+
+ public void UpdateState(ReverseEngineeringMachineState state)
+ {
+ Information.SetMessage(state.ScanMessage);
+ }
+
+ protected override void FrameUpdate(FrameEventArgs args)
+ {
+ base.FrameUpdate(args);
+
+ var scanning = _revEng.IsActive(_owner);
+ var item = _revEng.GetItem(_owner);
+ ScanButton.Disabled = scanning || item == null;
+ StopButton.Disabled = !scanning;
+ SafetyButton.Pressed = _owner.Comp.SafetyOn;
+ AutoScanButton.Pressed = _owner.Comp.AutoScan;
+ EjectButton.Disabled = ScanButton.Disabled;
+
+ UpdateArtifactIcon(item);
+
+ ProgressBox.Visible = scanning;
+
+ if (!_entMan.TryGetComponent(_owner, out var active)
+ || !_entMan.TryGetComponent(item, out var rev))
+ return;
+
+ TotalProgressBar.Value = (float) rev.Progress;
+
+ var remaining = Math.Max(active.NextProbe.TotalSeconds - _timing.CurTime.TotalSeconds, 0.0);
+ ProgressLabel.Text = Loc.GetString("analysis-console-progress-text", ("seconds", (int) remaining));
+ ProgressBar.Value = 1f - (float) (remaining / _owner.Comp.AnalysisDuration.TotalSeconds);
+ }
+}
diff --git a/Content.Client/Nyanotrasen/ReverseEngineering/ReverseEngineeringSystem.cs b/Content.Client/Nyanotrasen/ReverseEngineering/ReverseEngineeringSystem.cs
new file mode 100644
index 00000000000..6a95bbe4281
--- /dev/null
+++ b/Content.Client/Nyanotrasen/ReverseEngineering/ReverseEngineeringSystem.cs
@@ -0,0 +1,5 @@
+using Content.Shared.ReverseEngineering;
+
+namespace Content.Client.ReverseEngineering;
+
+public sealed class ReverseEngineeringSystem : SharedReverseEngineeringSystem;
diff --git a/Content.Server/Backmen/Supermatter/SupermatterSystem.cs b/Content.Server/Backmen/Supermatter/SupermatterSystem.cs
new file mode 100644
index 00000000000..81a19dab9a9
--- /dev/null
+++ b/Content.Server/Backmen/Supermatter/SupermatterSystem.cs
@@ -0,0 +1,647 @@
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Content.Server.AlertLevel;
+using Content.Server.Atmos.EntitySystems;
+using Content.Server.Audio;
+using Content.Server.Chat.Systems;
+using Content.Server.Explosion.Components;
+using Content.Server.Explosion.EntitySystems;
+using Content.Server.Lightning;
+using Content.Server.Station.Systems;
+using Content.Shared.Atmos;
+using Content.Shared.Audio;
+using Content.Shared.Backmen.CCVar;
+using Content.Shared.Backmen.Supermatter;
+using Content.Shared.Backmen.Supermatter.Components;
+using Content.Shared.Explosion.Components;
+using Content.Shared.Interaction;
+using Content.Shared.Mobs.Components;
+using Content.Shared.Projectiles;
+using Content.Shared.Radiation.Components;
+using Content.Shared.Tag;
+using Content.Shared.Whitelist;
+using Robust.Server.GameObjects;
+using Robust.Shared.Audio.Systems;
+using Robust.Shared.Configuration;
+using Robust.Shared.Containers;
+using Robust.Shared.CPUJob.JobQueues;
+using Robust.Shared.CPUJob.JobQueues.Queues;
+using Robust.Shared.Physics;
+using Robust.Shared.Physics.Events;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Timing;
+
+namespace Content.Server.Backmen.Supermatter;
+
+public sealed class SupermatterSystem : SharedSupermatterSystem
+{
+ public override void Initialize()
+ {
+ base.Initialize();
+
+
+ SubscribeLocalEvent(OnHandInteract);
+ SubscribeLocalEvent(OnMapInit);
+ SubscribeLocalEvent(OnComponentRemove);
+ }
+
+ private const double PwrJobTime = 0.5;
+ private readonly JobQueue _pwrJobQueue = new(PwrJobTime);
+
+
+
+ public sealed class HandleOutputJob(
+ float frameTime,
+ SupermatterSystem self,
+ Entity ent,
+ GasMixture gasMixture,
+ double maxTime,
+ CancellationToken cancellation = default)
+ : Job