diff --git a/.gitmodules b/.gitmodules
index 0bb89b4c4cdf3b1c089eab64733f5bbe9fbf80f1..01b26ce108ea88a071e34944dacd184946e0787d 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -31,3 +31,6 @@
 [submodule "firmware/axl-stepper/src/utils_samd51"]
 	path = firmware/axl-stepper/src/utils_samd51
 	url = https://github.com/jakeread/utils_samd51.git
+[submodule "firmware/axl-stepper/src/osape_ucbus"]
+	path = firmware/axl-stepper/src/osape_ucbus
+	url = https://github.com/jakeread/osape_ucbus.git
diff --git a/firmware/axl-stepper/src/axl b/firmware/axl-stepper/src/axl
index c874b7afa9102ae3e5c150e444b01703c7143303..2e5fc8fc207938607933be3c7b06326573265139 160000
--- a/firmware/axl-stepper/src/axl
+++ b/firmware/axl-stepper/src/axl
@@ -1 +1 @@
-Subproject commit c874b7afa9102ae3e5c150e444b01703c7143303
+Subproject commit 2e5fc8fc207938607933be3c7b06326573265139
diff --git a/firmware/axl-stepper/src/main.cpp b/firmware/axl-stepper/src/main.cpp
index 460f8bac738574457eb4ba0a7b4fb85dfb61d80f..ceaaccca990cda67f705f75666e2ab06ae212607 100644
--- a/firmware/axl-stepper/src/main.cpp
+++ b/firmware/axl-stepper/src/main.cpp
@@ -10,11 +10,14 @@
 #include "osape/core/ts.h"
 #include "osape/vertices/endpoint.h"
 #include "osape_arduino/vp_arduinoSerial.h"
+#include "osape_ucbus/vb_ucBusDrop.h"
 
 OSAP osap("hmc-motor");
 
 VPort_ArduinoSerial vpUSBSerial(&osap, "arduinoUSBSerial", &Serial);
 
