diff --git a/code/_onclick/hud/action.dm b/code/_onclick/hud/action.dm
index c1442fe2e9c..507090fdb4e 100644
--- a/code/_onclick/hud/action.dm
+++ b/code/_onclick/hud/action.dm
@@ -264,4 +264,36 @@
if(owner.mind)
if(target in owner.mind.spell_list)
return 0
- return !(target in owner.mob_spell_list)
\ No newline at end of file
+ return !(target in owner.mob_spell_list)
+
+
+//Action button controlling a mob's research examine ability.
+/datum/action/scan_mode
+ name = "Toggle Research Scanner"
+ button_icon_state = "scan_mode"
+ check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_ALIVE
+ action_type = AB_INNATE
+ var/devices = 0 //How may enabled scanners the mob has
+
+/datum/action/scan_mode/Activate()
+ active = 1
+ owner.research_scanner = 1
+ owner << " Research analyzer is now active."
+
+/datum/action/scan_mode/Deactivate()
+ active = 0
+ owner.research_scanner = 0
+ owner << " Research analyzer deactivated."
+
+/datum/action/scan_mode/Grant(mob/living/T)
+ devices += 1
+ ..(T)
+
+/datum/action/scan_mode/CheckRemoval(mob/living/user)
+ if(devices)
+ return 0
+ return 1
+
+/datum/action/scan_mode/Remove(mob/living/T)
+ owner.research_scanner = 0
+ ..(T)
\ No newline at end of file
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index a58d351dc4c..b6f5ec56cd5 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -189,7 +189,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s
msg += "[capitalize(copytext(mat, 2))]
" //Capitize first word, remove the "$"
else
msg += "No extractable materials detected.
"
- msg += "*--------*
"
+ msg += "*--------*"
user << msg
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index b4e82d05bd8..c033703bc83 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -38,11 +38,12 @@
item_state = "glasses"
/obj/item/clothing/glasses/science/equipped(mob/user, slot)
- user.research_scanner = 1
+ if(slot == slot_glasses)
+ user.scanner.Grant(user)
..(user, slot)
/obj/item/clothing/glasses/science/dropped(mob/user)
- user.research_scanner = initial(user.research_scanner) //Because some mobs might have it defaulted to 1.
+ user.scanner.devices -= 1
..(user)
/obj/item/clothing/glasses/night
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 47e6064953f..143d308367d 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -325,11 +325,11 @@
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 100, bio = 100, rad = 60)
/obj/item/clothing/head/helmet/space/hardsuit/rd/equipped(mob/user, slot)
- user.research_scanner = 1
+ user.scanner.Grant(user)
..(user, slot)
/obj/item/clothing/head/helmet/space/hardsuit/rd/dropped(mob/user)
- user.research_scanner = 0
+ user.scanner.devices -= 1
..(user)
/obj/item/clothing/suit/space/hardsuit/rd
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 905052b3ef0..bf1f812ae1f 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -125,6 +125,7 @@
playsound(loc, 'sound/voice/liveagain.ogg', 75, 1)
aicamera = new/obj/item/device/camera/siliconcam/robot_camera(src)
toner = 40
+ scanner.Grant(src)
//If there's an MMI in the robot, have it ejected when the mob goes away. --NEO
/mob/living/silicon/robot/Destroy()
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
index fafff43c6e0..3d449c4d653 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
@@ -80,6 +80,8 @@
var/obj/item/I = new default_hatmask(src)
equip_to_slot_or_del(I, slot_head)
+ scanner.Grant(src)
+
alert_drones(DRONE_NET_CONNECT)
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index a3beaa4912a..ddda848c270 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -94,6 +94,7 @@
var/datum/hud/hud_used = null
var/research_scanner = 0 //For research scanner equipped mobs. Enable to show research data when examining.
+ var/datum/action/scan_mode/scanner = new
var/list/grabbed_by = list( )
var/list/requests = list( )
diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi
index 0beea599900..d4a903af875 100644
Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