diff --git a/Tools/ArduPPM/Libraries/PPM_Encoder.h b/Tools/ArduPPM/Libraries/PPM_Encoder.h
index fcb7bccdc774bc72812025c3d28859e613fbf0c9..9b35e5659f5213dab4cf34fa916e217b546fa0cf 100644
--- a/Tools/ArduPPM/Libraries/PPM_Encoder.h
+++ b/Tools/ArduPPM/Libraries/PPM_Encoder.h
@@ -1,5 +1,5 @@
 // -------------------------------------------------------------
-// ArduPPM (PPM Encoder) V2.3.15
+// ArduPPM (PPM Encoder) V2.3.16
 // -------------------------------------------------------------
 // Improved servo to ppm for ArduPilot MEGA v1.x (ATmega328p),
 // PhoneDrone and APM2.x (ATmega32u2)
@@ -140,6 +140,9 @@
 // 13-01-2013
 // V2.3.15 - very small bug fix: speedup
 
+// 26-02-2013
+// V2.3.16 - when a channel is lost don't set it to a fail-safe value but retain its last value (except throttle)
+
 // -------------------------------------------------------------
 
 #ifndef _PPM_ENCODER_H_
@@ -181,7 +184,7 @@
 #endif
 
 // Version stamp for firmware hex file ( decode hex file using <avr-objdump -s file.hex> and look for "ArduPPM" string )
-const char ver[15] = "ArduPPMv2.3.15"; 
+const char ver[15] = "ArduPPMv2.3.16"; 
 
 // -------------------------------------------------------------
 // INPUT MODE
@@ -532,10 +535,13 @@ ISR( WDT_vect ) // If watchdog is triggered then enable missing signal flag and
     if ( ppm_generator_active || brownout_reset )
     {
         // Copy failsafe values to ppm[..]
-        for( uint8_t i = 0; i < PPM_ARRAY_MAX; i++ )
-        {
-			ppm[ i ] = failsafe_ppm[ i ];
-        }
+        //for( uint8_t i = 0; i < PPM_ARRAY_MAX; i++ )
+        //{
+        //  ppm[ i ] = failsafe_ppm[ i ];
+        //}
+        
+        // Set Throttle Low & leave other channels at last value
+        ppm[5] = failsafe_ppm[ 5 ];
     }
 
     // If we are in PPM passtrough mode and a input signal has been detected, or if chip has been reset from a brown_out then start the PPM generator.
@@ -790,11 +796,22 @@ ISR( PPM_INT_VECTOR, ISR_NOBLOCK )
     // Update timing for next compare toggle with either current ppm input value, or fail-safe value if there is a channel timeout.
     if( ppm_timeout[ ppm_out_channel ] > PPM_TIMEOUT_VALUE )
     {
-        // Use ppm fail-safe value
-        cli();
-        PPM_COMPARE += failsafe_ppm[ ppm_out_channel ];
-        sei();
-
+        // Use the ppm fail-safe value for throttle
+        if (ppm_out_channel == 5)
+        {
+            cli();
+            PPM_COMPARE += failsafe_ppm[ ppm_out_channel ];
+			// report this to the LED indication
+            servo_input_missing = true;
+            sei();
+        }
+        else
+        {
+            cli();
+            PPM_COMPARE += ppm[ ppm_out_channel ];
+            sei();
+        }
+        
     #if defined _THROTTLE_LOW_RECOVERY_POSSIBLE && defined _THROTTLE_LOW_FAILSAFE_INDICATION
         // Count the channel that we have lost
         disconnected_channels++;
@@ -812,7 +829,7 @@ ISR( PPM_INT_VECTOR, ISR_NOBLOCK )
         // Use latest ppm input value   
         cli();
         PPM_COMPARE += ppm[ ppm_out_channel ];
-		sei();
+        sei();
         
         // Increment active channel timeout (reset to zero in input interrupt each time a valid signal is detected)
         if( servo_input_connected[ ppm_out_channel ] >= SERVO_INPUT_CONNECTED_VALUE )
@@ -825,7 +842,7 @@ ISR( PPM_INT_VECTOR, ISR_NOBLOCK )
     {
         ppm_out_channel = 0;
 
-	#ifdef _THROTTLE_LOW_RECOVERY_POSSIBLE
+    #ifdef _THROTTLE_LOW_RECOVERY_POSSIBLE
         // Did we lose one or more active servo input channel? If so force throttle fail-safe (RTL)
         if( disconnected_channels > 0 )
         {