anchor.diff:  			type_or_datum = get_cached_movespeed_modifier(type_or_datum)
   		else
   			type_or_datum = new type_or_datum
  -	var/oldpriority
   	var/datum/movespeed_modifier/existing = LAZYACCESS(movespeed_modification, type_or_datum.id)
   	if(existing)
   		if(existing == type_or_datum)		//same thing don't need to touch
   			return TRUE
   		oldpriority = existing.priority
   		remove_movespeed_modifier(existing, FALSE)
  +	LAZYINITLIST(movespeed_modification)
  +	var/listlen = length(movespeed_modification)
  +	if(!listlen)
  +		movespeed_modification[type_or_datum.id] = type_or_datum
  +	else
  +		var/left = 1
  +		var/right = listlen
  +		var/mid = (left + right) >> 1
  +		var/datum/movespeed_modifier/curr
  +		while(left < right)
  +			var/id = movespeed_modification[mid]
  +			curr = movespeed_modification[id]
  +			if(curr.priority <= type_or_datum.priority)
  +				left = mid + 1
  +			else
  +				right = mid
  +			mid = (left + right) >> 1
  +		curr = movespeed_modification[mid]
  +		mid = curr.priority > type_or_datum.priority? mid : mid + 1
  +		movespeed_modification.Insert(mid, type_or_datum.id)
  +		movespeed_modification[type_or_datum.id] = type_or_datum
   	LAZYSET(movespeed_modification, type_or_datum.id, type_or_datum)
  -	var/resort = type_or_datum.priority == oldpriority
   	if(update)
  -		update_movespeed(resort)
  +		update_movespeed()
   	return TRUE
   
   /// Remove a move speed modifier from a mob, whether static or variable.
  
positive.code: 	. = TRUE
  	if(M.multiplicative_slowdown)
  		. = FALSE
  
  /**
    * Sort the list of move speed modifiers
    *
    * Verifies it too. Sorts highest priority (first applied) to lowest priority (last applied)
    */
  /mob/proc/sort_movespeed_modlist()
  	if(!movespeed_modification)
  		return
  	var/list/assembled = list()
  	for(var/our_id in movespeed_modification)
  		var/datum/movespeed_modifier/M = movespeed_modification[our_id]
  		if(movespeed_data_null_check(M))
  			movespeed_modification -= our_id
  			continue
  		var/our_priority = M.priority
  		var/resolved = FALSE
  		for(var/their_id in assembled)
  			var/datum/movespeed_modifier/other = assembled[their_id]
  			if(other.priority < our_priority)
  				assembled.Insert(assembled.Find(their_id), our_id)
  				assembled[our_id] = M
  				resolved = TRUE
  				break
  		if(!resolved)
  			assembled[our_id] = M
  	movespeed_modification = assembled
  	UNSETEMPTY(movespeed_modification)
  
negative.code: 		return GLOB.mob_config_movespeed_type_lookup[type]
  
  ///Go through the list of movespeed modifiers and calculate a final movespeed
  /mob/proc/update_movespeed()
  	. = 0
  	var/list/conflict_tracker = list()
  	for(var/id in get_movespeed_modifiers())
  