anchor.diff:  	var/cost = 1 // How much energy from storage it costs
   	var/merge_type = null // This path and its children should merge with this stack, defaults to src.type
   
  -/obj/item/stack/New(var/loc, var/amount=null)
  +/obj/item/stack/Initialize(mapload, new_amount=null)
   	..()
  -	if (amount)
  -		src.amount = amount
  +	if(new_amount)
  +		amount = new_amount
   	if(!merge_type)
  -		merge_type = src.type
  -	return
  +		merge_type = type
  +	for(var/obj/item/stack/S in loc)
  +		if(S.merge_type == merge_type)
  +			merge(S)
   
   /obj/item/stack/Destroy()
   	if (usr && usr.machine==src)
   		usr << browse(null, "window=stack")
  -	return ..()
  +	. = ..()
   
   /obj/item/stack/examine(mob/user)
   	..()
  
positive.code: 		merge(S)
  		user << "<span class='notice'>Your [S.name] stack now contains [S.get_amount()] [S.singular_name]\s.</span>"
  	else
  		return ..()
  
  /obj/item/stack/proc/copy_evidences(obj/item/stack/from as obj)
  	src.blood_DNA = from.blood_DNA
  
negative.code: 	update_icon()
  
  /obj/item/stack/proc/merge(obj/item/stack/S) //Merge src into S, as much as possible
  	if(QDELETED(S) || QDELETED(src) || S == src) //amusingly this can cause a stack to consume itself, let's not allow that.
  		return
  	var/transfer = get_amount()
  	if(S.is_cyborg)
  