diff --git a/quad/src/gen_diagram/network.dot b/quad/src/gen_diagram/network.dot
index 07cb977d796610ef9c22de4c76891b48fee1514f..c7ebd3547075c6e2210eef8a3855bb61659a84c3 100644
--- a/quad/src/gen_diagram/network.dot
+++ b/quad/src/gen_diagram/network.dot
@@ -3,18 +3,18 @@ rankdir="LR"
 "Roll PID"[shape=record
 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"]
-"Yaw Correction" -> "Roll PID":f2 [label="Rotated Y"]
+"RC Roll" -> "Roll PID":f2 [label="Constant"]
 "Ts_IMU" -> "Roll PID":f3 [label="Constant"]
 "Pitch PID"[shape=record
 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"]
-"Yaw Correction" -> "Pitch PID":f2 [label="Rotated X"]
+"RC Pitch" -> "Pitch PID":f2 [label="Constant"]
 "Ts_IMU" -> "Pitch PID":f3 [label="Constant"]
 "Yaw PID"[shape=record
 label="<f0>Yaw PID  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=2.600] |<f5> [Ki=0.000] |<f6> [Kd=0.000] |<f7> [alpha=0.000]"]
-"Yaw" -> "Yaw PID":f1 [label="Constant"]
+"Integrated gyro z" -> "Yaw PID":f1 [label="Integrated"]
 "Yaw Setpoint" -> "Yaw PID":f2 [label="Constant"]
-"Ts_VRPN" -> "Yaw PID":f3 [label="Constant"]
+"Ts_IMU" -> "Yaw PID":f3 [label="Constant"]
 "Roll Rate PID"[shape=record
 label="<f0>Roll Rate PID  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=0.030] |<f5> [Ki=0.000] |<f6> [Kd=0.005] |<f7> [alpha=0.880]"]
 "Gyro X" -> "Roll Rate PID":f1 [label="Constant"]
@@ -28,23 +28,23 @@ label="<f0>Pitch Rate PID  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |
 "Yaw Rate PID"[shape=record
 label="<f0>Yaw Rate PID  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=0.297] |<f5> [Ki=0.000] |<f6> [Kd=0.000] |<f7> [alpha=0.000]"]
 "Gyro Z" -> "Yaw Rate PID":f1 [label="Constant"]
-"Yaw PID" -> "Yaw Rate PID":f2 [label="Correction"]
+"RC Yaw" -> "Yaw Rate PID":f2 [label="Constant"]
 "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.550] |<f5> [Ki=0.007] |<f6> [Kd=0.000] |<f7> [alpha=0.000]"]
-"VRPN X" -> "X pos PID":f1 [label="Constant"]
+"OF X Trim Add" -> "X pos PID":f1 [label="Sum"]
 "X Setpoint" -> "X pos PID":f2 [label="Constant"]
-"Ts_VRPN" -> "X pos PID":f3 [label="Constant"]
+"Ts_IMU" -> "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.550] |<f5> [Ki=0.007] |<f6> [Kd=0.000] |<f7> [alpha=0.000]"]
-"VRPN Y" -> "Y pos PID":f1 [label="Constant"]
+"OF Y Trim Add" -> "Y pos PID":f1 [label="Sum"]
 "Y Setpoint" -> "Y pos PID":f2 [label="Constant"]
-"Ts_VRPN" -> "Y pos PID":f3 [label="Constant"]
+"Ts_IMU" -> "Y pos PID":f3 [label="Constant"]
 "Altitude PID"[shape=record
 label="<f0>Altitude PID  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=-0.098] |<f5> [Ki=-0.008] |<f6> [Kd=-0.074] |<f7> [alpha=0.880]"]
-"VRPN Alt" -> "Altitude PID":f1 [label="Constant"]
+"Lidar" -> "Altitude PID":f1 [label="Constant"]
 "Alt Setpoint" -> "Altitude PID":f2 [label="Constant"]
