diff --git a/quad/src/gen_diagram/network.dot b/quad/src/gen_diagram/network.dot
index 25a5dc165c2dac141e2c6694b707ec96db8eaf4a..174e1564fe62c01c56a092bd73e22a4efa945275 100644
--- a/quad/src/gen_diagram/network.dot
+++ b/quad/src/gen_diagram/network.dot
@@ -1,12 +1,12 @@
 digraph G {
 rankdir="LR"
 "Roll PID"[shape=record
-label="<f0>Roll PID  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=15.000] |<f5> [Ki=0.000] |<f6> [Kd=0.200] |<f7> [alpha=0.000]"]
+label="<f0>Roll PID  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=35.000] |<f5> [Ki=0.000] |<f6> [Kd=1.000] |<f7> [alpha=0.880]"]
 "Roll" -> "Roll PID":f1 [label="Constant"]
 "Y Vel PID" -> "Roll PID":f2 [label="Correction"]
 "Ts_IMU" -> "Roll PID":f3 [label="Constant"]
 "Pitch PID"[shape=record
-label="<f0>Pitch PID  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=15.000] |<f5> [Ki=0.000] |<f6> [Kd=0.200] |<f7> [alpha=0.000]"]
+label="<f0>Pitch PID  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=35.000] |<f5> [Ki=0.000] |<f6> [Kd=1.000] |<f7> [alpha=0.880]"]
 "Pitch trim add" -> "Pitch PID":f1 [label="Sum"]
 "X Vel PID" -> "Pitch PID":f2 [label="Correction"]
 "Ts_IMU" -> "Pitch PID":f3 [label="Constant"]
@@ -16,32 +16,32 @@ label="<f0>Yaw PID  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [K
 "Yaw Setpoint" -> "Yaw PID":f2 [label="Constant"]
 "Ts_VRPN" -> "Yaw PID":f3 [label="Constant"]
 "Roll Rate PID"[shape=record
-label="<f0>Roll Rate PID  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=4600.000] |<f5> [Ki=0.000] |<f6> [Kd=550.000] |<f7> [alpha=0.000]"]
-"dPhi" -> "Roll Rate PID":f1 [label="Constant"]
+label="<f0>Roll Rate PID  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=3000.000] |<f5> [Ki=0.000] |<f6> [Kd=500.000] |<f7> [alpha=0.880]"]
+"Gyro X" -> "Roll Rate PID":f1 [label="Constant"]
 "Roll PID" -> "Roll Rate PID":f2 [label="Correction"]
 "Ts_IMU" -> "Roll Rate PID":f3 [label="Constant"]
 "Pitch Rate PID"[shape=record
-label="<f0>Pitch Rate PID  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=4600.000] |<f5> [Ki=0.000] |<f6> [Kd=550.000] |<f7> [alpha=0.000]"]
-"dTheta" -> "Pitch Rate PID":f1 [label="Constant"]
+label="<f0>Pitch Rate PID  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=3000.000] |<f5> [Ki=0.000] |<f6> [Kd=500.000] |<f7> [alpha=0.880]"]
+"Gyro Y" -> "Pitch Rate PID":f1 [label="Constant"]
 "Pitch PID" -> "Pitch Rate PID":f2 [label="Correction"]
 "Ts_IMU" -> "Pitch Rate PID":f3 [label="Constant"]
 "Yaw Rate PID"[shape=record
 label="<f0>Yaw Rate PID  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=29700.000] |<f5> [Ki=0.000] |<f6> [Kd=0.000] |<f7> [alpha=0.000]"]
-"dPsi" -> "Yaw Rate PID":f1 [label="Constant"]
+"Gyro Z" -> "Yaw Rate PID":f1 [label="Constant"]
 "Yaw PID" -> "Yaw Rate PID":f2 [label="Correction"]
 "Ts_IMU" -> "Yaw Rate PID":f3 [label="Constant"]
 "X pos PID"[shape=record
-label="<f0>X pos PID  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=-0.015] |<f5> [Ki=-0.005] |<f6> [Kd=-0.030] |<f7> [alpha=0.000]"]
+label="<f0>X pos PID  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=-0.550] |<f5> [Ki=-0.007] |<f6> [Kd=0.000] |<f7> [alpha=0.000]"]
 "VRPN X" -> "X pos PID":f1 [label="Constant"]
 "X Setpoint" -> "X pos PID":f2 [label="Constant"]
 "Ts_VRPN" -> "X pos PID":f3 [label="Constant"]
 "Y pos PID"[shape=record
-label="<f0>Y pos PID  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=0.015] |<f5> [Ki=0.005] |<f6> [Kd=0.030] |<f7> [alpha=0.000]"]
+label="<f0>Y pos PID  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=0.550] |<f5> [Ki=0.007] |<f6> [Kd=0.000] |<f7> [alpha=0.000]"]
 "VRPN Y" -> "Y pos PID":f1 [label="Constant"]
 "Y Setpoint" -> "Y pos PID":f2 [label="Constant"]
 "Ts_VRPN" -> "Y pos PID":f3 [label="Constant"]
 "Altitude PID"[shape=record
-label="<f0>Altitude PID  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=9804.000] |<f5> [Ki=817.000] |<f6> [Kd=7353.000] |<f7> [alpha=0.000]"]
+label="<f0>Altitude PID  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=-9804.000] |<f5> [Ki=-817.000] |<f6> [Kd=-7353.000] |<f7> [alpha=0.000]"]
 "VRPN Alt" -> "Altitude PID":f1 [label="Constant"]
 "Alt Setpoint" -> "Altitude PID":f2 [label="Constant"]
 "Ts_VRPN" -> "Altitude PID":f3 [label="Constant"]
