diff --git a/circuit/README.md b/circuit/README.md
index 5039391924e642cc3f63d4d35b6443be4088bdde..14341965ff9227430934a1409290afcd96b14d66 100644
--- a/circuit/README.md
+++ b/circuit/README.md
@@ -28,4 +28,24 @@ I had this manufactured, and got the solder stencil, so that just left me to pla
 
 ![scopes](/images/scope-single-wave.jpg)
 
-![scopes](/images/scope-many.jpg)
\ No newline at end of file
+![scopes](/images/scope-many.jpg)
+
+## V0.3
+
+Ok, I just blew one of these drivers up. Not sure what's up.
+
+There's also a stray issue where the first apaport isn't working. the uartport runs messages out, but is maybe not catching any characters in, or something else, who knows.
+
+I also notice that I see some current through the vcc pin apparently coming from the logic side, I should test to see if this is the case on the old drivers as well. I've compared schematics and I can't see any issues, so unless these came back from the fab with a trace error?
+
+That's it - I had accidentally set two polygons to the same rank in eagle, connecting the +3V3 net to one of the motor outputs. Whoops! Fixed this by cutting the trace.
+
+So, to rev:
+ - power lines are in sad, move to edge 
+ - could do with only 2 mount holes, or three 
+ - gnd plane is pretty dissatisfying
+ - lights are a bit close, tend to solder together
+ - just nix the usb, regulator, and power source switch
+ - go to AEAT6600 encoder, but make sure you test it with the mkbldc first
+ - min trace is still not 8mil for 2oz, should be
+ - it would be cool to be able to heatsink from the top, maybe mount the driver on the bottom?
\ No newline at end of file
diff --git a/circuit/mkstepper/eagle.epf b/circuit/mkstepper/eagle.epf
index ec05ab8c33e0bf83cbb276348f9de14e9ee80c88..922df8dd528eb30c94403b0e12a63e84f0f12310 100644
--- a/circuit/mkstepper/eagle.epf
+++ b/circuit/mkstepper/eagle.epf
@@ -37,12 +37,12 @@ UsedLibrary="C:/EAGLE 8.3.2/lbr/ltspice/rload.lbr"
 UsedLibrary="C:/EAGLE 8.3.2/lbr/ltspice/sym.lbr"
 
 [Win_1]
-Type="Schematic Editor"
-Loc="926 0 1910 1007"
-State=2
-Number=1
-File="mkstepper.sch"
-View="69.3549 41.988 159.951 129.374"
+Type="Board Editor"
+Loc="0 0 1919 1016"
+State=1
+Number=2
+File="mkstepper.brd"
+View="-6.97066 -2.84297 80.9601 62.6704"
 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 @@ DimensionExtWidths=" 0.127 0.254 0.1 0.13 0.26 0"
 DimensionExtLengths=" 1.27 2.54 1 2 3 0"
 DimensionExtOffsets=" 1.27 2.54 1 2 3 0"
 SmdSizes=" 0.3048 0.1524 0.4064 0.2032 0.6096 0.3048 0.8128 0.4064 1.016 0.508 1.27 0.6604 1.4224 0.7112 1.6764 0.8128 1.778 0.9144 1.9304 0.9652 2.1844 1.0668 2.54 1.27 3.81 1.9304 5.08 2.54 6.4516 3.2512 1.27 0.635"
-WireBend=0
-WireBendSet=31
+WireBend=1
+WireBendSet=0
 WireCap=1
 MiterStyle=0
 PadShape=0
 ViaShape=1
 PolygonPour=0
-PolygonRank=0
+PolygonRank=1
 PolygonThermals=1
 PolygonOrphans=0
 TextRatio=8
@@ -80,17 +80,15 @@ SwapLevel=0
 ArcDirection=0
 AddLevel=2
 PadsSameType=0
-Layer=91
-Views=" 1: 69.3549 41.988 159.951 129.374"
-Sheet="1"
+Layer=1
 
 [Win_2]
-Type="Board Editor"
+Type="Schematic Editor"
 Loc="0 0 1919 1016"
 State=1
-Number=2
-File="mkstepper.brd"
-View="10.3097 24.4002 22.1441 33.2175"
+Number=1
+File="mkstepper.sch"
+View="69.3549 41.988 159.951 129.374"
 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"
@@ -106,14 +104,14 @@ DimensionExtWidths=" 0.127 0.254 0.1 0.13 0.26 0"
 DimensionExtLengths=" 1.27 2.54 1 2 3 0"
 DimensionExtOffsets=" 1.27 2.54 1 2 3 0"
 SmdSizes=" 0.3048 0.1524 0.4064 0.2032 0.6096 0.3048 0.8128 0.4064 1.016 0.508 1.27 0.6604 1.4224 0.7112 1.6764 0.8128 1.778 0.9144 1.9304 0.9652 2.1844 1.0668 2.54 1.27 3.81 1.9304 5.08 2.54 6.4516 3.2512 1.27 0.635"
-WireBend=1
-WireBendSet=0
+WireBend=0
+WireBendSet=31
 WireCap=1
 MiterStyle=0
 PadShape=0
 ViaShape=1
 PolygonPour=0
-PolygonRank=1
+PolygonRank=0
 PolygonThermals=1
 PolygonOrphans=0
 TextRatio=8