-"Ts_VRPN" -> "Altitude PID":f3 [label="Constant"]
+"Ts_IMU" -> "Altitude PID":f3 [label="Constant"]
 "X Setpoint"[shape=record
 label="<f0>X Setpoint  |<f1> [Constant=0.000]"]
 "Y Setpoint"[shape=record
@@ -116,35 +116,23 @@ label="<f0>RC Yaw  |<f1> [Constant=0.000]"]
 label="<f0>RC Throttle  |<f1> [Constant=0.000]"]
 "X Vel PID"[shape=record
 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.000]"]
-"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.100] |<f5> [Ki=0.000] |<f6> [Kd=0.020] |<f7> [alpha=0.000]"]
-"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.880]"]
-"VRPN X" -> "X Vel":f1 [label="Constant"]
-"zero" -> "X Vel":f2 [label="Constant"]
-"Ts_VRPN" -> "X Vel":f3 [label="Constant"]
+label="<f0>X Vel  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=0.000] |<f5> [Ki=0.000] |<f6> [Kd=0.000] |<f7> [alpha=0.880]"]
 "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.880]"]
-"VRPN Y" -> "Y Vel":f1 [label="Constant"]
-"zero" -> "Y Vel":f2 [label="Constant"]
-"Ts_VRPN" -> "Y Vel":f3 [label="Constant"]
+label="<f0>Y Vel  |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt |<f4> [Kp=0.000] |<f5> [Ki=0.000] |<f6> [Kd=0.000] |<f7> [alpha=0.880]"]
 "X Vel Clamp"[shape=record
-label="<f0>X Vel Clamp  |<f1> --\>Bounds in |<f2> [Min=-2.000] |<f3> [Max=2.000]"]
+label="<f0>X Vel Clamp  |<f1> --\>Bounds in |<f2> [Min=-0.174] |<f3> [Max=0.174]"]
 "X pos PID" -> "X Vel Clamp":f1 [label="Correction"]
 "Y vel Clamp"[shape=record
-label="<f0>Y vel Clamp  |<f1> --\>Bounds in |<f2> [Min=-2.000] |<f3> [Max=2.000]"]
+label="<f0>Y vel Clamp  |<f1> --\>Bounds in |<f2> [Min=-0.174] |<f3> [Max=0.174]"]
 "Y pos PID" -> "Y vel Clamp":f1 [label="Correction"]
 "Yaw Correction"[shape=record
 label="<f0>Yaw Correction  |<f1> --\>Current Yaw |<f2> --\>X Position |<f3> --\>Y Position"]
-"Yaw" -> "Yaw Correction":f1 [label="Constant"]
-"X Vel PID" -> "Yaw Correction":f2 [label="Correction"]
-"Y Vel PID" -> "Yaw Correction":f3 [label="Correction"]
+"Integrated gyro z" -> "Yaw Correction":f1 [label="Integrated"]
+"X Vel Clamp" -> "Yaw Correction":f2 [label="Bounded"]
+"Y vel Clamp" -> "Yaw Correction":f3 [label="Bounded"]
 "OF Offset Angle"[shape=record
 label="<f0>OF Offset Angle  |<f1> --\>Current Yaw |<f2> --\>X Position |<f3> --\>Y Position"]
 "OF Offset Add" -> "OF Offset Angle":f1 [label="Sum"]
@@ -155,7 +143,7 @@ label="<f0>OF Offset Rot  |<f1> [Constant=0.622]"]
 "OF Offset Add"[shape=record
 label="<f0>OF Offset Add  |<f1> --\>Summand 1 |<f2> --\>Summand 2"]
 "OF Offset Rot" -> "OF Offset Add":f1 [label="Constant"]
-"Yaw" -> "OF Offset Add":f2 [label="Constant"]
+"Integrated gyro z" -> "OF Offset Add":f2 [label="Integrated"]
 "OF Integrate X"[shape=record
 label="<f0>OF Integrate X  |<f1> --\>Integrator In |<f2> --\>Integrator dt"]
 "OF Offset Angle" -> "OF Integrate X":f1 [label="Rotated X"]
