Index: branches/HTM-9.1-dev0-ZTE/source/Lib/TLibDecoder/TDecCAVLC.cpp
===================================================================
--- branches/HTM-9.1-dev0-ZTE/source/Lib/TLibDecoder/TDecCAVLC.cpp	(revision 746)
+++ branches/HTM-9.1-dev0-ZTE/source/Lib/TLibDecoder/TDecCAVLC.cpp	(revision 748)
@@ -215,5 +215,9 @@
 }
 
+#if DLT_DIFF_CODING_IN_PPS
+Void TDecCavlc::parsePPS(TComPPS* pcPPS, TComVPS* pcVPS )
+#else
 Void TDecCavlc::parsePPS(TComPPS* pcPPS)
+#endif
 {
 #if ENC_DEC_TRACE  
@@ -364,10 +368,152 @@
   if (uiCode)
   {
-    while ( xMoreRbspData() )
-    {
-      READ_FLAG( uiCode, "pps_extension_data_flag");
-    }
-  }
-}
+#if DLT_DIFF_CODING_IN_PPS
+    parsePPSExtension( pcPPS, pcVPS );
+    READ_FLAG( uiCode, "pps_extension2_flag");
+    if ( uiCode )
+    {
+#endif
+      while ( xMoreRbspData() )
+      {
+        READ_FLAG( uiCode, "pps_extension_data_flag");
+      }
+#if DLT_DIFF_CODING_IN_PPS
+    }
+#endif
+  }
+}
+
+#if DLT_DIFF_CODING_IN_PPS
+Void TDecCavlc::parsePPSExtension( TComPPS* pcPPS, TComVPS* pcVPS )
+{
+  UInt uiCode = 0; 
+  TComDLT* pcDLT = new TComDLT;
+
+  READ_FLAG(uiCode, "dlt_present_flag");
+  pcDLT->setDltPresentFlag( (uiCode == 1) ? true : false );
+
+  if ( pcDLT->getDltPresentFlag() )
+  {
+    READ_CODE(6, uiCode, "pps_depth_layers_minus1");
+    pcDLT->setNumDepthViews( uiCode );
+
+    READ_CODE(4, uiCode, "pps_bit_depth_for_depth_views_minus8");
+    pcDLT->setDepthViewBitDepth( (uiCode+8) );
+
+    for( Int i = 0; i <= pcVPS->getMaxLayersMinus1(); i++ )
+    {
+      if ( i != 0 )
+      {
+        if( pcVPS->getDepthId( i ) == 1 ) 
+        {
+          READ_FLAG(uiCode, "dlt_flag[i]");
+          pcDLT->setUseDLTFlag(i, (uiCode == 1) ? true : false);
+
+          if ( pcDLT->getUseDLTFlag( i ) )
+          {
+            UInt uiNumDepthValues     = 0;
+            Bool bDltBitMapRepFlag    = false;
+            UInt uiMaxDiff            = 0xffffffff;
+            UInt uiMinDiff            = 0;
+            UInt uiCodeLength         = 0;
+            UInt uiDiffMaxMinDltValue = 0;
+
+            READ_FLAG(uiCode, "inter_view_dlt_pred_enable_flag[ i ]"); 
+            pcDLT->setInterViewDltPredEnableFlag( i, (uiCode == 1) ? true : false );
+
+            if ( pcDLT->getInterViewDltPredEnableFlag( i ) == false )
+            {
+              READ_FLAG(uiCode, "dlt_bit_map_rep_flag[ layerId ]");
+              bDltBitMapRepFlag = (uiCode == 1) ? true : false; 
+            }
+            else
+            {
+              bDltBitMapRepFlag = false;
+            }
+
+            // Bit map
+            if ( bDltBitMapRepFlag )
+            {
+              UInt uiNumDepthValues = 0;
+              Int  aiIdx2DepthValue[256]; 
+
+              for (UInt d=0; d<256; d++)
+              {
+                READ_FLAG(uiCode, "dlt_bit_map_flag[ layerId ][ j ]");
+                if (uiCode == 1)
+                {
+                  aiIdx2DepthValue[uiNumDepthValues] = d;
+                  uiNumDepthValues++;
+                }
+              }
+
+              pcDLT->setDepthLUTs(i, aiIdx2DepthValue, uiNumDepthValues);
+            }
+            // Diff Coding
+            else
+            {
+              READ_CODE(8, uiNumDepthValues, "num_depth_values_in_dlt[i]");   // num_entry
+
+              if ( pcDLT->getInterViewDltPredEnableFlag( i ) == false )       // Single-view DLT Diff Coding
+              {
+                // The condition if( pcVPS->getNumDepthValues(i) > 0 ) is always true since for Single-view Diff Coding, there is at least one depth value in depth component. 
+
+                Int* aiIdx2DepthValue = (Int*) calloc(uiNumDepthValues, sizeof(Int));
+
+                if (uiNumDepthValues > 1)
+                {
+                  READ_CODE(8, uiCode, "max_diff[ layerId ]"); 
+                  uiMaxDiff = uiCode;
+                }
+                else
+                {
+                  uiMaxDiff = 0;           // when there is only one value in DLT
+                }
+
+                if (uiNumDepthValues > 2)
+                {
+                  uiCodeLength = (UInt) ceil(Log2(uiMaxDiff + 1));
+                  READ_CODE(uiCodeLength, uiCode, "min_diff_minus1[ layerId ]");
+                  uiMinDiff = uiCode + 1;
+                }
+                else
+                {
+                  uiMinDiff = uiMaxDiff;   // when there are only one or two values in DLT
+                }
+
+                READ_CODE(8, uiCode, "dlt_depth_value0[layerId]");   // entry0
+                aiIdx2DepthValue[0] = uiCode;
+
+                if (uiMaxDiff == uiMinDiff)
+                {
+                  for (UInt d=1; d<uiNumDepthValues; d++)
+                  {
+                    aiIdx2DepthValue[d] = aiIdx2DepthValue[d-1] + uiMinDiff + 0;
+                  }
+                }
+                else
+                {
+                  uiCodeLength = (UInt) ceil(Log2(uiMaxDiff - uiMinDiff + 1));
+                  for (UInt d=1; d<uiNumDepthValues; d++)
+                  {
+                    READ_CODE(uiCodeLength, uiCode, "dlt_depth_value_diff_minus_min[ layerId ][ j ]");
+                    aiIdx2DepthValue[d] = aiIdx2DepthValue[d-1] + uiMinDiff + uiCode;
+                  }
+                }
+
+                pcDLT->setDepthLUTs(i, aiIdx2DepthValue, uiNumDepthValues);
+
+                free(aiIdx2DepthValue);
+              }              
+            }
+          }
+        }
+      }
+    }
+  }
+
+  pcPPS->setDLT( pcDLT );
+}
+#endif
 
 Void  TDecCavlc::parseVUI(TComVUI* pcVUI, TComSPS *pcSPS)