@@ -66,17 +66,17 @@ label="<f0>Roll  |<f1> [Constant=0.000]"]
 "Yaw"[shape=record
 label="<f0>Yaw  |<f1> [Constant=0.000]"]
 "Pitch trim"[shape=record
-label="<f0>Pitch trim  |<f1> [Constant=0.020]"]
+label="<f0>Pitch trim  |<f1> [Constant=0.045]"]
 "Pitch trim add"[shape=record
 label="<f0>Pitch trim add  |<f1> --\>Summand 1 |<f2> --\>Summand 2"]
 "Pitch trim" -> "Pitch trim add":f1 [label="Constant"]
 "Pitch" -> "Pitch trim add":f2 [label="Constant"]
-"dTheta"[shape=record
-label="<f0>dTheta  |<f1> [Constant=0.000]"]
-"dPhi"[shape=record
-label="<f0>dPhi  |<f1> [Constant=0.000]"]
-"dPsi"[shape=record
-label="<f0>dPsi  |<f1> [Constant=0.000]"]
+"Gyro Y"[shape=record
+label="<f0>Gyro Y  |<f1> [Constant=0.000]"]
+"Gyro X"[shape=record
+label="<f0>Gyro X  |<f1> [Constant=0.000]"]
+"Gyro Z"[shape=record
+label="<f0>Gyro Z  |<f1> [Constant=0.000]"]
 "P PWM Clamp"[shape=record
 label="<f0>P PWM Clamp  |<f1> --\>Bounds in |<f2> [Min=-20000.000] |<f3> [Max=20000.000]"]
 "Pitch Rate PID" -> "P PWM Clamp":f1 [label="Correction"]
@@ -104,35 +104,23 @@ label="<f0>RC Roll  |<f1> [Constant=0.000]"]
 label="<f0>RC Yaw  |<f1> [Constant=0.000]"]
 "RC Throttle"[shape=record
 label="<f0>RC Throttle  |<f1> [Constant=0.000]"]
-"Signal Mixer"[shape=record
-label="<f0>Signal Mixer  |<f1> --\>Throttle |<f2> --\>Pitch |<f3> --\>Roll |<f4> --\>Yaw"]
-"T trim add" -> "Signal Mixer":f1 [label="Sum"]
-"P PWM Clamp" -> "Signal Mixer":f2 [label="Bounded"]
-"R PWM Clamp" -> "Signal Mixer":f3 [label="Bounded"]
-"Y PWM Clamp" -> "Signal Mixer":f4 [label="Bounded"]
-"Ts_IMU"[shape=record
-label="<f0>Ts_IMU  |<f1> [Constant=0.005]"]
-"Ts_VRPN"[shape=record
-label="<f0>Ts_VRPN  |<f1> [Constant=0.040]"]
-"zero"[shape=record
-label="<f0>zero  |<f1> [Constant=0.000]"]
 "X Vel PID"[shape=record
-label="<f0>X Vel PID  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=0.000] |<f5> [Ki=0.000] |<f6> [Kd=0.000] |<f7> [alpha=0.000]"]
+label="<f0>X Vel PID  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=0.100] |<f5> [Ki=0.000] |<f6> [Kd=0.020] |<f7> [alpha=0.880]"]
 "X Vel" -> "X Vel PID":f1 [label="Correction"]
 "X Vel Clamp" -> "X Vel PID":f2 [label="Bounded"]
 "Ts_VRPN" -> "X Vel PID":f3 [label="Constant"]
 "Y Vel PID"[shape=record
-label="<f0>Y Vel PID  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=0.000] |<f5> [Ki=0.000] |<f6> [Kd=0.000] |<f7> [alpha=0.000]"]
+label="<f0>Y Vel PID  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=-0.100] |<f5> [Ki=0.000] |<f6> [Kd=-0.020] |<f7> [alpha=0.880]"]
 "Y Vel" -> "Y Vel PID":f1 [label="Correction"]
 "Y vel Clamp" -> "Y Vel PID":f2 [label="Bounded"]
 "Ts_VRPN" -> "Y Vel PID":f3 [label="Constant"]
 "X Vel"[shape=record
-label="<f0>X Vel  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=0.000] |<f5> [Ki=0.000] |<f6> [Kd=1.000] |<f7> [alpha=0.000]"]
+label="<f0>X Vel  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=0.000] |<f5> [Ki=0.000] |<f6> [Kd=-1.000] |<f7> [alpha=0.000]"]
 "VRPN X" -> "X Vel":f1 [label="Constant"]
 "zero" -> "X Vel":f2 [label="Constant"]
 "Ts_VRPN" -> "X Vel":f3 [label="Constant"]
 "Y Vel"[shape=record
-label="<f0>Y Vel  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=0.000] |<f5> [Ki=0.000] |<f6> [Kd=1.000] |<f7> [alpha=0.000]"]
+label="<f0>Y Vel  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=0.000] |<f5> [Ki=0.000] |<f6> [Kd=-1.000] |<f7> [alpha=0.000]"]
 "VRPN Y" -> "Y Vel":f1 [label="Constant"]
 "zero" -> "Y Vel":f2 [label="Constant"]
 "Ts_VRPN" -> "Y Vel":f3 [label="Constant"]
