diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 043f96d19d6..52b20188bda 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -1268,6 +1268,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/chameleon
cost = 7
+/datum/uplink_item/stealthy_tools/chameleon_counter
+ name = "Chameleon Counterfeiter"
+ desc = "This device disguises itself as any object scanned by it. The disguise is not a perfect replica and can be noticed when examined by an observer."
+ reference = "CC"
+ item = /obj/item/chameleon_counterfeiter
+ cost = 2
+
/datum/uplink_item/stealthy_tools/camera_bug
name = "Camera Bug"
desc = "Enables you to view all cameras on the network to track a target."
diff --git a/code/game/objects/items/devices/chameleon_counter.dm b/code/game/objects/items/devices/chameleon_counter.dm
new file mode 100644
index 00000000000..502a81865ee
--- /dev/null
+++ b/code/game/objects/items/devices/chameleon_counter.dm
@@ -0,0 +1,77 @@
+/obj/item/chameleon_counterfeiter
+ name = "chameleon counterfeiter"
+ icon = 'icons/obj/device.dmi'
+ icon_state = "cham_counter"
+ flags = CONDUCT
+ slot_flags = SLOT_BELT
+ item_state = "electronic"
+ w_class = WEIGHT_CLASS_SMALL
+ origin_tech = "syndicate=3;magnets=3"
+ var/can_use = TRUE
+ var/saved_name
+ var/saved_desc
+ var/saved_icon
+ var/saved_icon_state
+ var/saved_item_state
+ var/saved_overlays
+ var/saved_underlays
+ var/dummy_active = FALSE
+
+/obj/item/chameleon_counterfeiter/examine(mob/user)
+ . = ..()
+ if(dummy_active)
+ . += "It doesn't look quite right..."
+
+/obj/item/chameleon_counterfeiter/afterattack(obj/item/target, mob/user, proximity)
+ if(!proximity || !check_sprite(target) || target.alpha < 255 || target.invisibility != 0)
+ return
+ if(dummy_active || !isitem(target))
+ return
+ playsound(get_turf(src), 'sound/weapons/flash.ogg', 100, 1, -6)
+ to_chat(user, "Scanned [target].")
+ saved_name = target.name
+ saved_desc = target.desc
+ saved_icon = target.icon
+ saved_icon_state = target.icon_state
+ saved_item_state = target.item_state
+ saved_overlays = target.overlays
+ saved_underlays = target.underlays
+
+/obj/item/chameleon_counterfeiter/proc/check_sprite(atom/target)
+ return (target.icon_state in icon_states(target.icon))
+
+/obj/item/chameleon_counterfeiter/proc/matter_toggle(mob/living/user)
+ if(!can_use || !saved_name)
+ return
+ playsound(get_turf(src), 'sound/effects/pop.ogg', 100, 1, -6)
+ if(dummy_active)
+ matter_deactivate()
+ to_chat(user, "You deactivate [src].")
+ else
+ to_chat(user, "You activate [src].")
+ matter_activate()
+
+/obj/item/chameleon_counterfeiter/proc/matter_activate()
+ name = saved_name
+ desc = saved_desc
+ icon = saved_icon
+ icon_state = saved_icon_state
+ item_state = saved_item_state
+ overlays = saved_overlays
+ underlays = saved_underlays
+ dummy_active = TRUE
+
+/obj/item/chameleon_counterfeiter/proc/matter_deactivate()
+ name = initial(name)
+ desc = initial(desc)
+ icon = initial(icon)
+ icon_state = initial(icon_state)
+ item_state = initial(item_state)
+ overlays = initial(overlays)
+ underlays = initial(underlays)
+ dummy_active = FALSE
+ can_use = FALSE
+ addtimer(VARSET_CALLBACK(src, can_use, TRUE), 3 SECONDS)
+
+/obj/item/chameleon_counterfeiter/attack_self(mob/living/user)
+ matter_toggle(user)
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 6f5251c9ba8..2c9dee8178c 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 86447f6f077..24cd8caacc9 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -893,6 +893,7 @@
#include "code\game\objects\items\devices\aicard.dm"
#include "code\game\objects\items\devices\autopsy.dm"
#include "code\game\objects\items\devices\camera_bug.dm"
+#include "code\game\objects\items\devices\chameleon_counter.dm"
#include "code\game\objects\items\devices\chameleonproj.dm"
#include "code\game\objects\items\devices\enginepicker.dm"
#include "code\game\objects\items\devices\flash.dm"