@@ -176,9 +164,12 @@ label="<f0>OF X Trim Add  |<f1> --\>Summand 1 |<f2> --\>Summand 2"]
 label="<f0>OF Y Trim Add  |<f1> --\>Summand 1 |<f2> --\>Summand 2"]
 "OF Integrate Y" -> "OF Y Trim Add":f1 [label="Integrated"]
 "OF Trim Y" -> "OF Y Trim Add":f2 [label="Constant"]
+"Integrated gyro z"[shape=record
+label="<f0>Integrated gyro z  |<f1> --\>Integrator In |<f2> --\>Integrator dt"]
+"Gyro Z" -> "Integrated gyro z":f1 [label="Constant"]
 "Signal Mixer"[shape=record
 label="<f0>Signal Mixer  |<f1> --\>Throttle |<f2> --\>Pitch |<f3> --\>Roll |<f4> --\>Yaw"]
-"T trim add" -> "Signal Mixer":f1 [label="Sum"]
+"RC Throttle" -> "Signal Mixer":f1 [label="Constant"]
 "P PWM Clamp" -> "Signal Mixer":f2 [label="Bounded"]
 "R PWM Clamp" -> "Signal Mixer":f3 [label="Bounded"]
 "Y PWM Clamp" -> "Signal Mixer":f4 [label="Bounded"]
diff --git a/quad/src/gen_diagram/network.png b/quad/src/gen_diagram/network.png
index f13041740aa8c01eec3c0d83b8ceaab251505c22..8a85dddca8320d59cc742c69825d449673b3577f 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/control_algorithm.c b/quad/src/quad_app/control_algorithm.c
index 624c0642abfd47bc4de3cc586d9226dca28fa2a6..6f1f86a2f4e97fc8434e6ead0058ecb2d7d183ba 100644
--- a/quad/src/quad_app/control_algorithm.c
+++ b/quad/src/quad_app/control_algorithm.c
@@ -13,9 +13,14 @@
 #include "util.h"
 #include "timer.h"
 
-//#define USE_LIDAR
+#define USE_LIDAR
+#define USE_OF
+#define USE_FAKE_YAW
 #define MAX_VALID_LIDAR (10.0) // Maximum valid distance to read from LiDAR to update
 
+//10 degrees
+#define ANGLE_CLAMP		(0.1745)
+
 #define PX4FLOW_QUAL_MIN			(100)
 #define OF_OFFSET_ANGLE             (0.62204) // 35.64 degrees
 
@@ -29,8 +34,13 @@ void connect_autonomous(parameter_t* ps) {
 	//graph_set_source(graph, ps->roll_pid, PID_SETPOINT, ps->y_pos_pid, PID_CORRECTION);
 	graph_set_source(graph, ps->pitch_pid, PID_SETPOINT, ps->yaw_correction, ROT_OUT_X);
 	graph_set_source(graph, ps->roll_pid, PID_SETPOINT, ps->yaw_correction, ROT_OUT_Y);
-	graph_set_source(graph, ps->mixer, MIXER_THROTTLE, ps->throttle_trim_add, ADD_SUM);
 	graph_set_source(graph, ps->yaw_r_pid, PID_SETPOINT, ps->yaw_pid, PID_CORRECTION);
+#ifdef USE_OF
+	//graph_set_source(graph, ps->mixer, MIXER_THROTTLE, ps->rc_throttle, ADD_SUM);
+	graph_set_source(graph, ps->mixer, MIXER_THROTTLE, ps->throttle_trim_add, ADD_SUM);
+#else
+	graph_set_source(graph, ps->mixer, MIXER_THROTTLE, ps->throttle_trim_add, ADD_SUM);
+#endif
 }
 
 void connect_manual(parameter_t* ps) {
@@ -118,6 +128,9 @@ int control_algorithm_init(parameter_t * ps)
     ps->of_trimmed_x = graph_add_defined_block(graph, BLOCK_ADD, "OF X Trim Add");
     ps->of_trimmed_y = graph_add_defined_block(graph, BLOCK_ADD, "OF Y Trim Add");
 
+    // gyroscope z integrator
+    ps->gyro_yaw = graph_add_defined_block(graph, BLOCK_INTEGRATOR, "Integrated gyro z");
+
     ps->mixer = graph_add_defined_block(graph, BLOCK_MIXER, "Signal Mixer");
 
     ps->angle_time = graph_add_defined_block(graph, BLOCK_CONSTANT, "Ts_IMU");
@@ -152,6 +165,9 @@ int control_algorithm_init(parameter_t * ps)
     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);
 