@@ -142,8 +130,16 @@ label="<f0>X Vel Clamp  |<f1> --\>Bounds in |<f2> [Min=-2.000] |<f3> [Max=2.000]
 "Y vel Clamp"[shape=record
 label="<f0>Y vel Clamp  |<f1> --\>Bounds in |<f2> [Min=-2.000] |<f3> [Max=2.000]"]
 "Y pos PID" -> "Y vel Clamp":f1 [label="Correction"]
-"X Stick Gain"[shape=record
-label="<f0>X Stick Gain  |<f1> --\>Input |<f2> [Gain=5.000]"]
-"Y Stick Gain"[shape=record
-label="<f0>Y Stick Gain  |<f1> --\>Input |<f2> [Gain=-5.000]"]
+"Signal Mixer"[shape=record
+label="<f0>Signal Mixer  |<f1> --\>Throttle |<f2> --\>Pitch |<f3> --\>Roll |<f4> --\>Yaw"]
+"T trim add" -> "Signal Mixer":f1 [label="Sum"]
+"P PWM Clamp" -> "Signal Mixer":f2 [label="Bounded"]
+"R PWM Clamp" -> "Signal Mixer":f3 [label="Bounded"]
+"Y PWM Clamp" -> "Signal Mixer":f4 [label="Bounded"]
+"Ts_IMU"[shape=record
+label="<f0>Ts_IMU  |<f1> [Constant=0.005]"]
+"Ts_VRPN"[shape=record
+label="<f0>Ts_VRPN  |<f1> [Constant=0.040]"]
+"zero"[shape=record
+label="<f0>zero  |<f1> [Constant=0.000]"]
 }
\ No newline at end of file
diff --git a/quad/src/gen_diagram/network.png b/quad/src/gen_diagram/network.png
index 6e1c3ebc4db038a6d42839315233e453f2e123fe..c12bb2905d8e97d2c51cfb7c90f763352b264910 100644
Binary files a/quad/src/gen_diagram/network.png and b/quad/src/gen_diagram/network.png differ
diff --git a/quad/src/quad_app/PID.h b/quad/src/quad_app/PID.h
index 5a83225b0b9813e4d311bf61c8f1eae89c7f24a0..aea92ad5049acfe2f53a1b4e470befb9c39a4bca 100644
--- a/quad/src/quad_app/PID.h
+++ b/quad/src/quad_app/PID.h
@@ -10,16 +10,10 @@
 
 #include "type_def.h"
 
-// Yaw constants
-
-// when using units of degrees
-//#define YAW_ANGULAR_VELOCITY_KP 40.0f
-//#define YAW_ANGULAR_VELOCITY_KI 0.0f
-//#define YAW_ANGULAR_VELOCITY_KD 0.0f
-//#define YAW_ANGLE_KP 2.6f
-//#define YAW_ANGLE_KI 0.0f
-//#define YAW_ANGLE_KD 0.0f
+#define VEL_CLAMP 2.0
+#define PITCH_TRIM 0.045
 
+// Yaw constants
 // when using units of radians
 #define YAW_ANGULAR_VELOCITY_KP 29700//200.0f * 2292.0f
 #define YAW_ANGULAR_VELOCITY_KI 0.0f
@@ -28,59 +22,49 @@
 #define YAW_ANGLE_KI 0.0f
 #define YAW_ANGLE_KD 0.0f
 
-// Roll constants
-//#define ROLL_ANGULAR_VELOCITY_KP 0.95f
-//#define ROLL_ANGULAR_VELOCITY_KI 0.0f
-//#define ROLL_ANGULAR_VELOCITY_KD 0.13f//0.4f//0.7f
-//#define ROLL_ANGLE_KP 17.0f //9.0f
-//#define ROLL_ANGLE_KI 0.0f
-//#define ROLL_ANGLE_KD 0.3f // 0.2f
-//#define YPOS_KP 0.0f
-//#define YPOS_KI 0.0f
-//#define YPOS_KD 0.0f
+
 
 // when using units of radians
-#define ROLL_ANGULAR_VELOCITY_KP 100.0f*46.0f//102.0f*46.0f//9384.0f//204.0f * 46.0f
+#define ROLL_ANGULAR_VELOCITY_KP 3000
 #define ROLL_ANGULAR_VELOCITY_KI 0.0f
