diff --git a/code/game/objects/items/weapons/RFD.dm b/code/game/objects/items/weapons/RFD.dm
index 1cfcd822ba7..57fa9b7fe17 100644
--- a/code/game/objects/items/weapons/RFD.dm
+++ b/code/game/objects/items/weapons/RFD.dm
@@ -413,3 +413,139 @@ RFD Mining-Class
var/mob/living/silicon/robot/R = user
if(R.cell)
R.cell.use(used_energy)
+
+
+/*
+RFD Piping-Class
+*/
+
+#define STANDARD_PIPE "Standard Pipes"
+#define SUPPLY_PIPE "Supply Pipes"
+#define SCRUBBER_PIPE "Scrubber Pipes"
+#define DEVICES "Devices"
+
+/obj/item/rfd/piping
+ name = "\improper Rapid-Fabrication-Device P-Class"
+ desc = "A RFD, modified to construct pipes and piping accessories."
+ modes = list(STANDARD_PIPE, SUPPLY_PIPE, SCRUBBER_PIPE, DEVICES)
+ var/selected_mode = STANDARD_PIPE
+ var/pipe_examine = "Pipe" // used in the examine proc to see what you're putting down at a glance
+ var/selected_pipe = 0 // default is standard pipe, used for the new pipe creation
+ var/build_cost = 1 // this RFD only uses 1 unit of power per pipe, but can be modified if need be in future
+ var/build_delay = 10
+
+ // The numbers below refer to the numberized designator for each pipe, which is used in obj/item/pipe's new
+ // Take a look at code\game\machinery\pipe\construction.dm line 69 for more information. - Geeves
+ var/list/standard_pipes = list("Pipe" = 0,
+ "Bent Pipe" = 1,
+ "Manifold" = 5,
+ "Manual Valve" = 8,
+ "4-Way Manifold" = 19,
+ "Manual T-Valve" = 18,
+ "Upward Pipe" = 21,
+ "Downward Pipe" = 22)
+
+ var/list/supply_pipes = list("Pipe" = 29,
+ "Bent Pipe" = 30,
+ "Manifold" = 33,
+ "4-Way Manifold" = 35,
+ "Upward Pipe" = 37,
+ "Downward Pipe" = 39)
+
+ var/list/scrubber_pipes = list("Pipe" = 31,
+ "Bent Pipe" = 32,
+ "Manifold" = 34,
+ "4-Way Manifold" = 36,
+ "Upward Pipe" = 38,
+ "Downward Pipe" = 40)
+
+ var/list/devices = list("Universal Pipe Adapter" = 28,
+ "Connector" = 4,
+ "Unary Vent" = 7,
+ "Scrubber" = 10,
+ "Gas Pump" = 9,
+ "Pressure Regulator" = 15,
+ "High Power Gas Pump" = 16,
+ "Gas Filter" = 13,
+ "Omni Gas Filter" = 27)
+
+/obj/item/rfd/piping/examine(mob/user)
+ . = ..()
+ to_chat(user, FONT_SMALL(SPAN_NOTICE("Change pipe category by Alt clicking, change pipe selection by using in-hand.")))
+ to_chat(user, SPAN_NOTICE("Selected pipe category: [selected_mode]"))
+ to_chat(user, SPAN_NOTICE("Selected pipe: [pipe_examine]"))
+
+/obj/item/rfd/piping/afterattack(atom/A, mob/user, proximity)
+ if(!proximity)
+ return
+ if(istype(get_area(A), /area/shuttle) || istype(get_area(A), /turf/space))
+ to_chat(user, SPAN_WARNING("You can't lay pipe here!"))
+ return FALSE
+ var/turf/T = get_turf(A)
+ if(isNotStationLevel(T.z))
+ to_chat(user, SPAN_WARNING("You can't lay your pipe on this level!"))
+ return FALSE
+ return do_pipe(T, user)
+
+/obj/item/rfd/piping/proc/do_pipe(var/turf/T, var/mob/user)
+ if(working)
+ return FALSE
+
+ if(!useResource(build_cost, user))
+ to_chat(user, SPAN_WARNING("The \'Low Ammo\' light on the device blinks yellow."))
+ flick("[icon_state]-empty", src)
+ return FALSE
+
+ playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE)
+
+ working = TRUE
+ to_chat(user, SPAN_NOTICE("You start laying down your pipe..."))
+
+ if(build_delay && !do_after(user, build_delay))
+ working = FALSE
+ return FALSE
+
+ working = FALSE
+ if(build_delay && !can_use(user, T))
+ return FALSE
+
+ new /obj/item/pipe(T, selected_pipe, NORTH)
+
+ playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, TRUE)
+ return TRUE
+
+/obj/item/rfd/piping/attack_self(mob/user)
+ playsound(get_turf(src), 'sound/effects/pop.ogg', 50, FALSE)
+ var/list/pipe_selection = list()
+ switch(selected_mode)
+ if(STANDARD_PIPE)
+ pipe_selection = standard_pipes
+ if(SUPPLY_PIPE)
+ pipe_selection = supply_pipes
+ if(SCRUBBER_PIPE)
+ pipe_selection = scrubber_pipes
+ if(DEVICES)
+ pipe_selection = devices
+ pipe_examine = input(user, "Choose the pipe you want to deploy.", "Pipe Selection") in pipe_selection
+ selected_pipe = pipe_selection[pipe_examine]
+
+/obj/item/rfd/piping/AltClick(mob/user)
+ selected_mode = input(user, "Choose the category you want to change to.", "Pipe Categories") in modes
+ switch(selected_mode)
+ if(STANDARD_PIPE)
+ pipe_examine = "Pipe"
+ selected_pipe = 0
+ if(SUPPLY_PIPE)
+ pipe_examine = "Pipe"
+ selected_pipe = 29
+ if(SCRUBBER_PIPE)
+ pipe_examine = "Pipe"
+ selected_pipe = 31
+ if(DEVICES)
+ pipe_examine = "Universal Pipe Adapter"
+ selected_pipe = 28
+
+#undef STANDARD_PIPE
+#undef SUPPLY_PIPE
+#undef SCRUBBER_PIPE
+#undef DEVICES
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index 6632a825833..a1ede685c09 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -36,6 +36,7 @@
new /obj/item/device/flash(src)
new /obj/item/taperoll/engineering(src)
new /obj/item/clothing/accessory/storage/overalls/chief(src)
+ new /obj/item/rfd/piping(src)
/obj/structure/closet/secure_closet/engineering_chief2
name = "chief engineer's attire"
@@ -164,3 +165,4 @@
new /obj/item/cartridge/atmos(src)
new /obj/item/taperoll/engineering(src)
new /obj/item/clothing/accessory/storage/overalls/engineer(src)
+ new /obj/item/rfd/piping(src)
diff --git a/html/changelogs/geeves-rfd_pp.yml b/html/changelogs/geeves-rfd_pp.yml
new file mode 100644
index 00000000000..2e8e245bf23
--- /dev/null
+++ b/html/changelogs/geeves-rfd_pp.yml
@@ -0,0 +1,7 @@
+author: Geeves
+
+delete-after: True
+
+changes:
+ - rscadd: "Implements a Piping Rapid Fabrication Device, otherwise known as the RFD-P."
+ - rscadd: "Alt-clicking changes what types of pipes you can select, clicking on it in-hand or pressing Z while it's in your active hand will let you choose a specific pipe."
\ No newline at end of file