+VBus_UCBusDrop vbUCBusDrop(&osap, "ucBusDrop");
+
 // -------------------------------------------------------- 2: States
 
 EP_ONDATA_RESPONSES onStateData(uint8_t* data, uint16_t len){
@@ -77,6 +80,73 @@ void updateStatesEP(void){
   statesEP.write(stash, numBytes);
 }
 
+// -------------------------------------------------------- 3: Moves -> Queue
+
+EP_ONDATA_RESPONSES onMoveData(uint8_t* data, uint16_t len){
+  // this (and states-input) could watch <len> to make sure that 
+  // this code & transmitter code are agreeing on how many DOFs are specd 
+  if(axl_hasQueueSpace()){
+    uint16_t rptr = 0;
+    float rate = ts_readFloat32(data, &rptr);
+    dofs targ;
+    for(uint8_t a = 0; a < AXL_NUM_DOF; a ++){
+      targ.axis[a] = ts_readFloat32(data, &rptr);
+    }
+    axl_addMoveToQueue(targ, rate);
+    return EP_ONDATA_ACCEPT;
+  } else {
+    return EP_ONDATA_WAIT;
+  }
+}
+
+Endpoint moveEP(&osap, "moves", onMoveData);
+
+// -------------------------------------------------------- 4: AXL Settings
+
+EP_ONDATA_RESPONSES onAXLSettingsData(uint8_t* data, uint16_t len){
+  // jd, then pairs of accel & vel limits,
+  float jd;
+  dofs accelLimits;
+  dofs velLimits;
+  uint16_t rptr = 0;
+  jd = ts_readFloat32(data, &rptr);
+  for(uint8_t a = 0; a < AXL_NUM_DOF; a ++){
+    accelLimits.axis[a] = ts_readFloat32(data, &rptr);
+    velLimits.axis[a] = ts_readFloat32(data, &rptr);
+  }
+  axl_setJunctionDeviation(jd);
+  axl_setAccelLimits(accelLimits);
+  axl_setVelLimits(velLimits);
+  return EP_ONDATA_ACCEPT;
+}
+
+Endpoint axlSettingsEP(&osap, "axlSettings", onAXLSettingsData);
+
+// -------------------------------------------------------- 5: Motor Settings
+
+uint8_t axisPick = 0;
+boolean invert = false; 
+uint16_t microstep = 4; 
+float spu = 100.0F;
+float cscale = 0.1F;
+
+// aye, there should be a void onData overload... less confusing 
+EP_ONDATA_RESPONSES onMotorSettingsData(uint8_t* data, uint16_t len){
+  uint16_t rptr = 0;
+  axisPick = data[rptr ++];
+  ts_readBoolean(&invert, data, &rptr);
+  ts_readUint16(&microstep, data, &rptr);
+  spu = ts_readFloat32(data, &rptr);
+  cscale = ts_readFloat32(data, &rptr);
+  stepper_hw->setMicrostep(microstep);
+  stepper_hw->setCurrent(cscale);
+  stepper_hw->setInversion(invert);
+  return EP_ONDATA_ACCEPT;
+}
+
+Endpoint motorSettingsEP(&osap, "motorSettings", onMotorSettingsData);
+
+// -------------------------------------------------------- Arduino Setup 
 
 void setup() {
   CLKLIGHT_SETUP;
@@ -86,7 +156,7 @@ void setup() {
   // port begin 
   vpUSBSerial.begin();
   // setup stepper machine 
-  stepper_hw->init(false, 0.35F);
+  stepper_hw->init(false, 0.0F);
   stepper_hw->setMicrostep(4);
   // setup controller
   axl_setup();
@@ -94,6 +164,8 @@ void setup() {
   d51ClockUtils->start_ticker_a(AXL_TICKER_INTERVAL_US);
 }
 
+// -------------------------------------------------------- Das Loop 
+
 uint32_t lastBlink = 0;
 uint32_t blinkInterval = 50; // ms 
 
@@ -107,8 +179,7 @@ void loop() {
   }
 }
 
-uint8_t axisPick = 0;
-float spu = 100.0F;
+// -------------------------------------------------------- Small-Time Ops 
 
 volatile float stepRatchet = 0.0F;
 void axl_onPositionDelta(uint8_t axis, float delta){
@@ -132,4 +203,10 @@ void TC0_Handler(void){
   // run the loop, 
   axl_integrator();
   DEBUG1PIN_OFF;
-}
\ No newline at end of file
+}
+
+// deadies, unused ATM 
+
+void ucBusDrop_onRxISR(void){}
+
+void ucBusDrop_onPacketARx(uint8_t* data, uint16_t len){}
\ No newline at end of file
diff --git a/firmware/axl-stepper/src/osape_ucbus b/firmware/axl-stepper/src/osape_ucbus
new file mode 160000
index 0000000000000000000000000000000000000000..ba7240a9f473f3df114cccfd3c393cc9f5ea1074
--- /dev/null
+++ b/firmware/axl-stepper/src/osape_ucbus
@@ -0,0 +1 @@
+Subproject commit ba7240a9f473f3df114cccfd3c393cc9f5ea1074
diff --git a/firmware/axl-stepper/src/ucbus_config.h b/firmware/axl-stepper/src/ucbus_config.h
index 2b84fba6edf04a4d5ad1fc9fd5a11bfee67d08f6..eee24b0289a8649bc3543cd3dc759ebd0b131d97 100644
--- a/firmware/axl-stepper/src/ucbus_config.h
+++ b/firmware/axl-stepper/src/ucbus_config.h
@@ -16,8 +16,8 @@ no warranty is provided, and users accept all liability.
 #define UCBUS_CONFIG_H_
 
 #define UCBUS_MAX_DROPS 32 
-//#define UCBUS_IS_DROP 
-#define UCBUS_IS_HEAD 
+#define UCBUS_IS_DROP 
+//#define UCBUS_IS_HEAD 
 
 #define UCBUS_BAUD 2