-#define ROLL_ANGULAR_VELOCITY_KD 100.f*5.5f//102.0f*6.8f//1387.2//204.0f * 6.8f
-#define ROLL_ANGLE_KP 15.0f
+#define ROLL_ANGULAR_VELOCITY_KD 500
+#define ROLL_ANGULAR_VELOCITY_ALPHA 0.88
+#define ROLL_ANGLE_KP 35
 #define ROLL_ANGLE_KI 0.0f
-#define ROLL_ANGLE_KD 0.2f
-#define YPOS_KP 0.015f
-#define YPOS_KI 0.005f
-#define YPOS_KD 0.03f
+#define ROLL_ANGLE_KD 1.0
+#define ROLL_ANGLE_ALPHA 0.88
+#define YVEL_KP -0.1
+#define YVEL_KD -0.02
+#define YVEL_ALPHA 0.88
+#define YPOS_KP 0.55
+#define YPOS_KI 0.0075
+#define YPOS_KD 0.0
 #define YPOS_ALPHA 0
 
 
 //Pitch constants
-
-// when using units of degrees
-//#define PITCH_ANGULAR_VELOCITY_KP 0.95f
-//#define PITCH_ANGULAR_VELOCITY_KI 0.0f
-//#define PITCH_ANGULAR_VELOCITY_KD 0.13f//0.35f//0.7f
-//#define PITCH_ANGLE_KP 17.0f // 7.2f
-//#define PITCH_ANGLE_KI 0.0f
-//#define PITCH_ANGLE_KD 0.3f //0.3f
-//#define XPOS_KP 40.0f
-//#define XPOS_KI 0.0f
-//#define XPOS_KD 10.0f//0.015f
-
 // when using units of radians
-#define PITCH_ANGULAR_VELOCITY_KP 100.0f*46.0f//101.0f*46.0f//9292.0f//202.0f * 46.0f
+#define PITCH_ANGULAR_VELOCITY_KP 3000
 #define PITCH_ANGULAR_VELOCITY_KI 0.0f
-#define PITCH_ANGULAR_VELOCITY_KD 100.0f*5.5f//101.0f*6.8f//1373.6//202.0f * 6.8f
-#define PITCH_ANGLE_KP 15.0f
+#define PITCH_ANGULAR_VELOCITY_KD 500
+#define PITCH_ANGULAR_VELOCITY_ALPHA 0.88
+#define PITCH_ANGLE_KP 35
 #define PITCH_ANGLE_KI 0.0f
-#define PITCH_ANGLE_KD 0.2f
-#define XPOS_KP -0.015f
-#define XPOS_KI -0.005f
-#define XPOS_KD -0.03f
+#define PITCH_ANGLE_KD 1.0
+#define PITCH_ANGLE_ALPHA 0.88
+#define XVEL_KP 0.1
+#define XVEL_KD 0.02
+#define XVEL_ALPHA 0.88
+#define XPOS_KP -0.55
+#define XPOS_KI -0.0075
+#define XPOS_KD 0.0
 #define XPOS_ALPHA 0
 
 
 //Throttle constants
-#define ALT_ZPOS_KP 9804.0f
-#define ALT_ZPOS_KI 817.0f
-#define ALT_ZPOS_KD 7353.0f
+#define ALT_ZPOS_KP -9804.0f
+#define ALT_ZPOS_KI -817.0f
+#define ALT_ZPOS_KD -7353.0f
+#define ALT_ZPOS_ALPHA 0.88
 
 #endif /* PID_H_ */
diff --git a/quad/src/quad_app/control_algorithm.c b/quad/src/quad_app/control_algorithm.c
index 710f26b34144c2827d46aa0363575541a12aae97..9f2c8d5b9fdca403877c8a11112024a1fc75db17 100644
--- a/quad/src/quad_app/control_algorithm.c
+++ b/quad/src/quad_app/control_algorithm.c
@@ -66,13 +66,9 @@ int control_algorithm_init(parameter_t * ps)
     ps->pitch_trim_add = graph_add_defined_block(graph, BLOCK_ADD, "Pitch trim add");
 
 	// Yaw angular velocity PID
-    // theta_dot is the angular velocity about the y-axis
-    // phi_dot is the angular velocity about the x-axis
-	// psi_dot is the angular velocity about the z-axis
-	// These are calculated from using the gimbal equations
-    ps->theta_dot = graph_add_defined_block(graph, BLOCK_CONSTANT, "dTheta");
-    ps->phi_dot = graph_add_defined_block(graph, BLOCK_CONSTANT, "dPhi");
-    ps->psi_dot = graph_add_defined_block(graph, BLOCK_CONSTANT, "dPsi");
+    ps->gyro_y = graph_add_defined_block(graph, BLOCK_CONSTANT, "Gyro Y");
+    ps->gyro_x = graph_add_defined_block(graph, BLOCK_CONSTANT, "Gyro X");
+    ps->gyro_z = graph_add_defined_block(graph, BLOCK_CONSTANT, "Gyro Z");
     ps->clamp_d_pwmP = graph_add_defined_block(graph, BLOCK_BOUNDS, "P PWM Clamp");
     ps->clamp_d_pwmR = graph_add_defined_block(graph, BLOCK_BOUNDS, "R PWM Clamp");
     ps->clamp_d_pwmY = graph_add_defined_block(graph, BLOCK_BOUNDS, "Y PWM Clamp");
