diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h
index 0e33452e537339fe9173b00a967ed5a68fa21f39..0705deb60a7a9777980eba98af35bd56e5eb1721 100644
--- a/source/Lib/CommonLib/TypeDef.h
+++ b/source/Lib/CommonLib/TypeDef.h
@@ -78,6 +78,8 @@
 #define JVET_L0265_AFF_MINIMUM4X4                         1 //Affine 4x4 chroma subblock 
 
 #define JVET_L0111                                        1 // Max Tx size for skip
+#define JVET_L0553_PCM                                    1 // PCM mode
+
 #define JVET_L0553_FIX_INITQP                             1
 #define JVET_L0053_L0272_DM                               1 // use center position of luma block to derive DM
 
diff --git a/source/Lib/DecoderLib/CABACReader.cpp b/source/Lib/DecoderLib/CABACReader.cpp
index fd58a5ae29a364a7b1da93dd4cf420de42c0d7a4..f95dea94a9be92ef768de9dcbdc4002a75b0e892 100644
--- a/source/Lib/DecoderLib/CABACReader.cpp
+++ b/source/Lib/DecoderLib/CABACReader.cpp
@@ -715,7 +715,11 @@ bool CABACReader::coding_unit( CodingUnit &cu, Partitioner &partitioner, CUCtx&
   // pcm samples
   if( CU::isIntra(cu) && cu.partSize == SIZE_2Nx2N )
   {
+#if JVET_L0553_PCM
+    pcm_flag( cu, partitioner );
+#else
     pcm_flag( cu );
+#endif
     if( cu.ipcm )
     {
       TransformUnit& tu = cs.addTU( cu, partitioner.chType );
@@ -818,11 +822,19 @@ void CABACReader::pred_mode( CodingUnit& cu )
   }
 }
 
-
+#if JVET_L0553_PCM
+void CABACReader::pcm_flag( CodingUnit& cu, Partitioner &partitioner )
+#else
 void CABACReader::pcm_flag( CodingUnit& cu )
+#endif
 {
   const SPS& sps = *cu.cs->sps;
+#if JVET_L0553_PCM
+  if( !sps.getUsePCM() || partitioner.currArea().lwidth() > (1 << sps.getPCMLog2MaxSize()) || partitioner.currArea().lwidth() < (1 << sps.getPCMLog2MinSize()) 
+      || partitioner.currArea().lheight() > (1 << sps.getPCMLog2MaxSize()) || partitioner.currArea().lheight() < (1 << sps.getPCMLog2MinSize()) )
+#else
   if( !sps.getUsePCM() || cu.lumaSize().width > (1 << sps.getPCMLog2MaxSize()) || cu.lumaSize().width < (1 << sps.getPCMLog2MinSize()) )
+#endif
   {
     cu.ipcm = false;
     return;
@@ -1888,10 +1900,24 @@ void CABACReader::pcm_samples( TransformUnit& tu )
 {
   CHECK( !tu.cu->ipcm, "pcm mode expected" );
 
+#if JVET_L0553_PCM
+  const CodingStructure *cs = tu.cs;
+  const ChannelType chType = tu.chType;
+#endif
+
   const SPS&        sps       = *tu.cu->cs->sps;
+#if !JVET_L0553_PCM
   const ComponentID maxCompId = ( tu.chromaFormat == CHROMA_400 ? COMPONENT_Y : COMPONENT_Cr );
+#endif
   tu.depth                    = 0;
+
+#if JVET_L0553_PCM
+  ComponentID compStr = (CS::isDualITree(*cs) && !isLuma(chType)) ? COMPONENT_Cb: COMPONENT_Y;
+  ComponentID compEnd = (CS::isDualITree(*cs) && isLuma(chType)) ? COMPONENT_Y : COMPONENT_Cr;
+  for( ComponentID compID = compStr; compID <= compEnd; compID = ComponentID(compID+1) )
+#else
   for( ComponentID compID = COMPONENT_Y; compID <= maxCompId; compID = ComponentID(compID+1) )
+#endif
   {
     PelBuf          samples     = tu.getPcmbuf( compID );
     const unsigned  sampleBits  = sps.getPCMBitDepth( toChannelType(compID) );
diff --git a/source/Lib/DecoderLib/CABACReader.h b/source/Lib/DecoderLib/CABACReader.h
index 4332968b2e99f916c91d5d6ab9949fd806c8cec3..b0f46995933de4597ef6dc5ac19c5b24b06501d5 100644
--- a/source/Lib/DecoderLib/CABACReader.h
+++ b/source/Lib/DecoderLib/CABACReader.h
@@ -78,7 +78,11 @@ public:
   void        cu_transquant_bypass_flag ( CodingUnit&                   cu );
   void        cu_skip_flag              ( CodingUnit&                   cu );
   void        pred_mode                 ( CodingUnit&                   cu );
+#if JVET_L0553_PCM
+  void        pcm_flag                  ( CodingUnit&                   cu,     Partitioner&    pm );
+#else
   void        pcm_flag                  ( CodingUnit&                   cu );
+#endif
   void        cu_pred_data              ( CodingUnit&                   cu );
 #if JVET_L0646_GBI
   void        cu_gbi_flag               ( CodingUnit&                   cu );
diff --git a/source/Lib/DecoderLib/DecCu.cpp b/source/Lib/DecoderLib/DecCu.cpp
index dc510242ad3a866d0a9014d65976eec17e14e523..d1df4c4c877717c30a59a012a0ba7dd912df8f5e 100644
--- a/source/Lib/DecoderLib/DecCu.cpp
+++ b/source/Lib/DecoderLib/DecCu.cpp
@@ -260,9 +260,20 @@ void DecCu::xDecodePCMTexture(TransformUnit &tu, const ComponentID compID)
 */
 void DecCu::xReconPCM(TransformUnit &tu)
 {
+#if JVET_L0553_PCM
+  const CodingStructure *cs = tu.cs;
+  const ChannelType chType = tu.chType;
+
+  ComponentID compStr = (CS::isDualITree(*cs) && !isLuma(chType)) ? COMPONENT_Cb: COMPONENT_Y;
+  ComponentID compEnd = (CS::isDualITree(*cs) && isLuma(chType)) ? COMPONENT_Y : COMPONENT_Cr;
+  for( ComponentID compID = compStr; compID <= compEnd; compID = ComponentID(compID+1) )
+#else
   for (uint32_t ch = 0; ch < tu.blocks.size(); ch++)
+#endif
   {
+#if !JVET_L0553_PCM
     ComponentID compID = ComponentID(ch);
+#endif
 
     xDecodePCMTexture(tu, compID);
   }
diff --git a/source/Lib/EncoderLib/CABACWriter.cpp b/source/Lib/EncoderLib/CABACWriter.cpp
index a733df5104ee8bf7427a633a1f83dff83cbe3c92..60ed41522fef73156637554d40c69a8ae151c681 100644
--- a/source/Lib/EncoderLib/CABACWriter.cpp
+++ b/source/Lib/EncoderLib/CABACWriter.cpp
@@ -641,7 +641,11 @@ void CABACWriter::coding_unit( const CodingUnit& cu, Partitioner& partitioner, C
   // pcm samples
   if( CU::isIntra(cu) && cu.partSize == SIZE_2Nx2N )
   {
+#if JVET_L0553_PCM
+    pcm_data( cu, partitioner );
+#else
     pcm_data( cu );
+#endif
     if( cu.ipcm )
     {
       end_of_ctu( cu, cuCtx );
@@ -691,9 +695,17 @@ void CABACWriter::pred_mode( const CodingUnit& cu )
   m_BinEncoder.encodeBin( ( CU::isIntra( cu ) ), Ctx::PredMode() );
 }
 
+#if JVET_L0553_PCM
+void CABACWriter::pcm_data( const CodingUnit& cu, Partitioner& partitioner  )
+#else
 void CABACWriter::pcm_data( const CodingUnit& cu )
+#endif
 {
+#if JVET_L0553_PCM
+  pcm_flag( cu, partitioner );
+#else
   pcm_flag( cu );
+#endif
   if( cu.ipcm )
   {
     m_BinEncoder.pcmAlignBits();
@@ -701,11 +713,19 @@ void CABACWriter::pcm_data( const CodingUnit& cu )
   }
 }
 
-
+#if JVET_L0553_PCM
+void CABACWriter::pcm_flag( const CodingUnit& cu, Partitioner& partitioner )
+#else
 void CABACWriter::pcm_flag( const CodingUnit& cu )
+#endif
 {
   const SPS& sps = *cu.cs->sps;
+ #if JVET_L0553_PCM
+  if( !sps.getUsePCM() || partitioner.currArea().lwidth() > (1 << sps.getPCMLog2MaxSize()) || partitioner.currArea().lwidth() < (1 << sps.getPCMLog2MinSize()) 
+      || partitioner.currArea().lheight() > (1 << sps.getPCMLog2MaxSize()) || partitioner.currArea().lheight() < (1 << sps.getPCMLog2MinSize()) )
+#else
   if( !sps.getUsePCM() || cu.lumaSize().width > (1 << sps.getPCMLog2MaxSize()) || cu.lumaSize().width < (1 << sps.getPCMLog2MinSize()) )
+#endif
   {
     return;
   }
@@ -1836,8 +1856,18 @@ void CABACWriter::pcm_samples( const TransformUnit& tu )
   CHECK( !tu.cu->ipcm, "pcm mode expected" );
 
   const SPS&        sps       = *tu.cu->cs->sps;
+
+#if JVET_L0553_PCM
+  const CodingStructure *cs = tu.cs;
+  const ChannelType chType = tu.chType;
+
+  ComponentID compStr = (CS::isDualITree(*cs) && !isLuma(chType)) ? COMPONENT_Cb: COMPONENT_Y;
+  ComponentID compEnd = (CS::isDualITree(*cs) && isLuma(chType)) ? COMPONENT_Y : COMPONENT_Cr;
+  for( ComponentID compID = compStr; compID <= compEnd; compID = ComponentID(compID+1) )
+#else
   const ComponentID maxCompId = ( tu.chromaFormat == CHROMA_400 ? COMPONENT_Y : COMPONENT_Cr );
   for( ComponentID compID = COMPONENT_Y; compID <= maxCompId; compID = ComponentID(compID+1) )
+#endif
   {
     const CPelBuf   samples     = tu.getPcmbuf( compID );
     const unsigned  sampleBits  = sps.getPCMBitDepth( toChannelType(compID) );
diff --git a/source/Lib/EncoderLib/CABACWriter.h b/source/Lib/EncoderLib/CABACWriter.h
index addb673f2877e74e707290805c2b717220d3fda2..85311a0bb29b4ff43fa9621bd72c2c18110cbae7 100644
--- a/source/Lib/EncoderLib/CABACWriter.h
+++ b/source/Lib/EncoderLib/CABACWriter.h
@@ -90,8 +90,13 @@ public:
   void        cu_transquant_bypass_flag ( const CodingUnit&             cu );
   void        cu_skip_flag              ( const CodingUnit&             cu );
   void        pred_mode                 ( const CodingUnit&             cu );
+#if JVET_L0553_PCM
+  void        pcm_data                  ( const CodingUnit&             cu,       Partitioner&      pm );
+  void        pcm_flag                  ( const CodingUnit&             cu,       Partitioner&      pm );
+#else
   void        pcm_data                  ( const CodingUnit&             cu );
   void        pcm_flag                  ( const CodingUnit&             cu );
+#endif
   void        cu_pred_data              ( const CodingUnit&             cu );
 #if JVET_L0646_GBI
   void        cu_gbi_flag               ( const CodingUnit&             cu );
diff --git a/source/Lib/EncoderLib/EncCu.cpp b/source/Lib/EncoderLib/EncCu.cpp
index 7ab53e4ae2eef510cd12abc7488c3de10b5c20e3..c65884ec66d4868453c35b25d33cf6caaeb4ffdb 100644
--- a/source/Lib/EncoderLib/EncCu.cpp
+++ b/source/Lib/EncoderLib/EncCu.cpp
@@ -1507,8 +1507,11 @@ void EncCu::xCheckRDCostIntra( CodingStructure *&tempCS, CodingStructure *&bestC
     m_CABACEstimator->extend_ref_line( cu );
 #endif
     m_CABACEstimator->cu_pred_data   ( cu );
+#if JVET_L0553_PCM
+    m_CABACEstimator->pcm_data       ( cu, partitioner );
+#else
     m_CABACEstimator->pcm_data       ( cu );
-
+#endif
 
     // Encode Coefficients
     CUCtx cuCtx;
@@ -1554,7 +1557,11 @@ void EncCu::xCheckIntraPCM(CodingStructure *&tempCS, CodingStructure *&bestCS, P
 {
   tempCS->initStructData( encTestMode.qp, encTestMode.lossless );
 
+#if JVET_L0553_PCM
+  CodingUnit &cu      = tempCS->addCU( CS::getArea( *tempCS, tempCS->area, partitioner.chType ), partitioner.chType );
+#else
   CodingUnit &cu      = tempCS->addCU( tempCS->area, partitioner.chType );
+#endif
 
   partitioner.setCUData( cu );
   cu.slice            = tempCS->slice;
@@ -1572,9 +1579,15 @@ void EncCu::xCheckIntraPCM(CodingStructure *&tempCS, CodingStructure *&bestCS, P
   cu.qp               = encTestMode.qp;
   cu.ipcm             = true;
 
+#if JVET_L0553_PCM
+  tempCS->addPU( CS::getArea( *tempCS, tempCS->area, partitioner.chType ), partitioner.chType );
+
+  tempCS->addTU( CS::getArea( *tempCS, tempCS->area, partitioner.chType ), partitioner.chType );
+#else
   tempCS->addPU(tempCS->area, partitioner.chType);
 
   tempCS->addTU( tempCS->area, partitioner.chType );
+#endif
 
   m_pcIntraSearch->IPCMSearch(*tempCS, partitioner);
 
@@ -1596,7 +1609,11 @@ void EncCu::xCheckIntraPCM(CodingStructure *&tempCS, CodingStructure *&bestCS, P
     m_CABACEstimator->cu_skip_flag ( cu );
   }
   m_CABACEstimator->pred_mode      ( cu );
+#if JVET_L0553_PCM
+  m_CABACEstimator->pcm_data       ( cu, partitioner );
+#else
   m_CABACEstimator->pcm_data       ( cu );
+#endif
 
 
   tempCS->fracBits = m_CABACEstimator->getEstFracBits();
diff --git a/source/Lib/EncoderLib/IntraSearch.cpp b/source/Lib/EncoderLib/IntraSearch.cpp
index 9b48e8c05979dfa6d338909d05c87f0ebc947d43..36309d1f157dd714781a79ddeaf7bc09cd39dae2 100644
--- a/source/Lib/EncoderLib/IntraSearch.cpp
+++ b/source/Lib/EncoderLib/IntraSearch.cpp
@@ -1031,9 +1031,17 @@ void IntraSearch::estIntraPredChromaQT(CodingUnit &cu, Partitioner &partitioner)
 
 void IntraSearch::IPCMSearch(CodingStructure &cs, Partitioner& partitioner)
 {
+#if JVET_L0553_PCM
+  ComponentID compStr = (CS::isDualITree(cs) && !isLuma(partitioner.chType)) ? COMPONENT_Cb: COMPONENT_Y;
+  ComponentID compEnd = (CS::isDualITree(cs) && isLuma(partitioner.chType)) ? COMPONENT_Y : COMPONENT_Cr;
+  for( ComponentID compID = compStr; compID <= compEnd; compID = ComponentID(compID+1) )
+#else
   for (uint32_t ch = 0; ch < getNumberValidTBlocks( *cs.pcv ); ch++)
+#endif
   {
+#if !JVET_L0553_PCM
     const ComponentID compID = ComponentID(ch);
+#endif
 
     xEncPCM(cs, partitioner, compID);
   }
@@ -1047,7 +1055,9 @@ void IntraSearch::IPCMSearch(CodingStructure &cs, Partitioner& partitioner)
   cs.cost     = 0;
 
   cs.setDecomp(cs.area);
+#if !JVET_L0553_PCM
   cs.picture->getRecoBuf(cs.area).copyFrom(cs.getRecoBuf());
+#endif
 }
 
 void IntraSearch::xEncPCM(CodingStructure &cs, Partitioner& partitioner, const ComponentID &compID)
@@ -1111,7 +1121,11 @@ void IntraSearch::xEncIntraHeader(CodingStructure &cs, Partitioner &partitioner,
 #endif
       if( CU::isIntra(cu) && cu.partSize == SIZE_2Nx2N )
       {
+#if JVET_L0553_PCM
+        m_CABACEstimator->pcm_data( cu, partitioner );
+#else
         m_CABACEstimator->pcm_data( cu );
+#endif
         if( cu.ipcm )
         {
           return;