anchor.diff:  
   /datum/pipeline/proc/build_pipeline(obj/machinery/atmospherics/base)
   	var/volume = 0
  -	if(istype(base, /obj/machinery/atmospherics/pipe))
  -		var/obj/machinery/atmospherics/pipe/E = base
  -		volume = E.volume
  -		members += E
  -		if(E.air_temporary)
  -			air = E.air_temporary
  -			E.air_temporary = null
  +	if(!istype(base, /obj/machinery/atmospherics/pipe))
  +		addMachineryMember(base)
   	else
  -		addMachineryMember(base)
  +		var/obj/machinery/atmospherics/pipe/considered_pipe = base
  +		volume = considered_pipe.volume
  +		members += considered_pipe
  +		if(considered_pipe.air_temporary)
  +			air = considered_pipe.air_temporary
  +			considered_pipe.air_temporary = null
  +
   	if(!air)
   		air = new
   	var/list/possible_expansions = list(base)
   	while(possible_expansions.len)
   		for(var/obj/machinery/atmospherics/borderline in possible_expansions)
   			var/list/result = borderline.pipeline_expansion(src)
  -			if(result?.len)
  -				for(var/obj/machinery/atmospherics/P in result)
  -					if(istype(P, /obj/machinery/atmospherics/pipe))
  -						var/obj/machinery/atmospherics/pipe/item = P
  -						if(!members.Find(item))
  -
  -							if(item.parent)
  -								var/static/pipenetwarnings = 10
  -								if(pipenetwarnings > 0)
  -									log_mapping("build_pipeline(): [item.type] added to a pipenet while still having one. (pipes leading to the same spot stacking in one turf) around [AREACOORD(item)].")
  -									pipenetwarnings--
  -									if(pipenetwarnings == 0)
  -										log_mapping("build_pipeline(): further messages about pipenets will be suppressed")
  -							members += item
  -							possible_expansions += item
  -
  -							volume += item.volume
  -							item.parent = src
  -
  -							if(item.air_temporary)
  -								air.merge(item.air_temporary)
  -								item.air_temporary = null
  -					else
  -						P.setPipenet(src, borderline)
  -						addMachineryMember(P)
  +			if(!result?.len)
  +				possible_expansions -= borderline
  +				continue
  +			for(var/obj/machinery/atmospherics/considered_device in result)
  +				if(!istype(considered_device, /obj/machinery/atmospherics/pipe))
  +					considered_device.setPipenet(src, borderline)
  +					addMachineryMember(considered_device)
  +					continue
  +				var/obj/machinery/atmospherics/pipe/item = considered_device
  +				if(members.Find(item))
  +					continue
  +				if(item.parent)
  +					var/static/pipenetwarnings = 10
  +					if(pipenetwarnings > 0)
  +						log_mapping("build_pipeline(): [item.type] added to a pipenet while still having one. (pipes leading to the same spot stacking in one turf) around [AREACOORD(item)].")
  +						pipenetwarnings--
  +					if(pipenetwarnings == 0)
  +						log_mapping("build_pipeline(): further messages about pipenets will be suppressed")
  +
  +				members += item
  +				possible_expansions += item
  +
  +				volume += item.volume
  +				item.parent = src
  +
  +				if(item.air_temporary)
  +					air.merge(item.air_temporary)
  +					item.air_temporary = null
   
   			possible_expansions -= borderline
   
   	air.volume = volume
   
  -/datum/pipeline/proc/addMachineryMember(obj/machinery/atmospherics/components/C)
  -	other_atmosmch |= C
  -	var/datum/gas_mixture/G = C.returnPipenetAir(src)
  -	if(!G)
  -		stack_trace("addMachineryMember: Null gasmix added to pipeline datum from [C] which is of type [C.type]. Nearby: ([C.x], [C.y], [C.z])")
  -	other_airs |= G
  -
  -/datum/pipeline/proc/addMember(obj/machinery/atmospherics/A, obj/machinery/atmospherics/N)
  -	if(istype(A, /obj/machinery/atmospherics/pipe))
  -		var/obj/machinery/atmospherics/pipe/P = A
  -		if(P.parent)
  -			merge(P.parent)
  -		P.parent = src
  -		var/list/adjacent = P.pipeline_expansion()
  -		for(var/obj/machinery/atmospherics/pipe/I in adjacent)
  -			if(I.parent == src)
  +/datum/pipeline/proc/addMachineryMember(obj/machinery/atmospherics/components/considered_component)
  +	other_atmosmch |= considered_component
  +	var/datum/gas_mixture/component_mixture = considered_component.returnPipenetAir(src)
  +	if(!component_mixture)
  +		stack_trace("addMachineryMember: Null gasmix added to pipeline datum from [considered_component] \
  +		which is of type [considered_component.type]. Nearby: ([considered_component.x], [considered_component.y], [considered_component.z])")
  +	other_airs |= component_mixture
  +
  +/datum/pipeline/proc/addMember(obj/machinery/atmospherics/reference_device, obj/machinery/atmospherics/device_to_add)
  +	if(!istype(reference_device, /obj/machinery/atmospherics/pipe))
  +		reference_device.setPipenet(src, device_to_add)
  +		addMachineryMember(reference_device)
  +	else
  +		var/obj/machinery/atmospherics/pipe/reference_pipe = reference_device
  +		if(reference_pipe.parent)
  +			merge(reference_pipe.parent)
  +		reference_pipe.parent = src
  +		var/list/adjacent = reference_pipe.pipeline_expansion()
  +		for(var/obj/machinery/atmospherics/pipe/adjacent_pipe in adjacent)
  +			if(adjacent_pipe.parent == src)
   				continue
  -			var/datum/pipeline/E = I.parent
  -			merge(E)
  -		if(!members.Find(P))
  -			members += P
  -			air.volume += P.volume
  -	else
  -		A.setPipenet(src, N)
  -		addMachineryMember(A)
  -
  -/datum/pipeline/proc/merge(datum/pipeline/E)
  -	if(E == src)
  +			var/datum/pipeline/parent_pipeline = adjacent_pipe.parent
  +			merge(parent_pipeline)
  +		if(!members.Find(reference_pipe))
  +			members += reference_pipe
  +			air.volume += reference_pipe.volume
  +
  +/datum/pipeline/proc/merge(datum/pipeline/parent_pipeline)
  +	if(parent_pipeline == src)
   		return
  -	air.volume += E.air.volume
  -	members.Add(E.members)
  -	for(var/obj/machinery/atmospherics/pipe/S in E.members)
  -		S.parent = src
  -	air.merge(E.air)
  -	for(var/obj/machinery/atmospherics/components/C in E.other_atmosmch)
  -		C.replacePipenet(E, src)
  -	other_atmosmch.Add(E.other_atmosmch)
  -	other_airs.Add(E.other_airs)
  -	E.members.Cut()
  -	E.other_atmosmch.Cut()
  +	air.volume += parent_pipeline.air.volume
  +	members.Add(parent_pipeline.members)
  +	for(var/obj/machinery/atmospherics/pipe/reference_pipe in parent_pipeline.members)
  +		reference_pipe.parent = src
  +	air.merge(parent_pipeline.air)
  +	for(var/obj/machinery/atmospherics/components/reference_component in parent_pipeline.other_atmosmch)
  +		reference_component.replacePipenet(parent_pipeline, src)
  +	other_atmosmch.Add(parent_pipeline.other_atmosmch)
  +	other_airs.Add(parent_pipeline.other_airs)
  +	parent_pipeline.members.Cut()
  +	parent_pipeline.other_atmosmch.Cut()
   	update = TRUE
  -	qdel(E)
  -
  -/obj/machinery/atmospherics/proc/addMember(obj/machinery/atmospherics/A)
  +	qdel(parent_pipeline)
  +
  +/obj/machinery/atmospherics/proc/addMember(obj/machinery/atmospherics/considered_device)
   	return
   
  -/obj/machinery/atmospherics/pipe/addMember(obj/machinery/atmospherics/A)
  -	parent.addMember(A, src)
  -
  -/obj/machinery/atmospherics/components/addMember(obj/machinery/atmospherics/A)
  -	var/datum/pipeline/P = returnPipenet(A)
  -	if(!P)
  +/obj/machinery/atmospherics/pipe/addMember(obj/machinery/atmospherics/considered_device)
  +	parent.addMember(considered_device, src)
  +
  +/obj/machinery/atmospherics/components/addMember(obj/machinery/atmospherics/considered_device)
  +	var/datum/pipeline/device_pipeline = returnPipenet(considered_device)
  +	if(!device_pipeline)
   		CRASH("null.addMember() called by [type] on [COORD(src)]")
  -	P.addMember(A, src)
  +	device_pipeline.addMember(considered_device, src)
   
   
   /datum/pipeline/proc/temporarily_store_air()
  