@@ -90,18 +86,30 @@ int control_algorithm_init(parameter_t * ps)
     ps->rc_yaw = graph_add_defined_block(graph, BLOCK_CONSTANT, "RC Yaw");
     ps->rc_throttle = graph_add_defined_block(graph, BLOCK_CONSTANT, "RC Throttle");
 
+    // Create blocks for velocity controllers
+    ps->x_vel_pid = graph_add_defined_block(graph, BLOCK_PID, "X Vel PID");
+    ps->y_vel_pid = graph_add_defined_block(graph, BLOCK_PID, "Y Vel PID");
+    ps->x_vel = graph_add_defined_block(graph, BLOCK_PID, "X Vel");
+    ps->y_vel = graph_add_defined_block(graph, BLOCK_PID, "Y Vel");
+    ps->x_vel_clamp = graph_add_defined_block(graph, BLOCK_BOUNDS, "X Vel Clamp");
+    ps->y_vel_clamp = graph_add_defined_block(graph, BLOCK_BOUNDS, "Y vel Clamp");
+
     ps->mixer = graph_add_defined_block(graph, BLOCK_MIXER, "Signal Mixer");
 
     ps->angle_time = graph_add_defined_block(graph, BLOCK_CONSTANT, "Ts_IMU");
     ps->pos_time = graph_add_defined_block(graph, BLOCK_CONSTANT, "Ts_VRPN");
 
+    // Useful zero block
+    int zero_block = graph_add_defined_block(graph, BLOCK_CONSTANT, "zero");
+    graph_set_param_val(graph, zero_block, CONST_SET, 0);
+
     // Connect pitch PID chain
     // Trims
     graph_set_source(graph, ps->pitch_trim_add, ADD_SUMMAND1, ps->pitch_trim, CONST_VAL);
     graph_set_source(graph, ps->pitch_trim_add, ADD_SUMMAND2, ps->cur_pitch, CONST_VAL);
     // Controllers
     graph_set_source(graph, ps->pitch_r_pid, PID_SETPOINT, ps->pitch_pid, PID_CORRECTION);
-    graph_set_source(graph, ps->pitch_r_pid, PID_CUR_POINT, ps->theta_dot, CONST_VAL);
+    graph_set_source(graph, ps->pitch_r_pid, PID_CUR_POINT, ps->gyro_y, CONST_VAL);
     graph_set_source(graph, ps->pitch_r_pid, PID_DT, ps->angle_time, CONST_VAL);
     graph_set_source(graph, ps->pitch_pid, PID_CUR_POINT, ps->pitch_trim_add, ADD_SUM);
     //graph_set_source(graph, ps->pitch_pid, PID_CUR_POINT, ps->vrpn_pitch, CONST_VAL);
@@ -109,7 +117,7 @@ int control_algorithm_init(parameter_t * ps)
 
      // Connect roll PID chain
     graph_set_source(graph, ps->roll_r_pid, PID_SETPOINT, ps->roll_pid, PID_CORRECTION);
-    graph_set_source(graph, ps->roll_r_pid, PID_CUR_POINT, ps->phi_dot, CONST_VAL);
+    graph_set_source(graph, ps->roll_r_pid, PID_CUR_POINT, ps->gyro_x, CONST_VAL);
     graph_set_source(graph, ps->roll_r_pid, PID_DT, ps->angle_time, CONST_VAL);
     graph_set_source(graph, ps->roll_pid, PID_CUR_POINT, ps->cur_roll, CONST_VAL);
     //graph_set_source(graph, ps->roll_pid, PID_CUR_POINT, ps->vrpn_roll, CONST_VAL);
@@ -117,26 +125,49 @@ int control_algorithm_init(parameter_t * ps)
 
     // Connect yaw PID chain
     graph_set_source(graph, ps->yaw_r_pid, PID_SETPOINT, ps->rc_yaw, PID_CORRECTION);
-    graph_set_source(graph, ps->yaw_r_pid, PID_CUR_POINT, ps->psi_dot, CONST_VAL);
+    graph_set_source(graph, ps->yaw_r_pid, PID_CUR_POINT, ps->gyro_z, CONST_VAL);
     graph_set_source(graph, ps->yaw_r_pid, PID_DT, ps->angle_time, CONST_VAL);
 
