diff --git a/Content.Server/_CD/Engraving/EngraveableComponent.cs b/Content.Server/_CD/Engraving/EngraveableComponent.cs
new file mode 100644
index 0000000000..f60ee3f584
--- /dev/null
+++ b/Content.Server/_CD/Engraving/EngraveableComponent.cs
@@ -0,0 +1,32 @@
+namespace Content.Server._CD.Engraving;
+
+///
+/// Allows an items' description to be modified with an engraving
+///
+[RegisterComponent, Access(typeof(EngraveableSystem))]
+public sealed partial class EngraveableComponent : Component
+{
+ ///
+ /// Message given to user to notify them a message was sent
+ ///
+ [DataField]
+ public string EngravedMessage = string.Empty;
+
+ ///
+ /// The inspect text to use when there is no engraving
+ ///
+ [DataField]
+ public LocId NoEngravingText = "engraving-dogtags-no-message";
+
+ ///
+ /// The message to use when successfully engraving the item
+ ///
+ [DataField]
+ public LocId EngraveSuccessMessage = "engraving-dogtags-succeed";
+
+ ///
+ /// The inspect text to use when there is an engraving. The message will be shown seperately afterwards.
+ ///
+ [DataField]
+ public LocId HasEngravingText = "engraving-dogtags-has-message";
+}
diff --git a/Content.Server/_CD/Engraving/EngraveableSystem.cs b/Content.Server/_CD/Engraving/EngraveableSystem.cs
new file mode 100644
index 0000000000..370929511a
--- /dev/null
+++ b/Content.Server/_CD/Engraving/EngraveableSystem.cs
@@ -0,0 +1,83 @@
+using Content.Server.Administration;
+using Content.Server.Administration.Logs;
+using Content.Server.Popups;
+using Content.Shared.Database;
+using Content.Shared.Popups;
+using Content.Shared.Examine;
+using Content.Shared.Verbs;
+using Robust.Shared.Player;
+using Robust.Shared.Utility;
+
+namespace Content.Server._CD.Engraving;
+
+public sealed class EngraveableSystem : EntitySystem
+{
+ [Dependency] private readonly IAdminLogManager _adminLogger = default!;
+ [Dependency] private readonly PopupSystem _popup = default!;
+ [Dependency] private readonly QuickDialogSystem _dialog = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnExamined);
+ SubscribeLocalEvent>(AddEngraveVerb);
+ }
+
+ private void OnExamined(Entity ent, ref ExaminedEvent args)
+ {
+ var msg = new FormattedMessage();
+ msg.AddMarkupOrThrow(Loc.GetString(ent.Comp.EngravedMessage == string.Empty
+ ? ent.Comp.NoEngravingText
+ : ent.Comp.HasEngravingText));
+
+ if (ent.Comp.EngravedMessage != string.Empty)
+ msg.AddMarkupPermissive(Loc.GetString(ent.Comp.EngravedMessage));
+
+ args.PushMessage(msg, 1);
+ }
+
+ private void AddEngraveVerb(Entity ent, ref GetVerbsEvent args)
+ {
+ // First check if it's already been engraved. If it has, don't let them do it again.
+ if (ent.Comp.EngravedMessage != string.Empty)
+ return;
+
+ // We need an actor to give the verb.
+ if (!EntityManager.TryGetComponent(args.User, out ActorComponent? actor))
+ return;
+
+ // Make sure ghosts can't engrave stuff.
+ if (!args.CanInteract)
+ return;
+
+ var engraveVerb = new ActivationVerb
+ {
+ Text = Loc.GetString("engraving-verb-engrave"),
+ Act = () =>
+ {
+ _dialog.OpenDialog(actor.PlayerSession,
+ Loc.GetString("engraving-verb-engrave"),
+ Loc.GetString("engraving-popup-ui-message"),
+ (string message) =>
+ {
+ // If either the actor or comp have magically vanished
+ if (actor.PlayerSession.AttachedEntity == null || !HasComp(ent))
+ return;
+
+ ent.Comp.EngravedMessage = message;
+ _popup.PopupEntity(Loc.GetString(ent.Comp.EngraveSuccessMessage),
+ actor.PlayerSession.AttachedEntity.Value,
+ actor.PlayerSession,
+ PopupType.Medium);
+ _adminLogger.Add(LogType.Action,
+ LogImpact.Low,
+ $"{ToPrettyString(actor.PlayerSession.AttachedEntity):player} engraved an item with message: {message}");
+ });
+ },
+ Impact = LogImpact.Low,
+ };
+ engraveVerb.Impact = LogImpact.Low;
+ args.Verbs.Add(engraveVerb);
+ }
+}
diff --git a/Resources/Locale/en-US/_CD/engraving/engraving.ftl b/Resources/Locale/en-US/_CD/engraving/engraving.ftl
new file mode 100644
index 0000000000..fc6ca919ea
--- /dev/null
+++ b/Resources/Locale/en-US/_CD/engraving/engraving.ftl
@@ -0,0 +1,6 @@
+engraving-verb-engrave = Engrave
+engraving-popup-ui-message = Description
+
+engraving-dogtags-no-message = The dogtags don't seem to have any kind of engraving.
+engraving-dogtags-has-message = The dogtags are engraved with a message that reads:{" "}
+engraving-dogtags-succeed = You successfully engrave the dogtags with your message.
diff --git a/Resources/Prototypes/Loadouts/loadout_groups.yml b/Resources/Prototypes/Loadouts/loadout_groups.yml
index ccf1bd50d3..d81dd6c611 100644
--- a/Resources/Prototypes/Loadouts/loadout_groups.yml
+++ b/Resources/Prototypes/Loadouts/loadout_groups.yml
@@ -50,6 +50,7 @@
- SilverRing # DeltaV
- Cane # DeltaV
- WhiteCane #DeltaV
+ - CDDogtags # _CD
- type: loadoutGroup
id: Glasses
diff --git a/Resources/Prototypes/_CD/Entities/Objects/Misc/dogtags.yml b/Resources/Prototypes/_CD/Entities/Objects/Misc/dogtags.yml
new file mode 100644
index 0000000000..22a1b22a72
--- /dev/null
+++ b/Resources/Prototypes/_CD/Entities/Objects/Misc/dogtags.yml
@@ -0,0 +1,14 @@
+- type: entity
+ id: CDDogtags
+ parent: ClothingNeckBase
+ name: dogtags
+ description: A set of dogtags, hanging from a small piece of cord for wearing and carrying.
+ components:
+ - type: Sprite
+ sprite: _CD/Objects/Misc/dogtags.rsi
+ layers:
+ - state: dogtag
+ - type: Clothing
+ sprite: _CD/Objects/Misc/dogtags.rsi
+ - type: Appearance
+ - type: Engraveable
diff --git a/Resources/Prototypes/_CD/Loadouts/Miscellaneous/trinkets.yml b/Resources/Prototypes/_CD/Loadouts/Miscellaneous/trinkets.yml
new file mode 100644
index 0000000000..5c04fc51da
--- /dev/null
+++ b/Resources/Prototypes/_CD/Loadouts/Miscellaneous/trinkets.yml
@@ -0,0 +1,5 @@
+- type: loadout
+ id: CDDogtags
+ storage:
+ back:
+ - CDDogtags
diff --git a/Resources/Textures/_CD/Objects/Misc/dogtags.rsi/dogtag.png b/Resources/Textures/_CD/Objects/Misc/dogtags.rsi/dogtag.png
new file mode 100644
index 0000000000..05a5b71bc5
Binary files /dev/null and b/Resources/Textures/_CD/Objects/Misc/dogtags.rsi/dogtag.png differ
diff --git a/Resources/Textures/_CD/Objects/Misc/dogtags.rsi/equipped-NECK.png b/Resources/Textures/_CD/Objects/Misc/dogtags.rsi/equipped-NECK.png
new file mode 100644
index 0000000000..4d837168da
Binary files /dev/null and b/Resources/Textures/_CD/Objects/Misc/dogtags.rsi/equipped-NECK.png differ
diff --git a/Resources/Textures/_CD/Objects/Misc/dogtags.rsi/meta.json b/Resources/Textures/_CD/Objects/Misc/dogtags.rsi/meta.json
new file mode 100644
index 0000000000..da1b490e53
--- /dev/null
+++ b/Resources/Textures/_CD/Objects/Misc/dogtags.rsi/meta.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from cmss13 at https://github.com/cmss13-devs/cmss13/blob/a2d5ca6e69725341f0fa261a4a3f89c737e843b3/icons/obj/items/card.dmi",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "dogtag"
+ },
+ {
+ "name": "equipped-NECK",
+ "directions": 4
+ }
+ ]
+}