diff --git a/2020-08_psu-breakout/2020-08_psu-breakout.brd b/2020-08_psu-breakout/2020-08_psu-breakout.brd
index 431f2ca78e99aae59e30f2244159925e29e6f4e7..839e1c55767dcdfcd87489d7aeb7b9c4bcc8d1f9 100644
--- a/2020-08_psu-breakout/2020-08_psu-breakout.brd
+++ b/2020-08_psu-breakout/2020-08_psu-breakout.brd
@@ -1067,7 +1067,7 @@ design rules under a new name.</description>
 <attribute name="NAME" x="27.686" y="41.402" size="1.016" layer="25"/>
 <attribute name="VALUE" x="27.559" y="37.592" size="1.016" layer="27" ratio="10"/>
 </element>
-<element name="R8" library="passives" package="1206" value="1k" x="33.655" y="40.005" smashed="yes" rot="R180">
+<element name="R8" library="passives" package="1206" value="470R" x="33.655" y="40.005" smashed="yes" rot="R180">
 <attribute name="NAME" x="34.417" y="39.1795" size="1.016" layer="25" rot="R180"/>
 <attribute name="PACKAGE" value="1206" x="33.655" y="40.005" size="1.016" layer="27" rot="R180" display="off"/>
 <attribute name="PRECISION" value="" x="33.655" y="40.005" size="1.016" layer="27" rot="R180" display="off"/>
@@ -1081,7 +1081,7 @@ design rules under a new name.</description>
 <attribute name="NAME" x="27.686" y="38.862" size="1.016" layer="25"/>
 <attribute name="VALUE" x="27.559" y="35.052" size="1.016" layer="27" ratio="10"/>
 </element>
-<element name="R9" library="passives" package="1206" value="1k" x="33.655" y="37.465" smashed="yes" rot="R180">
+<element name="R9" library="passives" package="1206" value="470R" x="33.655" y="37.465" smashed="yes" rot="R180">
 <attribute name="NAME" x="34.417" y="36.6395" size="1.016" layer="25" rot="R180"/>
 <attribute name="PACKAGE" value="1206" x="33.655" y="37.465" size="1.016" layer="27" rot="R180" display="off"/>
 <attribute name="PRECISION" value="" x="33.655" y="37.465" size="1.016" layer="27" rot="R180" display="off"/>
@@ -1095,7 +1095,7 @@ design rules under a new name.</description>
 <attribute name="NAME" x="27.686" y="36.322" size="1.016" layer="25"/>
 <attribute name="VALUE" x="27.559" y="32.512" size="1.016" layer="27" ratio="10"/>
 </element>
-<element name="R10" library="passives" package="1206" value="1k" x="33.655" y="34.925" smashed="yes" rot="R180">
+<element name="R10" library="passives" package="1206" value="470R" x="33.655" y="34.925" smashed="yes" rot="R180">
 <attribute name="NAME" x="34.417" y="34.0995" size="1.016" layer="25" rot="R180"/>
 <attribute name="PACKAGE" value="1206" x="33.655" y="34.925" size="1.016" layer="27" rot="R180" display="off"/>
 <attribute name="PRECISION" value="" x="33.655" y="34.925" size="1.016" layer="27" rot="R180" display="off"/>
@@ -1109,7 +1109,7 @@ design rules under a new name.</description>
 <attribute name="NAME" x="27.686" y="33.782" size="1.016" layer="25"/>
 <attribute name="VALUE" x="27.559" y="29.972" size="1.016" layer="27" ratio="10"/>
 </element>
-<element name="R11" library="passives" package="1206" value="1k" x="33.655" y="32.385" smashed="yes" rot="R180">
+<element name="R11" library="passives" package="1206" value="470R" x="33.655" y="32.385" smashed="yes" rot="R180">
 <attribute name="NAME" x="34.417" y="31.5595" size="1.016" layer="25" rot="R180"/>
 <attribute name="PACKAGE" value="1206" x="33.655" y="32.385" size="1.016" layer="27" rot="R180" display="off"/>
 <attribute name="PRECISION" value="" x="33.655" y="32.385" size="1.016" layer="27" rot="R180" display="off"/>
@@ -1209,7 +1209,7 @@ design rules under a new name.</description>
 <attribute name="NAME" x="27.305" y="31.115" size="1.27" layer="25"/>
 <attribute name="VALUE" x="27.305" y="27.305" size="1.27" layer="27"/>
 </element>
-<element name="R7" library="passives" package="1206" value="1k" x="33.655" y="29.845" smashed="yes" rot="R180">
+<element name="R7" library="passives" package="1206" value="470R" x="33.655" y="29.845" smashed="yes" rot="R180">
 <attribute name="NAME" x="34.925" y="28.702" size="1.016" layer="25" rot="R180"/>
 <attribute name="PACKAGE" value="1206" x="33.655" y="29.845" size="1.778" layer="27" font="vector" rot="R180" display="off"/>
 <attribute name="PRECISION" value="" x="33.655" y="29.845" size="1.778" layer="27" font="vector" rot="R180" display="off"/>