positive.code: 			total_gases[giver_id][MOLES] += giver_gas_data[MOLES]
  			total_heat_capacity += giver_gas_data[MOLES] * giver_gas_data[GAS_META][META_GAS_SPECIFIC_HEAT]
  
  		total_thermal_energy += THERMAL_ENERGY(G)
  
  	total_gas_mixture.temperature = total_heat_capacity ? total_thermal_energy/total_heat_capacity : 0
  
  	if(total_gas_mixture.volume > 0)
  		//Update individual gas_mixtures by volume ratio
  		for(var/i in GL)
  			var/datum/gas_mixture/G = i
  			G.copy_from(total_gas_mixture, G.volume/total_gas_mixture.volume)
  
negative.code: 	for(var/obj/machinery/atmospherics/pipe/member in members)
  		member.air_temporary = new
  		member.air_temporary.volume = member.volume
  		member.air_temporary.copy_from(air, member.volume / air.volume)
  
  		member.air_temporary.temperature = air.temperature
  
  /datum/pipeline/proc/temperature_interact(turf/target, share_volume, thermal_conductivity)
  	var/total_heat_capacity = air.heat_capacity()
  	var/partial_heat_capacity = total_heat_capacity * (share_volume / air.volume)
  	var/target_temperature
  	var/target_heat_capacity
  
  