+    // X velocity PID
+        // Use a PID block to compute the derivative
+    graph_set_param_val(graph, ps->x_vel, PID_KD, -1);
+    graph_set_source(graph, ps->x_vel, PID_DT, ps->pos_time, CONST_VAL);
+    graph_set_source(graph, ps->x_vel, PID_CUR_POINT, ps->vrpn_x, CONST_VAL);
+    graph_set_source(graph, ps->x_vel, PID_SETPOINT, zero_block, CONST_VAL);
+        // Connect velocity PID itself
+    graph_set_source(graph, ps->x_vel_pid, PID_DT, ps->pos_time, CONST_VAL);
+    graph_set_source(graph, ps->x_vel_pid, PID_CUR_POINT, ps->x_vel, PID_CORRECTION);
+    graph_set_source(graph, ps->x_vel_pid, PID_SETPOINT, ps->x_vel_clamp, BOUNDS_OUT);
+    graph_set_source(graph, ps->x_vel_clamp, BOUNDS_IN, ps->x_pos_pid, PID_CORRECTION);
 
-    // X autonomous
+    // Y velocity PID
+        // Use a PID block to compute the derivative
+    graph_set_param_val(graph, ps->y_vel, PID_KD, -1);
+    graph_set_source(graph, ps->y_vel, PID_DT, ps->pos_time, CONST_VAL);
+    graph_set_source(graph, ps->y_vel, PID_CUR_POINT, ps->vrpn_y, CONST_VAL);
+    graph_set_source(graph, ps->y_vel, PID_SETPOINT, zero_block, CONST_VAL);
+        // Connect velocity PID itself
+    graph_set_source(graph, ps->y_vel_pid, PID_DT, ps->pos_time, CONST_VAL);
+    graph_set_source(graph, ps->y_vel_pid, PID_CUR_POINT, ps->y_vel, PID_CORRECTION);
+    graph_set_source(graph, ps->y_vel_pid, PID_SETPOINT, ps->y_vel_clamp, BOUNDS_OUT);
+    graph_set_source(graph, ps->y_vel_clamp, BOUNDS_IN, ps->y_pos_pid, PID_CORRECTION);
+
+    // X position
     graph_set_source(graph, ps->x_pos_pid, PID_DT, ps->pos_time, CONST_VAL);
     graph_set_source(graph, ps->x_pos_pid, PID_CUR_POINT, ps->vrpn_x, CONST_VAL);
     graph_set_source(graph, ps->x_pos_pid, PID_SETPOINT, ps->x_set, CONST_VAL);
-    // Y autonomous
+    // Y position
     graph_set_source(graph, ps->y_pos_pid, PID_DT, ps->pos_time, CONST_VAL);
     graph_set_source(graph, ps->y_pos_pid, PID_CUR_POINT, ps->vrpn_y, CONST_VAL);
     graph_set_source(graph, ps->y_pos_pid, PID_SETPOINT, ps->y_set, CONST_VAL);
-    // Alt autonomous
+    // Alt position
     graph_set_source(graph, ps->alt_pid, PID_DT, ps->pos_time, CONST_VAL);
     graph_set_source(graph, ps->alt_pid, PID_CUR_POINT, ps->vrpn_alt, CONST_VAL);
     graph_set_source(graph, ps->alt_pid, PID_SETPOINT, ps->alt_set, CONST_VAL);
     graph_set_source(graph, ps->alt_set, CONST_VAL, ps->vrpn_alt, CONST_VAL);
     graph_set_source(graph, ps->throttle_trim_add, ADD_SUMMAND1, ps->alt_pid, PID_CORRECTION);
     graph_set_source(graph, ps->throttle_trim_add, ADD_SUMMAND2, ps->throttle_trim, CONST_VAL);
-    // Yaw autonomous
+    // Yaw angle
     graph_set_source(graph, ps->yaw_pid, PID_DT, ps->pos_time, CONST_VAL);
     graph_set_source(graph, ps->yaw_pid, PID_SETPOINT, ps->yaw_set, CONST_VAL);
     graph_set_source(graph, ps->yaw_pid, PID_CUR_POINT, ps->cur_yaw, CONST_VAL);
@@ -156,17 +187,21 @@ int control_algorithm_init(parameter_t * ps)
     graph_set_param_val(graph, ps->pitch_pid, PID_KP, PITCH_ANGLE_KP);
     graph_set_param_val(graph, ps->pitch_pid, PID_KI, PITCH_ANGLE_KI);
     graph_set_param_val(graph, ps->pitch_pid, PID_KD, PITCH_ANGLE_KD);
+    graph_set_param_val(graph, ps->pitch_pid, PID_ALPHA, PITCH_ANGLE_ALPHA);
     graph_set_param_val(graph, ps->pitch_r_pid, PID_KP, PITCH_ANGULAR_VELOCITY_KP);
     graph_set_param_val(graph, ps->pitch_r_pid, PID_KI, PITCH_ANGULAR_VELOCITY_KI);
     graph_set_param_val(graph, ps->pitch_r_pid, PID_KD, PITCH_ANGULAR_VELOCITY_KD);
+    graph_set_param_val(graph, ps->pitch_r_pid, PID_ALPHA, PITCH_ANGULAR_VELOCITY_ALPHA);
 
     // Set roll PID constants
     graph_set_param_val(graph, ps->roll_pid, PID_KP, ROLL_ANGLE_KP);
     graph_set_param_val(graph, ps->roll_pid, PID_KI, ROLL_ANGLE_KI);
     graph_set_param_val(graph, ps->roll_pid, PID_KD, ROLL_ANGLE_KD);
