diff --git a/ArduCopter/navigation.pde b/ArduCopter/navigation.pde
index f74ffd58e1c221d4e93a13f6cd726952283f02ad..83b6c8ce55d18a1eadf6327e05478b44523a3549 100644
--- a/ArduCopter/navigation.pde
+++ b/ArduCopter/navigation.pde
@@ -154,22 +154,63 @@ static void calc_location_error(struct Location *next_loc)
 #define NAV_ERR_MAX 600
 static void calc_loiter(int x_error, int y_error)
 {
-	int16_t x_target_speed, y_target_speed;
-	//int16_t x_iterm, y_iterm;
+	int32_t p,i,d;						// used to capture pid values for logging
+	int32_t output;
+	int32_t x_target_speed, y_target_speed;
 
 	// East / West
-	x_target_speed 	= g.pi_loiter_lon.get_p(x_error);			// not contstrained yet
-	x_rate_error 	= x_target_speed - x_actual_speed;			// calc the speed error
-	nav_lon			= g.pid_loiter_rate_lon.get_pid(x_rate_error, dTnav);
+	x_target_speed 	= g.pi_loiter_lon.get_p(x_error);			// calculate desired speed from lon error
+
+#if LOGGING_ENABLED == ENABLED
+	// log output if PID logging is on and we are tuning the yaw
+	if( g.log_bitmask & MASK_LOG_PID && (g.radio_tuning == CH6_LOITER_KP || g.radio_tuning == CH6_LOITER_KI) ) {
+		Log_Write_PID(CH6_LOITER_KP, x_error, x_target_speed, 0, 0, x_target_speed, tuning_value);
+	}
+#endif
+
+	x_rate_error	= x_target_speed - x_actual_speed;			// calc the speed error
+	p				= g.pid_loiter_rate_lon.get_p(x_rate_error);
+	i				= g.pid_loiter_rate_lon.get_i(x_rate_error, dTnav);
+	d				= g.pid_loiter_rate_lon.get_d(x_rate_error, dTnav);
+
 	//nav_lon			+= x_rate_d * (g.pid_loiter_rate_lon.kD() / dTnav);
-	nav_lon			= constrain(nav_lon, -3000, 3000); 			// 30°
+
+	output			= p + i + d;
+	nav_lon			= constrain(output, -3000, 3000); 			// 30°
+
+#if LOGGING_ENABLED == ENABLED
+	// log output if PID logging is on and we are tuning the yaw
+	if( g.log_bitmask & MASK_LOG_PID && (g.radio_tuning == CH6_LOITER_RATE_KP || g.radio_tuning == CH6_LOITER_RATE_KI || g.radio_tuning == CH6_LOITER_RATE_KD) ) {
+		Log_Write_PID(CH6_LOITER_RATE_KP, x_rate_error, p, i, d, nav_lon, tuning_value);
+	}
+#endif
 
 	// North / South
-	y_target_speed 	= g.pi_loiter_lat.get_p(y_error);
-	y_rate_error 	= y_target_speed - y_actual_speed;
-	nav_lat			= g.pid_loiter_rate_lat.get_pid(y_rate_error, dTnav);
+	y_target_speed 	= g.pi_loiter_lat.get_p(y_error);			// calculate desired speed from lat error
+
+#if LOGGING_ENABLED == ENABLED
+	// log output if PID logging is on and we are tuning the yaw
+	if( g.log_bitmask & MASK_LOG_PID && (g.radio_tuning == CH6_LOITER_KP || g.radio_tuning == CH6_LOITER_KI) ) {
+		Log_Write_PID(CH6_LOITER_KP+100, y_error, y_target_speed, 0, 0, y_target_speed, tuning_value);
+	}
+#endif
+
+	y_rate_error	= y_target_speed - y_actual_speed;
+	p				= g.pid_loiter_rate_lat.get_p(y_rate_error);
+	i				= g.pid_loiter_rate_lat.get_i(y_rate_error, dTnav);
+	d				= g.pid_loiter_rate_lat.get_d(y_rate_error, dTnav);
+
 	//nav_lat			+= y_rate_d * (g.pid_loiter_rate_lat.kD() / dTnav);
-	nav_lat			= constrain(nav_lat, -3000, 3000); // 30°
+
+	output			= p + i + d;
+	nav_lat			= constrain(output, -3000, 3000); // 30°
+
+#if LOGGING_ENABLED == ENABLED
+	// log output if PID logging is on and we are tuning the yaw
+	if( g.log_bitmask & MASK_LOG_PID && (g.radio_tuning == CH6_LOITER_RATE_KP || g.radio_tuning == CH6_LOITER_RATE_KI || g.radio_tuning == CH6_LOITER_RATE_KD) ) {
+		Log_Write_PID(CH6_LOITER_RATE_KP+100, y_rate_error, p, i, d, nav_lat, tuning_value);
+	}
+#endif
 
 	// copy over I term to Nav_Rate
 	g.pid_nav_lon.set_integrator(g.pid_loiter_rate_lon.get_integrator());
@@ -180,6 +221,7 @@ static void calc_loiter(int x_error, int y_error)
 	// Wind I term based on location error,
 	// limit windup
 	/*
+	int16_t x_iterm, y_iterm;
 	x_error 		= constrain(x_error, -NAV_ERR_MAX, NAV_ERR_MAX);
 	y_error 		= constrain(y_error, -NAV_ERR_MAX, NAV_ERR_MAX);
 	x_iterm 		= g.pi_loiter_lon.get_i(x_error, dTnav);