diff --git a/src/physics.rs b/src/physics.rs
index a3d99c4f..81c98f4e 100644
--- a/src/physics.rs
+++ b/src/physics.rs
@@ -1398,10 +1398,9 @@ fn teleport(
 }
 enum TeleportToSpawnError{
 	NoModel,
-	NoSpawn,
 }
 fn teleport_to_spawn(
-	stage_id:gameplay_modes::StageId,
+	stage:&gameplay_modes::Stage,
 	move_state:&mut MoveState,
 	body:&mut Body,
 	touching:&mut TouchingState,
@@ -1416,8 +1415,7 @@ fn teleport_to_spawn(
 	input_state:&InputState,
 	time:Time,
 )->Result<(),TeleportToSpawnError>{
-	let model_id=mode.get_spawn_model_id(stage_id).ok_or(TeleportToSpawnError::NoSpawn)?;
-	let transform=models.get_model_transform(model_id).ok_or(TeleportToSpawnError::NoModel)?;
+	let transform=models.get_model_transform(stage.spawn()).ok_or(TeleportToSpawnError::NoModel)?;
 	let point=transform.vertex.transform_point3(Planar64Vec3::Y)+Planar64Vec3::Y*(style.hitbox.halfsize.y()+Planar64::ONE/16);
 	teleport(point,move_state,body,touching,run,mode_state,Some(mode),models,hitbox_mesh,bvh,style,camera,input_state,time);
 	Ok(())
@@ -1452,7 +1450,7 @@ fn run_teleport_behaviour(
 				if let Some(current_stage)=mode.get_stage(mode_state.get_stage_id()){
 					if !current_stage.is_complete(mode_state.ordered_checkpoint_count(),mode_state.unordered_checkpoint_count()){
 						//do the stage checkpoints have to be reset?
-						teleport_to_spawn(mode_state.get_stage_id(),move_state,body,touching,run,mode_state,mode,models,hitbox_mesh,bvh,style,camera,input_state,time);
+						let _=teleport_to_spawn(current_stage,move_state,body,touching,run,mode_state,mode,models,hitbox_mesh,bvh,style,camera,input_state,time);
 						return;
 					}
 				}
@@ -1464,7 +1462,7 @@ fn run_teleport_behaviour(
 					match mode.get_stage(stage_id){
 						Some(stage)=>if !stage.is_empty(){
 							mode_state.set_stage_id(stage_id);
-							teleport_to_spawn(stage_id,move_state,body,touching,run,mode_state,mode,models,hitbox_mesh,bvh,style,camera,input_state,time);
+							let _=teleport_to_spawn(stage,move_state,body,touching,run,mode_state,mode,models,hitbox_mesh,bvh,style,camera,input_state,time);
 							return;
 						},
 						None=>{
@@ -1488,7 +1486,7 @@ fn run_teleport_behaviour(
 				gameplay_modes::StageElementBehaviour::Trigger
 				|gameplay_modes::StageElementBehaviour::Teleport=>{
 					//I guess this is correct behaviour when trying to teleport to a non-existent spawn but it's still weird
-					teleport_to_spawn(mode_state.get_stage_id(),move_state,body,touching,run,mode_state,mode,models,hitbox_mesh,bvh,style,camera,input_state,time);
+					let _=teleport_to_spawn(stage,move_state,body,touching,run,mode_state,mode,models,hitbox_mesh,bvh,style,camera,input_state,time);
 					return;
 				},
 				gameplay_modes::StageElementBehaviour::Platform=>(),
@@ -1868,12 +1866,14 @@ fn atomic_input_instruction(state:&mut PhysicsState,data:&PhysicsData,ins:TimedI
 					PhysicsInputInstruction::Spawn(mode_id,stage_id)=>{
 						//spawn at a particular stage
 						if let Some(mode)=data.modes.get_mode(mode_id){
-							teleport_to_spawn(
-								stage_id,
-								&mut state.move_state,&mut state.body,&mut state.touching,&mut state.run,&mut state.mode_state,
-								mode,
-								&data.models,&data.hitbox_mesh,&data.bvh,&state.style,&state.camera,&state.input_state,state.time
-							);
+							if let Some(stage)=mode.get_stage(stage_id){
+								let _=teleport_to_spawn(
+									stage,
+									&mut state.move_state,&mut state.body,&mut state.touching,&mut state.run,&mut state.mode_state,
+									mode,
+									&data.models,&data.hitbox_mesh,&data.bvh,&state.style,&state.camera,&state.input_state,state.time
+								);
+							}
 						}
 						b_refresh_walk_target=false;
 					},