diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm
index bb9785286dc..115a5ae59d2 100644
--- a/code/game/gamemodes/changeling/powers/absorb.dm
+++ b/code/game/gamemodes/changeling/powers/absorb.dm
@@ -94,7 +94,7 @@
for(var/language in T.languages)
if(!(language in absorbed_languages))
absorbed_languages += language
- T.changeling_update_languages(absorbed_languages)
+ user.changeling_update_languages(absorbed_languages)
absorbedcount++
store_dna(new_dna, user)
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 40dd8959564..5dd8178c3b5 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -82,6 +82,23 @@
if (!species.name == "Machine")
return
+ if("wag")
+ if(species.bodyflags & TAIL_WAGGING)
+ if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space))
+ message = "[src] starts wagging \his tail."
+ src.start_tail_wagging(1)
+ else
+ return
+ else
+ return
+
+ if("swag")
+ if(species.bodyflags & TAIL_WAGGING)
+ message = "[src] stops wagging \his tail."
+ src.stop_tail_wagging(1)
+ else
+ return
+
if ("airguitar")
if (!src.restrained())
message = "[src] is strumming the air and headbanging like a safari chimp."
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 937c85bce8e..c565c3d7be5 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -1000,6 +1000,30 @@ proc/get_damage_icon_part(damage_state, body_part)
update_icons()
+/mob/living/carbon/human/proc/start_tail_wagging(var/update_icons=1)
+ overlays_standing[TAIL_LAYER] = null
+
+ if(species.tail && species.bodyflags & HAS_TAIL)
+ var/icon/tailw_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]w_s")
+ tailw_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
+
+ overlays_standing[TAIL_LAYER] = image(tailw_s)
+
+ if(update_icons)
+ update_icons()
+
+/mob/living/carbon/human/proc/stop_tail_wagging(var/update_icons=1)
+ overlays_standing[TAIL_LAYER] = null
+
+ if(species.tail && species.bodyflags & HAS_TAIL)
+ var/icon/tail_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_s")
+ tail_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
+
+ overlays_standing[TAIL_LAYER] = image(tail_s)
+
+ if(update_icons)
+ update_icons()
+
//Adds a collar overlay above the helmet layer if the suit has one
// Suit needs an identically named sprite in icons/mob/collar.dmi
/mob/living/carbon/human/proc/update_collar(var/update_icons=1)
diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm
index 02587d04994..d19baa5caad 100644
--- a/code/modules/mob/living/carbon/species.dm
+++ b/code/modules/mob/living/carbon/species.dm
@@ -354,11 +354,15 @@
primitive = /mob/living/carbon/monkey/tajara
flags = HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT
- bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR
+ bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING
flesh_color = "#AFA59E"
base_color = "#333333"
+/datum/species/tajaran/handle_death(var/mob/living/carbon/human/H)
+
+ H.stop_tail_wagging(1)
+
/datum/species/skrell
name = "Skrell"
icobase = 'icons/mob/human_races/r_skrell.dmi'
diff --git a/code/setup.dm b/code/setup.dm
index ad983fa5a43..bcf254f95a3 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -844,6 +844,7 @@ var/list/restricted_camera_networks = list( //Those networks can only be accesse
#define HAS_TAIL 8
#define HAS_SKIN_TONE 16
#define HAS_SKIN_COLOR 32
+#define TAIL_WAGGING 64
//Language flags.
#define WHITELISTED 1 // Language is available if the speaker is whitelisted.
diff --git a/icons/effects/species.dmi b/icons/effects/species.dmi
index d5405066ab9..a4562fd8d75 100644
Binary files a/icons/effects/species.dmi and b/icons/effects/species.dmi differ
diff --git a/maps/cyberiad.dmm b/maps/cyberiad.dmm
index 77c8ce078cd..6012a798fc9 100644
--- a/maps/cyberiad.dmm
+++ b/maps/cyberiad.dmm
@@ -6783,7 +6783,7 @@
"cAw" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
"cAx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
"cAy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
-"cAz" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{name = "Engineering Maintenance"; req_access_txt = "10"; req_one_access_txt = null},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/engine/engineering)
+"cAz" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{name = "Engineering Maintenance"; req_access_txt = "10"; req_one_access_txt = null},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/maintenance/engi_shuttle)
"cAA" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/engine/engineering)
"cAB" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/wall/r_wall,/area)
"cAC" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/engine/chiefs_office)