+    graph_set_param_val(graph, ps->roll_pid, PID_ALPHA, ROLL_ANGLE_ALPHA);
     graph_set_param_val(graph, ps->roll_r_pid, PID_KP, ROLL_ANGULAR_VELOCITY_KP);
     graph_set_param_val(graph, ps->roll_r_pid, PID_KI, ROLL_ANGULAR_VELOCITY_KI);
     graph_set_param_val(graph, ps->roll_r_pid, PID_KD, ROLL_ANGULAR_VELOCITY_KD);
+    graph_set_param_val(graph, ps->roll_r_pid, PID_ALPHA, ROLL_ANGULAR_VELOCITY_ALPHA);
 
     // Set yaw PID constants
     graph_set_param_val(graph, ps->yaw_pid, PID_KP, YAW_ANGLE_KP);
@@ -176,6 +211,14 @@ int control_algorithm_init(parameter_t * ps)
     graph_set_param_val(graph, ps->yaw_r_pid, PID_KI, YAW_ANGULAR_VELOCITY_KI);
     graph_set_param_val(graph, ps->yaw_r_pid, PID_KD, YAW_ANGULAR_VELOCITY_KD);
 
+    // Set velocity constants
+    graph_set_param_val(graph, ps->x_vel_pid, PID_KP, XVEL_KP);
+    graph_set_param_val(graph, ps->x_vel_pid, PID_KD, XVEL_KD);
+    graph_set_param_val(graph, ps->x_vel_pid, PID_ALPHA, XVEL_ALPHA);
+    graph_set_param_val(graph, ps->y_vel_pid, PID_KP, YVEL_KP);
+    graph_set_param_val(graph, ps->y_vel_pid, PID_KD, YVEL_KD);
+    graph_set_param_val(graph, ps->y_vel_pid, PID_ALPHA, YVEL_ALPHA);
+
     // Set X/Y/Alt constants
     graph_set_param_val(graph, ps->x_pos_pid, PID_KP, XPOS_KP);
     graph_set_param_val(graph, ps->x_pos_pid, PID_KI, XPOS_KI);
@@ -197,60 +240,14 @@ int control_algorithm_init(parameter_t * ps)
     graph_set_param_val(graph, ps->clamp_d_pwmY, BOUNDS_MIN, -PWM_DIFF_BOUNDS);
     graph_set_param_val(graph, ps->clamp_d_pwmY, BOUNDS_MAX, PWM_DIFF_BOUNDS);
 
-
-    // Velocity stuff
-    int zero_block = graph_add_defined_block(graph, BLOCK_CONSTANT, "zero");
-
-    ps->x_vel_pid = graph_add_defined_block(graph, BLOCK_PID, "X Vel PID");
-    ps->y_vel_pid = graph_add_defined_block(graph, BLOCK_PID, "Y Vel PID");
-    ps->x_vel = graph_add_defined_block(graph, BLOCK_PID, "X Vel");
-    ps->y_vel = graph_add_defined_block(graph, BLOCK_PID, "Y Vel");
-    ps->x_vel_clamp = graph_add_defined_block(graph, BLOCK_BOUNDS, "X Vel Clamp");
-    ps->y_vel_clamp = graph_add_defined_block(graph, BLOCK_BOUNDS, "Y vel Clamp");
-    ps->vel_x_gain = graph_add_defined_block(graph, BLOCK_GAIN, "X Stick Gain");
-    ps->vel_y_gain = graph_add_defined_block(graph, BLOCK_GAIN, "Y Stick Gain");
-
-    graph_set_source(graph, ps->x_vel_pid, PID_DT, ps->pos_time, CONST_VAL);
-    graph_set_source(graph, ps->y_vel_pid, PID_DT, ps->pos_time, CONST_VAL);
-    graph_set_source(graph, ps->x_vel, PID_DT, ps->pos_time, CONST_VAL);
-    graph_set_source(graph, ps->y_vel, PID_DT, ps->pos_time, CONST_VAL);
-
-    graph_set_source(graph, ps->x_vel_pid, PID_SETPOINT, ps->x_vel, PID_CORRECTION);
-    graph_set_source(graph, ps->y_vel_pid, PID_SETPOINT, ps->y_vel, PID_CORRECTION);
-    graph_set_source(graph, ps->x_vel_pid, PID_CUR_POINT, ps->x_vel, PID_CORRECTION);
-    graph_set_source(graph, ps->y_vel_pid, PID_CUR_POINT, ps->y_vel, PID_CORRECTION);
-
-    graph_set_source(graph, ps->x_vel, PID_CUR_POINT, ps->vrpn_x, CONST_VAL);
-    graph_set_source(graph, ps->y_vel, PID_CUR_POINT, ps->vrpn_y, CONST_VAL);
-    graph_set_source(graph, ps->x_vel, PID_SETPOINT, zero_block, CONST_VAL);
-    graph_set_source(graph, ps->y_vel, PID_SETPOINT, zero_block, CONST_VAL);
-
-    graph_set_source(graph, ps->x_vel_pid, PID_SETPOINT, ps->x_vel_clamp, GAIN_RESULT);
-    graph_set_source(graph, ps->y_vel_pid, PID_SETPOINT, ps->y_vel_clamp, GAIN_RESULT);
-
-    graph_set_source(graph, ps->x_vel_clamp, BOUNDS_IN, ps->x_pos_pid, PID_CORRECTION);
-    graph_set_source(graph, ps->y_vel_clamp, BOUNDS_IN, ps->y_pos_pid, PID_CORRECTION);
-    //graph_set_source(graph, ps->vel_x_gain, GAIN_INPUT, ps->rc_pitch, CONST_VAL);
-    //graph_set_source(graph, ps->vel_y_gain, GAIN_INPUT, ps->rc_roll, CONST_VAL);
-    //graph_set_source(graph, ps->x_vel_clamp, BOUNDS_IN, ps->vel_x_gain, GAIN_RESULT);
-    //graph_set_source(graph, ps->y_vel_clamp, BOUNDS_IN, ps->vel_y_gain, GAIN_RESULT);
-
-    float vel_clamps = 2;
-    graph_set_param_val(graph, ps->x_vel_clamp, BOUNDS_MIN, -vel_clamps);
-    graph_set_param_val(graph, ps->x_vel_clamp, BOUNDS_MAX, vel_clamps);
-    graph_set_param_val(graph, ps->y_vel_clamp, BOUNDS_MIN, -vel_clamps);
-    graph_set_param_val(graph, ps->y_vel_clamp, BOUNDS_MAX, vel_clamps);
-
-
-    graph_set_param_val(graph, ps->x_vel, PID_KD, 1);
-    graph_set_param_val(graph, ps->y_vel, PID_KD, 1);
-
-    graph_set_param_val(graph, ps->vel_x_gain, GAIN_GAIN, 5);
-    graph_set_param_val(graph, ps->vel_y_gain, GAIN_GAIN, -5);
-
+    // Set velocity clamping limits
+    graph_set_param_val(graph, ps->x_vel_clamp, BOUNDS_MIN, -VEL_CLAMP);
+    graph_set_param_val(graph, ps->x_vel_clamp, BOUNDS_MAX, VEL_CLAMP);
+    graph_set_param_val(graph, ps->y_vel_clamp, BOUNDS_MIN, -VEL_CLAMP);
+    graph_set_param_val(graph, ps->y_vel_clamp, BOUNDS_MAX, VEL_CLAMP);
 
     // Set trims
