diff --git a/strafe-client/src/mouse_interpolator.rs b/strafe-client/src/mouse_interpolator.rs
index d686309..07d2c4c 100644
--- a/strafe-client/src/mouse_interpolator.rs
+++ b/strafe-client/src/mouse_interpolator.rs
@@ -1,11 +1,15 @@
 use strafesnet_common::mouse::MouseState;
 use strafesnet_common::physics::{Instruction as PhysicsInputInstruction,Time as PhysicsTime,TimeInner as PhysicsTimeInner};
 use strafesnet_common::session::{Time as SessionTime,TimeInner as SessionTimeInner};
-use strafesnet_common::instruction::{self,TimedInstruction};
+use strafesnet_common::instruction::{self,InstructionConsumer,InstructionEmitter,TimedInstruction};
 
 type TimedPhysicsInstruction=TimedInstruction<PhysicsInputInstruction,PhysicsTimeInner>;
 type TimedInterpolatorInstruction=TimedInstruction<Instruction,SessionTimeInner>;
 
+pub struct DropInstruction<'a>{
+	instruction:&'a TimedPhysicsInstruction,
+}
+
 #[derive(Debug)]
 pub enum InputInstruction{
 	MoveMouse(glam::IVec2),
@@ -30,25 +34,41 @@ pub enum Instruction{
 }
 
 pub struct MouseInterpolator{
-	timeline:std::collections::VecDeque<>,
+	session_timeline:std::collections::VecDeque<TimedInterpolatorInstruction>,
+	physics_timeline:std::collections::VecDeque<TimedPhysicsInstruction>,
 }
-impl instruction::InstructionConsumer for MouseInterpolator{
-	type Instruction=Instruction;
+impl InstructionConsumer<Instruction> for MouseInterpolator{
 	type TimeInner=SessionTimeInner;
 	fn process_instruction(&mut self,ins:TimedInterpolatorInstruction){
-		self.process_instruction(ins)
+		self.push_input(ins)
+	}
+}
+impl<'a> InstructionConsumer<DropInstruction<'a>> for MouseInterpolator{
+	type TimeInner=SessionTimeInner;
+	fn process_instruction(&mut self,ins:TimedInstruction<DropInstruction<'a>,SessionTimeInner>){
+		self.drop_output(ins)
+	}
+}
+impl<'a> InstructionEmitter<DropInstruction<'a>> for MouseInterpolator{
+	type TimeInner=SessionTimeInner;
+	fn next_instruction(&'a self,time_limit:SessionTime)->Option<TimedInstruction<DropInstruction<'a>,Self::TimeInner>>{
+		self.next_output(time_limit)
 	}
 }
 impl MouseInterpolator{
 	pub fn new()->MouseInterpolator{
 		MouseInterpolator{
-			timeline:std::collections::VecDeque::new(),
+			session_timeline:std::collections::VecDeque::new(),
+			physics_timeline:std::collections::VecDeque::new(),
 		}
 	}
-	pub fn process_instruction(&mut self,ins:TimedInterpolatorInstruction){
+	pub fn push_input(&mut self,ins:TimedInterpolatorInstruction){
 		// new input
 	}
-	pub fn pop_next_instruction(&mut self)->Option<TimedPhysicsInstruction>{
-		// read state and potentially do work to determine the next instruction
+	pub fn drop_output<'a>(&mut self,ins:TimedInstruction<DropInstruction<'a>,SessionTimeInner>){
+		//
+	}
+	pub fn next_output(&self,time_limit:SessionTime)->Option<TimedInstruction<DropInstruction<'_>,SessionTimeInner>>{
+		None
 	}
 }