diff --git a/strafe-client/src/physics.rs b/strafe-client/src/physics.rs
index 16bbe48..c3fdc60 100644
--- a/strafe-client/src/physics.rs
+++ b/strafe-client/src/physics.rs
@@ -20,6 +20,8 @@ type MouseState=strafesnet_common::mouse::MouseState<TimeInner>;
 //external influence
 //this is how you influence the physics from outside
 use strafesnet_common::physics::Instruction as PhysicsInputInstruction;
+use strafesnet_common::physics::OtherInstruction as PhysicsOtherInstruction;
+use strafesnet_common::physics::MouseInstruction as PhysicsMouseInstruction;
 
 //internal influence
 //when the physics asks itself what happens next, this is how it's represented
@@ -1751,22 +1753,22 @@ fn atomic_input_instruction(state:&mut PhysicsState,data:&PhysicsData,ins:TimedI
 	let should_advance_body=match ins.instruction{
 		//the body may as well be a quantum wave function
 		//as far as these instruction are concerned (they don't care where it is)
-		PhysicsInputInstruction::SetSensitivity(..)
-		|PhysicsInputInstruction::Reset
-		|PhysicsInputInstruction::Restart
-		|PhysicsInputInstruction::Spawn(..)
-		|PhysicsInputInstruction::SetZoom(..)
-		|PhysicsInputInstruction::Idle=>false,
+		PhysicsInputInstruction::Other(PhysicsOtherInstruction::SetSensitivity(..))
+		|PhysicsInputInstruction::Other(PhysicsOtherInstruction::Reset)
+		|PhysicsInputInstruction::Other(PhysicsOtherInstruction::Restart)
+		|PhysicsInputInstruction::Other(PhysicsOtherInstruction::Spawn(..))
+		|PhysicsInputInstruction::Other(PhysicsOtherInstruction::SetZoom(..))
+		|PhysicsInputInstruction::Other(PhysicsOtherInstruction::Idle)=>false,
 		//these controls only update the body if you are on the ground
-		PhysicsInputInstruction::SetNextMouse(..)
-		|PhysicsInputInstruction::ReplaceMouse(..)
-		|PhysicsInputInstruction::SetMoveForward(..)
-		|PhysicsInputInstruction::SetMoveLeft(..)
-		|PhysicsInputInstruction::SetMoveBack(..)
-		|PhysicsInputInstruction::SetMoveRight(..)
-		|PhysicsInputInstruction::SetMoveUp(..)
-		|PhysicsInputInstruction::SetMoveDown(..)
-		|PhysicsInputInstruction::SetJump(..)=>{
+		PhysicsInputInstruction::Mouse(PhysicsMouseInstruction::SetNextMouse(..))
+		|PhysicsInputInstruction::Mouse(PhysicsMouseInstruction::ReplaceMouse{..})
+		|PhysicsInputInstruction::Other(PhysicsOtherInstruction::SetMoveForward(..))
+		|PhysicsInputInstruction::Other(PhysicsOtherInstruction::SetMoveLeft(..))
+		|PhysicsInputInstruction::Other(PhysicsOtherInstruction::SetMoveBack(..))
+		|PhysicsInputInstruction::Other(PhysicsOtherInstruction::SetMoveRight(..))
+		|PhysicsInputInstruction::Other(PhysicsOtherInstruction::SetMoveUp(..))
+		|PhysicsInputInstruction::Other(PhysicsOtherInstruction::SetMoveDown(..))
+		|PhysicsInputInstruction::Other(PhysicsOtherInstruction::SetJump(..))=>{
 			match &state.move_state{
 				MoveState::Fly
 				|MoveState::Water
@@ -1776,100 +1778,100 @@ fn atomic_input_instruction(state:&mut PhysicsState,data:&PhysicsData,ins:TimedI
 			}
 		},
 		//the body must be updated unconditionally
-		PhysicsInputInstruction::PracticeFly=>true,
+		PhysicsInputInstruction::Other(PhysicsOtherInstruction::PracticeFly)=>true,
 	};
 	if should_advance_body{
 		state.body.advance_time(state.time);
 	}
-	//TODO: UNTAB
-				let mut b_refresh_walk_target=true;
-				match ins.instruction{
-					PhysicsInputInstruction::SetSensitivity(sensitivity)=>state.camera.sensitivity=sensitivity,
-					PhysicsInputInstruction::SetNextMouse(m)=>{
-						state.camera.move_mouse(state.input_state.mouse_delta());
-						state.input_state.set_next_mouse(m);
-					},
-					PhysicsInputInstruction::ReplaceMouse(m0,m1)=>{
-						state.camera.move_mouse(m0.pos-state.input_state.mouse.pos);
-						state.input_state.replace_mouse(m0,m1);
-					},
-					PhysicsInputInstruction::SetMoveForward(s)=>state.input_state.set_control(Controls::MoveForward,s),
-					PhysicsInputInstruction::SetMoveLeft(s)=>state.input_state.set_control(Controls::MoveLeft,s),
-					PhysicsInputInstruction::SetMoveBack(s)=>state.input_state.set_control(Controls::MoveBackward,s),
-					PhysicsInputInstruction::SetMoveRight(s)=>state.input_state.set_control(Controls::MoveRight,s),
-					PhysicsInputInstruction::SetMoveUp(s)=>state.input_state.set_control(Controls::MoveUp,s),
-					PhysicsInputInstruction::SetMoveDown(s)=>state.input_state.set_control(Controls::MoveDown,s),
-					PhysicsInputInstruction::SetJump(s)=>{
-						state.input_state.set_control(Controls::Jump,s);
-						if let Some(walk_state)=state.move_state.get_walk_state(){
-							if let Some(jump_settings)=&state.style.jump{
-								let jump_dir=walk_state.jump_direction.direction(&data.models,&data.hitbox_mesh,&walk_state.contact);
-								let booster_option=data.models.contact_attr(walk_state.contact.model_id).general.booster.as_ref();
-								let jumped_velocity=jump_settings.jumped_velocity(&state.style,jump_dir,state.body.velocity,booster_option);
-								state.cull_velocity(&data,jumped_velocity);
-							}
-						}
-						b_refresh_walk_target=false;
-					},
-					PhysicsInputInstruction::SetZoom(s)=>{
-						state.input_state.set_control(Controls::Zoom,s);
-						b_refresh_walk_target=false;
-					},
-					PhysicsInputInstruction::Reset=>{
-						//totally reset physics state
-						state.reset_to_default();
-						b_refresh_walk_target=false;
-					},
-					PhysicsInputInstruction::Restart=>{
-						//teleport to start zone
-						let mode=data.modes.get_mode(state.mode_state.get_mode_id());
-						let spawn_point=mode.and_then(|mode|
-							//TODO: spawn at the bottom of the start zone plus the hitbox size
-							//TODO: set camera andles to face the same way as the start zone
-							data.models.get_model_transform(mode.get_start().into()).map(|transform|
-								transform.vertex.translation
-							)
-						).unwrap_or(vec3::ZERO);
-						set_position(spawn_point,&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);
-						set_velocity(&mut state.body,&state.touching,&data.models,&data.hitbox_mesh,vec3::ZERO);
-						state.set_move_state(data,MoveState::Air);
-						b_refresh_walk_target=false;
-					}
-					PhysicsInputInstruction::Spawn(mode_id,stage_id)=>{
-						//spawn at a particular stage
-						if let Some(mode)=data.modes.get_mode(mode_id){
-							if let Some(stage)=mode.get_stage(stage_id){
-								let _=teleport_to_spawn(
-									stage.spawn(),
-									&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;
-					},
-					PhysicsInputInstruction::PracticeFly=>{
-						match &state.move_state{
-							MoveState::Fly=>{
-								state.set_move_state(data,MoveState::Air);
-							},
-							_=>{
-								state.set_move_state(data,MoveState::Fly);
-							},
-						}
-						b_refresh_walk_target=false;
-					},
-					PhysicsInputInstruction::Idle=>{
-						//literally idle!
-						b_refresh_walk_target=false;
-					},
+
+	let mut b_refresh_walk_target=true;
+	match ins.instruction{
+		PhysicsInputInstruction::Mouse(PhysicsMouseInstruction::SetNextMouse(m))=>{
+			state.camera.move_mouse(state.input_state.mouse_delta());
+			state.input_state.set_next_mouse(m);
+		},
+		PhysicsInputInstruction::Mouse(PhysicsMouseInstruction::ReplaceMouse{m0,m1})=>{
+			state.camera.move_mouse(m0.pos-state.input_state.mouse.pos);
+			state.input_state.replace_mouse(m0,m1);
+		},
+		PhysicsInputInstruction::Other(PhysicsOtherInstruction::SetSensitivity(sensitivity))=>state.camera.sensitivity=sensitivity,
+		PhysicsInputInstruction::Other(PhysicsOtherInstruction::SetMoveForward(s))=>state.input_state.set_control(Controls::MoveForward,s),
+		PhysicsInputInstruction::Other(PhysicsOtherInstruction::SetMoveLeft(s))=>state.input_state.set_control(Controls::MoveLeft,s),
+		PhysicsInputInstruction::Other(PhysicsOtherInstruction::SetMoveBack(s))=>state.input_state.set_control(Controls::MoveBackward,s),
+		PhysicsInputInstruction::Other(PhysicsOtherInstruction::SetMoveRight(s))=>state.input_state.set_control(Controls::MoveRight,s),
+		PhysicsInputInstruction::Other(PhysicsOtherInstruction::SetMoveUp(s))=>state.input_state.set_control(Controls::MoveUp,s),
+		PhysicsInputInstruction::Other(PhysicsOtherInstruction::SetMoveDown(s))=>state.input_state.set_control(Controls::MoveDown,s),
+		PhysicsInputInstruction::Other(PhysicsOtherInstruction::SetJump(s))=>{
+			state.input_state.set_control(Controls::Jump,s);
+			if let Some(walk_state)=state.move_state.get_walk_state(){
+				if let Some(jump_settings)=&state.style.jump{
+					let jump_dir=walk_state.jump_direction.direction(&data.models,&data.hitbox_mesh,&walk_state.contact);
+					let booster_option=data.models.contact_attr(walk_state.contact.model_id).general.booster.as_ref();
+					let jumped_velocity=jump_settings.jumped_velocity(&state.style,jump_dir,state.body.velocity,booster_option);
+					state.cull_velocity(&data,jumped_velocity);
 				}
-				if b_refresh_walk_target{
-					state.apply_input_and_body(data);
-					state.cull_velocity(data,state.body.velocity);
-					//also check if accelerating away from surface
+			}
+			b_refresh_walk_target=false;
+		},
+		PhysicsInputInstruction::Other(PhysicsOtherInstruction::SetZoom(s))=>{
+			state.input_state.set_control(Controls::Zoom,s);
+			b_refresh_walk_target=false;
+		},
+		PhysicsInputInstruction::Other(PhysicsOtherInstruction::Reset)=>{
+			//totally reset physics state
+			state.reset_to_default();
+			b_refresh_walk_target=false;
+		},
+		PhysicsInputInstruction::Other(PhysicsOtherInstruction::Restart)=>{
+			//teleport to start zone
+			let mode=data.modes.get_mode(state.mode_state.get_mode_id());
+			let spawn_point=mode.and_then(|mode|
+				//TODO: spawn at the bottom of the start zone plus the hitbox size
+				//TODO: set camera andles to face the same way as the start zone
+				data.models.get_model_transform(mode.get_start().into()).map(|transform|
+					transform.vertex.translation
+				)
+			).unwrap_or(vec3::ZERO);
+			set_position(spawn_point,&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);
+			set_velocity(&mut state.body,&state.touching,&data.models,&data.hitbox_mesh,vec3::ZERO);
+			state.set_move_state(data,MoveState::Air);
+			b_refresh_walk_target=false;
+		}
+		PhysicsInputInstruction::Other(PhysicsOtherInstruction::Spawn(mode_id,stage_id))=>{
+			//spawn at a particular stage
+			if let Some(mode)=data.modes.get_mode(mode_id){
+				if let Some(stage)=mode.get_stage(stage_id){
+					let _=teleport_to_spawn(
+						stage.spawn(),
+						&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;
+		},
+		PhysicsInputInstruction::Other(PhysicsOtherInstruction::PracticeFly)=>{
+			match &state.move_state{
+				MoveState::Fly=>{
+					state.set_move_state(data,MoveState::Air);
+				},
+				_=>{
+					state.set_move_state(data,MoveState::Fly);
+				},
+			}
+			b_refresh_walk_target=false;
+		},
+		PhysicsInputInstruction::Other(PhysicsOtherInstruction::Idle)=>{
+			//literally idle!
+			b_refresh_walk_target=false;
+		},
+	}
+	if b_refresh_walk_target{
+		state.apply_input_and_body(data);
+		state.cull_velocity(data,state.body.velocity);
+		//also check if accelerating away from surface
+	}
 }
 
 #[cfg(test)]