diff --git a/ArduinoDriver/ArduinoDriver.ino b/ArduinoDriver/ArduinoDriver.ino
index dec8a02c746203aece320a53bbaa6187e7aa05c0..f9d9c51a129a257ca353e1f872b7ee7ad42f777e 100644
--- a/ArduinoDriver/ArduinoDriver.ino
+++ b/ArduinoDriver/ArduinoDriver.ino
@@ -2,70 +2,39 @@
 #include <Servo.h>
 
 #define BAUDRATE 57600 // Serial baudrate
-#define SIZE 12 // Size of incoming data in bytes
+#define SIZE 6 // Size of incoming data in bytes
 
 // DC motor pins
-#define E1 5     //M1 Speed Control
-#define E2 6     //M2 Speed Control
-
-Servo motor1;
-Servo motor2;
-
-// Servo pins
-#define sNum 6
-#define mNum 4
-int sPins[] = { 2, // arm
-                3, // claw
-                8, // bottom
-                9, // top
-                10, // cagelock
-                11 // droplock
-              };
-
-int sInit[] = { 90,
-                90,
-                90,
-                90,
-                90,
-                90
-              };
+#define ML 5     //M1 Speed Control
+#define MR 6     //M2 Speed Control
 
-// Byte array to hold incoming serial data
-byte bytes[SIZE];
+Servo motorL;
+Servo motorR;
 
-// Data arrays to hold motor values
-int mData[mNum];
-int sData[sNum];
+// Serial data in will be 6 bytes: SOM, L_dir, L_speed, R_dir, R_speed, EOM
+// where: L_dir = 0 meanst stop, 1 forward and 2 rev, same for R
+//        speed is a byte from 0-200 determining throttle position (201 - 255 are reserved.)
+// special bytes:
+// SOM (start of message): 250, EOM (end of message): 251
 
-// Servos
-Servo servos[sNum];
+// Byte array to hold incoming serial data
+byte bytes[SIZE];
+short motors[SIZE-2];
 
 // Timer for communications problems check
 elapsedMillis timer0;
 
 void setup(void)
 {
-  // Initialize DC motor
-  for (int i = 0; i < mNum; i++)
-    mData[i] = 0;
-
-  // Initialize servos
-  for (int i = 0; i < sNum; i++) {
-    sData[i] = sInit[i];
-
-    servos[i].attach(sPins[i]);
-    servos[i].write(sData[i]);
-  }
-
   // Initialize DC motor pins
-  for (int i = 4; i <= 7; i++)
-    pinMode(i, OUTPUT);
+  pinMode(ML, OUTPUT);
+  pinMode(MR, OUTPUT);
+  motorL.attach(ML);
+  motorR.attach(MR);
 
-  // Write initial DC motor values
-  //digitalWrite(E1, LOW);
-  //digitalWrite(E2, LOW);
-  motor2.attach(E2);
-  motor1.attach(E1);
+  for (int i = 0; i < SIZE-2; i++) {
+    motors[i] = 0;
+  }
 
   // Initialize serial
   Serial.begin(BAUDRATE);
@@ -79,18 +48,12 @@ void loop(void)
     bytes[i] = 0;
   }
 
-  // Check for connection problems
+  // Check for connection problems, if nothing in for more than .1 secs stop motors
   while (Serial.available() < SIZE) {
     if (timer0 > 100) {
       timer0 = 0;
-
-      mData[0] = 0;
-      mData[2] = 0;
-
-      //digitalWrite(E1, mData[0]);
-      //digitalWrite(E2, mData[2]);
-      motor1.writeMicroseconds(1500);
-      motor2.writeMicroseconds(1500);
+      motorL.writeMicroseconds(1500);
+      motorR.writeMicroseconds(1500);
     }
 
     delay(10);
@@ -103,64 +66,45 @@ void loop(void)
     }
   }
 
+  //  0 meanst stop, 1 forward and 2 rev
+  // SOM, L_dir, L_speed, R_dir, R_speed, EOM
+
   // If serial data looks ok, fill data array
