diff --git a/code/game/objects/items/devices/PDA/virus_cart.dm b/code/game/objects/items/devices/PDA/virus_cart.dm
new file mode 100644
index 0000000000..17c66cac10
--- /dev/null
+++ b/code/game/objects/items/devices/PDA/virus_cart.dm
@@ -0,0 +1,108 @@
+/obj/item/weapon/cartridge/virus
+ name = "Generic Virus PDA cart"
+ var/charges = 5
+
+/obj/item/weapon/cartridge/virus/proc/send_virus(obj/item/device/pda/target, mob/living/U)
+ return
+
+/obj/item/weapon/cartridge/virus/message_header()
+ return "[charges] viral files left.
"
+
+/obj/item/weapon/cartridge/virus/message_special(obj/item/device/pda/target)
+ if (!istype(loc, /obj/item/device/pda))
+ return "" //Sanity check, this shouldn't be possible.
+ return " (*Send Virus*)"
+
+/obj/item/weapon/cartridge/virus/special(mob/living/user, list/params)
+ var/obj/item/device/pda/P = locate(params["target"])//Leaving it alone in case it may do something useful, I guess.
+ send_virus(P,user)
+
+/obj/item/weapon/cartridge/virus/clown
+ name = "\improper Honkworks 5.0 cartridge"
+ icon_state = "cart-clown"
+ desc = "A data cartridge for portable microcomputers. It smells vaguely of banannas"
+ access_clown = 1
+
+/obj/item/weapon/cartridge/virus/clown/send_virus(obj/item/device/pda/target, mob/living/U)
+ if(charges <= 0)
+ to_chat(U, "Out of charges.")
+ return
+ if(!isnull(target) && !target.toff)
+ charges--
+ to_chat(U, "Virus Sent!")
+ target.honkamt = (rand(15,20))
+ else
+ to_chat(U, "PDA not found.")
+
+/obj/item/weapon/cartridge/virus/mime
+ name = "\improper Gestur-O 1000 cartridge"
+ icon_state = "cart-mi"
+ access_mime = 1
+
+/obj/item/weapon/cartridge/virus/mime/send_virus(obj/item/device/pda/target, mob/living/U)
+ if(charges <= 0)
+ to_chat(U, "Out of charges.")
+ return
+ if(!isnull(target) && !target.toff)
+ charges--
+ to_chat(U, "Virus Sent!")
+ target.silent = 1
+ target.ttone = "silence"
+ else
+ to_chat(U, "PDA not found.")
+
+/obj/item/weapon/cartridge/virus/syndicate
+ name = "\improper Detomatix cartridge"
+ icon_state = "cart"
+ access_remote_door = 1
+ remote_door_id = "smindicate" //Make sure this matches the syndicate shuttle's shield/door id!! //don't ask about the name, testing.
+ charges = 4
+
+/obj/item/weapon/cartridge/virus/syndicate/send_virus(obj/item/device/pda/target, mob/living/U)
+ if(charges <= 0)
+ to_chat(U, "Out of charges.")
+ return
+ if(!isnull(target) && !target.toff)
+ charges--
+ var/difficulty = 0
+ if(target.cartridge)
+ difficulty += target.cartridge.access_medical
+ difficulty += target.cartridge.access_security
+ difficulty += target.cartridge.access_engine
+ difficulty += target.cartridge.access_clown
+ difficulty += target.cartridge.access_janitor
+ difficulty += target.cartridge.access_manifest * 2
+ else
+ difficulty += 2
+ if(prob(difficulty * 15) || (target.hidden_uplink))
+ U.show_message("An error flashes on your [src].", 1)
+ else
+ U.show_message("Success!", 1)
+ target.explode()
+ else
+ to_chat(U, "PDA not found.")
+
+/obj/item/weapon/cartridge/virus/frame
+ name = "\improper F.R.A.M.E. cartridge"
+ icon_state = "cart"
+ var/telecrystals = 0
+
+/obj/item/weapon/cartridge/virus/frame/send_virus(obj/item/device/pda/target, mob/living/U)
+ if(charges <= 0)
+ to_chat(U, "Out of charges.")
+ return
+ if(!isnull(target) && !target.toff)
+ charges--
+ var/lock_code = "[rand(100,999)] [pick("Alpha","Bravo","Charlie","Delta","Echo","Foxtrot","Golf","Hotel","India","Juliet","Kilo","Lima","Mike","November","Oscar","Papa","Quebec","Romeo","Sierra","Tango","Uniform","Victor","Whiskey","X-ray","Yankee","Zulu")]"
+ to_chat(U, "Virus Sent! The unlock code to the target is: [lock_code]")
+ if(!target.hidden_uplink)
+ var/obj/item/device/uplink/uplink = new(target)
+ target.hidden_uplink = uplink
+ target.lock_code = lock_code
+ else
+ target.hidden_uplink.hidden_crystals += target.hidden_uplink.telecrystals //Temporarially hide the PDA's crystals, so you can't steal telecrystals.
+ target.hidden_uplink.telecrystals = telecrystals
+ telecrystals = 0
+ target.hidden_uplink.active = TRUE
+ else
+ to_chat(U, "PDA not found.")
diff --git a/icons/effects/throw_target.dmi b/icons/effects/throw_target.dmi
new file mode 100644
index 0000000000..660eafbf2b
Binary files /dev/null and b/icons/effects/throw_target.dmi differ
diff --git a/sound/voice/ApproachingTG.ogg b/sound/voice/ApproachingTG.ogg
new file mode 100644
index 0000000000..bc4b6f5f21
Binary files /dev/null and b/sound/voice/ApproachingTG.ogg differ