-    graph_set_param_val(graph, ps->pitch_trim, CONST_SET, 0.02);
+    graph_set_param_val(graph, ps->pitch_trim, CONST_SET, PITCH_TRIM);
 
     // Initial value for sampling periods
     graph_set_param_val(graph, ps->pos_time, CONST_SET, 0.04);
@@ -341,12 +338,9 @@ int control_algorithm_init(parameter_t * ps)
 	// Sensor values
     graph_set_param_val(graph, ps->cur_pitch, CONST_SET, sensor_struct->pitch_angle_filtered);
     graph_set_param_val(graph, ps->cur_roll, CONST_SET, sensor_struct->roll_angle_filtered);
-    //graph_set_param_val(graph, ps->theta_dot, CONST_SET, sensor_struct->theta_dot);
-    //graph_set_param_val(graph, ps->phi_dot, CONST_SET, sensor_struct->phi_dot);
-    //graph_set_param_val(graph, ps->psi_dot, CONST_SET, sensor_struct->psi_dot);
-    graph_set_param_val(graph, ps->theta_dot, CONST_SET, sensor_struct->gyr_y);
-    graph_set_param_val(graph, ps->phi_dot, CONST_SET, sensor_struct->gyr_x);
-    graph_set_param_val(graph, ps->psi_dot, CONST_SET, sensor_struct->gyr_z);
+    graph_set_param_val(graph, ps->gyro_y, CONST_SET, sensor_struct->gyr_y);
+    graph_set_param_val(graph, ps->gyro_x, CONST_SET, sensor_struct->gyr_x);
+    graph_set_param_val(graph, ps->gyro_z, CONST_SET, sensor_struct->gyr_z);
 
     // RC values
     graph_set_param_val(graph, ps->rc_pitch, CONST_SET, user_input_struct->pitch_angle_manual_setpoint);
diff --git a/quad/src/quad_app/type_def.h b/quad/src/quad_app/type_def.h
index d016134432b8e058601904a5013a296b7ecd7b00..21a1dcc0b949dd1f4c434618a772f3f5142a5b1f 100644
--- a/quad/src/quad_app/type_def.h
+++ b/quad/src/quad_app/type_def.h
@@ -316,9 +316,9 @@ typedef struct parameter_t {
 	int cur_pitch;
 	int cur_roll;
 	int cur_yaw;
-	int theta_dot;
-	int phi_dot;
-	int psi_dot;
+	int gyro_y;
+	int gyro_x;
+	int gyro_z;
 	// VRPN blocks
 	int vrpn_x;
 	int vrpn_y;