diff --git a/2020-08_psu-breakout/2020-08_psu-breakout.sch b/2020-08_psu-breakout/2020-08_psu-breakout.sch
index c8fcd248597077d894ecd61f405760bdc1548fdf..7d589fc8e7378aa39d5966fff6a8473539ddc561 100644
--- a/2020-08_psu-breakout/2020-08_psu-breakout.sch
+++ b/2020-08_psu-breakout/2020-08_psu-breakout.sch
@@ -6325,22 +6325,22 @@ chip</description>
 <part name="GND11" library="supply1" deviceset="GND" device=""/>
 <part name="GND12" library="supply1" deviceset="GND" device=""/>
 <part name="D2" library="lights" deviceset="LED" device="1206" value="LED1206"/>
-<part name="R8" library="passives" deviceset="RESISTOR" device="1206" value="1k"/>
+<part name="R8" library="passives" deviceset="RESISTOR" device="1206" value="470R"/>
 <part name="+3V4" library="supply1" deviceset="+3V3" device=""/>
 <part name="J15" library="SparkFun-Connectors" deviceset="CONN_02" device="LOCK"/>
 <part name="GND17" library="supply1" deviceset="GND" device=""/>
 <part name="D3" library="lights" deviceset="LED" device="1206" value="LED1206"/>
-<part name="R9" library="passives" deviceset="RESISTOR" device="1206" value="1k"/>
+<part name="R9" library="passives" deviceset="RESISTOR" device="1206" value="470R"/>
 <part name="+3V5" library="supply1" deviceset="+3V3" device=""/>
 <part name="J16" library="SparkFun-Connectors" deviceset="CONN_02" device="LOCK"/>
 <part name="GND18" library="supply1" deviceset="GND" device=""/>
 <part name="D4" library="lights" deviceset="LED" device="1206" value="LED1206"/>
-<part name="R10" library="passives" deviceset="RESISTOR" device="1206" value="1k"/>
+<part name="R10" library="passives" deviceset="RESISTOR" device="1206" value="470R"/>
 <part name="+3V6" library="supply1" deviceset="+3V3" device=""/>
 <part name="J17" library="SparkFun-Connectors" deviceset="CONN_02" device="LOCK"/>
 <part name="GND19" library="supply1" deviceset="GND" device=""/>
 <part name="D5" library="lights" deviceset="LED" device="1206" value="LED1206"/>
-<part name="R11" library="passives" deviceset="RESISTOR" device="1206" value="1k"/>
+<part name="R11" library="passives" deviceset="RESISTOR" device="1206" value="470R"/>
 <part name="+3V7" library="supply1" deviceset="+3V3" device=""/>
 <part name="J18" library="SparkFun-Connectors" deviceset="CONN_02" device="LOCK"/>
 <part name="GND20" library="supply1" deviceset="GND" device=""/>
@@ -6390,7 +6390,7 @@ chip</description>
 <part name="P+5" library="supply1" deviceset="+5V" device=""/>
 <part name="P+6" library="supply1" deviceset="+5V" device=""/>
 <part name="D9" library="lights" deviceset="LED" device="1206" value="LED1206"/>
-<part name="R7" library="passives" deviceset="RESISTOR" device="1206" value="1k"/>
+<part name="R7" library="passives" deviceset="RESISTOR" device="1206" value="470R"/>
 <part name="+3V3" library="supply1" deviceset="+3V3" device=""/>
 <part name="J20" library="SparkFun-Connectors" deviceset="CONN_02" device="LOCK"/>
 <part name="GND7" library="supply1" deviceset="GND" device=""/>
diff --git a/2020-08_psu-breakout/eagle.epf b/2020-08_psu-breakout/eagle.epf
index feb367dcc15c27b094bce4a5c72d7d3eda413b49..a2531fdcf2f0a0e9e7cea3795e9aea20bf786a62 100644
--- a/2020-08_psu-breakout/eagle.epf
+++ b/2020-08_psu-breakout/eagle.epf
@@ -19,7 +19,7 @@ UsedLibrary="C:/Dropbox/CBA/circuits/eagle/parts/SparkFun-Eagle-Libraries/SparkF
 Type="Schematic Editor"
 Number=1
 File="2020-08_psu-breakout.sch"
-View="-45.293 31.146 556.518 211.07"
+View="191.998 139.609 359.952 189.822"
 WireWidths=" 0.0762 0.1016 0.127 0.15 0.2 0.2032 0.254 0.3048 0.4064 0.508 0.6096 0.8128 1.016 1.27 2.54 0.1524"
 PadDiameters=" 0.254 0.3048 0.4064 0.6096 0.8128 1.016 1.27 1.4224 1.6764 1.778 1.9304 2.1844 2.54 3.81 6.4516 0"
 PadDrills=" 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.65 0.7 0.75 0.8 0.85 0.9 1 0.6"