+    graph_set_source(graph, ps->gyro_yaw, INTEGRATE_IN, ps->gyro_z, CONST_VAL);
+
+#ifndef USE_OF
     // X velocity PID
         // Use a PID block to compute the derivative
     graph_set_param_val(graph, ps->x_vel, PID_KD, -1);
@@ -166,7 +182,11 @@ int control_algorithm_init(parameter_t * ps)
     graph_set_source(graph, ps->x_vel_clamp, BOUNDS_IN, ps->x_pos_pid, PID_CORRECTION);
 
     // X/Y global to local conversion
+#ifdef USE_FAKE_YAW
+    graph_set_source(graph, ps->yaw_correction, ROT_YAW, ps->gyro_yaw, CONST_VAL);
+#else
     graph_set_source(graph, ps->yaw_correction, ROT_YAW, ps->cur_yaw, CONST_VAL);
+#endif
     graph_set_source(graph, ps->yaw_correction, ROT_CUR_X, ps->x_vel_pid, PID_CORRECTION);
     graph_set_source(graph, ps->yaw_correction, ROT_CUR_Y, ps->y_vel_pid, PID_CORRECTION);
     
@@ -194,6 +214,33 @@ int control_algorithm_init(parameter_t * ps)
     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_CUR_POINT, ps->of_trimmed_y, CONST_VAL);
     graph_set_source(graph, ps->y_pos_pid, PID_SETPOINT, ps->y_set, CONST_VAL);
+#endif
+
+#ifdef USE_OF
+    // X position
+    graph_set_source(graph, ps->x_pos_pid, PID_DT, ps->angle_time, CONST_VAL);
+    graph_set_source(graph, ps->x_pos_pid, PID_CUR_POINT, ps->of_trimmed_x, ADD_SUM);
+    //graph_set_source(graph, ps->x_pos_pid, PID_CUR_POINT, ps->of_trimmed_x, CONST_VAL);
+    graph_set_source(graph, ps->x_pos_pid, PID_SETPOINT, ps->x_set, CONST_VAL);
+    // Y position
+    graph_set_source(graph, ps->y_pos_pid, PID_DT, ps->angle_time, CONST_VAL);
+    graph_set_source(graph, ps->y_pos_pid, PID_CUR_POINT, ps->of_trimmed_y, ADD_SUM);
+    //graph_set_source(graph, ps->y_pos_pid, PID_CUR_POINT, ps->of_trimmed_y, CONST_VAL);
+    graph_set_source(graph, ps->y_pos_pid, PID_SETPOINT, ps->y_set, CONST_VAL);
+
+    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);
+
+
+    // X/Y global to local conversion
+#ifdef USE_FAKE_YAW
+    graph_set_source(graph, ps->yaw_correction, ROT_YAW, ps->gyro_yaw, CONST_VAL);
+#else
+    graph_set_source(graph, ps->yaw_correction, ROT_YAW, ps->cur_yaw, CONST_VAL);
+#endif
+    graph_set_source(graph, ps->yaw_correction, ROT_CUR_X, ps->x_vel_clamp, PID_CORRECTION);
+    graph_set_source(graph, ps->yaw_correction, ROT_CUR_Y, ps->y_vel_clamp, PID_CORRECTION);
+#endif
 
     // Alt autonomous
 #ifdef USE_LIDAR
