diff --git a/silk/dec_API.c b/silk/dec_API.c
index ade060f9ba72627129027cf18655b21f03c4d215..018173efa09aa279184e46b1cfd0ca74c58e42db 100644
--- a/silk/dec_API.c
+++ b/silk/dec_API.c
@@ -182,13 +182,21 @@ opus_int silk_Decode(
                 for( n = 0; n < decControl->nChannelsInternal; n++ ) {
                     if( channel_state[ n ].LBRR_flags[ i ] ) {
                         opus_int pulses[ MAX_FRAME_LENGTH ];
+                        opus_int condCoding;
+
                         if( decControl->nChannelsInternal == 2 && n == 0 ) {
                             silk_stereo_decode_pred( psRangeDec, MS_pred_Q13 );
                             if( channel_state[ 1 ].LBRR_flags[ i ] == 0 ) {
                                 silk_stereo_decode_mid_only( psRangeDec, &decode_only_middle );
                             }
                         }
-                        silk_decode_indices( &channel_state[ n ], psRangeDec, i, 1 );
+                        /* Use conditional coding if previous frame available */
+                        if( i > 0 && channel_state[ n ].LBRR_flags[ i - 1 ] ) {
+                            condCoding = CODE_CONDITIONALLY;
+                        } else {
+                            condCoding = CODE_INDEPENDENTLY;
+                        }
+                        silk_decode_indices( &channel_state[ n ], psRangeDec, i, 1, condCoding );
                         silk_decode_pulses( psRangeDec, pulses, channel_state[ n ].indices.signalType,
                             channel_state[ n ].indices.quantOffsetType, channel_state[ n ].frame_length );
                     }
@@ -230,7 +238,23 @@ opus_int silk_Decode(
     /* Call decoder for one frame */
     for( n = 0; n < decControl->nChannelsInternal; n++ ) {
         if( n == 0 || ( ( lostFlag != FLAG_PACKET_LOST ? decode_only_middle : psDec->prev_decode_only_middle ) == 0 ) ) {
-            ret += silk_decode_frame( &channel_state[ n ], psRangeDec, &samplesOut1_tmp[ n ][ 2 + delay ], &nSamplesOutDec, lostFlag );
+            opus_int FrameIndex;
+            opus_int condCoding;
+
+            FrameIndex = channel_state[ 0 ].nFramesDecoded - n;
+            /* Use independent coding if no previous frame available */
+            if( FrameIndex <= 0 ) {
+                condCoding = CODE_INDEPENDENTLY;
+            } else if( lostFlag == FLAG_DECODE_LBRR ) {
+                condCoding = channel_state[ n ].LBRR_flags[ FrameIndex - 1 ] ? CODE_CONDITIONALLY : CODE_INDEPENDENTLY;
+            } else if( n > 0 && psDec->prev_decode_only_middle ) {
+                /* If we skipped a side frame in this packet, we don't
+                   need LTP scaling; the LTP state is well-defined. */
+                condCoding = CODE_INDEPENDENTLY_NO_LTP_SCALING;
+            } else {
+                condCoding = CODE_CONDITIONALLY;
+            }
+            ret += silk_decode_frame( &channel_state[ n ], psRangeDec, &samplesOut1_tmp[ n ][ 2 + delay ], &nSamplesOutDec, lostFlag, condCoding);
         } else {
             silk_memset( &samplesOut1_tmp[ n ][ 2 + delay ], 0, nSamplesOutDec * sizeof( opus_int16 ) );
         }
diff --git a/silk/decode_frame.c b/silk/decode_frame.c
index 247861742fd3ef884d5f413fa3775286031f3319..54bb920bfc0c6d97f8dd7bd86305dc0dd4740b0b 100644
--- a/silk/decode_frame.c
+++ b/silk/decode_frame.c
@@ -40,7 +40,8 @@ opus_int silk_decode_frame(
     ec_dec                      *psRangeDec,        /* I/O  Compressor data structure                   */
     opus_int16                   pOut[],             /* O    Pointer to output speech frame              */
     opus_int32                   *pN,                /* O    Pointer to size of output frame             */
-    opus_int                     lostFlag            /* I    0: no loss, 1 loss, 2 decode fec            */
+    opus_int                     lostFlag,           /* I    0: no loss, 1 loss, 2 decode fec            */
+    opus_int                     condCoding          /* I    The type of conditional coding to use       */
 )
 {
     silk_decoder_control sDecCtrl;
@@ -62,7 +63,7 @@ TIC(DECODE_FRAME)
         /* Decode quantization indices of side info  */
         /*********************************************/
 TIC(decode_indices)
-        silk_decode_indices( psDec, psRangeDec, psDec->nFramesDecoded, lostFlag );
+        silk_decode_indices( psDec, psRangeDec, psDec->nFramesDecoded, lostFlag, condCoding );
 TOC(decode_indices)
 
         /*********************************************/
@@ -77,7 +78,7 @@ TOC(decode_pulses)
         /* Decode parameters and pulse signal       */
         /********************************************/
 TIC(decode_params)
-        silk_decode_parameters( psDec, &sDecCtrl );
+        silk_decode_parameters( psDec, &sDecCtrl, condCoding );
 TOC(decode_params)
 
         /* Update length. Sampling frequency may have changed */
diff --git a/silk/decode_indices.c b/silk/decode_indices.c
index 9ea0a80e92d0bc64e276212512a9ea7c55e97c5d..8ac53f4b9e0e41220f8488acbe428d3770c86aa6 100644
--- a/silk/decode_indices.c
+++ b/silk/decode_indices.c
@@ -36,21 +36,15 @@ void silk_decode_indices(
     silk_decoder_state      *psDec,             /* I/O  State                                       */
     ec_dec                      *psRangeDec,        /* I/O  Compressor data structure                   */
     opus_int                     FrameIndex,         /* I    Frame number                                */
-    opus_int                     decode_LBRR         /* I    Flag indicating LBRR data is being decoded  */
+    opus_int                     decode_LBRR,        /* I    Flag indicating LBRR data is being decoded  */
+    opus_int                     condCoding          /* I    The type of conditional coding to use       */
 )
 {
-    opus_int   i, k, Ix, condCoding;
+    opus_int   i, k, Ix;
     opus_int   decode_absolute_lagIndex, delta_lagIndex;
     opus_int16 ec_ix[ MAX_LPC_ORDER ];
     opus_uint8 pred_Q8[ MAX_LPC_ORDER ];
 
-    /* Use conditional coding if previous frame available */
-    if( FrameIndex > 0 && ( decode_LBRR == 0 || psDec->LBRR_flags[ FrameIndex - 1 ] == 1 ) ) {
-        condCoding = 1;
-    } else {
-        condCoding = 0;
-    }
-
     /*******************************************/
     /* Decode signal type and quantizer offset */
     /*******************************************/
@@ -66,7 +60,7 @@ void silk_decode_indices(
     /* Decode gains */
     /****************/
     /* First subframe */
-    if( condCoding ) {
+    if( condCoding == CODE_CONDITIONALLY ) {
         /* Conditional coding */
         psDec->indices.GainsIndices[ 0 ] = (opus_int8)ec_dec_icdf( psRangeDec, silk_delta_gain_iCDF, 8 );
     } else {
@@ -110,7 +104,7 @@ void silk_decode_indices(
         /*********************/
         /* Get lag index */
         decode_absolute_lagIndex = 1;
-        if( condCoding && psDec->ec_prevSignalType == TYPE_VOICED ) {
+        if( condCoding == CODE_CONDITIONALLY && psDec->ec_prevSignalType == TYPE_VOICED ) {
             /* Decode Delta index */
             delta_lagIndex = (opus_int16)ec_dec_icdf( psRangeDec, silk_pitch_delta_iCDF, 8 );
             if( delta_lagIndex > 0 ) {
@@ -142,7 +136,7 @@ void silk_decode_indices(
         /**********************/
         /* Decode LTP scaling */
         /**********************/
-        if( !condCoding ) {
+        if( condCoding == CODE_INDEPENDENTLY ) {
             psDec->indices.LTP_scaleIndex = (opus_int8)ec_dec_icdf( psRangeDec, silk_LTPscale_iCDF, 8 );
         } else {
             psDec->indices.LTP_scaleIndex = 0;
diff --git a/silk/decode_parameters.c b/silk/decode_parameters.c
index ad4788f94923f70fb2d1217f1c53a3310f1e265d..1ab8ed741417fb6fc84f9b66b8bba84dfdb34d94 100644
--- a/silk/decode_parameters.c
+++ b/silk/decode_parameters.c
@@ -34,7 +34,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 /* Decode parameters from payload */
 void silk_decode_parameters(
     silk_decoder_state      *psDec,                             /* I/O  State                                    */
-    silk_decoder_control    *psDecCtrl                          /* I/O  Decoder control                          */
+    silk_decoder_control    *psDecCtrl,                         /* I/O  Decoder control                          */
+    opus_int                 condCoding                         /* I    The type of conditional coding to use    */
 )
 {
     opus_int   i, k, Ix;
@@ -43,7 +44,7 @@ void silk_decode_parameters(
 
     /* Dequant Gains */
     silk_gains_dequant( psDecCtrl->Gains_Q16, psDec->indices.GainsIndices,
-        &psDec->LastGainIndex, psDec->nFramesDecoded, psDec->nb_subfr );
+        &psDec->LastGainIndex, condCoding == CODE_CONDITIONALLY, psDec->nb_subfr );
 
     /****************/
     /* Decode NLSFs */
diff --git a/silk/define.h b/silk/define.h
index f56ca2d71c0855917a6676a4f350719359cdbb11..8f9935fc10626c408d6960e8f39be440a36c9a98 100644
--- a/silk/define.h
+++ b/silk/define.h
@@ -66,6 +66,11 @@ extern "C"
 #define TYPE_UNVOICED                           1
 #define TYPE_VOICED                             2
 
+/* Conditional coding types */
+#define CODE_INDEPENDENTLY                      0
+#define CODE_INDEPENDENTLY_NO_LTP_SCALING       1
+#define CODE_CONDITIONALLY                      2
+
 /* Settings for stereo processing */
 #define STEREO_QUANT_TAB_SIZE                   16
 #define STEREO_QUANT_SUB_STEPS                  5
diff --git a/silk/enc_API.c b/silk/enc_API.c
index 339dafc410756423f9c425f21465070620c1cae2..7177d4d58b4282e552bb8ba39a88614ca51d9127 100644
--- a/silk/enc_API.c
+++ b/silk/enc_API.c
@@ -330,6 +330,8 @@ opus_int silk_Encode(
                 for( i = 0; i < psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket; i++ ) {
                     for( n = 0; n < encControl->nChannelsInternal; n++ ) {
                         if( psEnc->state_Fxx[ n ].sCmn.LBRR_flags[ i ] ) {
+                            opus_int condCoding;
+
                             if( encControl->nChannelsInternal == 2 && n == 0 ) {
                                 silk_stereo_encode_pred( psRangeEnc, psEnc->sStereo.predIx[ i ] );
                                 /* For LBRR data there's no need to code the mid-only flag if the side-channel LBRR flag is set */
@@ -337,7 +339,13 @@ opus_int silk_Encode(
                                     silk_stereo_encode_mid_only( psRangeEnc, psEnc->sStereo.mid_only_flags[ i ] );
                                 }
                             }
-                            silk_encode_indices( &psEnc->state_Fxx[ n ].sCmn, psRangeEnc, i, 1 );
+                            /* Use conditional coding if previous frame available */
+                            if( i > 0 && psEnc->state_Fxx[ n ].sCmn.LBRR_flags[ i - 1 ] ) {
+                                condCoding = CODE_CONDITIONALLY;
+                            } else {
+                                condCoding = CODE_INDEPENDENTLY;
+                            }
+                            silk_encode_indices( &psEnc->state_Fxx[ n ].sCmn, psRangeEnc, i, 1, condCoding );
                             silk_encode_pulses( psRangeEnc, psEnc->state_Fxx[ n ].sCmn.indices_LBRR[i].signalType, psEnc->state_Fxx[ n ].sCmn.indices_LBRR[i].quantOffsetType,
                                 psEnc->state_Fxx[ n ].sCmn.pulses_LBRR[ i ], psEnc->state_Fxx[ n ].sCmn.frame_length );
                         }
@@ -400,7 +408,6 @@ opus_int silk_Encode(
                 psEnc->state_Fxx[ 1 ].sCmn.prevSignalType         = TYPE_NO_VOICE_ACTIVITY;
                 psEnc->state_Fxx[ 1 ].sCmn.sNSQ.prev_inv_gain_Q16 = 65536;
             }
-            psEnc->prev_decode_only_middle = psEnc->sStereo.mid_only_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ];
 
             /* Encode */
             for( n = 0; n < encControl->nChannelsInternal; n++ ) {
@@ -411,9 +418,21 @@ opus_int silk_Encode(
                 }
 
                 if( channelRate_bps > 0 ) {
+                    opus_int condCoding;
+
                     silk_control_SNR( &psEnc->state_Fxx[ n ].sCmn, channelRate_bps );
 
-                    if( ( ret = silk_encode_frame_Fxx( &psEnc->state_Fxx[ n ], nBytesOut, psRangeEnc ) ) != 0 ) {
+                    /* Use independent coding if no previous frame available */
+                    if( psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded - n <= 0 ) {
+                        condCoding = CODE_INDEPENDENTLY;
+                    } else if( n > 0 && psEnc->prev_decode_only_middle ) {
+                        /* If we skipped a side frame in this packet, we don't
+                           need LTP scaling; the LTP state is well-defined. */
+                        condCoding = CODE_INDEPENDENTLY_NO_LTP_SCALING;
+                    } else {
+                        condCoding = CODE_CONDITIONALLY;
+                    }
+                    if( ( ret = silk_encode_frame_Fxx( &psEnc->state_Fxx[ n ], nBytesOut, psRangeEnc, condCoding ) ) != 0 ) {
                         silk_assert( 0 );
                     }
                     psEnc->state_Fxx[ n ].sCmn.nFramesEncoded++;
@@ -421,6 +440,7 @@ opus_int silk_Encode(
                 psEnc->state_Fxx[ n ].sCmn.controlled_since_last_payload = 0;
                 psEnc->state_Fxx[ n ].sCmn.inputBufIx = 0;
             }
+            psEnc->prev_decode_only_middle = psEnc->sStereo.mid_only_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded - 1 ];
 
             /* Insert VAD and FEC flags at beginning of bitstream */
             if( *nBytesOut > 0 && psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded == psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket) {
diff --git a/silk/encode_indices.c b/silk/encode_indices.c
index 6d8e82a17bc3fdc4a5a3f3fc2548f2e2144c98e3..f87de036af77c952223aadf96692d92cf85f1b1c 100644
--- a/silk/encode_indices.c
+++ b/silk/encode_indices.c
@@ -36,10 +36,11 @@ void silk_encode_indices(
     silk_encoder_state          *psEncC,            /* I/O  Encoder state                               */
     ec_enc                      *psRangeEnc,        /* I/O  Compressor data structure                   */
     opus_int                     FrameIndex,         /* I    Frame number                                */
-    opus_int                     encode_LBRR         /* I    Flag indicating LBRR data is being encoded  */
+    opus_int                     encode_LBRR,        /* I    Flag indicating LBRR data is being encoded  */
+    opus_int                     condCoding          /* I    The type of conditional coding to use      */
 )
 {
-    opus_int   i, k, condCoding, typeOffset;
+    opus_int   i, k, typeOffset;
     opus_int   encode_absolute_lagIndex, delta_lagIndex;
     opus_int16 ec_ix[ MAX_LPC_ORDER ];
     opus_uint8 pred_Q8[ MAX_LPC_ORDER ];
@@ -49,13 +50,6 @@ void silk_encode_indices(
     opus_int nBytes_after, nBytes_before;
 #endif
 
-    /* Use conditional coding if previous frame available */
-    if( FrameIndex > 0 && ( encode_LBRR == 0 || psEncC->LBRR_flags[ FrameIndex - 1 ] == 1 ) ) {
-        condCoding = 1;
-    } else {
-        condCoding = 0;
-    }
-
     if( encode_LBRR ) {
          psIndices = &psEncC->indices_LBRR[ FrameIndex ];
     } else {
@@ -81,7 +75,7 @@ void silk_encode_indices(
     nBytes_before = silk_RSHIFT( ec_tell( psRangeEnc ) + 7, 3 );
 #endif
     /* first subframe */
-    if( condCoding ) {
+    if( condCoding == CODE_CONDITIONALLY ) {
         /* conditional coding */
         silk_assert( psIndices->GainsIndices[ 0 ] >= 0 && psIndices->GainsIndices[ 0 ] < MAX_DELTA_GAIN_QUANT - MIN_DELTA_GAIN_QUANT + 1 );
         ec_enc_icdf( psRangeEnc, psIndices->GainsIndices[ 0 ], silk_delta_gain_iCDF, 8 );
@@ -148,7 +142,7 @@ void silk_encode_indices(
 #endif
         /* lag index */
         encode_absolute_lagIndex = 1;
-        if( condCoding && psEncC->ec_prevSignalType == TYPE_VOICED ) {
+        if( condCoding == CODE_CONDITIONALLY && psEncC->ec_prevSignalType == TYPE_VOICED ) {
             /* Delta Encoding */
             delta_lagIndex = psIndices->lagIndex - psEncC->ec_prevLagIndex;
             if( delta_lagIndex < -8 || delta_lagIndex > 11 ) {
@@ -212,7 +206,7 @@ void silk_encode_indices(
         /**********************/
         /* Encode LTP scaling */
         /**********************/
-        if( !condCoding ) {
+        if( condCoding == CODE_INDEPENDENTLY ) {
             silk_assert( psIndices->LTP_scaleIndex >= 0 && psIndices->LTP_scaleIndex < 3 );
             ec_enc_icdf( psRangeEnc, psIndices->LTP_scaleIndex, silk_LTPscale_iCDF, 8 );
         }
diff --git a/silk/fixed/LTP_scale_ctrl_FIX.c b/silk/fixed/LTP_scale_ctrl_FIX.c
index 463cf735a0da77f01dbbd3d7a55945893debe18b..5e85cc74496a116335e187dc90952b8fa9f2142a 100644
--- a/silk/fixed/LTP_scale_ctrl_FIX.c
+++ b/silk/fixed/LTP_scale_ctrl_FIX.c
@@ -33,7 +33,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 void silk_LTP_scale_ctrl_FIX(
     silk_encoder_state_FIX      *psEnc,     /* I/O  encoder state FIX                           */
-    silk_encoder_control_FIX    *psEncCtrl  /* I/O  encoder control FIX                         */
+    silk_encoder_control_FIX    *psEncCtrl, /* I/O  encoder control FIX                         */
+    opus_int                     condCoding /* I    The type of conditional coding to use       */
+
 )
 {
     opus_int round_loss;
@@ -44,7 +46,7 @@ void silk_LTP_scale_ctrl_FIX(
     psEnc->prevLTPredCodGain_Q7 = psEncCtrl->LTPredCodGain_Q7;
 
     /* Only scale if first frame in packet */
-    if( psEnc->sCmn.nFramesEncoded == 0 ) {
+    if( condCoding == CODE_INDEPENDENTLY ) {
         round_loss = psEnc->sCmn.PacketLoss_perc + psEnc->sCmn.nFramesPerPacket - 1;
         psEnc->sCmn.indices.LTP_scaleIndex = (opus_int8)silk_LIMIT(
             silk_SMULWB( silk_SMULBB( round_loss, psEnc->HPLTPredCodGain_Q7 ), SILK_FIX_CONST( 0.1, 9 ) ), 0, 2 );
diff --git a/silk/fixed/encode_frame_FIX.c b/silk/fixed/encode_frame_FIX.c
index 6f4367f74668638420876d4c594c840683d8e6c4..c3da9bcfd136179f137f5f932c7587b19f3d96c4 100644
--- a/silk/fixed/encode_frame_FIX.c
+++ b/silk/fixed/encode_frame_FIX.c
@@ -38,7 +38,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 opus_int silk_encode_frame_FIX(
     silk_encoder_state_FIX          *psEnc,             /* I/O  Encoder state FIX                       */
     opus_int32                       *pnBytesOut,        /*   O  Number of payload bytes                 */
-    ec_enc                          *psRangeEnc         /* I/O  compressor data structure               */
+    ec_enc                          *psRangeEnc,        /* I/O  compressor data structure               */
+    opus_int                         condCoding         /* I    The type of conditional coding to use   */
 )
 {
     silk_encoder_control_FIX sEncCtrl;
@@ -116,7 +117,7 @@ TOC(NOISE_SHAPE_ANALYSIS)
     /* Find linear prediction coefficients (LPC + LTP) */
     /***************************************************/
 TIC(FIND_PRED_COEF)
-    silk_find_pred_coefs_FIX( psEnc, &sEncCtrl, res_pitch, x_frame );
+    silk_find_pred_coefs_FIX( psEnc, &sEncCtrl, res_pitch, x_frame, condCoding );
 TOC(FIND_PRED_COEF)
 
     /****************************************/
@@ -137,7 +138,7 @@ TOC(PREFILTER)
     /* Low Bitrate Redundant Encoding       */
     /****************************************/
 TIC(LBRR)
-    silk_LBRR_encode_FIX( psEnc, &sEncCtrl, xfw );
+    silk_LBRR_encode_FIX( psEnc, &sEncCtrl, xfw, condCoding );
 TOC(LBRR)
 
     /*****************************************/
@@ -174,7 +175,7 @@ TOC(NSQ)
     /* Encode Parameters                    */
     /****************************************/
 TIC(ENCODE_PARAMS)
-    silk_encode_indices( &psEnc->sCmn, psRangeEnc, psEnc->sCmn.nFramesEncoded, 0 );
+    silk_encode_indices( &psEnc->sCmn, psRangeEnc, psEnc->sCmn.nFramesEncoded, 0, condCoding );
 TOC(ENCODE_PARAMS)
 
     /****************************************/
@@ -242,7 +243,8 @@ TOC(ENCODE_FRAME)
 void silk_LBRR_encode_FIX(
     silk_encoder_state_FIX          *psEnc,         /* I/O  Pointer to Silk FIX encoder state           */
     silk_encoder_control_FIX        *psEncCtrl,     /* I/O  Pointer to Silk FIX encoder control struct  */
-    const opus_int16                 xfw[]           /* I    Input signal                                */
+    const opus_int16                 xfw[],          /* I    Input signal                                */
+    opus_int                         condCoding     /* I    The type of conditional coding used so far for this frame */
 )
 {
     opus_int32   TempGains_Q16[ MAX_NB_SUBFR ];
@@ -274,7 +276,7 @@ void silk_LBRR_encode_FIX(
         /* Decode to get gains in sync with decoder         */
         /* Overwrite unquantized gains with quantized gains */
         silk_gains_dequant( psEncCtrl->Gains_Q16, psIndices_LBRR->GainsIndices,
-            &psEnc->sCmn.LBRRprevLastGainIndex, psEnc->sCmn.nFramesEncoded, psEnc->sCmn.nb_subfr );
+            &psEnc->sCmn.LBRRprevLastGainIndex, condCoding == CODE_CONDITIONALLY, psEnc->sCmn.nb_subfr );
 
         /*****************************************/
         /* Noise shaping quantization            */
diff --git a/silk/fixed/find_pred_coefs_FIX.c b/silk/fixed/find_pred_coefs_FIX.c
index 980e321d6207a68f0b905059526748830867de9d..e9891cd43a8ea572bfc3fe16f6b3ced6fd498ce6 100644
--- a/silk/fixed/find_pred_coefs_FIX.c
+++ b/silk/fixed/find_pred_coefs_FIX.c
@@ -35,7 +35,8 @@ void silk_find_pred_coefs_FIX(
     silk_encoder_state_FIX          *psEnc,         /* I/O  encoder state                               */
     silk_encoder_control_FIX        *psEncCtrl,     /* I/O  encoder control                             */
     const opus_int16                 res_pitch[],    /* I    Residual from pitch analysis                */
-    const opus_int16                 x[]             /* I    Speech signal                               */
+    const opus_int16                 x[],            /* I    Speech signal                               */
+    opus_int                         condCoding      /* I    The type of conditional coding to use       */
 )
 {
     opus_int         i;
@@ -86,7 +87,7 @@ void silk_find_pred_coefs_FIX(
             WLTP, psEnc->sCmn.mu_LTP_Q9, psEnc->sCmn.LTPQuantLowComplexity, psEnc->sCmn.nb_subfr);
 
         /* Control LTP scaling */
-        silk_LTP_scale_ctrl_FIX( psEnc, psEncCtrl );
+        silk_LTP_scale_ctrl_FIX( psEnc, psEncCtrl, condCoding );
 
         /* Create LTP residual */
         silk_LTP_analysis_filter_FIX( LPC_in_pre, x - psEnc->sCmn.predictLPCOrder, psEncCtrl->LTPCoef_Q14,
diff --git a/silk/fixed/main_FIX.h b/silk/fixed/main_FIX.h
index e0b1e0544f43bd34d8f06eb937cb1524c627e85b..56ba1ef078272ac20126df9360ed21f7170417bf 100644
--- a/silk/fixed/main_FIX.h
+++ b/silk/fixed/main_FIX.h
@@ -59,7 +59,8 @@ void silk_HP_variable_cutoff(
 opus_int silk_encode_frame_FIX(
     silk_encoder_state_FIX          *psEnc,             /* I/O  Pointer to Silk FIX encoder state       */
     opus_int32                       *pnBytesOut,        /*   O  Pointer to number of payload bytes;     */
-    ec_enc                          *psRangeEnc         /* I/O  compressor data structure               */
+    ec_enc                          *psRangeEnc,        /* I/O  compressor data structure               */
+    opus_int                         condCoding         /* I    The type of conditional coding to use   */
 );
 
 /* Low Bitrate Redundancy (LBRR) encoding. Reuse all parameters but encode with lower bitrate           */
@@ -118,7 +119,8 @@ void silk_warped_autocorrelation_FIX(
 /* Calculation of LTP state scaling */
 void silk_LTP_scale_ctrl_FIX(
     silk_encoder_state_FIX          *psEnc,         /* I/O  encoder state                               */
-    silk_encoder_control_FIX        *psEncCtrl      /* I/O  encoder control                             */
+    silk_encoder_control_FIX        *psEncCtrl,     /* I/O  encoder control                             */
+    opus_int                         condCoding     /* I    The type of conditional coding to use       */
 );
 
 /**********************************************/
@@ -137,7 +139,8 @@ void silk_find_pred_coefs_FIX(
     silk_encoder_state_FIX          *psEnc,         /* I/O  encoder state                               */
     silk_encoder_control_FIX        *psEncCtrl,     /* I/O  encoder control                             */
     const opus_int16                 res_pitch[],    /* I    Residual from pitch analysis                */
-    const opus_int16                 x[]             /* I    Speech signal                               */
+    const opus_int16                 x[],            /* I    Speech signal                               */
+    opus_int                         condCoding      /* I    The type of conditional coding to use       */
 );
 
 /* LPC analysis */
@@ -204,7 +207,8 @@ opus_int32 silk_residual_energy16_covar_FIX(
 /* Processing of gains */
 void silk_process_gains_FIX(
     silk_encoder_state_FIX          *psEnc,         /* I/O  Encoder state                               */
-    silk_encoder_control_FIX        *psEncCtrl      /* I/O  Encoder control                             */
+    silk_encoder_control_FIX        *psEncCtrl,     /* I/O  Encoder control                             */
+    opus_int                         condCoding     /* I    The type of conditional coding to use       */
 );
 
 /******************/
diff --git a/silk/fixed/process_gains_FIX.c b/silk/fixed/process_gains_FIX.c
index 0dea69b61aa2355d8e6ee5b92de7a881b78f1a26..4fe55bb0e7d9f69aefeb10a3579716d9b196e907 100644
--- a/silk/fixed/process_gains_FIX.c
+++ b/silk/fixed/process_gains_FIX.c
@@ -36,6 +36,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 void silk_process_gains_FIX(
     silk_encoder_state_FIX      *psEnc,         /* I/O  Encoder state_FIX                           */
     silk_encoder_control_FIX    *psEncCtrl      /* I/O  Encoder control_FIX                         */
+    opus_int                     condCoding     /* The type of conditional coding to use            */
 )
 {
     silk_shape_state_FIX    *psShapeSt = &psEnc->sShape;
@@ -87,7 +88,7 @@ void silk_process_gains_FIX(
 
     /* Noise shaping quantization */
     silk_gains_quant( psEnc->sCmn.indices.GainsIndices, psEncCtrl->Gains_Q16,
-        &psShapeSt->LastGainIndex, psEnc->sCmn.nFramesEncoded, psEnc->sCmn.nb_subfr );
+        &psShapeSt->LastGainIndex, condCoding == CODE_CONDITIONALLY, psEnc->sCmn.nb_subfr );
 
     /* Set quantizer offset for voiced signals. Larger offset when LTP coding gain is low or tilt is high (ie low-pass) */
     if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) {
diff --git a/silk/float/LTP_scale_ctrl_FLP.c b/silk/float/LTP_scale_ctrl_FLP.c
index 76290b140290c2bbb6ddc6609b5fa0781c3db9ce..cbac1005157a85528959e37107e42d0d90beb694 100644
--- a/silk/float/LTP_scale_ctrl_FLP.c
+++ b/silk/float/LTP_scale_ctrl_FLP.c
@@ -33,7 +33,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 void silk_LTP_scale_ctrl_FLP(
     silk_encoder_state_FLP      *psEnc,             /* I/O  Encoder state FLP                       */
-    silk_encoder_control_FLP    *psEncCtrl          /* I/O  Encoder control FLP                     */
+    silk_encoder_control_FLP    *psEncCtrl,         /* I/O  Encoder control FLP                     */
+    opus_int                     condCoding         /* I    The type of conditional coding to use   */
 )
 {
     opus_int   round_loss;
@@ -45,7 +46,7 @@ void silk_LTP_scale_ctrl_FLP(
     psEnc->prevLTPredCodGain = psEncCtrl->LTPredCodGain;
 
     /* Only scale if first frame in packet */
-    if( psEnc->sCmn.nFramesEncoded == 0 ) {
+    if( condCoding == CODE_INDEPENDENTLY ) {
         round_loss = psEnc->sCmn.PacketLoss_perc + psEnc->sCmn.nFramesPerPacket;
         psEnc->sCmn.indices.LTP_scaleIndex = (opus_int8)silk_LIMIT( round_loss * psEnc->HPLTPredCodGain * 0.1f, 0.0f, 2.0f );
     } else {
diff --git a/silk/float/encode_frame_FLP.c b/silk/float/encode_frame_FLP.c
index 4d156a03520aa94d4e35bdcacae67fb725a8cc79..d105642853f268684a4a3c181b65159af89c7399 100644
--- a/silk/float/encode_frame_FLP.c
+++ b/silk/float/encode_frame_FLP.c
@@ -36,7 +36,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 static inline void silk_LBRR_encode_FLP(
     silk_encoder_state_FLP          *psEnc,             /* I/O  Encoder state FLP                       */
     silk_encoder_control_FLP        *psEncCtrl,         /* I/O  Encoder control FLP                     */
-    const silk_float                 xfw[]               /* I    Input signal                            */
+    const silk_float                 xfw[],              /* I    Input signal                            */
+    opus_int                         condCoding         /* I    The type of conditional coding used so far for this frame */
 );
 
 /****************/
@@ -45,7 +46,8 @@ static inline void silk_LBRR_encode_FLP(
 opus_int silk_encode_frame_FLP(
     silk_encoder_state_FLP          *psEnc,             /* I/O  Encoder state FLP                       */
     opus_int32                       *pnBytesOut,        /*   O  Number of payload bytes                 */
-    ec_enc                          *psRangeEnc         /* I/O  compressor data structure               */
+    ec_enc                          *psRangeEnc,        /* I/O  compressor data structure               */
+    opus_int                         condCoding         /* I    The type of conditional coding to use   */
 )
 {
     silk_encoder_control_FLP sEncCtrl;
@@ -128,14 +130,14 @@ TOC(NOISE_SHAPE_ANALYSIS)
     /* Find linear prediction coefficients (LPC + LTP) */
     /***************************************************/
 TIC(FIND_PRED_COEF)
-    silk_find_pred_coefs_FLP( psEnc, &sEncCtrl, res_pitch, x_frame );
+    silk_find_pred_coefs_FLP( psEnc, &sEncCtrl, res_pitch, x_frame, condCoding );
 TOC(FIND_PRED_COEF)
 
     /****************************************/
     /* Process gains                        */
     /****************************************/
 TIC(PROCESS_GAINS)
-    silk_process_gains_FLP( psEnc, &sEncCtrl );
+    silk_process_gains_FLP( psEnc, &sEncCtrl, condCoding );
 TOC(PROCESS_GAINS)
 
     /*****************************************/
@@ -149,7 +151,7 @@ TOC(PREFILTER)
     /* Low Bitrate Redundant Encoding       */
     /****************************************/
 TIC(LBRR)
-    silk_LBRR_encode_FLP( psEnc, &sEncCtrl, xfw );
+    silk_LBRR_encode_FLP( psEnc, &sEncCtrl, xfw, condCoding );
 TOC(LBRR)
 
     /*****************************************/
@@ -178,7 +180,7 @@ TOC(NSQ)
     /* Encode Parameters                    */
     /****************************************/
 TIC(ENCODE_PARAMS)
-    silk_encode_indices( &psEnc->sCmn, psRangeEnc, psEnc->sCmn.nFramesEncoded, 0 );
+    silk_encode_indices( &psEnc->sCmn, psRangeEnc, psEnc->sCmn.nFramesEncoded, 0, condCoding );
 TOC(ENCODE_PARAMS)
 
     /****************************************/
@@ -222,7 +224,8 @@ TOC(ENCODE_FRAME)
 static inline void silk_LBRR_encode_FLP(
     silk_encoder_state_FLP          *psEnc,             /* I/O  Encoder state FLP                       */
     silk_encoder_control_FLP        *psEncCtrl,         /* I/O  Encoder control FLP                     */
-    const silk_float                 xfw[]               /* I    Input signal                            */
+    const silk_float                 xfw[],              /* I    Input signal                            */
+    opus_int                         condCoding         /* I    The type of conditional coding used so far for this frame */
 )
 {
     opus_int     k;
@@ -255,7 +258,7 @@ static inline void silk_LBRR_encode_FLP(
 
         /* Decode to get gains in sync with decoder */
         silk_gains_dequant( Gains_Q16, psIndices_LBRR->GainsIndices,
-            &psEnc->sCmn.LBRRprevLastGainIndex, psEnc->sCmn.nFramesEncoded, psEnc->sCmn.nb_subfr );
+            &psEnc->sCmn.LBRRprevLastGainIndex, condCoding == CODE_CONDITIONALLY, psEnc->sCmn.nb_subfr );
 
         /* Overwrite unquantized gains with quantized gains and convert back to Q0 from Q16 */
         for( k = 0; k <  psEnc->sCmn.nb_subfr; k++ ) {
diff --git a/silk/float/find_pred_coefs_FLP.c b/silk/float/find_pred_coefs_FLP.c
index 49c29d36920246d2d897c3ff629ff426776c736e..04881855f8bce9fe168997446e7b1b58d40e5d2b 100644
--- a/silk/float/find_pred_coefs_FLP.c
+++ b/silk/float/find_pred_coefs_FLP.c
@@ -36,7 +36,8 @@ void silk_find_pred_coefs_FLP(
     silk_encoder_state_FLP          *psEnc,             /* I/O  Encoder state FLP                       */
     silk_encoder_control_FLP        *psEncCtrl,         /* I/O  Encoder control FLP                     */
     const silk_float                 res_pitch[],        /* I    Residual from pitch analysis            */
-    const silk_float                 x[]                 /* I    Speech signal                           */
+    const silk_float                 x[],                /* I    Speech signal                           */
+    opus_int                         condCoding          /* I    The type of conditional coding to use   */
 )
 {
     opus_int         i;
@@ -73,7 +74,7 @@ void silk_find_pred_coefs_FLP(
             WLTP, psEnc->sCmn.mu_LTP_Q9, psEnc->sCmn.LTPQuantLowComplexity, psEnc->sCmn.nb_subfr );
 
         /* Control LTP scaling */
-        silk_LTP_scale_ctrl_FLP( psEnc, psEncCtrl );
+        silk_LTP_scale_ctrl_FLP( psEnc, psEncCtrl, condCoding );
 
         /* Create LTP residual */
         silk_LTP_analysis_filter_FLP( LPC_in_pre, x - psEnc->sCmn.predictLPCOrder, psEncCtrl->LTPCoef,
diff --git a/silk/float/main_FLP.h b/silk/float/main_FLP.h
index 605fd38468aea36ff774e07388c2f0ef0b9223b5..d0c2de7c534c325435ea66c250c9c3a685fe0e63 100644
--- a/silk/float/main_FLP.h
+++ b/silk/float/main_FLP.h
@@ -57,7 +57,8 @@ void silk_HP_variable_cutoff(
 opus_int silk_encode_frame_FLP(
     silk_encoder_state_FLP          *psEnc,             /* I/O  Encoder state FLP                       */
     opus_int32                       *pnBytesOut,        /*   O  Number of payload bytes;                */
-    ec_enc                          *psRangeEnc         /* I/O  compressor data structure               */
+    ec_enc                          *psRangeEnc,        /* I/O  compressor data structure               */
+    opus_int                         condCoding         /* I    The type of conditional coding to use   */
 );
 
 /* Initializes the Silk encoder state */
@@ -108,7 +109,8 @@ void silk_warped_autocorrelation_FLP(
 /* Calculation of LTP state scaling */
 void silk_LTP_scale_ctrl_FLP(
     silk_encoder_state_FLP          *psEnc,             /* I/O  Encoder state FLP                       */
-    silk_encoder_control_FLP        *psEncCtrl          /* I/O  Encoder control FLP                     */
+    silk_encoder_control_FLP        *psEncCtrl,         /* I/O  Encoder control FLP                     */
+    opus_int                         condCoding         /* I    The type of conditional coding to use   */
 );
 
 /**********************************************/
@@ -127,7 +129,8 @@ void silk_find_pred_coefs_FLP(
     silk_encoder_state_FLP          *psEnc,             /* I/O  Encoder state FLP                       */
     silk_encoder_control_FLP        *psEncCtrl,         /* I/O  Encoder control FLP                     */
     const silk_float                 res_pitch[],        /* I    Residual from pitch analysis            */
-    const silk_float                 x[]                 /* I    Speech signal                           */
+    const silk_float                 x[],                /* I    Speech signal                           */
+    opus_int                         condCoding          /* I    The type of conditional coding to use   */
 );
 
 /* LPC analysis */
@@ -234,7 +237,8 @@ void silk_VQ_WMat_EC_FLP(
 /* Processing of gains */
 void silk_process_gains_FLP(
     silk_encoder_state_FLP          *psEnc,             /* I/O  Encoder state FLP                       */
-    silk_encoder_control_FLP        *psEncCtrl          /* I/O  Encoder control FLP                     */
+    silk_encoder_control_FLP        *psEncCtrl,         /* I/O  Encoder control FLP                     */
+    opus_int                         condCoding         /* I    The type of conditional coding to use   */
 );
 
 /******************/
diff --git a/silk/float/process_gains_FLP.c b/silk/float/process_gains_FLP.c
index e0c18a97898c2d541f4092b8c86e8bd79cbb0102..2c7dfdd087ad7ba6242847a82b8ecba853fb498f 100644
--- a/silk/float/process_gains_FLP.c
+++ b/silk/float/process_gains_FLP.c
@@ -35,7 +35,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 /* Processing of gains */
 void silk_process_gains_FLP(
     silk_encoder_state_FLP      *psEnc,             /* I/O  Encoder state FLP                       */
-    silk_encoder_control_FLP    *psEncCtrl          /* I/O  Encoder control FLP                     */
+    silk_encoder_control_FLP    *psEncCtrl,         /* I/O  Encoder control FLP                     */
+    opus_int                     condCoding         /* I    The type of conditional coding to use   */
 )
 {
     silk_shape_state_FLP *psShapeSt = &psEnc->sShape;
@@ -68,7 +69,7 @@ void silk_process_gains_FLP(
 
     /* Noise shaping quantization */
     silk_gains_quant( psEnc->sCmn.indices.GainsIndices, pGains_Q16,
-            &psShapeSt->LastGainIndex, psEnc->sCmn.nFramesEncoded, psEnc->sCmn.nb_subfr );
+            &psShapeSt->LastGainIndex, condCoding == CODE_CONDITIONALLY, psEnc->sCmn.nb_subfr );
 
     /* Overwrite unquantized gains with quantized gains and convert back to Q0 from Q16 */
     for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) {
diff --git a/silk/main.h b/silk/main.h
index 85423ab63b6d06ca121f85da1ffa2ebbb996c7dd..1f2f01a78c9464a953b30bdc5ada469568fcb472 100644
--- a/silk/main.h
+++ b/silk/main.h
@@ -377,7 +377,8 @@ opus_int silk_decode_frame(
     ec_dec                      *psRangeDec,        /* I/O  Compressor data structure                   */
     opus_int16                   pOut[],             /* O    Pointer to output speech frame              */
     opus_int32                   *pN,                /* O    Pointer to size of output frame             */
-    opus_int                     lostFlag            /* I    0: no loss, 1 loss, 2 decode fec            */
+    opus_int                     lostFlag,           /* I    0: no loss, 1 loss, 2 decode fec            */
+    opus_int                     condCoding          /* I    The type of conditional coding to use       */
 );
 
 /* Decode LBRR side info and excitation */
@@ -391,13 +392,15 @@ void silk_decode_indices(
     silk_decoder_state          *psDec,             /* I/O  State                                       */
     ec_dec                      *psRangeDec,        /* I/O  Compressor data structure                   */
     opus_int                     FrameIndex,         /* I    Frame number                                */
-    opus_int                     decode_LBRR         /* I    Flag indicating LBRR data is being decoded  */
+    opus_int                     decode_LBRR,        /* I    Flag indicating LBRR data is being decoded  */
+    opus_int                     condCoding          /* I    The type of conditional coding to use       */
 );
 
 /* Decode parameters from payload */
 void silk_decode_parameters(
     silk_decoder_state      *psDec,                             /* I/O  State                                    */
-    silk_decoder_control    *psDecCtrl                          /* I/O  Decoder control                          */
+    silk_decoder_control    *psDecCtrl,                         /* I/O  Decoder control                          */
+    opus_int                 condCoding                         /* I    The type of conditional coding to use    */
 );
 
 /* Core decoder. Performs inverse NSQ operation LTP + LPC */
@@ -439,7 +442,8 @@ void silk_encode_indices(
     silk_encoder_state          *psEncC,            /* I/O  Encoder state                               */
     ec_enc                      *psRangeEnc,        /* I/O  Compressor data structure                   */
     opus_int                     FrameIndex,         /* I    Frame number                                */
-    opus_int                     encode_LBRR         /* I    Flag indicating LBRR data is being encoded  */
+    opus_int                     encode_LBRR,        /* I    Flag indicating LBRR data is being encoded  */
+    opus_int                     condCoding          /* I    The type of conditional coding to use       */
 );
 
 #endif