diff --git a/code/modules/admin/list_free_slots.dm b/code/modules/admin/list_free_slots.dm
new file mode 100644
index 00000000000..56e7db96c24
--- /dev/null
+++ b/code/modules/admin/list_free_slots.dm
@@ -0,0 +1,18 @@
+/datum/admins/proc/list_free_slots()
+ if(!check_rights())
+ return
+ var/dat = "
List Free Slots"
+ var/count = 0
+
+ if(job_master)
+ for(var/datum/job/job in job_master.occupations)
+ count++
+ var/J_title = html_encode(job.title)
+ var/J_totPos = html_encode(job.total_positions)
+ dat += "[J_title]: [J_totPos]
"
+
+ dat += ""
+ var/winheight = 100 + (count * 20)
+ winheight = min(winheight, 690)
+ usr << browse(dat, "window=players;size=316x[winheight]")
+
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 8d2ca7527d4..3e9af944833 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -470,9 +470,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
if (!holder)
src << "Only administrators may use this command."
return
- if(job_master)
- for(var/datum/job/job in job_master.occupations)
- src << "[job.title]: [job.total_positions]"
+ holder.list_free_slots()
feedback_add_details("admin_verb","LFS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in world)
diff --git a/tgstation.dme b/tgstation.dme
index a2bf33fc3f8..0044d4d8eef 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -671,6 +671,7 @@
#include "code\modules\admin\create_turf.dm"
#include "code\modules\admin\holder2.dm"
#include "code\modules\admin\IsBanned.dm"
+#include "code\modules\admin\list_free_slots.dm"
#include "code\modules\admin\NewBan.dm"
#include "code\modules\admin\newbanjob.dm"
#include "code\modules\admin\player_notes.dm"