diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index 7ec0dac07e2..53a52f093ba 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -26568,6 +26568,7 @@
layer = 3;
pixel_x = 32
},
+/obj/machinery/aug_manipulator,
/turf/open/floor/plasteel/white,
/area/science/robotics/lab)
"bkp" = (
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index d6357cc5583..a6b334314c1 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -93138,6 +93138,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 4
},
+/obj/machinery/aug_manipulator,
/turf/open/floor/plasteel,
/area/science/robotics/lab)
"dxQ" = (
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 9fb29795ae4..70ed4505f1e 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -71169,6 +71169,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/machinery/aug_manipulator,
/turf/open/floor/plasteel,
/area/science/robotics/lab)
"cFe" = (
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 758ff6f496e..2b0e8ee74ad 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -43,7 +43,7 @@
#define BODYPART_ROBOTIC 2
#define DEFAULT_BODYPART_ICON_ORGANIC 'icons/mob/human_parts_greyscale.dmi'
-#define DEFAULT_BODYPART_ICON_ROBOTIC 'icons/mob/augments.dmi'
+#define DEFAULT_BODYPART_ICON_ROBOTIC 'icons/mob/augmentation/augments.dmi'
#define MONKEY_BODYPART "monkey"
#define ALIEN_BODYPART "alien"
diff --git a/code/game/machinery/aug_manipulator.dm b/code/game/machinery/aug_manipulator.dm
new file mode 100644
index 00000000000..05d6a480641
--- /dev/null
+++ b/code/game/machinery/aug_manipulator.dm
@@ -0,0 +1,135 @@
+/obj/machinery/aug_manipulator
+ name = "\improper augment manipulator"
+ desc = "A machine for custom fitting augmentations, with in-built spraypainter."
+ icon = 'icons/obj/pda.dmi'
+ icon_state = "pdapainter"
+ density = TRUE
+ anchored = TRUE
+ obj_integrity = 200
+ max_integrity = 200
+ var/obj/item/bodypart/storedpart
+ var/initial_icon_state
+ var/static/list/style_list_icons = list("standard" = 'icons/mob/augmentation/augments.dmi', "engineer" = 'icons/mob/augmentation/augments_engineer.dmi', "security" = 'icons/mob/augmentation/augments_security.dmi', "mining" = 'icons/mob/augmentation/augments_mining.dmi')
+
+
+/obj/machinery/aug_manipulator/Initialize()
+ initial_icon_state = initial(icon_state)
+ return ..()
+
+/obj/machinery/aug_manipulator/update_icon()
+ cut_overlays()
+
+ if(stat & BROKEN)
+ icon_state = "[initial_icon_state]-broken"
+ return
+
+ if(storedpart)
+ add_overlay("[initial_icon_state]-closed")
+
+ if(powered())
+ icon_state = initial_icon_state
+ else
+ icon_state = "[initial_icon_state]-off"
+
+/obj/machinery/aug_manipulator/Destroy()
+ QDEL_NULL(storedpart)
+ return ..()
+
+/obj/machinery/aug_manipulator/on_deconstruction()
+ if(storedpart)
+ storedpart.forceMove(loc)
+ storedpart = null
+
+/obj/machinery/aug_manipulator/contents_explosion(severity, target)
+ if(storedpart)
+ storedpart.ex_act(severity, target)
+
+/obj/machinery/aug_manipulator/handle_atom_del(atom/A)
+ if(A == storedpart)
+ storedpart = null
+ update_icon()
+
+/obj/machinery/aug_manipulator/attackby(obj/item/O, mob/user, params)
+ if(default_unfasten_wrench(user, O))
+ power_change()
+ return
+
+ else if(istype(O, /obj/item/bodypart))
+ var/obj/item/bodypart/B = O
+ if(B.status != BODYPART_ROBOTIC)
+ to_chat(user, "The machine only accepts cybernetics!")
+ return
+ if(storedpart)
+ to_chat(user, "There is already something inside!")
+ return
+ else
+ O = user.get_active_held_item()
+ if(!user.transferItemToLoc(O, src))
+ return
+ storedpart = O
+ O.add_fingerprint(user)
+ update_icon()
+
+ else if(istype(O, /obj/item/weapon/weldingtool) && user.a_intent != INTENT_HARM)
+ var/obj/item/weapon/weldingtool/WT = O
+ if(obj_integrity < max_integrity)
+ if(WT.remove_fuel(0,user))
+ user.visible_message("[user] begins repairing [src].", \
+ "You begin repairing [src]...", \
+ "You hear welding.")
+ playsound(src, WT.usesound, 40, 1)
+ if(do_after(user,40*WT.toolspeed, TRUE, target = src))
+ if(!WT.isOn() || !(stat & BROKEN))
+ return
+ to_chat(user, "You repair [src].")
+ playsound(src, 'sound/items/welder2.ogg', 50, 1)
+ stat &= ~BROKEN
+ obj_integrity = max(obj_integrity, max_integrity)
+ update_icon()
+ else
+ to_chat(user, "[src] does not need repairs.")
+ else
+ return ..()
+
+/obj/machinery/aug_manipulator/obj_break(damage_flag)
+ if(!(flags & NODECONSTRUCT))
+ if(!(stat & BROKEN))
+ stat |= BROKEN
+ update_icon()
+
+/obj/machinery/aug_manipulator/attack_hand(mob/user)
+ if(!..())
+ add_fingerprint(user)
+
+ if(storedpart)
+ var/augstyle = input(user, "Select style.", "Augment Custom Fitting") as null|anything in style_list_icons
+ if(!augstyle)
+ return
+ if(!in_range(src, user))
+ return
+ if(!storedpart)
+ return
+ storedpart.icon = style_list_icons[augstyle]
+ eject_part(user)
+
+ else
+ to_chat(user, "\The [src] is empty.")
+
+/obj/machinery/aug_manipulator/proc/eject_part(mob/living/user)
+ if(storedpart)
+ storedpart.forceMove(get_turf(src))
+ storedpart = null
+ update_icon()
+ else
+ to_chat(user, "[src] is empty.")
+
+/obj/machinery/aug_manipulator/AltClick(mob/living/user)
+ ..()
+ if(!user.canUseTopic(src))
+ return
+ else
+ eject_part(user)
+
+/obj/machinery/aug_manipulator/power_change()
+ ..()
+ update_icon()
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 70f7a809af0..2981ffe8494 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -241,6 +241,10 @@
var/dynamic_hair_suffix = "" //if this is non-null, and hair+suffix matches an iconstate, then we render that hair instead
var/dynamic_fhair_suffix = ""
+ //for augmented heads
+ if(HD.status == BODYPART_ROBOTIC)
+ return
+
//we check if our hat or helmet hides our facial hair.
if(H.head)
var/obj/item/I = H.head
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index d93fc658ddb..b239e395761 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -306,7 +306,7 @@
else
limb.icon_state = "[animal_origin]_[body_zone]"
else
- limb.icon = 'icons/mob/augments.dmi'
+ limb.icon = 'icons/mob/augmentation/augments.dmi'
limb.icon_state = "[animal_origin]_[body_zone]"
return
diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm
index 00a01e2d2e4..c956380d200 100644
--- a/code/modules/surgery/bodyparts/robot_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm
@@ -165,27 +165,27 @@
/obj/item/bodypart/l_arm/robot/surplus
name = "surplus prosthetic left arm"
desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing."
- icon = 'icons/mob/surplus_augments.dmi'
+ icon = 'icons/mob/augmentation/surplus_augments.dmi'
icon_state = "l_arm"
max_damage = 20
/obj/item/bodypart/r_arm/robot/surplus
name = "surplus prosthetic right arm"
desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing."
- icon = 'icons/mob/surplus_augments.dmi'
+ icon = 'icons/mob/augmentation/surplus_augments.dmi'
icon_state = "r_arm"
max_damage = 20
/obj/item/bodypart/l_leg/robot/surplus
name = "surplus prosthetic left leg"
desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing."
- icon = 'icons/mob/surplus_augments.dmi'
+ icon = 'icons/mob/augmentation/surplus_augments.dmi'
icon_state = "l_leg"
max_damage = 20
/obj/item/bodypart/r_leg/robot/surplus
name = "surplus prosthetic right leg"
desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing."
- icon = 'icons/mob/surplus_augments.dmi'
+ icon = 'icons/mob/augmentation/surplus_augments.dmi'
icon_state = "r_leg"
max_damage = 20
diff --git a/code/modules/surgery/limb_augmentation.dm b/code/modules/surgery/limb_augmentation.dm
index 32b4f7c8c6b..c965640ade5 100644
--- a/code/modules/surgery/limb_augmentation.dm
+++ b/code/modules/surgery/limb_augmentation.dm
@@ -57,6 +57,7 @@
qdel(tool)
target.update_body_parts()
target.updatehealth()
+ target.update_hair()
add_logs(user, target, "augmented", addition="by giving him new [parse_zone(target_zone)] INTENT: [uppertext(user.a_intent)]")
else
to_chat(user, "[target] has no organic [parse_zone(target_zone)] there!")
diff --git a/icons/mob/augmentation/augments.dmi b/icons/mob/augmentation/augments.dmi
new file mode 100644
index 00000000000..a532348d6d1
Binary files /dev/null and b/icons/mob/augmentation/augments.dmi differ
diff --git a/icons/mob/augmentation/augments_engineer.dmi b/icons/mob/augmentation/augments_engineer.dmi
new file mode 100644
index 00000000000..8aeaaf04e08
Binary files /dev/null and b/icons/mob/augmentation/augments_engineer.dmi differ
diff --git a/icons/mob/augmentation/augments_mining.dmi b/icons/mob/augmentation/augments_mining.dmi
new file mode 100644
index 00000000000..b79c54e9c89
Binary files /dev/null and b/icons/mob/augmentation/augments_mining.dmi differ
diff --git a/icons/mob/augmentation/augments_security.dmi b/icons/mob/augmentation/augments_security.dmi
new file mode 100644
index 00000000000..8f57f77c4b8
Binary files /dev/null and b/icons/mob/augmentation/augments_security.dmi differ
diff --git a/icons/mob/surplus_augments.dmi b/icons/mob/augmentation/surplus_augments.dmi
similarity index 100%
rename from icons/mob/surplus_augments.dmi
rename to icons/mob/augmentation/surplus_augments.dmi
diff --git a/icons/mob/augments.dmi b/icons/mob/augments.dmi
deleted file mode 100644
index 7124c35105e..00000000000
Binary files a/icons/mob/augments.dmi and /dev/null differ
diff --git a/tgstation.dme b/tgstation.dme
index 579a827bff7..8c13f0dfb52 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -515,6 +515,7 @@
#include "code\game\machinery\ai_slipper.dm"
#include "code\game\machinery\airlock_control.dm"
#include "code\game\machinery\announcement_system.dm"
+#include "code\game\machinery\aug_manipulator.dm"
#include "code\game\machinery\autolathe.dm"
#include "code\game\machinery\bank_machine.dm"
#include "code\game\machinery\Beacon.dm"