@@ -58,14 +58,14 @@ ArcDirection=0
 AddLevel=2
 PadsSameType=0
 Layer=91
-Views=" 1: -45.293 31.146 556.518 211.07"
+Views=" 1: 191.998 139.609 359.952 189.822"
 Sheet="1"
 
 [Win_2]
 Type="Board Editor"
 Number=2
 File="2020-08_psu-breakout.brd"
-View="12.384 -7.24152 122.016 84.5385"
+View="22.6761 -7.9544 114.036 68.529"
 WireWidths=" 0.1016 0.15 0.2 2.54 0 0.508 0.2032 0.254 0.3048 0.4064 0.1524 1.016 1.27 0.127 0.6096 0.8128"
 PadDiameters=" 0.254 0.3048 0.4064 0.6096 0.8128 1.016 1.27 1.4224 1.6764 1.778 1.9304 2.1844 2.54 3.81 6.4516 0"
 PadDrills=" 0.2 0.25 0.3 0.35 0.4 0.5 0.55 0.65 0.7 0.75 0.8 0.85 0.9 1 0.6 0.45"
diff --git a/README.md b/README.md
index 7b27c117f331c72eec7c0397999c0a1d3c8c70ef..4b0b884e2996a33952c1dca1fc547a0de054a4b6 100644
--- a/README.md
+++ b/README.md
@@ -18,4 +18,21 @@ This is a circuit & mount for a small power supply and embedded system bus-head
 
 ### Firmware 
 