@@ -207,9 +254,14 @@ int control_algorithm_init(parameter_t * ps)
     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 angle
+#ifdef USE_FAKE_YAW
+    graph_set_source(graph, ps->yaw_pid, PID_DT, ps->angle_time, CONST_VAL);
+    graph_set_source(graph, ps->yaw_pid, PID_CUR_POINT, ps->gyro_yaw, CONST_VAL);
+#else
     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);
+#endif
+    graph_set_source(graph, ps->yaw_pid, PID_SETPOINT, ps->yaw_set, CONST_VAL);
 
     // Connect PWM clamping blocks
     graph_set_source(graph, ps->clamp_d_pwmP, BOUNDS_IN, ps->pitch_r_pid, PID_CORRECTION);
@@ -224,7 +276,11 @@ int control_algorithm_init(parameter_t * ps)
 
     // Connect optical flow
     graph_set_source(graph, ps->of_angle_add, ADD_SUMMAND1, ps->of_angle_offset, CONST_VAL);
+#ifdef USE_FAKE_YAW
+    graph_set_source(graph, ps->of_angle_add, ADD_SUMMAND2, ps->gyro_yaw, CONST_VAL);
+#else
     graph_set_source(graph, ps->of_angle_add, ADD_SUMMAND2, ps->cur_yaw, CONST_VAL);
+#endif
     graph_set_source(graph, ps->of_angle_corr, ROT_YAW, ps->of_angle_add, ADD_SUM);
     graph_set_source(graph, ps->of_angle_corr, ROT_CUR_X, ps->flow_vel_x, CONST_VAL);
     graph_set_source(graph, ps->of_angle_corr, ROT_CUR_Y, ps->flow_vel_y, CONST_VAL);
@@ -299,11 +355,19 @@ 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);
 
+#ifdef USE_OF
+    //Set angle clamping limits
+    graph_set_param_val(graph, ps->x_vel_clamp, BOUNDS_MIN, -ANGLE_CLAMP);
+    graph_set_param_val(graph, ps->x_vel_clamp, BOUNDS_MAX, ANGLE_CLAMP);
+    graph_set_param_val(graph, ps->y_vel_clamp, BOUNDS_MIN, -ANGLE_CLAMP);
+    graph_set_param_val(graph, ps->y_vel_clamp, BOUNDS_MAX, ANGLE_CLAMP);
+#else
     // 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);
+#endif
 
     // Set trims
     graph_set_param_val(graph, ps->pitch_trim, CONST_SET, PITCH_TRIM);