@@ -1738,4 +1884,5 @@
         //          READ_FLAG( uiCode, "lim_qt_pred_flag[i]");                  pcVPS->setLimQtPreFlag     ( i, uiCode == 1 ? true : false ); 
 #if H_3D_DIM_DLT
+#if !DLT_DIFF_CODING_IN_PPS
         if( pcVPS->getVpsDepthModesFlag( i ) )
         {
@@ -1762,4 +1909,5 @@
           free(aiIdx2DepthValue);
         }
+#endif
 #endif
 #if H_3D_INTER_SDC
Index: branches/HTM-9.1-dev0-ZTE/source/Lib/TLibDecoder/TDecCAVLC.h
===================================================================
--- branches/HTM-9.1-dev0-ZTE/source/Lib/TLibDecoder/TDecCAVLC.h	(revision 746)
+++ branches/HTM-9.1-dev0-ZTE/source/Lib/TLibDecoder/TDecCAVLC.h	(revision 748)
@@ -105,4 +105,12 @@
   Void  parseSPS            ( TComSPS* pcSPS );
 #endif
+
+#if DLT_DIFF_CODING_IN_PPS
+  Void  parsePPS            ( TComPPS* pcPPS, TComVPS* pcVPS );
+  Void  parsePPSExtension   ( TComPPS* pcPPS, TComVPS* pcVPS );
+#else
+  Void  parsePPS            ( TComPPS* pcPPS);
+#endif
+
   Void  parsePPS            ( TComPPS* pcPPS);
   Void  parseVUI            ( TComVUI* pcVUI, TComSPS* pcSPS );
