anchor.diff:    * * extra_classes - Extra classes to apply to the span that holds the text
     * * lifespan - The lifespan of the message in deciseconds
     */
  -/datum/chatmessage/New(text, atom/target, mob/owner, list/extra_classes = null, lifespan = CHAT_MESSAGE_LIFESPAN)
  +/datum/chatmessage/New(text, atom/target, mob/owner, list/extra_classes = list(), lifespan = CHAT_MESSAGE_LIFESPAN)
   	. = ..()
   	if (!istype(target))
   		CRASH("Invalid target given for chatmessage")
  
positive.code: /datum/chatmessage/proc/generate_image(text, atom/target, mob/owner, list/extra_classes, lifespan)
  	// Register client who owns this message
  	owned_by = owner.client
  	RegisterSignal(owned_by, COMSIG_PARENT_QDELETING, .proc/qdel, src)
  
  	// Clip message
  	var/maxlen = owned_by.prefs.max_chat_length
  
negative.code:   */
  /mob/proc/create_chat_message(atom/movable/speaker, datum/language/message_language, raw_message, list/spans, message_mode)
  	// Ensure the list we are using, if present, is a copy so we don't modify the list provided to us
  	spans = spans ? spans.Copy() : list()
  
  	// Check for virtual speakers (aka hearing a message through a radio)
  	var/atom/movable/originalSpeaker = speaker
  