@@ -354,10 +418,17 @@ int control_algorithm_init(parameter_t * ps)
 	// also reset the previous error and accumulated error from the position PIDs
 	if((cur_fm_switch == AUTO_FLIGHT_MODE) && (user_defined_struct->engaging_auto == 2))
 	{
+#ifdef USE_OF
+		graph_set_param_val(graph, ps->x_set, CONST_SET, graph_get_output(graph, ps->of_trimmed_x, ADD_SUM));
+		graph_set_param_val(graph, ps->y_set, CONST_SET, graph_get_output(graph, ps->of_trimmed_y, ADD_SUM));
+		//graph_set_param_val(graph, ps->alt_set, CONST_SET, sensor_struct->currentQuadPosition.alt_pos);
+		graph_set_param_val(graph, ps->yaw_set, CONST_SET, sensor_struct->currentQuadPosition.yaw);
+#else
 		graph_set_param_val(graph, ps->x_set, CONST_SET, sensor_struct->currentQuadPosition.x_pos);
 		graph_set_param_val(graph, ps->y_set, CONST_SET, sensor_struct->currentQuadPosition.y_pos);
 		graph_set_param_val(graph, ps->alt_set, CONST_SET, sensor_struct->currentQuadPosition.alt_pos);
 		graph_set_param_val(graph, ps->yaw_set, CONST_SET, sensor_struct->currentQuadPosition.yaw);
+#endif
 
 		// reset the flag that engages auto mode
 		user_defined_struct->engaging_auto = 0;
@@ -407,10 +478,12 @@ int control_algorithm_init(parameter_t * ps)
     //}
     graph_set_param_val(graph, ps->flow_quality, CONST_SET, sensor_struct->optical_flow.quality);
     //As per documentation, disregard frames with low quality, as they contain unreliable data
-    if (sensor_struct->optical_flow.quality >= PX4FLOW_QUAL_MIN) {
+    //NOTE: As per the Wehrneyton(R) Method(TM), we will be exponentially decaying the
+    //optical flow velocities when the quality is below the threshold
+    //if (sensor_struct->optical_flow.quality >= PX4FLOW_QUAL_MIN) {
         graph_set_param_val(graph, ps->flow_vel_x, CONST_SET, sensor_struct->optical_flow.xVel);
         graph_set_param_val(graph, ps->flow_vel_y, CONST_SET, sensor_struct->optical_flow.yVel);
-    }
+    //}
     graph_set_param_val(graph, ps->flow_distance, CONST_SET, sensor_struct->optical_flow.distance);
 
     // RC values
diff --git a/quad/src/quad_app/log_data.c b/quad/src/quad_app/log_data.c
index 2a29ddb8f798a1e9a80dfe6c879e196358621f67..dadb8194d29a6c6c677f4aea810ae9cfed1e32a2 100644
--- a/quad/src/quad_app/log_data.c
+++ b/quad/src/quad_app/log_data.c
@@ -118,11 +118,10 @@ void initialize_logging(log_t* log_struct, parameter_t* ps) {
 	addOutputToLog(log_struct, ps->of_angle_corr, ROT_OUT_Y, m_s);
 	addOutputToLog(log_struct, ps->of_integ_x, INTEGRATED, m);
 	addOutputToLog(log_struct, ps->of_integ_y, INTEGRATED, m);
+	addOutputToLog(log_struct, ps->gyro_yaw, INTEGRATED, rad);
 
 	addParamToLog(log_struct, ps->cur_roll, CONST_VAL, rad);
 	addParamToLog(log_struct, ps->cur_yaw, CONST_VAL, rad);
-	addParamToLog(log_struct, ps->vrpn_pitch, CONST_VAL, rad);
-	addParamToLog(log_struct, ps->vrpn_roll, CONST_VAL, rad);
 	addParamToLog(log_struct, ps->x_set, CONST_VAL, m);
 	addParamToLog(log_struct, ps->y_set, CONST_VAL, m);
 	addParamToLog(log_struct, ps->alt_set, CONST_VAL, m);
@@ -134,10 +133,6 @@ void initialize_logging(log_t* log_struct, parameter_t* ps) {
 	addParamToLog(log_struct, ps->flow_vel_x, CONST_VAL, m_s);
 	addParamToLog(log_struct, ps->flow_vel_y, CONST_VAL, m_s);
 	addParamToLog(log_struct, ps->flow_quality, CONST_VAL, "none");
-	addParamToLog(log_struct, ps->flow_distance, CONST_VAL, m);
-	addParamToLog(log_struct, ps->rc_throttle, CONST_VAL, pwm_val);
-	addParamToLog(log_struct, ps->rc_pitch, CONST_VAL, pwm_val);
-	addParamToLog(log_struct, ps->rc_roll, CONST_VAL, pwm_val);
 
 	// TODO: Make this not stupid. Adding 6 for IMU and 1 for timestamp
 	row_size = n_outputs + n_params + 6 + 1;
diff --git a/quad/src/quad_app/sensor_processing.c b/quad/src/quad_app/sensor_processing.c
index cdd5a8c347895ed6c557f37b4e72659a1af39ab3..59511fa9d349d6b274d5d5c32f183b85f05e8417 100644
--- a/quad/src/quad_app/sensor_processing.c
+++ b/quad/src/quad_app/sensor_processing.c
@@ -14,6 +14,8 @@
 #include <math.h>
 
 #define ALPHA 0.99
+#define PX4FLOW_QUAL_MIN			(100)
+#define PX4FLOW_VEL_DECAY					(0.99)
 
 int sensor_processing_init(sensor_t* sensor_struct) {
 	float a0 = 0.0200833310260;
@@ -43,8 +45,14 @@ static float focal_length_px = 16.0 / (4.0f * 6.0f) * 1000.0f; //original focal
 void flow_to_vel(px4flow_t* flow_data, double distance) {
 	double loop_time = get_last_loop_time();
 	if (loop_time != 0) {
-		flow_data->xVel = distance * flow_data->flowX / focal_length_px / get_last_loop_time();
-		flow_data->yVel = distance * flow_data->flowY / focal_length_px / get_last_loop_time();
+		if(flow_data->quality > PX4FLOW_QUAL_MIN) {
+			flow_data->xVel = distance * flow_data->flowX / focal_length_px / loop_time;
+			flow_data->yVel = distance * flow_data->flowY / focal_length_px / loop_time;
+		}
+		else {
+			flow_data->xVel *= PX4FLOW_VEL_DECAY;
+			flow_data->yVel *= PX4FLOW_VEL_DECAY;
+		}
 	}
 }
 
@@ -124,8 +132,9 @@ int sensor_processing(log_t* log_struct, user_input_t *user_input_struct, raw_se
 	flow_to_vel(&sensor_struct->optical_flow, raw_sensor_struct->lidar_distance_m);
 //	sensor_struct->optical_flow.xVel = biquad_execute(&sensor_struct->flow_x_filt, -sensor_struct->optical_flow.xVel);
 //	sensor_struct->optical_flow.yVel = biquad_execute(&sensor_struct->flow_y_filt, -sensor_struct->optical_flow.yVel);
-	sensor_struct->optical_flow.xVel *= -1;
-	sensor_struct->optical_flow.yVel *= -1;
+	//Note: This was wrong and dumb
+	//sensor_struct->optical_flow.xVel *= -1;
+	//sensor_struct->optical_flow.yVel *= -1;
 
 	/*
 	 * Altitude double complementary filter
diff --git a/quad/src/quad_app/type_def.h b/quad/src/quad_app/type_def.h
index d5bd1d45e240dd71e06ac784fc4c75e8b4e406d0..9c3e651305954b6a971485c1f24ad76f1acb9ff6 100644
--- a/quad/src/quad_app/type_def.h
+++ b/quad/src/quad_app/type_def.h
@@ -412,6 +412,7 @@ typedef struct parameter_t {
 	int of_trim_y;
 	int of_trimmed_x; // Trimmed optical flow integrated value (of_integ_x + of_trim_x)
 	int of_trimmed_y;
+	int gyro_yaw; // Integrates the gyro z value
 } parameter_t;
 
 /**
diff --git a/quad/xsdk_workspace/real_quad/src/hw_impl_zybo_imu.c b/quad/xsdk_workspace/real_quad/src/hw_impl_zybo_imu.c
index da9ed7ffc6346f652d13391ae6acfd738171892b..bf94f23894fcebfc6b76d97b49b9e4d869426226 100644
--- a/quad/xsdk_workspace/real_quad/src/hw_impl_zybo_imu.c
+++ b/quad/xsdk_workspace/real_quad/src/hw_impl_zybo_imu.c
@@ -44,7 +44,7 @@
 
 #define GYRO_X_BIAS	0.005f
 #define GYRO_Y_BIAS	-0.014f
-#define GYRO_Z_BIAS	0.045f
+#define GYRO_Z_BIAS	0.0541f
 
 #define ACCEL_X_BIAS	0.023f
 #define ACCEL_Y_BIAS	0.009f