diff --git a/firmware/axl-stepper/src/axl b/firmware/axl-stepper/src/axl
index 0aa41982be0a8ec1189ec6e4517e4f1c2b6774cb..09e3e90667034d09f34bbe4041b3f395461fad8a 160000
--- a/firmware/axl-stepper/src/axl
+++ b/firmware/axl-stepper/src/axl
@@ -1 +1 @@
-Subproject commit 0aa41982be0a8ec1189ec6e4517e4f1c2b6774cb
+Subproject commit 09e3e90667034d09f34bbe4041b3f395461fad8a
diff --git a/firmware/axl-stepper/src/main.cpp b/firmware/axl-stepper/src/main.cpp
index 49ebd11a81f8d74a8ebfe3aaf9b9e99ddd7077ce..6628e5b52a66e647d673428e153254e74c1c82f4 100644
--- a/firmware/axl-stepper/src/main.cpp
+++ b/firmware/axl-stepper/src/main.cpp
@@ -21,40 +21,39 @@ VBus_UCBusDrop vbUCBusDrop(&osap, "ucBusDrop");
 // -------------------------------------------------------- 2: States
 
 EP_ONDATA_RESPONSES onStateData(uint8_t* data, uint16_t len){
+  // check for partner-config badness, 
+  if(len != AXL_NUM_DOF * 4 + 2){ OSAP::error("state req has bad DOF count"); return EP_ONDATA_REJECT; }
   // we have accel, rate, posn data, 
   dofs targ;
   uint16_t rptr = 0;
-  uint8_t mode = data[rptr];
-  if(mode == AXL_MODE_ACCEL){
-    // read from 1st block of ndof 
-    /*
-    rptr = 1;
-    for(uint8_t a = 0; a < AXL_NUM_DOF; a ++){
-      targ.axis[a] = ts_readFloat32(data, &rptr);
-    }
-    axl_setAccelTarget(targ);
-    */
-  } else if (mode == AXL_MODE_VELOCITY){
-    //axl_setVelocityTarget(rate.f);
-    rptr = 1 + AXL_NUM_DOF * 4 * 1;
-    for(uint8_t a = 0; a < AXL_NUM_DOF; a ++){
-      targ.axis[a] = ts_readFloat32(data, &rptr);
-    }
-    axl_setVelocityTarget(targ);
-  } else if (mode == AXL_MODE_POSITION){
-    rptr = 1 + AXL_NUM_DOF * 4 * 2;
-    for(uint8_t a = 0; a < AXL_NUM_DOF; a ++){
-      targ.axis[a] = ts_readFloat32(data, &rptr);
+  uint8_t mode = data[rptr ++];
+  uint8_t set = data[rptr ++];
+  for(uint8_t a = 0; a < AXL_NUM_DOF; a ++){
+    targ.axis[a] = ts_readFloat32(data, &rptr);
+  }
+  // set or target?
+  if(set){
+    if(mode == AXL_MODE_POSITION){
+      OSAP::error("axl set-pos... havne't written it yet");
+    } else {
+      OSAP::error("we can only 'set' position, others are targs");
     }
-    axl_setPositionTarget(targ);  
   } else {
-    // no / bad mode set, noop 
-    OSAP::error("bad set-states request to axl, no / bad mode info", MEDIUM);
+    switch(mode){
+      case AXL_MODE_ACCEL:
+        axl_setAccelTarget(targ);
+        break;
+      case AXL_MODE_VELOCITY:
+        axl_setVelocityTarget(targ);
+        break;
+      case AXL_MODE_POSITION:
+        axl_setPositionTarget(targ);
+        break;
+      default:
+        OSAP::error("AXL state targ has bad / unrecognized mode");
+        break;
+    }
   }
-  // chunk_float32 acc = { .bytes = { data[0], data[1], data[2], data[3] } };
-  // chunk_float32 rate = { .bytes = { data[4], data[5], data[6], data[7] } };
-  // chunk_float32 posn = { .bytes = { data[8], data[9], data[10], data[11] } };
-  // we 'reject' this i.e. we don't write these data into the endpoint,
   // since we routinely update it w/ actual states (not requests) 
   return EP_ONDATA_REJECT;
 }
@@ -81,7 +80,16 @@ void updateStatesEP(void){
   statesEP.write(stash, numBytes);
 }
 
-// -------------------------------------------------------- 3: Moves -> Queue
+// -------------------------------------------------------- 3: Halt
+
+EP_ONDATA_RESPONSES onHaltData(uint8_t* data, uint16_t len){
+  axl_halt();
+  return EP_ONDATA_REJECT;
+}
+
+Endpoint haltEP(&osap, "halt", onHaltData);
+
+// -------------------------------------------------------- 4: Moves -> Queue
 
 EP_ONDATA_RESPONSES onMoveData(uint8_t* data, uint16_t len){
   // this (and states-input) could watch <len> to make sure that 
@@ -102,7 +110,7 @@ EP_ONDATA_RESPONSES onMoveData(uint8_t* data, uint16_t len){
 
 Endpoint moveEP(&osap, "moves", onMoveData);
 
-// -------------------------------------------------------- 4: AXL Settings
+// -------------------------------------------------------- 5: AXL Settings
 
 EP_ONDATA_RESPONSES onAXLSettingsData(uint8_t* data, uint16_t len){
   // jd, then pairs of accel & vel limits,
@@ -123,7 +131,7 @@ EP_ONDATA_RESPONSES onAXLSettingsData(uint8_t* data, uint16_t len){
 
 Endpoint axlSettingsEP(&osap, "axlSettings", onAXLSettingsData);
 
-// -------------------------------------------------------- 5: Motor Settings
+// -------------------------------------------------------- 6: Motor Settings
 
 uint8_t axisPick = 0;
 boolean invert = false;