diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm
index 0df10cd97c4..7417889dcab 100644
--- a/code/game/objects/items/weapons/mop.dm
+++ b/code/game/objects/items/weapons/mop.dm
@@ -48,4 +48,4 @@
/obj/effect/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/weapon/mop) || istype(I, /obj/item/weapon/soap))
return
- ..()
+ ..()
diff --git a/code/game/objects/items/weapons/mop_deploy.dm b/code/game/objects/items/weapons/mop_deploy.dm
new file mode 100644
index 00000000000..b8eb201b5c1
--- /dev/null
+++ b/code/game/objects/items/weapons/mop_deploy.dm
@@ -0,0 +1,73 @@
+/obj/item/weapon/mop_deploy
+ name = "mop"
+ desc = "Deployable mop."
+ icon_state = "mop"
+ force = 3
+ anchored = 1 // Never spawned outside of inventory, should be fine.
+ throwforce = 1 //Throwing or dropping the item deletes it.
+ throw_speed = 1
+ throw_range = 1
+ w_class = 4.0//So you can't hide it in your pocket or some such.
+ attack_verb = list("mopped", "bashed", "bludgeoned", "whacked")
+ var/mob/living/creator
+ var/mopping = 0
+ var/mopcount = 0
+
+
+/obj/item/weapon/mop_deploy/New()
+ create_reagents(5)
+ processing_objects |= src
+
+/turf/proc/clean_deploy(atom/source)
+ if(source.reagents.has_reagent("water", 1))
+ clean_blood()
+ if(istype(src, /turf/simulated))
+ var/turf/simulated/T = src
+ T.dirt = 0
+ for(var/obj/effect/O in src)
+ if(istype(O,/obj/effect/rune) || istype(O,/obj/effect/decal/cleanable) || istype(O,/obj/effect/overlay))
+ del(O)
+ source.reagents.reaction(src, TOUCH, 10) //10 is the multiplier for the reaction effect. probably needed to wet the floor properly.
+ source.reagents.remove_any(1) //reaction() doesn't use up the reagents
+
+/obj/item/weapon/mop_deploy/afterattack(atom/A, mob/user, proximity)
+ if(!proximity) return
+ if(istype(A, /turf) || istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/overlay) || istype(A, /obj/effect/rune))
+ user.visible_message("[user] begins to clean \the [get_turf(A)].")
+
+ if(do_after(user, 40))
+ var/turf/T = get_turf(A)
+ if(T)
+ T.clean_deploy(src)
+ user << "You have finished mopping!"
+
+/obj/effect/attackby(obj/item/I, mob/user)
+ if(istype(I, /obj/item/weapon/mop_deploy) || istype(I, /obj/item/weapon/soap))
+ return
+ ..()
+
+/obj/item/weapon/mop_deploy/Del()
+ processing_objects -= src
+ ..()
+
+/obj/item/weapon/mop_deploy/attack_self(mob/user as mob)
+ user.drop_from_inventory(src)
+ spawn(1) if(src) del(src)
+
+/obj/item/weapon/mop_deploy/dropped()
+ spawn(1) if(src) del(src)
+
+/obj/item/weapon/mop_deploy/process()
+ if(!creator || loc != creator || (creator.l_hand != src && creator.r_hand != src))
+ // Tidy up a bit.
+ if(istype(loc,/mob/living))
+ var/mob/living/carbon/human/host = loc
+ if(istype(host))
+ for(var/obj/item/organ/external/organ in host.organs)
+ for(var/obj/item/O in organ.implants)
+ if(O == src)
+ organ.implants -= src
+ host.pinned -= src
+ host.embedded -= src
+ host.drop_from_inventory(src)
+ spawn(1) if(src) del(src)
\ No newline at end of file
diff --git a/code/modules/clothing/spacesuits/rig/modules/combat.dm b/code/modules/clothing/spacesuits/rig/modules/combat.dm
index d40f74202ef..94df5a92443 100644
--- a/code/modules/clothing/spacesuits/rig/modules/combat.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/combat.dm
@@ -5,6 +5,7 @@
* /obj/item/rig_module/mounted/taser
* /obj/item/rig_module/shield
* /obj/item/rig_module/fabricator
+ * /obj/item/rig_module/mounted/energy_blade
*/
/obj/item/rig_module/grenade_launcher
diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm
index 79abda20ccb..a5bb19e43d4 100644
--- a/code/modules/clothing/spacesuits/rig/modules/utility.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm
@@ -12,6 +12,8 @@
* /obj/item/rig_module/chem_dispenser
* /obj/item/rig_module/chem_dispenser/injector
* /obj/item/rig_module/voice
+ * /obj/item/rig_module/mounted/mop
+ * /obj/item/rig_module/cleaner_launcher
*/
/obj/item/rig_module/device
@@ -377,4 +379,154 @@
jets.holder = null
jets.ion_trail.set_up(jets)
-/obj/item/rig_module/foam_sprayer
\ No newline at end of file
+/obj/item/rig_module/foam_sprayer
+
+
+//Deployable Mop
+
+/obj/item/rig_module/mounted/mop
+
+ name = "mop projector"
+ desc = "A powerful mop projector."
+ icon_state = "mop"
+
+ activate_string = "Project Mop"
+ deactivate_string = "Cancel Mop"
+
+ interface_name = "mop projector"
+ interface_desc = "A mop that can be deployed from the hand of the wearer."
+
+ usable = 0
+ selectable = 1
+ toggleable = 1
+ use_power_cost = 0
+ active_power_cost = 0
+ passive_power_cost = 0
+
+ gun = /obj/item/weapon/reagent_containers/spray/cleaner
+
+//obj/item/weapon/reagent_containers/spray/cleaner
+// spary =
+
+/obj/item/rig_module/mounted/engage(atom/target)
+
+ if(!..())
+ return 0
+
+ if(!target)
+ gun.attack_self(holder.wearer)
+ return 1
+
+ gun.Fire(target,holder.wearer)
+ return 1
+
+/obj/item/rig_module/mounted/mop/process()
+
+ if(holder && holder.wearer)
+ if(!(locate(/obj/item/weapon/mop_deploy) in holder.wearer))
+ deactivate()
+ return 0
+
+ return ..()
+
+/obj/item/rig_module/mounted/mop/activate()
+
+ ..()
+
+ var/mob/living/M = holder.wearer
+
+ if(M.l_hand && M.r_hand)
+ M << "Your hands are full."
+ deactivate()
+ return
+
+ var/obj/item/weapon/mop_deploy/blade = new(M)
+ blade.creator = M
+ M.put_in_hands(blade)
+
+/obj/item/rig_module/mounted/mop/deactivate()
+
+ ..()
+
+ var/mob/living/M = holder.wearer
+
+ if(!M)
+ return
+
+ for(var/obj/item/weapon/mop_deploy/blade in M.contents)
+ M.drop_from_inventory(blade)
+ del(blade)
+
+
+ //Space Cleaner Launcher
+
+/obj/item/rig_module/cleaner_launcher
+
+ name = "mounted space cleaner launcher"
+ desc = "A shoulder-mounted micro-cleaner dispenser."
+ selectable = 1
+ icon_state = "grenade_launcher"
+
+ interface_name = "integrated cleaner launcher"
+ interface_desc = "Discharges loaded cleaner grenades against the wearer's location."
+
+ var/fire_force = 30
+ var/fire_distance = 10
+
+ charges = list(
+ list("cleaner grenade", "cleaner grenade", /obj/item/weapon/grenade/chem_grenade/cleaner, 9),
+ )
+
+/obj/item/rig_module/cleaner_launcher/accepts_item(var/obj/item/input_device, var/mob/living/user)
+
+ if(!istype(input_device) || !istype(user))
+ return 0
+
+ var/datum/rig_charge/accepted_item
+ for(var/charge in charges)
+ var/datum/rig_charge/charge_datum = charges[charge]
+ if(input_device.type == charge_datum.product_type)
+ accepted_item = charge_datum
+ break
+
+ if(!accepted_item)
+ return 0
+
+ if(accepted_item.charges >= 5)
+ user << "Another grenade of that type will not fit into the module."
+ return 0
+
+ user << "You slot \the [input_device] into the suit module."
+ user.drop_from_inventory(input_device)
+ del(input_device)
+ accepted_item.charges++
+ return 1
+
+/obj/item/rig_module/cleaner_launcher/engage(atom/target)
+
+ if(!..())
+ return 0
+
+ if(!target)
+ return 0
+
+ var/mob/living/carbon/human/H = holder.wearer
+
+ if(!charge_selected)
+ H << "You have not selected a grenade type."
+ return 0
+
+ var/datum/rig_charge/charge = charges[charge_selected]
+
+ if(!charge)
+ return 0
+
+ if(charge.charges <= 0)
+ H << "Insufficient grenades!"
+ return 0
+
+ charge.charges--
+ var/obj/item/weapon/grenade/new_grenade = new charge.product_type(get_turf(H))
+ H.visible_message("[H] launches \a [new_grenade]!")
+ new_grenade.activate(H)
+ new_grenade.throw_at(target,fire_force,fire_distance)
diff --git a/code/modules/clothing/spacesuits/rig/suits/ert.dm b/code/modules/clothing/spacesuits/rig/suits/ert.dm
index 70c21d51089..43d62bffa81 100644
--- a/code/modules/clothing/spacesuits/rig/suits/ert.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/ert.dm
@@ -43,6 +43,19 @@
name = "insulated gauntlets"
siemens_coefficient = 0
+/obj/item/weapon/rig/ert/janitor
+ name = "ERT-J suit control module"
+ desc = "A suit worn by the janitor division of a NanoTrasen Emergency Response Team. Has purple highlights. Armoured and space ready."
+ suit_type = "ERT Janitor"
+ icon_state = "ert_janitor_rig"
+
+ initial_modules = list(
+ /obj/item/rig_module/ai_container,
+ /obj/item/rig_module/maneuvering_jets,
+ /obj/item/rig_module/mounted/mop,
+ /obj/item/rig_module/cleaner_launcher,
+ )
+
/obj/item/weapon/rig/ert/medical
name = "ERT-M suit control module"
desc = "A suit worn by the medical division of a NanoTrasen Emergency Response Team. Has white highlights. Armoured and space ready."
diff --git a/icons/mob/back - Janitor.dmi b/icons/mob/back - Janitor.dmi
new file mode 100644
index 00000000000..32c69ba50c1
Binary files /dev/null and b/icons/mob/back - Janitor.dmi differ
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index 8322b7b4f58..f7810eccb3d 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/feet - Janitor.dmi b/icons/mob/feet - Janitor.dmi
new file mode 100644
index 00000000000..45d85ddece8
Binary files /dev/null and b/icons/mob/feet - Janitor.dmi differ
diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi
index ed60b1fa86a..6fd9af00565 100644
Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ
diff --git a/icons/mob/hands - Janitor.dmi b/icons/mob/hands - Janitor.dmi
new file mode 100644
index 00000000000..bcc177b110c
Binary files /dev/null and b/icons/mob/hands - Janitor.dmi differ
diff --git a/icons/mob/hands.dmi b/icons/mob/hands.dmi
index f79c6641cb0..ccc60d443ad 100644
Binary files a/icons/mob/hands.dmi and b/icons/mob/hands.dmi differ
diff --git a/icons/mob/head - Janitor.dmi b/icons/mob/head - Janitor.dmi
new file mode 100644
index 00000000000..66ad58cff65
Binary files /dev/null and b/icons/mob/head - Janitor.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 8038dc3d785..85047f6e417 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/rig_back - Janitor.dmi b/icons/mob/rig_back - Janitor.dmi
new file mode 100644
index 00000000000..eec7222637f
Binary files /dev/null and b/icons/mob/rig_back - Janitor.dmi differ
diff --git a/icons/mob/rig_back.dmi b/icons/mob/rig_back.dmi
index fdd761de541..6703e80bf2c 100644
Binary files a/icons/mob/rig_back.dmi and b/icons/mob/rig_back.dmi differ
diff --git a/icons/mob/suit - Janitor.dmi b/icons/mob/suit - Janitor.dmi
new file mode 100644
index 00000000000..8fb5ce9a97a
Binary files /dev/null and b/icons/mob/suit - Janitor.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index afb8b523618..90628b2bd75 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/obj/clothing/gloves - Janitor.dmi b/icons/obj/clothing/gloves - Janitor.dmi
new file mode 100644
index 00000000000..5b730bff103
Binary files /dev/null and b/icons/obj/clothing/gloves - Janitor.dmi differ
diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi
index 6399acfc15d..a60d90a2559 100644
Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ
diff --git a/icons/obj/clothing/hats - Janitor.dmi b/icons/obj/clothing/hats - Janitor.dmi
new file mode 100644
index 00000000000..68222ffa2d7
Binary files /dev/null and b/icons/obj/clothing/hats - Janitor.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index ec29f0ce41b..c0c80082945 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/shoes - Janitor.dmi b/icons/obj/clothing/shoes - Janitor.dmi
new file mode 100644
index 00000000000..22a75fd2b48
Binary files /dev/null and b/icons/obj/clothing/shoes - Janitor.dmi differ
diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi
index 50981432711..93641b1f90f 100644
Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ
diff --git a/icons/obj/clothing/suits - Janitor.dmi b/icons/obj/clothing/suits - Janitor.dmi
new file mode 100644
index 00000000000..bb5dd01fc86
Binary files /dev/null and b/icons/obj/clothing/suits - Janitor.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index b8156cad06d..e8291f37531 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/rig_modules.dmi b/icons/obj/rig_modules.dmi
index 02af395159d..a85b89a10bc 100644
Binary files a/icons/obj/rig_modules.dmi and b/icons/obj/rig_modules.dmi differ
diff --git a/polaris.dme b/polaris.dme
index 7e0a81494b8..d995318db74 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -5,6 +5,70 @@
// END_INTERNALS
// BEGIN_FILE_DIR
#define FILE_DIR .
+#define FILE_DIR "html"
+#define FILE_DIR "html/images"
+#define FILE_DIR "icons"
+#define FILE_DIR "icons/48x48"
+#define FILE_DIR "icons/atmos"
+#define FILE_DIR "icons/effects"
+#define FILE_DIR "icons/mecha"
+#define FILE_DIR "icons/misc"
+#define FILE_DIR "icons/mob"
+#define FILE_DIR "icons/mob/human_races"
+#define FILE_DIR "icons/mob/human_races/cyberlimbs"
+#define FILE_DIR "icons/mob/human_races/masks"
+#define FILE_DIR "icons/mob/human_races/monkeys"
+#define FILE_DIR "icons/mob/human_races/xenos"
+#define FILE_DIR "icons/mob/items"
+#define FILE_DIR "icons/mob/species"
+#define FILE_DIR "icons/mob/species/skrell"
+#define FILE_DIR "icons/mob/species/tajaran"
+#define FILE_DIR "icons/mob/species/unathi"
+#define FILE_DIR "icons/mob/species/vox"
+#define FILE_DIR "icons/NTOS"
+#define FILE_DIR "icons/NTOS/battery_icons"
+#define FILE_DIR "icons/obj"
+#define FILE_DIR "icons/obj/assemblies"
+#define FILE_DIR "icons/obj/atmospherics"
+#define FILE_DIR "icons/obj/clothing"
+#define FILE_DIR "icons/obj/clothing/species"
+#define FILE_DIR "icons/obj/clothing/species/skrell"
+#define FILE_DIR "icons/obj/clothing/species/tajaran"
+#define FILE_DIR "icons/obj/clothing/species/unathi"
+#define FILE_DIR "icons/obj/doors"
+#define FILE_DIR "icons/obj/flora"
+#define FILE_DIR "icons/obj/machines"
+#define FILE_DIR "icons/obj/pipes"
+#define FILE_DIR "icons/pda_icons"
+#define FILE_DIR "icons/spideros_icons"
+#define FILE_DIR "icons/Testing"
+#define FILE_DIR "icons/turf"
+#define FILE_DIR "icons/vending_icons"
+#define FILE_DIR "maps"
+#define FILE_DIR "maps/overmap"
+#define FILE_DIR "maps/overmap/bearcat"
+#define FILE_DIR "nano"
+#define FILE_DIR "nano/images"
+#define FILE_DIR "sound"
+#define FILE_DIR "sound/AI"
+#define FILE_DIR "sound/ambience"
+#define FILE_DIR "sound/effects"
+#define FILE_DIR "sound/effects/turret"
+#define FILE_DIR "sound/effects/wind"
+#define FILE_DIR "sound/hallucinations"
+#define FILE_DIR "sound/items"
+#define FILE_DIR "sound/machines"
+#define FILE_DIR "sound/mecha"
+#define FILE_DIR "sound/misc"
+#define FILE_DIR "sound/music"
+#define FILE_DIR "sound/piano"
+#define FILE_DIR "sound/violin"
+#define FILE_DIR "sound/voice"
+#define FILE_DIR "sound/voice/Serithi"
+#define FILE_DIR "sound/weapons"
+#define FILE_DIR "tools"
+#define FILE_DIR "tools/AddToChangelog"
+#define FILE_DIR "tools/AddToChangelog/AddToChangelog"
// END_FILE_DIR
// BEGIN_PREFERENCES
#define DEBUG
@@ -620,6 +684,7 @@
#include "code\game\objects\items\weapons\kitchen.dm"
#include "code\game\objects\items\weapons\manuals.dm"
#include "code\game\objects\items\weapons\mop.dm"
+#include "code\game\objects\items\weapons\mop_deploy.dm"
#include "code\game\objects\items\weapons\paint.dm"
#include "code\game\objects\items\weapons\paiwire.dm"
#include "code\game\objects\items\weapons\policetape.dm"