diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm
index 5454b0fdb8..0e5d3add5f 100644
--- a/code/game/objects/items/robot/robot_items.dm
+++ b/code/game/objects/items/robot/robot_items.dm
@@ -746,3 +746,73 @@
..()
hud = new /obj/item/clothing/glasses/hud/security(src)
return
+
+
+/**********************************************************************
+ Grippers oh god oh fuck
+***********************************************************************/
+
+/obj/item/weapon/gripper
+ name = "circuit gripper"
+ desc = "A simple grasping tool for inserting circuitboards into machinary."
+ icon = 'icons/obj/device.dmi'
+ icon_state = "gripper"
+
+ item_flags = NOBLUDGEON
+
+ //Has a list of items that it can hold.
+ var/list/can_hold = list(
+ /obj/item/circuitboard
+ )
+
+ var/obj/item/wrapped = null // Item currently being held.
+
+/obj/item/weapon/gripper/attack_self()
+ if(wrapped)
+ wrapped.forceMove(get_turf(wrapped))
+ wrapped = null
+ return ..()
+
+/obj/item/weapon/gripper/afterattack(var/atom/target, var/mob/living/user, proximity, params)
+
+ if(!proximity)
+ return
+
+ if(!wrapped)
+ for(var/obj/item/thing in src.contents)
+ wrapped = thing
+ break
+
+ if(wrapped) //Already have an item.
+ //Temporary put wrapped into user so target's attackby() checks pass.
+ wrapped.loc = user
+
+ //Pass the attack on to the target. This might delete/relocate wrapped.
+ var/resolved = target.attackby(wrapped,user)
+ if(!resolved && wrapped && target)
+ wrapped.afterattack(target,user,1)
+ //If wrapped was neither deleted nor put into target, put it back into the gripper.
+ if(wrapped && user && (wrapped.loc == user))
+ wrapped.loc = src
+ else
+ wrapped = null
+ return
+
+ else if(istype(target,/obj/item))
+
+ var/obj/item/I = target
+
+ var/grab = 0
+ for(var/typepath in can_hold)
+ if(istype(I,typepath))
+ grab = 1
+ break
+
+ //We can grab the item, finally.
+ if(grab)
+ to_chat(user, "You collect \the [I].")
+ I.loc = src
+ wrapped = I
+ return
+ else
+ to_chat(user, "Your gripper cannot hold \the [target].")
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index 2356319cd7..e1834078a6 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -598,10 +598,10 @@
R.update_transform()
/obj/item/borg/upgrade/rped
- name = "engineering cyborg RPED"
+ name = "engineering cyborg BSRPED"
desc = "A rapid part exchange device for the engineering cyborg."
icon = 'icons/obj/storage.dmi'
- icon_state = "borgrped"
+ icon_state = "borg_BS_RPED"
require_module = TRUE
module_type = list(/obj/item/robot_module/engineering)
@@ -609,14 +609,21 @@
. = ..()
if(.)
+ var/obj/item/storage/part_replacer/bluespace/cyborg/BSRPED = locate() in R
var/obj/item/storage/part_replacer/cyborg/RPED = locate() in R
- if(RPED)
- to_chat(user, "This unit is already equipped with a RPED module.")
+ if(!RPED)
+ RPED = locate() in R.module
+ if(!BSRPED)
+ BSRPED = locate() in R.module //There's gotta be a smarter way to do this.
+ if(BSRPED)
+ to_chat(user, "This unit is already equipped with a BSRPED module.")
return FALSE
- RPED = new(R.module)
- R.module.basic_modules += RPED
- R.module.add_module(RPED, FALSE, TRUE)
+ BSRPED = new(R.module)
+ SEND_SIGNAL(RPED, COMSIG_TRY_STORAGE_QUICK_EMPTY)
+ qdel(RPED)
+ R.module.basic_modules += BSRPED
+ R.module.add_module(BSRPED, FALSE, TRUE)
/obj/item/borg/upgrade/rped/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..()
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 7b95ced63f..ac759c7176 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -311,6 +311,10 @@
/obj/item/multitool/cyborg,
/obj/item/t_scanner,
/obj/item/analyzer,
+ /obj/item/storage/part_replacer/cyborg,
+ /obj/item/holosign_creator/atmos,
+ /obj/item/weapon/gripper,
+ /obj/item/lightreplacer/cyborg,
/obj/item/geiger_counter/cyborg,
/obj/item/assembly/signaler/cyborg,
/obj/item/areaeditor/blueprints/cyborg,
diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm
index 3cd296f866..12fe64463d 100644
--- a/code/modules/research/stock_parts.dm
+++ b/code/modules/research/stock_parts.dm
@@ -43,7 +43,7 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi
/obj/item/storage/part_replacer/bluespace
name = "bluespace rapid part exchange device"
- desc = "A version of the RPED that allows for replacement of parts and scanning from a distance, along with higher capacity for parts."
+ desc = "A version of the RPED that allows for replacement of parts and scanning from a distance, along with higher capacity for parts. Definitely not just a BSRPED painted orange."
icon_state = "BS_RPED"
w_class = WEIGHT_CLASS_NORMAL
works_from_distance = TRUE
@@ -52,12 +52,10 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi
component_type = /datum/component/storage/concrete/bluespace/rped
/obj/item/storage/part_replacer/cyborg
- name = "rapid part exchange device"
- desc = "Special mechanical module made to store, sort, and apply standard machine parts."
icon_state = "borgrped"
- item_state = "RPED"
- lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
+
+/obj/item/storage/part_replacer/bluespace/cyborg
+ icon_state = "borg_BS_RPED"
/proc/cmp_rped_sort(obj/item/A, obj/item/B)
return B.get_part_rating() - A.get_part_rating()
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 08b605a1d6..db0e5a301a 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index fae8134791..68bf9bd2bd 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