-  if (bytes[0] == 'b' && bytes[SIZE - 1] == 'e') {
-    for (int i = 0; i < mNum; i++)
-      mData[i] = bytes[i + 1];
-
-    for (int i = 0; i < sNum; i++)
-      sData[i] = bytes[i + mNum + 1];
-
-    Serial.print("OK\n");
-
-    // Serial.print("mData: ");
-    // // Print contents of mData to serial
-    // for(int i = 0; i < 4; i++) {
-    //     Serial.print(mData[i]);
-    //     Serial.print(" ");
-    // }
-
-    // Serial.print(" sData: ");
-    // // Print contents of sData to serial
-    // for(int i = 0; i < sNum; i++) {
-    //     Serial.print(sData[i]);
-    //     Serial.print(" ");
-    // }
-    // Serial.praint("\n");
-  } else {
-    Serial.print("Corrupt data!\n");
-  }
+  if (bytes[0] == 250 && bytes[SIZE - 1] == 251) {
+      if (bytes[1] == 0) {
+        motors[0] = 0;
+        motors[1] = 1;
+        
+      } else if (bytes[1] == 1) {
+        motors[0] = 1;
+        motors[1] = round(2.5*bytes[2]);
+      } else {
+        motors[0] = -1;
+        motors[1] = round(2.5*bytes[2]);
+      }
+
+      if (bytes[3] == 0) {
+        motors[2] = 0;
+        motors[3] = 1;
+        
+      } else if (bytes[3] == 1) {
+        motors[2] = 1;
+        motors[3] = round(2.5*bytes[4]);
+      } else {
+        motors[2] = -1;
+        motors[3] = round(2.5*bytes[4]);
+      }
+       
+      
+      motorL.writeMicroseconds(1500+motors[0]*motors[1]);
+      motorR.writeMicroseconds(1500+motors[2]*motors[3]);
 
-  // Write DC motor values
-  //analogWrite(E1, mData[0]);
-  if (mData[1] == 1) {
-    //digitalWrite(M1, HIGH);
-    mData[1] = 1;
-  } else if (mData[1] == 0) {
-    //digitalWrite(M1, LOW);
-    mData[1] = -1;
-  }
-  
-  if (mData[3] == 1) {
-    //digitalWrite(M2, HIGH);
-    mData[3] = 1;
-  } else if (mData[3] == 0) {
-    //digitalWrite(M2, LOW);
-    mData[3] = -1;
+  } else {
+    motorL.writeMicroseconds(1500);
+    motorR.writeMicroseconds(1500);
   }
-  //analogWrite(E2, mData[2]);
-  motor1.writeMicroseconds(1500+mData[1]*mData[0]*2);
-  motor2.writeMicroseconds(1500+mData[3]*mData[2]*2);
-  //delay(6);
-
 
 
-  for (int i = 0; i < sNum; i++)
-    servos[i].write(sData[i]);
-
-  while (Serial.available() > 0) {
-    char t = Serial.read();
-  }
 
   timer0 = 0;
   delay(10);
diff --git a/src/main.rs b/src/main.rs
index 39f787dbe78d36f175b2d2fe69eab80017707971..3fad1aad7f737e2716e0c16b48d744b045ad1c5a 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -26,8 +26,8 @@ const LIDAR_ADDRESS: &str = "127.0.0.1:8080";
 const LIDAR_BUF_SIZE: usize = 4096;
 
 //Arduinos
-const COUNTER_SERIAL_PORT: &str = "/dev/cu.usbmodem1422";
-const DRIVER_SERIAL_PORT: &str = "/dev/cu.usbmodem1423";
+const COUNTER_SERIAL_PORT: &str = "/dev/cu.usbmodem1412";
+const DRIVER_SERIAL_PORT: &str = "/dev/cu.usbmodem1421";
 
 //controller
 const REMOTE_OPERATOR_ADDRESS: &str = "10.9.0.3:30000"; // remember to double check port!
@@ -45,7 +45,7 @@ const WHEEL_RADIUS: f32 =  30.0; //cm
 /////////////////////////////
 ///////    structs    ///////
 /////////////////////////////
-struct stateStruct {
+struct RobotState {
     x: f32,
     y: f32,
     theta: f32,
@@ -66,12 +66,35 @@ fn main() {
     let (mapper_send_location_tx, mapper_send_location_rx): (mpsc::Sender<(f32, f32, f32, f32, f32)>, mpsc::Receiver<(f32, f32, f32, f32, f32)>) = mpsc::channel();
 
 
-    let controller = thread::spawn(move || {
-        let listener = TcpListener::bind(REMOTE_OPERATOR_ADDRESS).unwrap();
+    let builder = thread::Builder::new().name("controller".into());
+    let controller = builder.spawn(move || {
+
         let mut stream;
-        let mut state: (f32, f32, f32, f32, f32) = (COLS as f32/2.0,ROWS as f32/2.0, 0.0, 0.0, 0.0);
-        let left_motor = Pin::new(127); // number depends on chip, etc.
-        let right_motor = Pin::new(128); 
+        let mut state: (f32, f32, f32, f32, f32) = (COLS as f32/2.0,ROWS as f32/2.0, 0.0, 0.0, 0.0); 
+        
+        let mut port: serial::SystemPort;
+        loop{
+            match  serial::open(&DRIVER_SERIAL_PORT) {
+                Ok(p) => {port = p; break;},
+                Err(e) => {
+                    println!("Controller: Could not connect to arduino driver: {}", e); 
+                    thread::sleep(time::Duration::new(1,0));
+                    },
+            }
+        }
+        interact(&mut port).unwrap();
+
+        let listener: std::net::TcpListener;
+        loop {
+            match TcpListener::bind(REMOTE_OPERATOR_ADDRESS) {
+                Ok(lis) => {listener = lis; break;},
+                Err(e) => {
+                    println!("Controller: No connection from operator yet. {}", e);
+                    thread::sleep(time::Duration::new(1,0));
+                    }, 
+            }
+        }
+
         match listener.accept() {
             Ok((socket, addr)) => {
                 println!("controller: new client: {:?}", addr); stream=socket;
@@ -121,7 +144,7 @@ fn main() {
                             },
                             Err(_) => {}, //TODO
                         }
-                        if received_bytes > message_len && recording { // EOM is missing!
+                        if received_bytes > message_length && recording { // EOM is missing!
                             received_bytes = 0;
                             recording = false;
                         }
@@ -136,6 +159,7 @@ fn main() {
                     // PID controller
 
                     // send voltage to motors.
+                    port.write(&message[0..message_length]).unwrap();
 
                 }
             
@@ -143,7 +167,7 @@ fn main() {
             },
             Err(e) => println!("couldn't get client: {:?}", e), // TODO: what if controller braks? Thread ends?
         }
-    });
+    }).unwrap();
 
     //let mut vecMap = vec![vec![0; ROWS]; COLS];
 
@@ -154,7 +178,8 @@ fn main() {
     //println!("{}, {}", map[0][0], map[0][1]);
 
     // dummy thread for replacing lidar
-    let server = thread::spawn(|| {
+    let builder = thread::Builder::new().name("DummyLidarThread".into());
+    let server = builder.spawn(|| {
         let listener = TcpListener::bind(LIDAR_ADDRESS).unwrap();
         let mut stream;
         match listener.accept() {
@@ -203,15 +228,25 @@ fn main() {
             },
             Err(e) => println!("couldn't get client: {:?}", e),
         }
-    });
+    }).unwrap();
 
 
     // location tracker
-    let tracker = thread::spawn(move || {
+    let builder = thread::Builder::new().name("Location Tracker Thread".into());
+    let tracker = builder.spawn(move || {
         println!("Tracker started.");
         
         let mut serial_buf: [u8; 8] = [0; 8];
-        let mut port = serial::open(&COUNTER_SERIAL_PORT).unwrap();
+        let mut port: serial::SystemPort;
+        loop{
+            match  serial::open(&COUNTER_SERIAL_PORT) {
+                Ok(p) => {port = p; break;},
+                Err(e) => {
+                    println!("LocationTracker: Could not connect to arduino counter: {}", e); 
+                    thread::sleep(time::Duration::new(1,0));
+                    },
+            }
+        }
         interact(&mut port).unwrap();
 
         //let mut l_tick: f32 = 0;
@@ -264,12 +299,13 @@ fn main() {
         };
         println!("tracker exiting with local pos: {:?}", state);
    
-    });
+    }).unwrap();
 
 
 
     // mapper (gets lidar data, requests position and updates its map.)
-    let mapper = thread::spawn(move || {
+    let builder = thread::Builder::new().name("Mapper Thread".into());
+    let mapper = builder.spawn(move || {
         println!("mapper started.");
         // create empty map
         
@@ -341,7 +377,7 @@ fn main() {
 
         
    
-    });
+    }).unwrap();
 
 
     println!("Main wating for join.");