@@ -128,7 +126,9 @@ SwapLevel=0
 ArcDirection=0
 AddLevel=2
 PadsSameType=0
-Layer=1
+Layer=91
+Views=" 1: 69.3549 41.988 159.951 129.374"
+Sheet="1"
 
 [Win_3]
 Type="Control Panel"
@@ -137,7 +137,7 @@ State=1
 Number=0
 
 [Desktop]
-Screen="6000 2160"
+Screen="3840 1080"
 Window="Win_1"
 Window="Win_2"
 Window="Win_3"
diff --git a/circuit/mkstepper/mkstepper.brd b/circuit/mkstepper/mkstepper.brd
index 86826669b459e6349c1cdf4c8e13b66f6426f4f3..7663d564e7495a7fa59a02124da63a8e8dd7dc7d 100644
--- a/circuit/mkstepper/mkstepper.brd
+++ b/circuit/mkstepper/mkstepper.brd
@@ -1455,7 +1455,7 @@ design rules under a new name.</description>
 <vertex x="26.85" y="49.25"/>
 <vertex x="28.55" y="49.25"/>
 </polygon>
-<polygon width="0.1524" layer="1" thermals="no" rank="2">
+<polygon width="0.1524" layer="1" thermals="no" rank="3">
 <vertex x="34.95" y="39.85"/>
 <vertex x="34.95" y="49.25"/>
 <vertex x="38.45" y="49.25"/>
@@ -1631,7 +1631,7 @@ design rules under a new name.</description>
 <contactref element="U$11" pad="1"/>
 <contactref element="U$14" pad="1"/>
 <contactref element="U$13" pad="1"/>
-<polygon width="0.1524" layer="1" rank="5">
+<polygon width="0.1524" layer="1" rank="6">
 <vertex x="1.75" y="58"/>
 <vertex x="1.75" y="1.75"/>
 <vertex x="43.25" y="1.75"/>
diff --git a/embedded/README.md b/embedded/README.md
index cc0f3da9eb31e87e73b4dc074e9ee1c8b1d8a4dc..6a35f85ba43ee937e359771fdbcb7ce117066f49 100644
--- a/embedded/README.md
+++ b/embedded/README.md
@@ -533,3 +533,13 @@ Packet Handling and Passing, oh my!
 
 I'll take most of this from the code I've already written for the Router.
 
+Done that, just have to debug one apaport and get the lights a flashing. I think this project should be the major touchstone for network code / all around infrastructure as it'll probably get the most love.
+
+## Step Linking and Acceleration 
+
+So, I want to be able to send the command:
+ - Start Speed : Steps to take : End Speed
+ - or Steps to Take : End Speed and assume link from last block
+And do linear interpretation.
+
+I should also, and as a starting exercise, re-write the relative speed and relative steps packet handlers to do ... relative, and real speeds in steps / s. 
\ No newline at end of file
diff --git a/embedded/mkstepper-v011/.vs/mkstepper-v011/v14/.atsuo b/embedded/mkstepper-v011/.vs/mkstepper-v011/v14/.atsuo
index bf5ec65953cbd5772f8fd9ee9aa64d80911873df..04bd86806200e9f88b4f0f1a9e5e0454b187544e 100644
Binary files a/embedded/mkstepper-v011/.vs/mkstepper-v011/v14/.atsuo and b/embedded/mkstepper-v011/.vs/mkstepper-v011/v14/.atsuo differ
diff --git a/embedded/mkstepper-v011/mkstepper-v011/Debug/Makefile b/embedded/mkstepper-v011/mkstepper-v011/Debug/Makefile
index b582b1c81fe7224413037905bc6e06963b641760..721ba48fb21b3c07da925a5abc389a07dfda2f49 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/Debug/Makefile
+++ b/embedded/mkstepper-v011/mkstepper-v011/Debug/Makefile
@@ -120,8 +120,8 @@ OUTPUT_FILE_DEP:= ./makedep.mk
 LIB_DEP+= 
 
 LINKER_SCRIPT_DEP+=  \
-../Device_Startup/samd51j18a_flash.ld \
-../Device_Startup/samd51j18a_sram.ld
+../Device_Startup/samd51j19a_flash.ld \
+../Device_Startup/samd51j19a_sram.ld
 
 
 # AVR32/GNU C Compiler
@@ -151,14 +151,14 @@ LINKER_SCRIPT_DEP+=  \
 ./%.o: .././%.c
 	@echo Building file: $<
 	@echo Invoking: ARM/GNU C Compiler : 6.3.1
-	$(QUOTE)C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\arm\arm-gnu-toolchain\bin\arm-none-eabi-gcc.exe$(QUOTE)  -x c -mthumb -D__SAMD51J18A__ -DDEBUG  -I"C:\Program Files (x86)\Atmel\Studio\7.0\Packs\arm\CMSIS\5.0.1\CMSIS\Include" -I"C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\SAMD51_DFP\1.0.70\include"  -O1 -ffunction-sections -mlong-calls -g3 -Wall -mcpu=cortex-m4 -c -std=gnu99 -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)"   -o "$@" "$<" 
+	$(QUOTE)C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\arm\arm-gnu-toolchain\bin\arm-none-eabi-gcc.exe$(QUOTE)  -x c -mthumb -D__SAMD51J19A__ -DDEBUG  -I"C:\Program Files (x86)\Atmel\Studio\7.0\Packs\arm\CMSIS\5.0.1\CMSIS\Include" -I"C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\SAMD51_DFP\1.0.70\include"  -O1 -ffunction-sections -mlong-calls -g3 -Wall -mcpu=cortex-m4 -c -std=gnu99 -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)"   -o "$@" "$<" 
 	@echo Finished building: $<
 	
 
 Device_Startup/%.o: ../Device_Startup/%.c
 	@echo Building file: $<
 	@echo Invoking: ARM/GNU C Compiler : 6.3.1
