diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index 806047ae37..e90a67bc0c 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -69,8 +69,37 @@
/obj/item/weapon/implant/tracking
name = "tracking implant"
desc = "Track with this."
- var/id = 1.0
+ var/id = 1
+ var/degrade_time = 10 MINUTES //How long before the implant stops working outside of a living body.
+/obj/item/weapon/implant/tracking/weak //This is for the loadout
+ degrade_time = 2.5 MINUTES
+
+/obj/item/weapon/implant/tracking/New()
+ id = rand(1, 1000)
+ ..()
+
+/obj/item/weapon/implant/tracking/implanted(var/mob/source)
+ processing_objects.Add(src)
+ listening_objects |= src
+ return 1
+
+/obj/item/weapon/implant/tracking/Destroy()
+ processing_objects.Remove(src)
+ ..()
+
+/obj/item/weapon/implant/tracking/process()
+ var/implant_location = src.loc
+ if(ismob(implant_location))
+ var/mob/living/L = implant_location
+ if(L.stat == 2)
+ if(world.time >= L.timeofdeath + degrade_time)
+ name = "melted implant"
+ desc = "Charred circuit in melted plastic case. Wonder what that used to be..."
+ icon_state = "implant_melted"
+ malfunction = MALFUNCTION_PERMANENT
+ processing_objects.Remove(src)
+ return 1
/obj/item/weapon/implant/tracking/get_data()
var/dat = {"Implant Specifications:
diff --git a/code/game/objects/items/weapons/implants/implantpad.dm b/code/game/objects/items/weapons/implants/implantpad.dm
index dc054536ac..ebc01c6ebb 100644
--- a/code/game/objects/items/weapons/implants/implantpad.dm
+++ b/code/game/objects/items/weapons/implants/implantpad.dm
@@ -82,7 +82,7 @@
if (href_list["tracking_id"])
var/obj/item/weapon/implant/tracking/T = src.case.imp
T.id += text2num(href_list["tracking_id"])
- T.id = min(100, T.id)
+ T.id = min(1000, T.id)
T.id = max(1, T.id)
if (istype(src.loc, /mob))
diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm
index b27ef63a4a..e0e11a6285 100644
--- a/code/game/objects/items/weapons/teleportation.dm
+++ b/code/game/objects/items/weapons/teleportation.dm
@@ -79,13 +79,8 @@ Frequency:
src.temp += "Extranneous Signals:
"
for (var/obj/item/weapon/implant/tracking/W in world)
- if (!W.implanted || !(istype(W.loc,/obj/item/organ/external) || ismob(W.loc)))
+ if (!W.implanted || !(istype(W.loc,/obj/item/organ/external) || ismob(W.loc) || W.malfunction))
continue
- else
- var/mob/M = W.loc
- if (M.stat == 2)
- if (M.timeofdeath + 6000 < world.time)
- continue
var/turf/tr = get_turf(W)
if (tr.z == sr.z && tr)
diff --git a/code/modules/client/preference_setup/loadout/loadout_utility.dm b/code/modules/client/preference_setup/loadout/loadout_utility.dm
index 5e7fa24d9f..b990906fea 100644
--- a/code/modules/client/preference_setup/loadout/loadout_utility.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_utility.dm
@@ -76,12 +76,17 @@
display_name = "cell, device"
path = /obj/item/weapon/cell/device
-/datum/gear/utility/implant //This does nothing if you don't actually know EAL.
+/datum/gear/utility/implant/eal //This does nothing if you don't actually know EAL.
display_name = "implant, language, EAL"
path = /obj/item/weapon/implant/language/eal
cost = 2
slot = "implant"
- var/implant_type = "EAL"
+
+/datum/gear/utility/implant/tracking
+ display_name = "implant, tracking"
+ path = /obj/item/weapon/implant/tracking/weak
+ cost = 10
+ slot = "implant"
/datum/gear/utility/translator
display_name = "universal translator"
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 96f5dddc42..6e3fbe4305 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -1649,12 +1649,13 @@
for(var/obj/item/weapon/implant/I in src)
if(I.implanted)
- if(istype(I,/obj/item/weapon/implant/tracking))
- holder1.icon_state = "hud_imp_tracking"
- if(istype(I,/obj/item/weapon/implant/loyalty))
- holder2.icon_state = "hud_imp_loyal"
- if(istype(I,/obj/item/weapon/implant/chem))
- holder3.icon_state = "hud_imp_chem"
+ if(!I.malfunction)
+ if(istype(I,/obj/item/weapon/implant/tracking))
+ holder1.icon_state = "hud_imp_tracking"
+ if(istype(I,/obj/item/weapon/implant/loyalty))
+ holder2.icon_state = "hud_imp_loyal"
+ if(istype(I,/obj/item/weapon/implant/chem))
+ holder3.icon_state = "hud_imp_chem"
hud_list[IMPTRACK_HUD] = holder1
hud_list[IMPLOYAL_HUD] = holder2