diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 0501caf3db1..127acb23565 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -109,6 +109,7 @@
var/rename_cyborg = 0
var/ooc_during_round = 0
+ var/emojis = 0
//Used for modifying movement speed for mobs.
//Unversal modifiers
@@ -300,6 +301,8 @@
config.rename_cyborg = 1
if("ooc_during_round")
config.ooc_during_round = 1
+ if("emojis")
+ config.emojis = 1
if("run_delay")
config.run_speed = text2num(value)
if("walk_delay")
diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm
index 2eb21269c60..20e86957187 100644
--- a/code/game/verbs/ooc.dm
+++ b/code/game/verbs/ooc.dm
@@ -43,6 +43,8 @@
if(prefs.toggles & MEMBER_PUBLIC)
keyname = "
[keyname]"
+ msg = emoji_parse(msg)
+
for(var/client/C in clients)
if(C.prefs.toggles & CHAT_OOC)
if(holder)
diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm
index 038d9d88553..39b8899c4b2 100644
--- a/code/modules/admin/verbs/adminpm.dm
+++ b/code/modules/admin/verbs/adminpm.dm
@@ -68,6 +68,8 @@
msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN))
if(!msg) return
+ msg = emoji_parse(msg)
+
if(C.holder)
if(holder) //both are admins
C << "Admin PM from-[key_name(src, C, 1)]: [msg]"
diff --git a/code/modules/emoji/emoji_parse.dm b/code/modules/emoji/emoji_parse.dm
new file mode 100644
index 00000000000..aab9947c89e
--- /dev/null
+++ b/code/modules/emoji/emoji_parse.dm
@@ -0,0 +1,32 @@
+var/list/emojis
+
+/proc/emoji_parse(text)
+ if(!config.emojis)
+ return text
+ if(!emojis)
+ emojis = icon_states(icon('icons/emoji.dmi'))
+ var/parsed = ""
+ var/pos = 1
+ var/search = 0
+ var/emoji = ""
+ while(1)
+ search = findtext(text, ":", pos)
+ parsed += copytext(text, pos, search)
+ if(search)
+ pos = search
+ search = findtext(text, ":", pos+1)
+ if(search)
+ emoji = lowertext(copytext(text, pos+1, search))
+ if(emoji in emojis)
+ parsed += "
"
+ pos = search + 1
+ else
+ parsed += copytext(text, pos, search)
+ pos = search
+ emoji = ""
+ continue
+ else
+ parsed += copytext(text, pos, search)
+ break
+ return parsed
+
diff --git a/config/game_options.txt b/config/game_options.txt
index 7f469d35001..00fad47a4de 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -27,6 +27,10 @@ REVIVAL_BRAIN_LIFE -1
#Comment this out if you want OOC to be automatically disabled during the round, it will be enabled during the lobby and after the round end results.
OOC_DURING_ROUND
+### EMOJI ###
+#Comment this out if you want to disable emojis
+EMOJIS
+
### MOB MOVEMENT ###
## We suggest editing these variables ingame to find a good speed for your server.
diff --git a/html/changelogs/JJRcop-OOCemoji.yml b/html/changelogs/JJRcop-OOCemoji.yml
new file mode 100644
index 00000000000..fa65b93fb7e
--- /dev/null
+++ b/html/changelogs/JJRcop-OOCemoji.yml
@@ -0,0 +1,4 @@
+author: JJRcop, Nienhaus
+delete-after: True
+changes:
+ - rscadd: "Adds emoji to OOC chat."
\ No newline at end of file
diff --git a/icons/emoji.dmi b/icons/emoji.dmi
new file mode 100644
index 00000000000..a78a7e3df79
Binary files /dev/null and b/icons/emoji.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 810fa7af430..0e7af4bc429 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -854,6 +854,7 @@
#include "code\modules\detectivework\evidence.dm"
#include "code\modules\detectivework\footprints_and_rag.dm"
#include "code\modules\detectivework\scanner.dm"
+#include "code\modules\emoji\emoji_parse.dm"
#include "code\modules\events\alien_infestation.dm"
#include "code\modules\events\anomaly.dm"
#include "code\modules\events\anomaly_bluespace.dm"