-	$(QUOTE)C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\arm\arm-gnu-toolchain\bin\arm-none-eabi-gcc.exe$(QUOTE)  -x c -mthumb -D__SAMD51J18A__ -DDEBUG  -I"C:\Program Files (x86)\Atmel\Studio\7.0\Packs\arm\CMSIS\5.0.1\CMSIS\Include" -I"C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\SAMD51_DFP\1.0.70\include"  -O1 -ffunction-sections -mlong-calls -g3 -Wall -mcpu=cortex-m4 -c -std=gnu99 -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)"   -o "$@" "$<" 
+	$(QUOTE)C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\arm\arm-gnu-toolchain\bin\arm-none-eabi-gcc.exe$(QUOTE)  -x c -mthumb -D__SAMD51J19A__ -DDEBUG  -I"C:\Program Files (x86)\Atmel\Studio\7.0\Packs\arm\CMSIS\5.0.1\CMSIS\Include" -I"C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\SAMD51_DFP\1.0.70\include"  -O1 -ffunction-sections -mlong-calls -g3 -Wall -mcpu=cortex-m4 -c -std=gnu99 -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)"   -o "$@" "$<" 
 	@echo Finished building: $<
 	
 
@@ -187,7 +187,7 @@ all: $(OUTPUT_FILE_PATH) $(ADDITIONAL_DEPENDENCIES)
 $(OUTPUT_FILE_PATH): $(OBJS) $(USER_OBJS) $(OUTPUT_FILE_DEP) $(LIB_DEP) $(LINKER_SCRIPT_DEP)
 	@echo Building target: $@
 	@echo Invoking: ARM/GNU Linker : 6.3.1
-	$(QUOTE)C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\arm\arm-gnu-toolchain\bin\arm-none-eabi-gcc.exe$(QUOTE) -o$(OUTPUT_FILE_PATH_AS_ARGS) $(OBJS_AS_ARGS) $(USER_OBJS) $(LIBS) -mthumb -Wl,-Map="mkstepper-v011.map" -Wl,--start-group -lm  -Wl,--end-group -L"..\\Device_Startup"  -Wl,--gc-sections -mcpu=cortex-m4 -Tsamd51j18a_flash.ld  
+	$(QUOTE)C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\arm\arm-gnu-toolchain\bin\arm-none-eabi-gcc.exe$(QUOTE) -o$(OUTPUT_FILE_PATH_AS_ARGS) $(OBJS_AS_ARGS) $(USER_OBJS) $(LIBS) -mthumb -Wl,-Map="mkstepper-v011.map" -Wl,--start-group -lm  -Wl,--end-group -L"..\\Device_Startup"  -Wl,--gc-sections -mcpu=cortex-m4 -Tsamd51j19a_flash.ld  
 	@echo Finished building target: $@
 	"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\arm\arm-gnu-toolchain\bin\arm-none-eabi-objcopy.exe" -O binary "mkstepper-v011.elf" "mkstepper-v011.bin"
 	"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\arm\arm-gnu-toolchain\bin\arm-none-eabi-objcopy.exe" -O ihex -R .eeprom -R .fuse -R .lock -R .signature  "mkstepper-v011.elf" "mkstepper-v011.hex"
diff --git a/embedded/mkstepper-v011/mkstepper-v011/Device_Startup/samd51j18a_flash.ld b/embedded/mkstepper-v011/mkstepper-v011/Device_Startup/samd51j19a_flash.ld
similarity index 95%
rename from embedded/mkstepper-v011/mkstepper-v011/Device_Startup/samd51j18a_flash.ld
rename to embedded/mkstepper-v011/mkstepper-v011/Device_Startup/samd51j19a_flash.ld
index 301f100e83356376dbdd6191ac64239e551ae9c0..a915d1fbb8c3fb37c9393c8c0aab57fbe7c8aa83 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/Device_Startup/samd51j18a_flash.ld
+++ b/embedded/mkstepper-v011/mkstepper-v011/Device_Startup/samd51j19a_flash.ld
@@ -1,7 +1,7 @@
 /**
  * \file
  *
- * \brief Linker script for running in internal FLASH on the SAMD51J18A
+ * \brief Linker script for running in internal FLASH on the SAMD51J19A
  *
  * Copyright (c) 2017 Microchip Technology Inc.
  *
@@ -35,14 +35,14 @@ SEARCH_DIR(.)
 /* Memory Spaces Definitions */
 MEMORY
 {
-  rom      (rx)  : ORIGIN = 0x00000000, LENGTH = 0x00040000
-  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00020000
+  rom      (rx)  : ORIGIN = 0x00000000, LENGTH = 0x00080000
+  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00030000
   bkupram  (rwx) : ORIGIN = 0x47000000, LENGTH = 0x00002000
   qspi     (rwx) : ORIGIN = 0x04000000, LENGTH = 0x01000000
 }
 
 /* The stack size used by the application. NOTE: you need to adjust according to your application. */