-I use this board mostly as the 'coordinator' for modular motion systems, firmware is [here](firmware) and uses platform.io to run, see [this guide](https://mtm.cba.mit.edu/2021/2021-10_microcontroller-primer/fab-platformio/) to build and load code. 
\ No newline at end of file
+I use this board mostly as the 'coordinator' for modular motion systems, firmware is [here](firmware) and uses platform.io to run, see [this guide](https://mtm.cba.mit.edu/2021/2021-10_microcontroller-primer/fab-platformio/) to build and load code. 
+
+### Shorthand BOM 
+
+- 7x 470R / 120R / LED Choice R 
+- 3x 1k 
+- 2x 4k7 
+- 2x 10k
+- 4x 1uF
+- 4x 10uF
+- 8x LED,
+- TVS Diode 
+- 2x Hi-Side Gate DRV MIC5014 
+- 3x NFET TPW4R008NH
+- Optional I2C Display 
+- Optional 4x Pushbutton 
+- Optional Pololu D36V50F5 Regulator (PSU -> RPI)
+- Optional RPI 
\ No newline at end of file
diff --git a/firmware/motion-head/src/indicators.h b/firmware/motion-head/src/indicators.h
index e95b9991def2041a1aa24c658bbc6c09b9adf279..5de5ba9fb781ee179d87d937e937fcf6afbc3750 100644
--- a/firmware/motion-head/src/indicators.h
+++ b/firmware/motion-head/src/indicators.h
@@ -1,61 +1,55 @@
-// indicators for the module
-// older module (with smt debug) these are *not routed* my mistake 
-// newer module they are PA27 and PB08 respectively
-#define CLKLIGHT_PIN 27
-#define CLKLIGHT_PORT PORT->Group[0]
-#define CLKLIGHT_BM (uint32_t)(1 << CLKLIGHT_PIN)
-#define CLKLIGHT_ON CLKLIGHT_PORT.OUTCLR.reg = CLKLIGHT_BM
-#define CLKLIGHT_OFF CLKLIGHT_PORT.OUTSET.reg = CLKLIGHT_BM
-#define CLKLIGHT_TOGGLE CLKLIGHT_PORT.OUTTGL.reg = CLKLIGHT_BM
-#define CLKLIGHT_SETUP CLKLIGHT_PORT.DIRSET.reg = CLKLIGHT_BM; CLKLIGHT_OFF
-
-#define ERRLIGHT_PIN 8
-#define ERRLIGHT_PORT PORT->Group[1]
-#define ERRLIGHT_BM (uint32_t)(1 << ERRLIGHT_PIN)
-#define ERRLIGHT_ON ERRLIGHT_PORT.OUTCLR.reg = ERRLIGHT_BM
-#define ERRLIGHT_OFF ERRLIGHT_PORT.OUTSET.reg = ERRLIGHT_BM
-#define ERRLIGHT_TOGGLE ERRLIGHT_PORT.OUTTGL.reg = ERRLIGHT_BM
-#define ERRLIGHT_SETUP ERRLIGHT_PORT.DIRSET.reg = ERRLIGHT_BM; ERRLIGHT_OFF
-
-// PSU-breakout board lights, 
-
-#define DEBUG1PIN_PIN 13
-#define DEBUG1PIN_PORT PORT->Group[0]
-#define DEBUG1PIN_BM (uint32_t)(1 << DEBUG1PIN_PIN)
-#define DEBUG1PIN_HI DEBUG1PIN_PORT.OUTSET.reg = DEBUG1PIN_BM
-#define DEBUG1PIN_LO DEBUG1PIN_PORT.OUTCLR.reg = DEBUG1PIN_BM
-// in the case of the psu-breakout-board, where this code probably lives, pin-hi is led-off, pin-lo is led-on, 
-#define DEBUG1PIN_ON DEBUG1PIN_LO
-#define DEBUG1PIN_OFF DEBUG1PIN_HI
-#define DEBUG1PIN_TOGGLE DEBUG1PIN_PORT.OUTTGL.reg = DEBUG1PIN_BM
-#define DEBUG1PIN_SETUP DEBUG1PIN_PORT.DIRSET.reg = DEBUG1PIN_BM; DEBUG1PIN_HI
-
-#define DEBUG2PIN_PIN 12 
-#define DEBUG2PIN_PORT PORT->Group[0]
-#define DEBUG2PIN_BM (uint32_t)(1 << DEBUG2PIN_PIN)
-#define DEBUG2PIN_HI DEBUG2PIN_PORT.OUTSET.reg = DEBUG2PIN_BM
-#define DEBUG2PIN_LO DEBUG2PIN_PORT.OUTCLR.reg = DEBUG2PIN_BM
-#define DEBUG2PIN_ON DEBUG2PIN_LO
-#define DEBUG2PIN_OFF DEBUG2PIN_HI
-#define DEBUG2PIN_TOGGLE DEBUG2PIN_PORT.OUTTGL.reg = DEBUG2PIN_BM
-#define DEBUG2PIN_SETUP DEBUG2PIN_PORT.DIRSET.reg = DEBUG2PIN_BM; DEBUG2PIN_HI
-
-#define DEBUG3PIN_PIN 15
-#define DEBUG3PIN_PORT PORT->Group[1]
-#define DEBUG3PIN_BM (uint32_t)(1 << DEBUG3PIN_PIN)
-#define DEBUG3PIN_HI DEBUG3PIN_PORT.OUTSET.reg = DEBUG3PIN_BM
-#define DEBUG3PIN_LO DEBUG3PIN_PORT.OUTCLR.reg = DEBUG3PIN_BM
-#define DEBUG3PIN_ON DEBUG3PIN_LO
-#define DEBUG3PIN_OFF DEBUG3PIN_HI
-#define DEBUG3PIN_TOGGLE DEBUG3PIN_PORT.OUTTGL.reg = DEBUG3PIN_BM
-#define DEBUG3PIN_SETUP DEBUG3PIN_PORT.DIRSET.reg = DEBUG3PIN_BM; DEBUG3PIN_HI
-
-#define DEBUG4PIN_PIN 14
-#define DEBUG4PIN_PORT PORT->Group[1]
-#define DEBUG4PIN_BM (uint32_t)(1 << DEBUG4PIN_PIN)
-#define DEBUG4PIN_HI DEBUG4PIN_PORT.OUTSET.reg = DEBUG4PIN_BM
-#define DEBUG4PIN_LO DEBUG4PIN_PORT.OUTCLR.reg = DEBUG4PIN_BM
-#define DEBUG4PIN_ON DEBUG4PIN_LO
-#define DEBUG4PIN_OFF DEBUG4PIN_HI
-#define DEBUG4PIN_TOGGLE DEBUG4PIN_PORT.OUTTGL.reg = DEBUG4PIN_BM
-#define DEBUG4PIN_SETUP DEBUG4PIN_PORT.DIRSET.reg = DEBUG4PIN_BM; DEBUG4PIN_HI
\ No newline at end of file
+// circuit specific indicators: modular-motion-head 2021-08-26 
+
+#define PIN_BM(pin) (uint32_t)(1 << pin)
+#define PIN_HI(port, pin) PORT->Group[port].OUTSET.reg = PIN_BM(pin) 
+#define PIN_LO(port, pin) PORT->Group[port].OUTCLR.reg = PIN_BM(pin) 
+#define PIN_TGL(port, pin) PORT->Group[port].OUTTGL.reg = PIN_BM(pin)
+#define PIN_SETUP_OUTPUT(port, pin) PORT->Group[port].DIRSET.reg = PIN_BM(pin) 
+
+#define CLKLIGHT_ON PIN_LO(0, 27) 
+#define CLKLIGHT_OFF PIN_HI(0, 27)
+#define CLKLIGHT_TOGGLE PIN_TGL(0, 27)
+#define CLKLIGHT_SETUP PIN_SETUP_OUTPUT(0, 27); CLKLIGHT_OFF
+
+#define ERRLIGHT_ON PIN_LO(1, 8)
+#define ERRLIGHT_OFF PIN_HI(1, 8)
+#define ERRLIGHT_TOGGLE PIN_TGL(1, 8)
+#define ERRLIGHT_SETUP PIN_SETUP_OUTPUT(1, 8); ERRLIGHT_OFF
+
+// breakout debugs are pin-to-gnd, 
+// PA13, PA12, PB15, PB14, PA04 
+
+#define DEBUG1PIN_ON PIN_LO(0, 13)
+#define DEBUG1PIN_OFF PIN_HI(0, 13)
+#define DEBUG1PIN_HI PIN_HI(0, 13)
+#define DEBUG1PIN_LO PIN_LO(0, 13)
+#define DEBUG1PIN_TOGGLE PIN_TGL(0, 13)
+#define DEBUG1PIN_SETUP PIN_SETUP_OUTPUT(0, 13); PIN_HI(0, 13)
+
+#define DEBUG2PIN_ON PIN_LO(0, 13)
+#define DEBUG2PIN_OFF PIN_HI(0, 13)
+#define DEBUG2PIN_HI PIN_HI(0, 13)
+#define DEBUG2PIN_LO PIN_LO(0, 13)
+#define DEBUG2PIN_TOGGLE PIN_TGL(0, 13)
+#define DEBUG2PIN_SETUP PIN_SETUP_OUTPUT(0, 13); PIN_HI(0, 13)
+
+#define DEBUG3PIN_ON PIN_LO(1, 15)
+#define DEBUG3PIN_OFF PIN_HI(1, 15)
+#define DEBUG3PIN_HI PIN_HI(1, 15)
+#define DEBUG3PIN_LO PIN_LO(1, 15)
+#define DEBUG3PIN_TOGGLE PIN_TGL(1, 15)
+#define DEBUG3PIN_SETUP PIN_SETUP_OUTPUT(1, 15); PIN_HI(1, 15)
+
+#define DEBUG4PIN_ON PIN_LO(1, 14)
+#define DEBUG4PIN_OFF PIN_HI(1, 14)
+#define DEBUG4PIN_HI PIN_HI(1, 14)
+#define DEBUG4PIN_LO PIN_LO(1, 14)
+#define DEBUG4PIN_TOGGLE PIN_TGL(1, 14)
+#define DEBUG4PIN_SETUP PIN_SETUP_OUTPUT(1, 14); PIN_HI(1, 14)
+
+#define DEBUG5PIN_ON PIN_LO(0, 4)
+#define DEBUG5PIN_OFF PIN_HI(0, 4)
+#define DEBUG5PIN_HI PIN_HI(0, 4)
+#define DEBUG5PIN_LO PIN_LO(0, 4)
+#define DEBUG5PIN_TOGGLE PIN_TGL(0, 4)
+#define DEBUG5PIN_SETUP PIN_SETUP_OUTPUT(0, 4); PIN_HI(0, 4)
diff --git a/firmware/motion-head/src/main.cpp b/firmware/motion-head/src/main.cpp
index 03a3fbe8232456bd11184b6129e01f8903dc7de3..7df92b750df60481e32e22e3a513a5d0dd823727 100644
--- a/firmware/motion-head/src/main.cpp
+++ b/firmware/motion-head/src/main.cpp
@@ -51,7 +51,7 @@ EP_ONDATA_RESPONSES onMoveData(uint8_t* data, uint16_t len){
       // do load 
       float target[3] = {targetChunks[0].f, targetChunks[1].f, targetChunks[2].f };
       //sysError("targets, rate: " + String(target[0], 6) + ", " + String(target[1], 6) + ", " + String(target[2], 6) + ", " + String(feedrateChunk.f, 6));
-      planner->append_move(target, SR_NUM_MOTORS, feedrateChunk.f, targetChunks[3].f); // mm/min -> mm/sec 
+      planner->append_move(target, SR_NUM_MOTORS, feedrateChunk.f, targetChunks[3].f); // it's mm/sec
       return EP_ONDATA_ACCEPT; 
     }
   } else {
@@ -60,15 +60,10 @@ EP_ONDATA_RESPONSES onMoveData(uint8_t* data, uint16_t len){
   }
 }
 
-vertex_t* moveQueueEp = osapBuildEndpoint("moveQueue", onMoveData, nullptr);  // 2
+endpoint_t* moveQueueEp = osapBuildEndpoint("moveQueue", onMoveData);  // 2
 
 // -------------------------------------------------------- POSITION ENDPOINT 
 
-EP_ONDATA_RESPONSES onPositionSet(uint8_t* data, uint16_t len);
-boolean beforePositionQuery(void);
-
-vertex_t* positionEp = osapBuildEndpoint("position", onPositionSet, beforePositionQuery); // 3
-
 EP_ONDATA_RESPONSES onPositionSet(uint8_t* data, uint16_t len){
   // only if it's not moving, 
   if(smoothie_is_moving()){
@@ -88,55 +83,47 @@ EP_ONDATA_RESPONSES onPositionSet(uint8_t* data, uint16_t len){
   }
 }
 
-boolean beforePositionQuery(void){
+endpoint_t* positionEp = osapBuildEndpoint("positions", onPositionSet); // 3
+
+uint8_t posData[16];
+
+void updatePositions(void){
   // write new pos data periodically, 
-  uint8_t posData[16];
   uint16_t poswptr = 0;
   ts_writeFloat32(smoothieRoll->actuators[0]->floating_position, posData, &poswptr);
   ts_writeFloat32(smoothieRoll->actuators[1]->floating_position, posData, &poswptr);
   ts_writeFloat32(smoothieRoll->actuators[2]->floating_position, posData, &poswptr);
   ts_writeFloat32(smoothieRoll->actuators[3]->floating_position, posData, &poswptr);
-  memcpy(positionEp->ep->data, posData, 16);
-  positionEp->ep->dataLen = 16;
-  return true; 
+  endpointWrite(positionEp, posData, 16);
 }
 
 // -------------------------------------------------------- CURRENT SPEEDS
 
-boolean beforeSpeedQuery(void);
-
-vertex_t* speedEp = osapBuildEndpoint("speed", nullptr, beforeSpeedQuery);
+endpoint_t* speedEp = osapBuildEndpoint("speeds");
+uint8_t speedData[16];
 
-boolean beforeSpeedQuery(void){
+void updateSpeeds(void){
   // collect actuator speeds, 
-  uint8_t speedData[16];
   uint16_t wptr = 0;
   ts_writeFloat32(smoothieRoll->actuators[0]->get_current_speed(), speedData, &wptr);
   ts_writeFloat32(smoothieRoll->actuators[1]->get_current_speed(), speedData, &wptr);
   ts_writeFloat32(smoothieRoll->actuators[2]->get_current_speed(), speedData, &wptr);
   ts_writeFloat32(smoothieRoll->actuators[3]->get_current_speed(), speedData, &wptr);
-  memcpy(speedEp->ep->data, speedData, 16);
-  speedEp->ep->dataLen = 16;
-  return true;
+  endpointWrite(speedEp, speedData, 16);
 }
 
 // -------------------------------------------------------- MOTION STATE EP 
 
-boolean beforeMotionStateQuery(void);
+endpoint_t* motionStateEp = osapBuildEndpoint("motionState");  // 4
+uint8_t motionData[1];
 
-vertex_t* motionStateEp = osapBuildEndpoint("motionState", nullptr, beforeMotionStateQuery);  // 4
-
-boolean beforeMotionStateQuery(void){
-  uint8_t motion;
+void updateMotionState(void){
   if(smoothieRoll->actuators[0]->is_moving() || smoothieRoll->actuators[1]->is_moving() || smoothieRoll->actuators[2]->is_moving() || !smoothie_is_queue_empty()){
-    motion = 1;
+    motionData[0] = 1;
   } else {
-    motion = 0;
+    motionData[0] = 0;
   }
-  motionStateEp->ep->data[0] = motion;
-  motionStateEp->ep->dataLen = 1;
-  //sysError("motion query " + String(motion));
-  return true; 
+  endpointWrite(motionStateEp, motionData, 1);
 }
 
 // -------------------------------------------------------- WAIT TIME EP 
@@ -152,7 +139,7 @@ EP_ONDATA_RESPONSES onWaitTimeData(uint8_t* data, uint16_t len){
   return EP_ONDATA_ACCEPT;
 }
 
-vertex_t* waitTimeEp = osapBuildEndpoint("waitTime", onWaitTimeData, nullptr);  // 5 
+endpoint_t* waitTimeEp = osapBuildEndpoint("waitTime", onWaitTimeData);  // 5 
 
 // -------------------------------------------------------- ACCEL SETTTINGS 
 
@@ -172,7 +159,7 @@ EP_ONDATA_RESPONSES onAccelSettingsData(uint8_t* data, uint16_t len){
   return EP_ONDATA_ACCEPT;
 }
 
-vertex_t* accelSettingsEp = osapBuildEndpoint("accelSettings", onAccelSettingsData, nullptr);
+endpoint_t* accelSettingsEp = osapBuildEndpoint("accelSettings", onAccelSettingsData);
 
 // -------------------------------------------------------- RATES SETTINGS 
 
@@ -192,7 +179,7 @@ EP_ONDATA_RESPONSES onRateSettingsData(uint8_t* data, uint16_t len){
   return EP_ONDATA_ACCEPT;
 }
 
-vertex_t* rateSettingsEp = osapBuildEndpoint("rateSettings", onRateSettingsData, nullptr);
+endpoint_t* rateSettingsEp = osapBuildEndpoint("rateSettings", onRateSettingsData);
 
 // -------------------------------------------------------- SETUP 
 
@@ -203,29 +190,30 @@ void setup() {
   DEBUG2PIN_SETUP;
   DEBUG3PIN_SETUP;
   DEBUG4PIN_SETUP;
+  DEBUG5PIN_SETUP;
   // osap
-  osapSetup();
+  osapSetup("modularMotionHead");
   // ports 
   vt_usbSerial_setup();
   osapAddVertex(vt_usbSerial);    // 0
   vt_ucBusHead_setup();
   osapAddVertex(vt_ucBusHead);    // 1
   // move to queue 
-  osapAddVertex(moveQueueEp);     // 2
+  osapAddEndpoint(moveQueueEp);     // 2
   // position 
-  osapAddVertex(positionEp);      // 3
+  osapAddEndpoint(positionEp);      // 3
   // speed 
-  osapAddVertex(speedEp);         // 4 
+  osapAddEndpoint(speedEp);         // 4 
   // motion state 
-  osapAddVertex(motionStateEp);   // 5
+  osapAddEndpoint(motionStateEp);   // 5
   // set wait time (ms)
-  osapAddVertex(waitTimeEp);      // 6
+  osapAddEndpoint(waitTimeEp);      // 6
   // acceler8 settings
-  osapAddVertex(accelSettingsEp); // 7 
+  osapAddEndpoint(accelSettingsEp); // 7 
   // r8 settings 
-  osapAddVertex(rateSettingsEp);  // 8 
+  osapAddEndpoint(rateSettingsEp);  // 8 
   // smoothie (and frequency of loop below)
-  smoothieRoll->init(20000);
+  smoothieRoll->init(10000);
   // 25kHz base (40us period) or 
   // 20kHz base (50us period)
   // 10kHz base (100us period) 
@@ -233,11 +221,23 @@ void setup() {
   d51ClockBoss->start_ticker_a(100); 
 }
 
+unsigned long epUpdateInterval = 100; // ms 
+unsigned long lastUpdate = 0;
+
 void loop() {
-  // write ~ every second, transmit on chb to drop 1 
-  // check indices on the way down / up ... was shifting, are not anymore 
+  // main recursive osap loop:
   osapLoop();
-  conveyor->on_idle(nullptr);
+  // smoothie checks / etc:
+  //conveyor->on_idle(nullptr);
+  // run 10Hz endpoint update:
+  if(millis() > lastUpdate + epUpdateInterval){
+    DEBUG5PIN_TOGGLE;
+    lastUpdate = millis();
+    updatePositions();
+    updateSpeeds();
+    updateMotionState();
+  }
+
 } // end loop 
 
 // runs on period defined by timer_a setup: 
@@ -262,7 +262,7 @@ void TC0_Handler(void){
   // each of these ticks drops 10 data bytes, so if we have 17 byte packet, can do every 2nd packet 
   // which would occupy the full bus - notgood - or we can do every 3rd... I'll pick every 4th. 
   timeTick ++;
-  if(timeTick > 3){
+  if(timeTick > 2){
     DEBUG2PIN_HI;
     timeTick = 0;
     uint16_t mpptr = 0; // motion packet pointer 
@@ -290,4 +290,4 @@ void TC0_Handler(void){
     timeBlink = 0; 
   }
   DEBUG1PIN_LO;
-}
+}
\ No newline at end of file
diff --git a/firmware/motion-head/src/osape-d51 b/firmware/motion-head/src/osape-d51
index 23064339e200c3819af8bc55988b57d3eaa28a2e..acbff5f3f0333d072780d32246ac15a6aa7f1a62 160000
--- a/firmware/motion-head/src/osape-d51
+++ b/firmware/motion-head/src/osape-d51
@@ -1 +1 @@
-Subproject commit 23064339e200c3819af8bc55988b57d3eaa28a2e
+Subproject commit acbff5f3f0333d072780d32246ac15a6aa7f1a62
diff --git a/firmware/motion-head/src/smoothie/libs/StepTicker.cpp b/firmware/motion-head/src/smoothie/libs/StepTicker.cpp
index b426dc0f15cc342341fb817dac94c106ebfc7358..25a2a597b8cc1c9541fca7d81f80e6771f3ce2be 100644
--- a/firmware/motion-head/src/smoothie/libs/StepTicker.cpp
+++ b/firmware/motion-head/src/smoothie/libs/StepTicker.cpp
@@ -62,7 +62,6 @@ void StepTicker::start(){
 #warning This leaves config as is, see startup to 'make proper'.
 void StepTicker::set_frequency( float frequency ){
     this->frequency = frequency;
-    this->period = 80; // set manually above, floorf((SystemCoreClock / 4.0F) / frequency); // SystemCoreClock/4 = Timer increments in a second
 }
 
 // step clock
diff --git a/firmware/motion-head/src/smoothie/libs/StepTicker.h b/firmware/motion-head/src/smoothie/libs/StepTicker.h
index aec03660ee69fc6121ea7f2ff5fbee23e574234c..8cb4ecf462a8e240264c2f4b264b13dfb993f462 100644
--- a/firmware/motion-head/src/smoothie/libs/StepTicker.h
+++ b/firmware/motion-head/src/smoothie/libs/StepTicker.h
@@ -40,7 +40,6 @@ class StepTicker{
         bool start_next_block();
 
         float frequency;
-        uint32_t period;
         // not using motor refs, direct stepping std::array<StepperMotor*, k_max_actuators> motor;
         // do adhoc hack 
         StepInterface* motor[SR_NUM_MOTORS];
diff --git a/firmware/motion-head/src/smoothie/modules/robot/Planner.cpp b/firmware/motion-head/src/smoothie/modules/robot/Planner.cpp
index 4cfea947c72c0cd117b94d5f34dc178fe6e6603a..9e83530f7fc364d7ddd0b467c41e445aeefd1e21 100644
--- a/firmware/motion-head/src/smoothie/modules/robot/Planner.cpp
+++ b/firmware/motion-head/src/smoothie/modules/robot/Planner.cpp
@@ -229,7 +229,8 @@ bool Planner::append_block( ActuatorCoordinates &actuator_pos, uint8_t n_motors,
         block->nominal_speed = rate_mm_s;           // (mm/s) Always > 0
         block->nominal_rate = block->steps_event_count * rate_mm_s / distance; // (step/s) Always > 0
     } else {
-        sysError("now distance, nominal rate and speed to zero...");
+        sysError("bad move call! rejecting");
+        return false;
         block->nominal_speed = 0.0F;
         block->nominal_rate  = 0;
     }
diff --git a/firmware/motion-head/src/smoothie/modules/robot/StepInterface.h b/firmware/motion-head/src/smoothie/modules/robot/StepInterface.h
index 990f1ce4bc538c3f78a00d50fec2140b0aec3249..5e4813d1881a182dd41dfa0a895b2b7a5f151bd5 100644
--- a/firmware/motion-head/src/smoothie/modules/robot/StepInterface.h
+++ b/firmware/motion-head/src/smoothie/modules/robot/StepInterface.h
@@ -47,7 +47,7 @@ class StepInterface {
 
         float max_rate = 10.0F; // in mm/sec ? 
         float accel = 100.0F; // in mm/sec/sec 
-        float steps_per_mm = 400.0F; // for everyone: this is a hack... actually we send floating posns to steppers, who deal with this config 
+        float steps_per_mm = 25.0F; // for everyone: this is a hack... actually we send floating posns to steppers, who deal with this config 
         float mm_per_step = 1 / steps_per_mm;
         int32_t last_milestone_steps = 0;
         float last_milestone_mm = 0;
diff --git a/log/ucbus-psu-breakout-log.md b/log/ucbus-psu-breakout-log.md
index d71886aba7a75f0f7fb0b3388c8d5a2e7ee11506..c4d84a9a8b743d33d8e7854894d7b98ed018791f 100644
--- a/log/ucbus-psu-breakout-log.md
+++ b/log/ucbus-psu-breakout-log.md
@@ -97,6 +97,20 @@ Then the scheme here is to pin the face of the PSU (backside, I guess: where the
 
 Alright, this is fine. Not the most beautiful of devices. Onwards.
 
+## 2022 01 09 
+
+Finally - sheesh - bringing this up, so that I can remotely switch 24V and 5V, better resetting system state. This is kind of ... not a necessary piece of kit, but is "nice". Arguably the system should go either to a fab-able SAMD21 board, for accessibility, or to a Teensy, for performance. I suppose the teensy version could be accessible as well...
+
+In any case, code... then a test of the switching stuff... then the fab-step work, and maybe we make the step-tick stuff a little better, i.e. actually issuing steps (?) rather than this floating point work, which is awkwards anyways. Maybe this'll be a little bit fun, and maybe it'll get us to the fab-abble motion system that we want as a stopgap! Or maybe all failure, too soon to tell. 
+
+Arg it seems like something I've done w/ the new endpoint API is bricking this. 
+
+God bless, just a recursive overloaded function that was calling itself, when I meant to call a different version of the same name. Whoop! 
+
+OK I can try a 5v turn-on-off code. I guess I'll build my little one-motor-single-page-demo controller as well, sheesh. 
+
+- 5v src / sinks ? 
+
 ## Part Purchase
 
 - pololu https://www.pololu.com/product/4091 5vreg 7a