Index: branches/HTM-9.1-dev0-ZTE/source/Lib/TLibDecoder/TDecCu.cpp
===================================================================
--- branches/HTM-9.1-dev0-ZTE/source/Lib/TLibDecoder/TDecCu.cpp	(revision 746)
+++ branches/HTM-9.1-dev0-ZTE/source/Lib/TLibDecoder/TDecCu.cpp	(revision 748)
@@ -781,7 +781,15 @@
     {
 #if LGE_PRED_RES_CODING_DLT_DOMAIN_F0159
-        if( (isDimMode( uiLumaPredMode ) || uiLumaPredMode == HOR_IDX || uiLumaPredMode == VER_IDX || uiLumaPredMode == DC_IDX) && pcCU->getSlice()->getIsDepth() && pcCU->getSlice()->getVPS()->getUseDLTFlag(pcCU->getSlice()->getLayerIdInVps()) )
+#if DLT_DIFF_CODING_IN_PPS
+      if( (isDimMode( uiLumaPredMode ) || uiLumaPredMode == HOR_IDX || uiLumaPredMode == VER_IDX || uiLumaPredMode == DC_IDX) && pcCU->getSlice()->getIsDepth() && pcCU->getSlice()->getPPS()->getDLT()->getUseDLTFlag(pcCU->getSlice()->getLayerIdInVps()) )
+#else
+      if( (isDimMode( uiLumaPredMode ) || uiLumaPredMode == HOR_IDX || uiLumaPredMode == VER_IDX || uiLumaPredMode == DC_IDX) && pcCU->getSlice()->getIsDepth() && pcCU->getSlice()->getVPS()->getUseDLTFlag(pcCU->getSlice()->getLayerIdInVps()) )
+#endif
         {
-            pReco    [ uiX ] = pcCU->getSlice()->getVPS()->idx2DepthValue( pcCU->getSlice()->getLayerIdInVps(), Clip3( 0, pcCU->getSlice()->getVPS()->getNumDepthValues( pcCU->getSlice()->getLayerIdInVps() ) - 1, pcCU->getSlice()->getVPS()->depthValue2idx( pcCU->getSlice()->getLayerIdInVps(), pPred[ uiX ] ) + pResi[ uiX ] ) );
+#if DLT_DIFF_CODING_IN_PPS
+          pReco    [ uiX ] = pcCU->getSlice()->getPPS()->getDLT()->idx2DepthValue( pcCU->getSlice()->getLayerIdInVps(), Clip3( 0, pcCU->getSlice()->getPPS()->getDLT()->getNumDepthValues( pcCU->getSlice()->getLayerIdInVps() ) - 1, pcCU->getSlice()->getPPS()->getDLT()->depthValue2idx( pcCU->getSlice()->getLayerIdInVps(), pPred[ uiX ] ) + pResi[ uiX ] ) );
+#else
+          pReco    [ uiX ] = pcCU->getSlice()->getVPS()->idx2DepthValue( pcCU->getSlice()->getLayerIdInVps(), Clip3( 0, pcCU->getSlice()->getVPS()->getNumDepthValues( pcCU->getSlice()->getLayerIdInVps() ) - 1, pcCU->getSlice()->getVPS()->depthValue2idx( pcCU->getSlice()->getLayerIdInVps(), pPred[ uiX ] ) + pResi[ uiX ] ) );
+#endif
         }
         else
@@ -1000,8 +1008,14 @@
   {
 #if H_3D_DIM_DLT
+#if DLT_DIFF_CODING_IN_PPS
+    Pel   pPredIdx    = pcCU->getSlice()->getPPS()->getDLT()->depthValue2idx( pcCU->getSlice()->getLayerIdInVps(), apDCPredValues[uiSegment] );
+    Pel   pResiIdx    = pcCU->getSDCSegmentDCOffset(uiSegment, uiAbsPartIdx);
+    Pel   pRecoValue  = pcCU->getSlice()->getPPS()->getDLT()->idx2DepthValue( pcCU->getSlice()->getLayerIdInVps(), pPredIdx + pResiIdx );
+#else
     Pel   pPredIdx    = pcCU->getSlice()->getVPS()->depthValue2idx( pcCU->getSlice()->getLayerIdInVps(), apDCPredValues[uiSegment] );
     Pel   pResiIdx    = pcCU->getSDCSegmentDCOffset(uiSegment, uiAbsPartIdx);
     Pel   pRecoValue  = pcCU->getSlice()->getVPS()->idx2DepthValue( pcCU->getSlice()->getLayerIdInVps(), pPredIdx + pResiIdx );
-    
+#endif
+
     apDCResiValues[uiSegment]  = pRecoValue - apDCPredValues[uiSegment];
 #else
Index: branches/HTM-9.1-dev0-ZTE/source/Lib/TLibDecoder/TDecEntropy.h
===================================================================
--- branches/HTM-9.1-dev0-ZTE/source/Lib/TLibDecoder/TDecEntropy.h	(revision 746)
+++ branches/HTM-9.1-dev0-ZTE/source/Lib/TLibDecoder/TDecEntropy.h	(revision 748)
@@ -71,5 +71,9 @@
   virtual Void  parseSPS                  ( TComSPS* pcSPS )                                      = 0;
 #endif
+#if DLT_DIFF_CODING_IN_PPS
+  virtual Void  parsePPS                  ( TComPPS* pcPPS, TComVPS* pcVPS )                      = 0;
+#else
   virtual Void  parsePPS                  ( TComPPS* pcPPS )                                      = 0;
+#endif
 
   virtual Void parseSliceHeader          ( TComSlice*& rpcSlice, ParameterSetManagerDecoder *parameterSetManager)       = 0;
@@ -148,5 +152,9 @@
   Void    decodeSPS                   ( TComSPS* pcSPS     )    { m_pcEntropyDecoderIf->parseSPS(pcSPS);                    }
 #endif
+#if DLT_DIFF_CODING_IN_PPS
+  Void    decodePPS                   ( TComPPS* pcPPS, TComVPS* pcVPS )    { m_pcEntropyDecoderIf->parsePPS(pcPPS, pcVPS);                    }
+#else
   Void    decodePPS                   ( TComPPS* pcPPS )    { m_pcEntropyDecoderIf->parsePPS(pcPPS);                    }
+#endif
   Void    decodeSliceHeader           ( TComSlice*& rpcSlice, ParameterSetManagerDecoder *parameterSetManager)  { m_pcEntropyDecoderIf->parseSliceHeader(rpcSlice, parameterSetManager);         }
 
Index: branches/HTM-9.1-dev0-ZTE/source/Lib/TLibDecoder/TDecSbac.cpp
===================================================================
--- branches/HTM-9.1-dev0-ZTE/source/Lib/TLibDecoder/TDecSbac.cpp	(revision 746)
+++ branches/HTM-9.1-dev0-ZTE/source/Lib/TLibDecoder/TDecSbac.cpp	(revision 748)
@@ -568,5 +568,9 @@
   
 #if H_3D_DIM_DLT
+#if DLT_DIFF_CODING_IN_PPS
+  UInt uiMaxResidualBits = pcCU->getSlice()->getPPS()->getDLT()->getBitsPerDepthValue( pcCU->getSlice()->getLayerIdInVps() );
+#else
   UInt uiMaxResidualBits = pcCU->getSlice()->getVPS()->getBitsPerDepthValue( pcCU->getSlice()->getLayerIdInVps() );
+#endif
 #else
   UInt uiMaxResidualBits = g_bitDepthY;
@@ -592,5 +596,9 @@
     UInt uiCount = 0;
 #if H_3D_DIM_DLT
+#if DLT_DIFF_CODING_IN_PPS
+    UInt uiNumDepthValues = pcCU->getSlice()->getPPS()->getDLT()->getNumDepthValues( pcCU->getSlice()->getLayerIdInVps() );
+#else
     UInt uiNumDepthValues = pcCU->getSlice()->getVPS()->getNumDepthValues( pcCU->getSlice()->getLayerIdInVps() );
+#endif
 #else
     UInt uiNumDepthValues = ((1 << g_bitDepthY)-1);
Index: branches/HTM-9.1-dev0-ZTE/source/Lib/TLibDecoder/TDecSbac.h
===================================================================
--- branches/HTM-9.1-dev0-ZTE/source/Lib/TLibDecoder/TDecSbac.h	(revision 746)
+++ branches/HTM-9.1-dev0-ZTE/source/Lib/TLibDecoder/TDecSbac.h	(revision 748)
@@ -81,5 +81,9 @@
   Void  parseSPS                  ( TComSPS* /*pcSPS*/ ) {}
 #endif
+#if DLT_DIFF_CODING_IN_PPS
+  Void  parsePPS                  ( TComPPS* /*pcPPS*/, TComVPS* /*pcVPS*/ ) {}
+#else
   Void  parsePPS                  ( TComPPS* /*pcPPS*/ ) {}
+#endif
 
   Void  parseSliceHeader          ( TComSlice*& /*rpcSlice*/, ParameterSetManagerDecoder* /*parameterSetManager*/) {}
Index: branches/HTM-9.1-dev0-ZTE/source/Lib/TLibDecoder/TDecTop.cpp
===================================================================
--- branches/HTM-9.1-dev0-ZTE/source/Lib/TLibDecoder/TDecTop.cpp	(revision 746)
+++ branches/HTM-9.1-dev0-ZTE/source/Lib/TLibDecoder/TDecTop.cpp	(revision 748)
@@ -1151,5 +1151,17 @@
   pps->setLayerId( getLayerId() ); 
 #endif
+#if DLT_DIFF_CODING_IN_PPS
+  // Assuming that all PPS indirectly refer to the same VPS via different SPS
+  // There is no parsing dependency in decoding DLT in PPS. 
+  // The VPS information passed to decodePPS() is used to arrange the decoded DLT tables to their corresponding layers. 
+  // This is equivalent to the process of 
+  //   Step 1) decoding DLT tables based on the number of depth layers, and
+  //   Step 2) mapping DLT tables to the depth layers
+  // as descripted in the 3D-HEVC WD. 
+  TComVPS* vps = m_parameterSetManagerDecoder.getPrefetchedVPS( 0 );
+  m_cEntropyDecoder.decodePPS( pps, vps );
+#else
   m_cEntropyDecoder.decodePPS( pps );
+#endif
   m_parameterSetManagerDecoder.storePrefetchedPPS( pps );
 }