-STACK_SIZE = DEFINED(STACK_SIZE) ? STACK_SIZE : DEFINED(__stack_size__) ? __stack_size__ : 0x8000;
+STACK_SIZE = DEFINED(STACK_SIZE) ? STACK_SIZE : DEFINED(__stack_size__) ? __stack_size__ : 0xC000;
 
 /* Section Definitions */
 SECTIONS
diff --git a/embedded/mkstepper-v011/mkstepper-v011/Device_Startup/samd51j18a_sram.ld b/embedded/mkstepper-v011/mkstepper-v011/Device_Startup/samd51j19a_sram.ld
similarity index 97%
rename from embedded/mkstepper-v011/mkstepper-v011/Device_Startup/samd51j18a_sram.ld
rename to embedded/mkstepper-v011/mkstepper-v011/Device_Startup/samd51j19a_sram.ld
index 0303f06c3a62e558ecfe4277dad36f8b5d5448d6..2afa70f3194dac245cf5447f9328b146134ceeda 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/Device_Startup/samd51j18a_sram.ld
+++ b/embedded/mkstepper-v011/mkstepper-v011/Device_Startup/samd51j19a_sram.ld
@@ -1,7 +1,7 @@
 /**
  * \file
  *
- * \brief Linker script for running in internal SRAM on the SAMD51J18A
+ * \brief Linker script for running in internal SRAM on the SAMD51J19A
  *
  * Copyright (c) 2017 Microchip Technology Inc.
  *
@@ -35,13 +35,13 @@ SEARCH_DIR(.)
 /* Memory Spaces Definitions */
 MEMORY
 {
-  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00020000
+  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00030000
   bkupram  (rwx) : ORIGIN = 0x47000000, LENGTH = 0x00002000
   qspi     (rwx) : ORIGIN = 0x04000000, LENGTH = 0x01000000
 }
 
 /* The stack size used by the application. NOTE: you need to adjust according to your application. */
-STACK_SIZE = DEFINED(STACK_SIZE) ? STACK_SIZE : DEFINED(__stack_size__) ? __stack_size__ : 0x8000;
+STACK_SIZE = DEFINED(STACK_SIZE) ? STACK_SIZE : DEFINED(__stack_size__) ? __stack_size__ : 0xC000;
 
 /* Section Definitions */
 SECTIONS
diff --git a/embedded/mkstepper-v011/mkstepper-v011/apahandler.c b/embedded/mkstepper-v011/mkstepper-v011/apahandler.c
index 36ab2b207b6a14040d34f594d5759422b76f2673..c89bf7bd2aa1aba4a9d47920371e9a7c60bead31 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/apahandler.c
+++ b/embedded/mkstepper-v011/mkstepper-v011/apahandler.c
@@ -30,46 +30,43 @@ void apa_handle_packet(uint8_t *packet, uint8_t length){
 				
 			case APA_HANDLER_INSIDE:
 				switch (packet[i]){
-					case DELIM_KEY_POSITION_FLOAT:
-						if(i + 5 > length){
-							i ++;
-						} else {
-							float position = 0;
-							position = (packet[i+1] << 24) | (packet[i+2] << 16) | (packet[i+3] << 8) | packet[i+4]; // msb
-							stepper_targetposition_float(&stepper, position);
-							i += 5; // bring packet ptr to next key (should)
-						}
-						break;
 						
 					case DELIM_KEY_POSITION_STEPS:
-						if(i + 5 > length){
-							i ++;
+					// should set 0 accel 
+						if(i + 4 > length){
+							i ++; // avoid hangup
 						} else {
 							int32_t steps = (packet[i+1] << 24) | (packet[i+2] << 16) | (packet[i+3] << 8) | packet[i+4]; // msb
-							stepper_targetposition_steps(&stepper, steps);
-							i += 5; // bring packet ptr to next key (should)
-						}
-						break;
-						
-					case DELIM_KEY_SPEED_FLOAT:
-						if(i + 5 > length){
-							i ++;
-						} else {
-							float speed = (packet[i+1] << 24) | (packet[i+2] << 16) | (packet[i+3] << 8) | packet[i+4]; // msb
-							stepper_targetspeed_float(&stepper, speed);
+							stepper_steps(&stepper, steps);
 							i += 5; // bring packet ptr to next key (should)
 						}
 						break;
 					
 					case DELIM_KEY_SPEED_STEPS:
-						if(i + 5 > length){
+					// should set 0 accel
+						if(i + 4 > length){
 							i ++; // avoiding hangup
 						} else {
 							uint32_t speed = (packet[i+1] << 24) | (packet[i+2] << 16) | (packet[i+3] << 8) | packet[i+4]; // msb
-							stepper_targetspeed_steps(&stepper, speed);
+							stepper_speed(&stepper, speed);
 							i += 5; // bring packet ptr to next key (should)
 						}
 						break;
+					
+					case DELIM_KEY_SEGMENT:
+						if(i + 12 > length){ // confirm: not i + 12 >= ?
+							i ++; // avoid hangup
+						} else {
+							// in steps / s
+							uint32_t startspeed = (packet[i+1] << 24) | (packet[i+2] << 16) | (packet[i+3] << 8) | packet[i+4];
+							// in steps / s^2
+							int32_t accel = (packet[i+5] << 24) | (packet[i+6] << 16) | (packet[i+7] << 8) | packet[i+8];
+							// in steps
+							int32_t steps = (packet[i+9] << 24) | (packet[i+10] << 16) | (packet[i+11] << 8) | packet[i+12];
+							stepper_segment(&stepper, startspeed, accel, steps);
+							i += 13; // ? not 12 ?
+						}
+						break;
 																
 					default:
 						// probably an error
diff --git a/embedded/mkstepper-v011/mkstepper-v011/apahandler.h b/embedded/mkstepper-v011/mkstepper-v011/apahandler.h
index 1f7c5dc67fe1b75a2f07b6d632c87a57df0689c9..009b4c6b019990796792cf88106dc0508979f867 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/apahandler.h
+++ b/embedded/mkstepper-v011/mkstepper-v011/apahandler.h
@@ -14,10 +14,9 @@
 #define APA_HANDLER_OUTSIDE 0
 #define APA_HANDLER_INSIDE 1
 
-#define DELIM_KEY_POSITION_FLOAT 127 // is 32 bit float
-#define DELIM_KEY_SPEED_FLOAT 128 // is 32 bit float
 #define DELIM_KEY_POSITION_STEPS 129 // is 32 bit int
 #define DELIM_KEY_SPEED_STEPS 130 // is 32 bit int
+#define DELIM_KEY_SEGMENT 131
 
 void apa_handle_packet(uint8_t *packet, uint8_t length);
 void apa_return_packet(uint8_t *packet, uint8_t length);
diff --git a/embedded/mkstepper-v011/mkstepper-v011/main.c b/embedded/mkstepper-v011/mkstepper-v011/main.c
index 7a3169dfb526bc3ba97a57f957da13fec3fb7ff0..09c7a0abf04cd328bd8b3285e0e14cc435dd8051 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/main.c
+++ b/embedded/mkstepper-v011/mkstepper-v011/main.c
@@ -161,10 +161,7 @@ int main(void)
     /* Initialize the SAM system */
     SystemInit();
 	clock_init();
-	SysTick_Config(12000000);
-	
-	pin_t clockpin = pin_new(&PORT->Group[1], 2);
-	pin_output(&clockpin);
+	SysTick_Config(4000000);
 	
 	// lights
 	stlb = pin_new(&PORT->Group[1], 14);
@@ -202,6 +199,19 @@ int main(void)
 	ups[0] = &up0;
 	ups[1] = &up1;
 	
+	up0_stlr = pin_new(&PORT->Group[0], 19);
+	pin_output(&up0_stlr);
+	pin_set(&up0_stlr);
+	up0_stlb = pin_new(&PORT->Group[0], 17);
+	pin_output(&up0_stlb);
+	pin_set(&up0_stlb);
+	up1_stlr = pin_new(&PORT->Group[0], 21);
+	pin_output(&up1_stlr);
+	pin_set(&up1_stlr);
+	up1_stlb = pin_new(&PORT->Group[0], 23);
+	pin_output(&up1_stlb);
+	pin_set(&up1_stlb);
+	
 	apaport_build(&apap0, 0, &up0, &up0_stlr, &up0_stlb);
 	apaport_reset(&apap0);
 	apaport_build(&apap1, 1, &up1, &up1_stlr, &up1_stlb);
@@ -246,11 +256,9 @@ int main(void)
 	pin_output(&step_pin);
 	pin_output(&dir_pin);
 	
-	stepper = stepper_new(&step_pin, &dir_pin, 360.0, 64);
+	stepper = stepper_new(&step_pin, &dir_pin);
 	stepper_reset(&stepper);
-	
-	stepper_targetspeed_steps(&stepper, 2000); 
-	
+		
 	uint8_t lpcnt = 0;
 	uint8_t stpcnt = 0;
 	
@@ -258,7 +266,7 @@ int main(void)
     {
 		apaport_scan(&apap0, 2);
 		apaport_scan(&apap1, 2);
-	
+			
 		if(stepper.position_ticks_target == stepper.position_ticks){
 			stpcnt ++;
 			pin_clear(&stlr);
@@ -288,6 +296,7 @@ minors:
 void SysTick_Handler(void){
 	// slow ticker
 	pin_toggle(&stlb);
+
 	/*
 	if(stepper.position_ticks_target == stepper.position_ticks){
 		stpcnt ++;
diff --git a/embedded/mkstepper-v011/mkstepper-v011/mkstepper-v011.componentinfo.xml b/embedded/mkstepper-v011/mkstepper-v011/mkstepper-v011.componentinfo.xml
index 517a711ec4290c071de610dc1471e5cb9e8d7912..2630963fbb86f73fe95cfc5e2e654f54ddc2affd 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/mkstepper-v011.componentinfo.xml
+++ b/embedded/mkstepper-v011/mkstepper-v011/mkstepper-v011.componentinfo.xml
@@ -131,24 +131,24 @@
 					<SourcePath></SourcePath>
 				</d4p1:anyType>
 				<d4p1:anyType i:type="FileInfo">
-					<AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\SAMD51_DFP\1.0.70\gcc\gcc\samd51j18a_flash.ld</AbsolutePath>
+					<AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\SAMD51_DFP\1.0.70\gcc\gcc\samd51j19a_flash.ld</AbsolutePath>
 					<Attribute>config</Attribute>
 					<Category>linkerScript</Category>
 					<Condition>GCC Exe</Condition>
-					<FileContentHash>CF4FN7Jc1GGlwWZRgaNJqA==</FileContentHash>
+					<FileContentHash>Of63AdD4+Czq3mZiSTKfRg==</FileContentHash>
 					<FileVersion></FileVersion>
-					<Name>gcc/gcc/samd51j18a_flash.ld</Name>
+					<Name>gcc/gcc/samd51j19a_flash.ld</Name>
 					<SelectString></SelectString>
 					<SourcePath></SourcePath>
 				</d4p1:anyType>
 				<d4p1:anyType i:type="FileInfo">
-					<AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\SAMD51_DFP\1.0.70\gcc\gcc\samd51j18a_sram.ld</AbsolutePath>
+					<AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\SAMD51_DFP\1.0.70\gcc\gcc\samd51j19a_sram.ld</AbsolutePath>
 					<Attribute>config</Attribute>
 					<Category>other</Category>
 					<Condition>GCC Exe</Condition>
-					<FileContentHash>UCVgCIkMhtRrpTXgb0K8mg==</FileContentHash>
+					<FileContentHash>wuv3TIKUypzM1AtgDfaRYQ==</FileContentHash>
 					<FileVersion></FileVersion>
-					<Name>gcc/gcc/samd51j18a_sram.ld</Name>
+					<Name>gcc/gcc/samd51j19a_sram.ld</Name>
 					<SelectString></SelectString>
 					<SourcePath></SourcePath>
 				</d4p1:anyType>
@@ -157,7 +157,7 @@
 			<PackPath>C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/SAMD51_DFP/1.0.70/Atmel.SAMD51_DFP.pdsc</PackPath>
 			<PackVersion>1.0.70</PackVersion>
 			<PresentInProject>true</PresentInProject>
-			<ReferenceConditionId>ATSAMD51J18A</ReferenceConditionId>
+			<ReferenceConditionId>ATSAMD51J19A</ReferenceConditionId>
 			<RteComponents xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
 				<d4p1:string></d4p1:string>
 			</RteComponents>
diff --git a/embedded/mkstepper-v011/mkstepper-v011/mkstepper-v011.cproj b/embedded/mkstepper-v011/mkstepper-v011/mkstepper-v011.cproj
index c32fc679273ea028b6f7776a024c1e7fdd0133ea..93b87e613e5c64a4c5e49c3dd076e40614356ce3 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/mkstepper-v011.cproj
+++ b/embedded/mkstepper-v011/mkstepper-v011/mkstepper-v011.cproj
@@ -5,7 +5,7 @@
     <ProjectVersion>7.0</ProjectVersion>
     <ToolchainName>com.Atmel.ARMGCC.C</ToolchainName>
     <ProjectGuid>dce6c7e3-ee26-4d79-826b-08594b9ad897</ProjectGuid>
-    <avrdevice>ATSAMD51J18A</avrdevice>
+    <avrdevice>ATSAMD51J19A</avrdevice>
     <avrdeviceseries>none</avrdeviceseries>
     <OutputType>Executable</OutputType>
     <Language>C</Language>
@@ -42,7 +42,7 @@
     </AsfFrameworkConfig>
     <avrtool>com.atmel.avrdbg.tool.atmelice</avrtool>
     <avrtoolserialnumber>J41800087098</avrtoolserialnumber>
-    <avrdeviceexpectedsignature>0x60060006</avrdeviceexpectedsignature>
+    <avrdeviceexpectedsignature>0x60060005</avrdeviceexpectedsignature>
     <avrtoolinterface>SWD</avrtoolinterface>
     <com_atmel_avrdbg_tool_atmelice>
       <ToolOptions>
@@ -90,7 +90,7 @@
     </ListValues>
   </armgcc.linker.libraries.LibrarySearchPaths>
   <armgcc.linker.optimization.GarbageCollectUnusedSections>True</armgcc.linker.optimization.GarbageCollectUnusedSections>
-  <armgcc.linker.miscellaneous.LinkerFlags>-Tsamd51j18a_flash.ld</armgcc.linker.miscellaneous.LinkerFlags>
+  <armgcc.linker.miscellaneous.LinkerFlags>-Tsamd51j19a_flash.ld</armgcc.linker.miscellaneous.LinkerFlags>
   <armgcc.assembler.general.IncludePaths>
     <ListValues>
       <Value>%24(PackRepoDir)\arm\CMSIS\5.0.1\CMSIS\Include\</Value>
@@ -141,7 +141,7 @@
   </armgcc.linker.libraries.LibrarySearchPaths>
   <armgcc.linker.optimization.GarbageCollectUnusedSections>True</armgcc.linker.optimization.GarbageCollectUnusedSections>
   <armgcc.linker.memorysettings.ExternalRAM />
-  <armgcc.linker.miscellaneous.LinkerFlags>-Tsamd51j18a_flash.ld</armgcc.linker.miscellaneous.LinkerFlags>
+  <armgcc.linker.miscellaneous.LinkerFlags>-Tsamd51j19a_flash.ld</armgcc.linker.miscellaneous.LinkerFlags>
   <armgcc.assembler.general.IncludePaths>
     <ListValues>
       <Value>%24(PackRepoDir)\arm\CMSIS\5.0.1\CMSIS\Include\</Value>
@@ -225,10 +225,10 @@
     <Folder Include="Device_Startup\" />
   </ItemGroup>
   <ItemGroup>
-    <None Include="Device_Startup\samd51j18a_flash.ld">
+    <None Include="Device_Startup\samd51j19a_flash.ld">
       <SubType>compile</SubType>
     </None>
-    <None Include="Device_Startup\samd51j18a_sram.ld">
+    <None Include="Device_Startup\samd51j19a_sram.ld">
       <SubType>compile</SubType>
     </None>
   </ItemGroup>
diff --git a/embedded/mkstepper-v011/mkstepper-v011/stepper.c b/embedded/mkstepper-v011/mkstepper-v011/stepper.c
index 2a59f03fd635c4a754d8572e49b356223445e9c0..8b2034d5d26120f54b66c38667da3d76b0605bfb 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/stepper.c
+++ b/embedded/mkstepper-v011/mkstepper-v011/stepper.c
@@ -8,19 +8,14 @@
 #include "stepper.h"
 #include "hardware.h"
 
-stepper_t stepper_new(pin_t *step_pin, pin_t *dir_pin, float position_per_200_steps, uint32_t microsteps){
+stepper_t stepper_new(pin_t *step_pin, pin_t *dir_pin){
 	stepper_t stepper;
 	
 	stepper.step_pin = step_pin;
 	stepper.dir_pin = dir_pin;
-	
-	stepper.position_per_200_steps = position_per_200_steps;
-	stepper.microsteps = microsteps;
-	
+		
 	stepper.speed_period = 0;
 	stepper.position_ticks = 0;
-	stepper.position = 0;
-	stepper.speed = 0;
 	
 	stepper.position_ticks_target = 0;
 	
@@ -30,65 +25,67 @@ stepper_t stepper_new(pin_t *step_pin, pin_t *dir_pin, float position_per_200_st
 void stepper_reset(stepper_t *stepper){
 	stepper->speed_period = 0;
 	stepper->position_ticks = 0;
-	stepper->position = 0;
-	stepper->speed = 0;
-	
 	stepper->position_ticks_target = 0;
+	stepper->dir_steps = 1;
 }
 
-// position and speed by position_per_100_steps
-// speed is position units / s
-void stepper_goto(stepper_t *stepper, float position, float speed){
-	// in steps / second
-	uint32_t discrete_speed = (speed / (stepper->position_per_200_steps / 200)) * stepper->microsteps;
-	// in 3rds of microseconds (a result of timer settings)
-	stepper->speed_period = 3000000 / discrete_speed; 
-	// in steps pulses
-	stepper->position_ticks_target = (position / (stepper->position_per_200_steps / 200)) * stepper->microsteps;
-}
-
-void stepper_targetposition_float(stepper_t *stepper, float position){
-	// do the business
-}
-
-void stepper_targetposition_steps(stepper_t *stepper, int32_t position){
-	stepper->position_ticks_target = position;
-}
-
-void stepper_targetspeed_float(stepper_t *stepper, float speed){
-	// do more business
+void stepper_steps(stepper_t *stepper, int32_t position){
+	stepper->position_ticks_target = abs(position);
+	stepper->position_ticks = 0;
+	if(position < 0){
+		stepper->dir_steps = 0;
+		pin_clear(stepper->dir_pin);
+	} else {
+		stepper->dir_steps = 1;
+		pin_set(stepper->dir_pin);
+	}
 }
 
-void stepper_targetspeed_steps(stepper_t *stepper, uint32_t speed){
-	uint32_t speedmin = ((speed / (stepper->position_per_200_steps / 200)) * stepper->microsteps); // enforce no division by 0
+void stepper_speed(stepper_t *stepper, uint32_t speed){
 	// minimum of 1 step / s
 	// if speed is 0, we leave speed at minimum and set state to not step?
-	(speedmin < 1) ? speedmin = 1 : (0);
+	(speed < 1) ? speed = 1 : (0);
+	stepper->speed = speed;
 	// timing not accurate to real-world yet
 	// timer is 48MHz clock on a DIV16, so we have 3 000 000 ticks / s (333ns resolution, wow)
-	stepper->speed_period = 60000000 / speedmin;
+	stepper->speed_period = 3000000 / speed;
+}
+
+void stepper_segment(stepper_t *stepper, uint32_t startspeed, int32_t accel, int32_t steps){
+	if(accel < 0){
+		stepper->dir_accel = 0;
+	} else {
+		stepper->dir_accel = 1;
+	}
+	stepper->accel_period = 3000000 / abs(accel); // should check for / by 0
+	stepper_speed(stepper, startspeed);
+	stepper_steps(stepper, steps);
+	TICKER_SYNC;
+	uint32_t now = TICKER;
+	stepper->last_accel = now;
+	stepper->last_step = now;
 }
 
 void stepper_update(stepper_t *stepper){	
-	if(stepper->position_ticks_target != stepper->position_ticks){ // still have somewhere to go
+	if(stepper->position_ticks_target > stepper->position_ticks){ // still have somewhere to go
 		TICKER_SYNC;
 		uint32_t now = TICKER;
-		// check if it's time to step
-		// todo: do timer update to fire this f'n at precisely the right time: nice for accel, deccel etc
-		if(now - stepper->last_time > stepper->speed_period){
-			int32_t gap = stepper->position_ticks_target - stepper->position_ticks;
-			if(gap < 0){
-				pin_set(stepper->dir_pin); // step forwards
-				pin_toggle(stepper->step_pin);
-				stepper->position_ticks --;
-			} else if (gap > 0) {
-				pin_clear(stepper->dir_pin);
-				pin_toggle(stepper->step_pin);
-				stepper->position_ticks ++;
+		// check if it's time to accel
+		if(now - stepper->last_accel > stepper->accel_period){
+			if(stepper->dir_accel){
+				uint32_t newspeed = stepper->speed + 1;
+				stepper_speed(stepper, newspeed);
 			} else {
-				// nah
+				uint32_t newspeed = stepper->speed - 1;
+				stepper_speed(stepper, newspeed);
 			}
-			stepper->last_time = now;
+			stepper->last_accel = now;
+		}
+		// check if it's time to step
+		if(now - stepper->last_step > stepper->speed_period){
+			pin_toggle(stepper->step_pin);
+			stepper->position_ticks ++;
+			stepper->last_step = now;
 		} // end step cycle
 		
 	}// end step if not there cycle
diff --git a/embedded/mkstepper-v011/mkstepper-v011/stepper.h b/embedded/mkstepper-v011/mkstepper-v011/stepper.h
index 581023aefb96254b423f5aae2a37f17d89067692..e7811a1cd462e51f5b2a5e82dd626042434f7320 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/stepper.h
+++ b/embedded/mkstepper-v011/mkstepper-v011/stepper.h
@@ -16,33 +16,30 @@ typedef struct {
 	pin_t *step_pin;
 	pin_t *dir_pin;
 	
-	// currently
+	// currently.. why do we need so much state?
 	uint32_t speed_period;
-	int32_t position_ticks;
+	uint32_t speed;
+	uint32_t accel_period;
+	uint32_t position_ticks;
+	uint32_t dir_steps; // 0 or 1
+	uint32_t dir_accel;
 	
-	// updating
-	uint32_t last_time;
-	
-	// float conversions
-	// not used in runtime, only during command calls
-	float position_per_200_steps; // units (mm or deg, probably) moved per full rotation
-	uint32_t microsteps;
-	float position;
-	float speed;
+	// tracking time for updates
+	uint32_t last_step;
+	uint32_t last_accel;
 	
 	// targets
-	int32_t position_ticks_target;
+	uint32_t position_ticks_target;
 }stepper_t;
 
-stepper_t stepper_new(pin_t *step_pin, pin_t *dir_pin, float position_per_200_steps, uint32_t microsteps);
+stepper_t stepper_new(pin_t *step_pin, pin_t *dir_pin);
 
 void stepper_reset(stepper_t *stepper);
 
-void stepper_goto(stepper_t *stepper, float position, float speed);
-void stepper_targetposition_steps(stepper_t *stepper, int32_t steps);
-void stepper_targetposition_float(stepper_t *stepper, float position);
-void stepper_targetspeed_steps(stepper_t *stepper, uint32_t speed);
-void stepper_targetspeed_float(stepper_t *stepper, float speed);
+void stepper_steps(stepper_t *stepper, int32_t steps);
+void stepper_speed(stepper_t *stepper, uint32_t speed);
+
+void stepper_segment(stepper_t *stepper, uint32_t startspeed, int32_t accel, int32_t steps);
 
 void stepper_update(stepper_t *stepper);
 
@@ -50,4 +47,13 @@ void stepper_current_position(stepper_t *steppper, float *position);
 void stepper_current_speed(stepper_t *stepper, float *speed);
 void stepper_currently(stepper_t *stepper, float *position, float *speed);
 
+/*
+step to-do
+ - everything is broken and untested
+ - refactor all for:
+  - dir-by-flag, assume no dir change per segment
+  - speed & periods unfuck
+  - update checks accel rate as well
+*/
+
 #endif /* STEPPER_H_ */
\ No newline at end of file
diff --git a/embedded/mkstepper-v011/mkstepper-v011/tmc26.c b/embedded/mkstepper-v011/mkstepper-v011/tmc26.c
index cd26b8ae1a619c8335da65dd6e6aa91ea4644279..948268cd69187356438edd48c430f37ce5b6bb3e 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/tmc26.c
+++ b/embedded/mkstepper-v011/mkstepper-v011/tmc26.c
@@ -41,7 +41,7 @@ void tmc26_init(tmc26_t *tmc){
 	uint32_t sgthresh_mask = 0b00000111111100000000;
 	int32_t sgthres_val = 60;
 	uint32_t cscale_mask = 0b00000000000000011111;
-	uint32_t cscale_val = 20;
+	uint32_t cscale_val = 12;
 	uint32_t sgcsconf = 0b11010000000000000000 | ((sgthres_val << 8) & sgthresh_mask) | (cscale_val & cscale_mask);
 	tmc26_write(tmc, sgcsconf);
 	
@@ -73,6 +73,6 @@ void tmc26_enable(tmc26_t *tmc){
 	pin_clear(tmc->en_pin);
 }
 
-tmc26_disable(tmc26_t *tmc){
+void tmc26_disable(tmc26_t *tmc){
 	pin_set(tmc->en_pin);
 }
\ No newline at end of file