diff --git a/cfg/encoder_intra_vtm.cfg b/cfg/encoder_intra_vtm.cfg
index 57b9ef540bce9ef7350d448a7ca853f49fcdfeab..4d330a29967920fc8798046fae58525c8f535db7 100644
--- a/cfg/encoder_intra_vtm.cfg
+++ b/cfg/encoder_intra_vtm.cfg
@@ -61,13 +61,6 @@ SliceArgument            : 1500             # Argument for 'SliceMode'.
 LFCrossSliceBoundaryFlag : 1                # In-loop filtering, including ALF and DB, is across or not across slice boundary.
                                             # 0:not across, 1: across
 
-#============ PCM ================
-PCMEnabledFlag                      : 0                # 0: No PCM mode
-PCMLog2MaxSize                      : 5                # Log2 of maximum PCM block size.
-PCMLog2MinSize                      : 3                # Log2 of minimum PCM block size.
-PCMInputBitDepthFlag                : 1                # 0: PCM bit-depth is internal bit-depth. 1: PCM bit-depth is input bit-depth.
-PCMFilterDisableFlag                : 0                # 0: Enable loop filtering on I_PCM samples. 1: Disable loop filtering on I_PCM samples.
-
 #============ Lossless ================
 TransquantBypassEnable     : 0                         # Value of PPS flag.
 CUTransquantBypassFlagForce: 0                         # Force transquant bypass mode, when transquant_bypass_enable_flag is enabled
diff --git a/cfg/encoder_lowdelay_P_vtm.cfg b/cfg/encoder_lowdelay_P_vtm.cfg
index fcc83ed92956b95f44f4996eea69342cb63737ca..90b645849b645ea62c3ad309fe947895b9a865f6 100644
--- a/cfg/encoder_lowdelay_P_vtm.cfg
+++ b/cfg/encoder_lowdelay_P_vtm.cfg
@@ -69,13 +69,6 @@ SliceArgument            : 1500             # Argument for 'SliceMode'.
 LFCrossSliceBoundaryFlag : 1                # In-loop filtering, including ALF and DB, is across or not across slice boundary.
                                             # 0:not across, 1: across
 
-#============ PCM ================
-PCMEnabledFlag                      : 0                # 0: No PCM mode
-PCMLog2MaxSize                      : 5                # Log2 of maximum PCM block size.
-PCMLog2MinSize                      : 3                # Log2 of minimum PCM block size.
-PCMInputBitDepthFlag                : 1                # 0: PCM bit-depth is internal bit-depth. 1: PCM bit-depth is input bit-depth.
-PCMFilterDisableFlag                : 0                # 0: Enable loop filtering on I_PCM samples. 1: Disable loop filtering on I_PCM samples.
-
 #============ Lossless ================
 TransquantBypassEnable     : 0                         # Value of PPS flag.
 CUTransquantBypassFlagForce: 0                         # Force transquant bypass mode, when transquant_bypass_enable_flag is enabled
diff --git a/cfg/encoder_lowdelay_vtm.cfg b/cfg/encoder_lowdelay_vtm.cfg
index a1c98ae3c685dd7215ea4f02a514e0f797c09a3e..02becb448693210ff8abfba01411c9ccf4bbc585 100644
--- a/cfg/encoder_lowdelay_vtm.cfg
+++ b/cfg/encoder_lowdelay_vtm.cfg
@@ -69,13 +69,6 @@ SliceArgument            : 1500             # Argument for 'SliceMode'.
 LFCrossSliceBoundaryFlag : 1                # In-loop filtering, including ALF and DB, is across or not across slice boundary.
                                             # 0:not across, 1: across
 
-#============ PCM ================
-PCMEnabledFlag                      : 0                # 0: No PCM mode
-PCMLog2MaxSize                      : 5                # Log2 of maximum PCM block size.
-PCMLog2MinSize                      : 3                # Log2 of minimum PCM block size.
-PCMInputBitDepthFlag                : 1                # 0: PCM bit-depth is internal bit-depth. 1: PCM bit-depth is input bit-depth.
-PCMFilterDisableFlag                : 0                # 0: Enable loop filtering on I_PCM samples. 1: Disable loop filtering on I_PCM samples.
-
 #============ Lossless ================
 TransquantBypassEnable     : 0                         # Value of PPS flag.
 CUTransquantBypassFlagForce: 0                         # Force transquant bypass mode, when transquant_bypass_enable_flag is enabled
diff --git a/cfg/encoder_randomaccess_vtm.cfg b/cfg/encoder_randomaccess_vtm.cfg
index 7c4404bdfca11c24f7cdc4619bbfe57e25084d40..45d4ecd4f7c2ca9041c5dbf0e98689394aba35fc 100644
--- a/cfg/encoder_randomaccess_vtm.cfg
+++ b/cfg/encoder_randomaccess_vtm.cfg
@@ -83,13 +83,6 @@ SliceArgument            : 1500             # Argument for 'SliceMode'.
 LFCrossSliceBoundaryFlag : 1                # In-loop filtering, including ALF and DB, is across or not across slice boundary.
                                             # 0:not across, 1: across
 
-#============ PCM ================
-PCMEnabledFlag                      : 0                # 0: No PCM mode
-PCMLog2MaxSize                      : 5                # Log2 of maximum PCM block size.
-PCMLog2MinSize                      : 3                # Log2 of minimum PCM block size.
-PCMInputBitDepthFlag                : 1                # 0: PCM bit-depth is internal bit-depth. 1: PCM bit-depth is input bit-depth.
-PCMFilterDisableFlag                : 0                # 0: Enable loop filtering on I_PCM samples. 1: Disable loop filtering on I_PCM samples.
-
 #============ Lossless ================
 TransquantBypassEnable     : 0                         # Value of PPS flag.
 CUTransquantBypassFlagForce: 0                         # Force transquant bypass mode, when transquant_bypass_enable_flag is enabled
diff --git a/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_RasterScanSlice.cfg b/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_RasterScanSlice.cfg
index c588313ddeea1c63529ce967c31820e6225bd825..4dbc0a9e90e3602acb4318aa0d28fa8ce3b621ba 100644
--- a/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_RasterScanSlice.cfg
+++ b/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_RasterScanSlice.cfg
@@ -96,13 +96,6 @@ LFCrossTileBoundaryFlag             : 0                # In-loop filtering is ac
                                                        
 RectSliceFlag                       : 0
 
-#============ PCM ================
-PCMEnabledFlag                      : 0                # 0: No PCM mode
-PCMLog2MaxSize                      : 5                # Log2 of maximum PCM block size.
-PCMLog2MinSize                      : 3                # Log2 of minimum PCM block size.
-PCMInputBitDepthFlag                : 1                # 0: PCM bit-depth is internal bit-depth. 1: PCM bit-depth is input bit-depth.
-PCMFilterDisableFlag                : 0                # 0: Enable loop filtering on I_PCM samples. 1: Disable loop filtering on I_PCM samples.
-
 #============ Lossless ================
 TransquantBypassEnable     : 0                         # Value of PPS flag.
 CUTransquantBypassFlagForce: 0                         # Force transquant bypass mode, when transquant_bypass_enable_flag is enabled
diff --git a/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_RectangularSlice.cfg b/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_RectangularSlice.cfg
index 4b8fd25a1d4988fae5f2a941ec52c52a0991c5d7..f8f2286a823908a7f14ff0387ea891271e52b3bc 100644
--- a/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_RectangularSlice.cfg
+++ b/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_RectangularSlice.cfg
@@ -98,13 +98,6 @@ RectSliceFlag                       : 1
 NumRectSlicesInPicMinus1            : 3  
 RectSlicesBoundaryArray             : 0 4 1 5 2 6 3 7
 
-#============ PCM ================
-PCMEnabledFlag                      : 0                # 0: No PCM mode
-PCMLog2MaxSize                      : 5                # Log2 of maximum PCM block size.
-PCMLog2MinSize                      : 3                # Log2 of minimum PCM block size.
-PCMInputBitDepthFlag                : 1                # 0: PCM bit-depth is internal bit-depth. 1: PCM bit-depth is input bit-depth.
-PCMFilterDisableFlag                : 0                # 0: Enable loop filtering on I_PCM samples. 1: Disable loop filtering on I_PCM samples.
-
 #============ Lossless ================
 TransquantBypassEnable     : 0                         # Value of PPS flag.
 CUTransquantBypassFlagForce: 0                         # Force transquant bypass mode, when transquant_bypass_enable_flag is enabled
diff --git a/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_SingleTilePerSlice.cfg b/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_SingleTilePerSlice.cfg
index 1bf9e561e8d1e284eb814d5b07cf1b78e6b135dc..9d7ce53ae491ff720340828e7c0b517fc5f0401d 100644
--- a/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_SingleTilePerSlice.cfg
+++ b/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_SingleTilePerSlice.cfg
@@ -98,13 +98,6 @@ RectSliceFlag                       : 1
 NumRectSlicesInPicMinus1            : 3  
 RectSlicesBoundaryArray             : 0 0 1 1 2 2 3 3
 
-#============ PCM ================
-PCMEnabledFlag                      : 0                # 0: No PCM mode
-PCMLog2MaxSize                      : 5                # Log2 of maximum PCM block size.
-PCMLog2MinSize                      : 3                # Log2 of minimum PCM block size.
-PCMInputBitDepthFlag                : 1                # 0: PCM bit-depth is internal bit-depth. 1: PCM bit-depth is input bit-depth.
-PCMFilterDisableFlag                : 0                # 0: Enable loop filtering on I_PCM samples. 1: Disable loop filtering on I_PCM samples.
-
 #============ Lossless ================
 TransquantBypassEnable     : 0                         # Value of PPS flag.
 CUTransquantBypassFlagForce: 0                         # Force transquant bypass mode, when transquant_bypass_enable_flag is enabled
diff --git a/source/App/EncoderApp/EncApp.cpp b/source/App/EncoderApp/EncApp.cpp
index 21c65e025833428981a3e697e79f01f9c20d0f7d..819fc808525685f98be95499ffb6f5a3893a65f6 100644
--- a/source/App/EncoderApp/EncApp.cpp
+++ b/source/App/EncoderApp/EncApp.cpp
@@ -118,7 +118,9 @@ void EncApp::xInitLibCfg()
   m_cEncLib.setNoPartitionConstraintsOverrideConstraintFlag      ( !m_SplitConsOverrideEnabledFlag );
   m_cEncLib.setNoSaoConstraintFlag                               ( !m_bUseSAO );
   m_cEncLib.setNoAlfConstraintFlag                               ( !m_alf );
+#if !JVET_O0525_REMOVE_PCM
   m_cEncLib.setNoPcmConstraintFlag                               ( !m_usePCM );
+#endif
   m_cEncLib.setNoRefWraparoundConstraintFlag                     ( m_bNoRefWraparoundConstraintFlag );
   m_cEncLib.setNoTemporalMvpConstraintFlag                       ( m_TMVPModeId ? false : true );
   m_cEncLib.setNoSbtmvpConstraintFlag                            ( m_SubPuMvpMode ? false : true );
@@ -387,8 +389,10 @@ void EncApp::xInitLibCfg()
   m_cEncLib.setFastUDIUseMPMEnabled                              ( m_bFastUDIUseMPMEnabled );
   m_cEncLib.setFastMEForGenBLowDelayEnabled                      ( m_bFastMEForGenBLowDelayEnabled );
   m_cEncLib.setUseBLambdaForNonKeyLowDelayPictures               ( m_bUseBLambdaForNonKeyLowDelayPictures );
+#if !JVET_O0525_REMOVE_PCM
   m_cEncLib.setPCMLog2MinSize                                    ( m_uiPCMLog2MinSize);
   m_cEncLib.setUsePCM                                            ( m_usePCM );
+#endif
   m_cEncLib.setUseISP                                            ( m_ISP );
   m_cEncLib.setUseFastISP                                        ( m_useFastISP );
 
@@ -397,10 +401,14 @@ void EncApp::xInitLibCfg()
   {
     m_cEncLib.setBitDepth((ChannelType)channelType, m_internalBitDepth[channelType]);
     m_cEncLib.setInputBitDepth((ChannelType)channelType, m_inputBitDepth[channelType]);
+#if !JVET_O0525_REMOVE_PCM
     m_cEncLib.setPCMBitDepth((ChannelType)channelType, m_bPCMInputBitDepthFlag ? m_MSBExtendedBitDepth[channelType] : m_internalBitDepth[channelType]);
+#endif
   }
 
+#if !JVET_O0525_REMOVE_PCM
   m_cEncLib.setPCMLog2MaxSize                                    ( m_pcmLog2MaxSize);
+#endif
   m_cEncLib.setMaxNumMergeCand                                   ( m_maxNumMergeCand );
   m_cEncLib.setMaxNumAffineMergeCand                             ( m_maxNumAffineMergeCand );
   m_cEncLib.setMaxNumTriangleCand                                ( m_maxNumTriangleCand );
@@ -432,8 +440,10 @@ void EncApp::xInitLibCfg()
   m_cEncLib.setMaxNumOffsetsPerPic                               ( m_maxNumOffsetsPerPic);
 
   m_cEncLib.setSaoCtuBoundary                                    ( m_saoCtuBoundary);
+#if !JVET_O0525_REMOVE_PCM
   m_cEncLib.setPCMInputBitDepthFlag                              ( m_bPCMInputBitDepthFlag);
   m_cEncLib.setPCMFilterDisableFlag                              ( m_bPCMFilterDisableFlag);
+#endif
 
   m_cEncLib.setSaoGreedyMergeEnc                                 ( m_saoGreedyMergeEnc);
   m_cEncLib.setIntraSmoothingDisabledFlag                        (!m_enableIntraReferenceSmoothing );
diff --git a/source/App/EncoderApp/EncAppCfg.cpp b/source/App/EncoderApp/EncAppCfg.cpp
index 75c2ef47e2add50da3cb20575404cb2cbc032924..ac811cd4a7b135da1d3a193c07daaf89743e8a5a 100644
--- a/source/App/EncoderApp/EncAppCfg.cpp
+++ b/source/App/EncoderApp/EncAppCfg.cpp
@@ -116,7 +116,9 @@ EncAppCfg::EncAppCfg()
 , m_noPartitionConstraintsOverrideConstraintFlag(false)
 , m_bNoSaoConstraintFlag(false)
 , m_bNoAlfConstraintFlag(false)
+#if !JVET_O0525_REMOVE_PCM
 , m_bNoPcmConstraintFlag(false)
+#endif
 , m_bNoRefWraparoundConstraintFlag(false)
 , m_bNoTemporalMvpConstraintFlag(false)
 , m_bNoSbtmvpConstraintFlag(false)
@@ -1152,12 +1154,14 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] )
   ("FastUDIUseMPMEnabled",                            m_bFastUDIUseMPMEnabled,                           true, "If enabled, adapt intra direction search, accounting for MPM")
   ("FastMEForGenBLowDelayEnabled",                    m_bFastMEForGenBLowDelayEnabled,                   true, "If enabled use a fast ME for generalised B Low Delay slices")
   ("UseBLambdaForNonKeyLowDelayPictures",             m_bUseBLambdaForNonKeyLowDelayPictures,            true, "Enables use of B-Lambda for non-key low-delay pictures")
+#if !JVET_O0525_REMOVE_PCM
   ("PCMEnabledFlag",                                  m_usePCM,                                         false)
   ("PCMLog2MaxSize",                                  m_pcmLog2MaxSize,                                    5u)
   ("PCMLog2MinSize",                                  m_uiPCMLog2MinSize,                                  3u)
 
   ("PCMInputBitDepthFlag",                            m_bPCMInputBitDepthFlag,                           true)
   ("PCMFilterDisableFlag",                            m_bPCMFilterDisableFlag,                          false)
+#endif
   ("IntraReferenceSmoothing",                         m_enableIntraReferenceSmoothing,                   true, "0: Disable use of intra reference smoothing (not valid in V1 profiles). 1: Enable use of intra reference smoothing (same as V1)")
   ("WeightedPredP,-wpP",                              m_useWeightedPred,                                false, "Use weighted prediction in P slices")
   ("WeightedPredB,-wpB",                              m_useWeightedBiPred,                              false, "Use weighted (bidirectional) prediction in B slices")
@@ -2718,6 +2722,7 @@ bool EncAppCfg::xCheckParameter()
   xConfirmPara( m_MTSIntraMaxCand < 0 || m_MTSIntraMaxCand > 5, "m_MTSIntraMaxCand must be greater than 0 and smaller than 6" );
   xConfirmPara( m_MTSInterMaxCand < 0 || m_MTSInterMaxCand > 5, "m_MTSInterMaxCand must be greater than 0 and smaller than 6" );
   xConfirmPara( m_MTS != 0 && m_MTSImplicit != 0, "Both explicit and implicit MTS cannot be enabled at the same time" );
+#if !JVET_O0525_REMOVE_PCM
   if( m_usePCM)
   {
     for (uint32_t channelType = 0; channelType < MAX_NUM_CHANNEL_TYPE; channelType++)
@@ -2729,6 +2734,7 @@ bool EncAppCfg::xCheckParameter()
     xConfirmPara(  m_pcmLog2MaxSize > 5,                                        "PCMLog2MaxSize must be 5 or smaller.");
     xConfirmPara(  m_pcmLog2MaxSize < m_uiPCMLog2MinSize,                       "PCMLog2MaxSize must be equal to or greater than m_uiPCMLog2MinSize.");
   }
+#endif
 
   if (m_useBDPCM)
   {
@@ -3377,7 +3383,9 @@ void EncAppCfg::xPrintParameter()
 #if MAX_TB_SIZE_SIGNALLING
   msg( DETAILS, "Max TB size                            : %d \n", 1 << m_log2MaxTbSize );
 #endif
+#if !JVET_O0525_REMOVE_PCM
   msg( DETAILS, "Min PCM size                           : %d\n", 1 << m_uiPCMLog2MinSize);
+#endif
   msg( DETAILS, "Motion search range                    : %d\n", m_iSearchRange );
   msg( DETAILS, "Intra period                           : %d\n", m_iIntraPeriod );
   msg( DETAILS, "Decoding refresh type                  : %d\n", m_iDecodingRefreshType );
@@ -3402,8 +3410,10 @@ void EncAppCfg::xPrintParameter()
   msg( DETAILS, "Input bit depth                        : (Y:%d, C:%d)\n", m_inputBitDepth[CHANNEL_TYPE_LUMA], m_inputBitDepth[CHANNEL_TYPE_CHROMA] );
   msg( DETAILS, "MSB-extended bit depth                 : (Y:%d, C:%d)\n", m_MSBExtendedBitDepth[CHANNEL_TYPE_LUMA], m_MSBExtendedBitDepth[CHANNEL_TYPE_CHROMA] );
   msg( DETAILS, "Internal bit depth                     : (Y:%d, C:%d)\n", m_internalBitDepth[CHANNEL_TYPE_LUMA], m_internalBitDepth[CHANNEL_TYPE_CHROMA] );
+#if !JVET_O0525_REMOVE_PCM
   msg( DETAILS, "PCM sample bit depth                   : (Y:%d, C:%d)\n", m_bPCMInputBitDepthFlag ? m_MSBExtendedBitDepth[CHANNEL_TYPE_LUMA] : m_internalBitDepth[CHANNEL_TYPE_LUMA],
                                                                     m_bPCMInputBitDepthFlag ? m_MSBExtendedBitDepth[CHANNEL_TYPE_CHROMA] : m_internalBitDepth[CHANNEL_TYPE_CHROMA] );
+#endif
   msg( DETAILS, "Intra reference smoothing              : %s\n", (m_enableIntraReferenceSmoothing           ? "Enabled" : "Disabled") );
   msg( DETAILS, "cu_chroma_qp_offset_subdiv             : %d\n", m_cuChromaQpOffsetSubdiv);
   msg( DETAILS, "extended_precision_processing_flag     : %s\n", (m_extendedPrecisionProcessingFlag         ? "Enabled" : "Disabled") );
@@ -3493,7 +3503,9 @@ void EncAppCfg::xPrintParameter()
   msg( VERBOSE, "CIP:%d ", m_bUseConstrainedIntraPred);
   msg( VERBOSE, "SAO:%d ", (m_bUseSAO)?(1):(0));
   msg( VERBOSE, "ALF:%d ", m_alf ? 1 : 0 );
+#if !JVET_O0525_REMOVE_PCM
   msg( VERBOSE, "PCM:%d ", (m_usePCM && (1<<m_uiPCMLog2MinSize) <= m_uiMaxCUWidth)? 1 : 0);
+#endif
 
   if (m_TransquantBypassEnabledFlag && m_CUTransquantBypassFlagForce)
   {
diff --git a/source/App/EncoderApp/EncAppCfg.h b/source/App/EncoderApp/EncAppCfg.h
index 16d0993ce049104fdece32b202f8f273edc1794b..6cc2c2ed36f49420f669bba360446776272473ec 100644
--- a/source/App/EncoderApp/EncAppCfg.h
+++ b/source/App/EncoderApp/EncAppCfg.h
@@ -130,7 +130,9 @@ protected:
   bool      m_noPartitionConstraintsOverrideConstraintFlag;
   bool      m_bNoSaoConstraintFlag;
   bool      m_bNoAlfConstraintFlag;
+#if !JVET_O0525_REMOVE_PCM
   bool      m_bNoPcmConstraintFlag;
+#endif
   bool      m_bNoRefWraparoundConstraintFlag;
   bool      m_bNoTemporalMvpConstraintFlag;
   bool      m_bNoSbtmvpConstraintFlag;
@@ -377,8 +379,10 @@ protected:
   //coding tools (chroma format)
   ChromaFormat m_chromaFormatIDC;
 
+#if !JVET_O0525_REMOVE_PCM
   // coding tools (PCM bit-depth)
   bool      m_bPCMInputBitDepthFlag;                          ///< 0: PCM bit-depth is internal bit-depth. 1: PCM bit-depth is input bit-depth.
+#endif
 
   // coding tool (SAO)
   bool      m_bUseSAO;
@@ -398,11 +402,13 @@ protected:
 #else
   bool      m_DeblockingFilterMetric;                         ///< blockiness metric in encoder
 #endif
+#if !JVET_O0525_REMOVE_PCM
   // coding tools (PCM)
   bool      m_usePCM;                                         ///< flag for using IPCM
   uint32_t      m_pcmLog2MaxSize;                                 ///< log2 of maximum PCM block size
   uint32_t      m_uiPCMLog2MinSize;                               ///< log2 of minimum PCM block size
   bool      m_bPCMFilterDisableFlag;                          ///< PCM filter disable flag
+#endif
   bool      m_enableIntraReferenceSmoothing;                  ///< flag for enabling(default)/disabling intra reference smoothing/filtering
 
   // coding tools (encoder-only parameters)
diff --git a/source/Lib/CommonLib/AdaptiveLoopFilter.cpp b/source/Lib/CommonLib/AdaptiveLoopFilter.cpp
index ed2a49402b2f2a26291cf8c45d949a2cc309149d..22432da378550108f4bd9a9a33e9424d989aa39f 100644
--- a/source/Lib/CommonLib/AdaptiveLoopFilter.cpp
+++ b/source/Lib/CommonLib/AdaptiveLoopFilter.cpp
@@ -273,8 +273,10 @@ void AdaptiveLoopFilter::ALFProcess(CodingStructure& cs)
               const Area blkSrc( 0, 0, w, h );
               const Area blkDst( xStart, yStart, w, h );
               deriveClassification( m_classifier, buf.get(COMPONENT_Y), blkDst, blkSrc );
+#if !JVET_O0525_REMOVE_PCM
               const Area blkPCM( xStart, yStart, w, h );
               resetPCMBlkClassInfo( cs, m_classifier, buf.get(COMPONENT_Y), blkPCM );
+#endif
               short filterSetIndex = alfCtuFilterIndex[ctuIdx];
               short *coeff;
               short *clip;
@@ -328,8 +330,10 @@ void AdaptiveLoopFilter::ALFProcess(CodingStructure& cs)
       {
         Area blk( xPos, yPos, width, height );
         deriveClassification( m_classifier, tmpYuv.get( COMPONENT_Y ), blk, blk );
+#if !JVET_O0525_REMOVE_PCM
         Area blkPCM(xPos, yPos, width, height);
         resetPCMBlkClassInfo(cs, m_classifier, tmpYuv.get(COMPONENT_Y), blkPCM);
+#endif
         short filterSetIndex = alfCtuFilterIndex[ctuIdx];
         short *coeff;
         short *clip;
@@ -754,6 +758,7 @@ void AdaptiveLoopFilter::deriveClassification( AlfClassifier** classifier, const
     }
   }
 }
+#if !JVET_O0525_REMOVE_PCM
 void AdaptiveLoopFilter::resetPCMBlkClassInfo(CodingStructure & cs,  AlfClassifier** classifier, const CPelBuf& srcLuma, const Area& blk)
 {
   if ( !cs.sps->getPCMFilterDisableFlag() )
@@ -803,6 +808,7 @@ void AdaptiveLoopFilter::resetPCMBlkClassInfo(CodingStructure & cs,  AlfClassifi
     }
   }
 }
+#endif
 
 void AdaptiveLoopFilter::deriveClassificationBlk(AlfClassifier **classifier, int **laplacian[NUM_DIRECTIONS],
                                                  const CPelBuf &srcLuma, const Area &blkDst, const Area &blk,
@@ -1029,10 +1035,12 @@ void AdaptiveLoopFilter::filterBlk(AlfClassifier **classifier, const PelUnitBuf
   {
     CHECK( filtType != 0, "Chroma needs to have filtType == 0" );
   }
+#if !JVET_O0525_REMOVE_PCM
   const SPS*     sps = cs.slice->getSPS();
   bool isDualTree =CS::isDualITree(cs);
   bool isPCMFilterDisabled = sps->getPCMFilterDisableFlag();
   ChromaFormat nChromaFormat = sps->getChromaFormatIdc();
+#endif
 
   const CPelBuf srcLuma = recSrc.get( compId );
   PelBuf dstLuma = recDst.get( compId );
@@ -1062,7 +1070,9 @@ void AdaptiveLoopFilter::filterBlk(AlfClassifier **classifier, const PelUnitBuf
   const int clsSizeY = 4;
   const int clsSizeX = 4;
 
+#if !JVET_O0525_REMOVE_PCM
   bool pcmFlags2x2[4] = {0,0,0,0};
+#endif
 
   CHECK( startHeight % clsSizeY, "Wrong startHeight in filtering" );
   CHECK( startWidth % clsSizeX, "Wrong startWidth in filtering" );
@@ -1101,13 +1111,16 @@ void AdaptiveLoopFilter::filterBlk(AlfClassifier **classifier, const PelUnitBuf
       {
         AlfClassifier& cl = pClass[j];
         transposeIdx = cl.transposeIdx;
+#if !JVET_O0525_REMOVE_PCM
         if( isPCMFilterDisabled && cl.classIdx== m_ALF_UNUSED_CLASSIDX && transposeIdx== m_ALF_UNUSED_TRANSPOSIDX )
         {
           continue;
         }
+#endif
         coef = filterSet + cl.classIdx * MAX_NUM_ALF_LUMA_COEFF;
         clip = fClipSet + cl.classIdx * MAX_NUM_ALF_LUMA_COEFF;
       }
+#if !JVET_O0525_REMOVE_PCM
       else if( isPCMFilterDisabled )
       {
         int  blkX, blkY;
@@ -1139,6 +1152,7 @@ void AdaptiveLoopFilter::filterBlk(AlfClassifier **classifier, const PelUnitBuf
         }
       }
 
+#endif
 
       if( filtType == ALF_FILTER_7 )
       {
@@ -1224,6 +1238,7 @@ void AdaptiveLoopFilter::filterBlk(AlfClassifier **classifier, const PelUnitBuf
         for( int jj = 0; jj < clsSizeX; jj++ )
         {
 
+#if !JVET_O0525_REMOVE_PCM
           // skip 2x2 PCM chroma blocks
           if( bChroma && isPCMFilterDisabled )
           {
@@ -1239,6 +1254,7 @@ void AdaptiveLoopFilter::filterBlk(AlfClassifier **classifier, const PelUnitBuf
               continue;
             }
           }
+#endif
 
           int sum = 0;
           const Pel curr = pImg0[+0];
diff --git a/source/Lib/CommonLib/AdaptiveLoopFilter.h b/source/Lib/CommonLib/AdaptiveLoopFilter.h
index 04c9f66003087ee949714eb57f211e01046a51b4..1d6e367b49798f7f56ec8312a5b2b973f0923321 100644
--- a/source/Lib/CommonLib/AdaptiveLoopFilter.h
+++ b/source/Lib/CommonLib/AdaptiveLoopFilter.h
@@ -91,7 +91,9 @@ public:
                                       const CPelBuf &srcLuma, const Area &blkDst, const Area &blk, const int shift,
                                       const int vbCTUHeight, int vbPos);
   void deriveClassification( AlfClassifier** classifier, const CPelBuf& srcLuma, const Area& blkDst, const Area& blk );
+#if !JVET_O0525_REMOVE_PCM
   void resetPCMBlkClassInfo(CodingStructure & cs, AlfClassifier** classifier, const CPelBuf& srcLuma, const Area& blk);
+#endif
   template<AlfFilterType filtType>
   static void filterBlk(AlfClassifier **classifier, const PelUnitBuf &recDst, const CPelUnitBuf &recSrc,
                         const Area &blkDst, const Area &blk, const ComponentID compId, const short *filterSet,
diff --git a/source/Lib/CommonLib/CodingStatistics.h b/source/Lib/CommonLib/CodingStatistics.h
index 845e040702366e4f3cff1cca8fccf456951f7da0..d9dae2f63e5d19565ce2a28c26c365cc1133d77f 100644
--- a/source/Lib/CommonLib/CodingStatistics.h
+++ b/source/Lib/CommonLib/CodingStatistics.h
@@ -102,8 +102,10 @@ enum CodingStatisticsType
   STATS__CABAC_BITS__ALF,
   STATS__CABAC_TRM_BITS,
   STATS__CABAC_FIXED_BITS,
+#if !JVET_O0525_REMOVE_PCM
   STATS__CABAC_PCM_ALIGN_BITS,
   STATS__CABAC_PCM_CODE_BITS,
+#endif
   STATS__BYTE_ALIGNMENT_BITS,
   STATS__TRAILING_BITS,
   STATS__EXPLICIT_RDPCM_BITS,
@@ -198,8 +200,10 @@ static inline const char* getName(CodingStatisticsType name)
     "CABAC_BITS__ALF",
     "CABAC_TRM_BITS",
     "CABAC_FIXED_BITS",
+#if !JVET_O0525_REMOVE_PCM
     "CABAC_PCM_ALIGN_BITS",
     "CABAC_PCM_CODE_BITS",
+#endif
     "BYTE_ALIGNMENT_BITS",
     "TRAILING_BITS",
     "EXPLICIT_RDPCM_BITS",
diff --git a/source/Lib/CommonLib/LoopFilter.cpp b/source/Lib/CommonLib/LoopFilter.cpp
index 35b4cd16d44ad390072998fd43b84ce62a81779a..13424b7d8e41683a7534e9cda36303504f6d8cad 100644
--- a/source/Lib/CommonLib/LoopFilter.cpp
+++ b/source/Lib/CommonLib/LoopFilter.cpp
@@ -914,7 +914,9 @@ void LoopFilter::xEdgeFilterLuma( const CodingUnit& cu, const DeblockEdgeDir edg
   unsigned     uiBsAbsIdx   = 0, uiBs = 0;
   int          iOffset, iSrcStep;
 
+#if !JVET_O0525_REMOVE_PCM
   bool  bPCMFilter      = (sps.getPCMEnabledFlag() && sps.getPCMFilterDisableFlag()) ? true : false;
+#endif
   bool  bPartPNoFilter  = false;
   bool  bPartQNoFilter  = false;
   int   betaOffsetDiv2  = slice.getDeblockingFilterBetaOffsetDiv2();
@@ -1071,12 +1073,14 @@ void LoopFilter::xEdgeFilterLuma( const CodingUnit& cu, const DeblockEdgeDir edg
           int dL = d0L + d3L;
 
           bPartPNoFilter = bPartQNoFilter = false;
+#if !JVET_O0525_REMOVE_PCM
           if (bPCMFilter)
           {
             // Check if each of PUs is I_PCM with LF disabling
             bPartPNoFilter = cuP.ipcm;
             bPartQNoFilter = cuQ.ipcm;
           }
+#endif
           if (ppsTransquantBypassEnabledFlag)
           {
             // check if each of PUs is lossless coded
@@ -1124,12 +1128,14 @@ void LoopFilter::xEdgeFilterLuma( const CodingUnit& cu, const DeblockEdgeDir edg
         const int d  = d0  + d3;
 
         bPartPNoFilter = bPartQNoFilter = false;
+#if !JVET_O0525_REMOVE_PCM
         if( bPCMFilter )
         {
           // Check if each of PUs is I_PCM with LF disabling
           bPartPNoFilter = cuP.ipcm;
           bPartQNoFilter = cuQ.ipcm;
         }
+#endif
         if( ppsTransquantBypassEnabledFlag )
         {
           // check if each of PUs is lossless coded
@@ -1199,7 +1205,9 @@ void LoopFilter::xEdgeFilterChroma(const CodingUnit& cu, const DeblockEdgeDir ed
   int       iOffset, iSrcStep;
   unsigned  uiLoopLength;
 
+#if !JVET_O0525_REMOVE_PCM
   bool      bPCMFilter      = (sps.getPCMEnabledFlag() && sps.getPCMFilterDisableFlag()) ? true : false;
+#endif
   bool      bPartPNoFilter  = false;
   bool      bPartQNoFilter  = false;
   const int tcOffsetDiv2    = slice.getDeblockingFilterTcOffsetDiv2();
@@ -1282,12 +1290,14 @@ void LoopFilter::xEdgeFilterChroma(const CodingUnit& cu, const DeblockEdgeDir ed
       }
 
       bPartPNoFilter = bPartQNoFilter = false;
+#if !JVET_O0525_REMOVE_PCM
       if (bPCMFilter)
       {
         // Check if each of PUs is I_PCM with LF disabling
         bPartPNoFilter = cuP.ipcm;
         bPartQNoFilter = cuQ.ipcm;
       }
+#endif
       if( pps.getTransquantBypassEnabledFlag() )
       {
         // check if each of PUs is lossless coded
diff --git a/source/Lib/CommonLib/SampleAdaptiveOffset.cpp b/source/Lib/CommonLib/SampleAdaptiveOffset.cpp
index ddd40aeefe4226d11c5a34b552ee63192eeacf13..37ca91c90e1fb3ff2a62b72a898f691ad60a6b80 100644
--- a/source/Lib/CommonLib/SampleAdaptiveOffset.cpp
+++ b/source/Lib/CommonLib/SampleAdaptiveOffset.cpp
@@ -661,15 +661,27 @@ void SampleAdaptiveOffset::SAOProcess( CodingStructure& cs, SAOBlkParam* saoBlkP
   DTRACE    ( g_trace_ctx, D_CRC, "SAO" );
   DTRACE_CRC( g_trace_ctx, D_CRC, cs, cs.getRecoBuf() );
 
+#if !JVET_O0525_REMOVE_PCM
   xPCMLFDisableProcess(cs);
+#else
+  xLosslessDisableProcess(cs);
+#endif
 }
 
+#if !JVET_O0525_REMOVE_PCM
 void SampleAdaptiveOffset::xPCMLFDisableProcess(CodingStructure& cs)
+#else
+void SampleAdaptiveOffset::xLosslessDisableProcess(CodingStructure& cs)
+#endif
 {
   const PreCalcValues& pcv = *cs.pcv;
+#if !JVET_O0525_REMOVE_PCM
   const bool bPCMFilter = (cs.sps->getPCMEnabledFlag() && cs.sps->getPCMFilterDisableFlag()) ? true : false;
 
   if( bPCMFilter || cs.pps->getTransquantBypassEnabledFlag() )
+#else
+  if( cs.pps->getTransquantBypassEnabledFlag() )
+#endif
   {
     for( uint32_t yPos = 0; yPos < pcv.lumaHeight; yPos += pcv.maxCUHeight )
     {
@@ -677,22 +689,37 @@ void SampleAdaptiveOffset::xPCMLFDisableProcess(CodingStructure& cs)
       {
         UnitArea ctuArea( cs.area.chromaFormat, Area( xPos, yPos, pcv.maxCUWidth, pcv.maxCUHeight ) );
 
+#if !JVET_O0525_REMOVE_PCM
         // CU-based deblocking
         xPCMCURestoration(cs, ctuArea);
+#else
+        xLosslessCURestoration(cs, ctuArea);
+#endif
       }
     }
   }
 }
 
+#if !JVET_O0525_REMOVE_PCM
 void SampleAdaptiveOffset::xPCMCURestoration(CodingStructure& cs, const UnitArea &ctuArea)
+#else
+void SampleAdaptiveOffset::xLosslessCURestoration(CodingStructure& cs, const UnitArea &ctuArea)
+#endif
 {
+#if !JVET_O0525_REMOVE_PCM
   const SPS& sps = *cs.sps;
+#endif
   uint32_t numComponents;
   bool anyDualTree = false;
   for( auto &cu : cs.traverseCUs( ctuArea, CH_L ) )
   {
+#if !JVET_O0525_REMOVE_PCM
     // restore PCM samples
     if( ( cu.ipcm && sps.getPCMFilterDisableFlag() ) || CU::isLosslessCoded( cu ) )
+#else
+    // restore lossless samples
+    if( CU::isLosslessCoded( cu ) )
+#endif
     {
 
       cs.slice = cu.slice;
@@ -700,7 +727,11 @@ void SampleAdaptiveOffset::xPCMCURestoration(CodingStructure& cs, const UnitArea
       numComponents = CS::isDualITree(cs) ? 1 : m_numberOfComponents;
       for( uint32_t comp = 0; comp < numComponents; comp++ )
       {
+#if !JVET_O0525_REMOVE_PCM
         xPCMSampleRestoration( cu, ComponentID( comp ) );
+#else
+        xLosslessSampleRestoration( cu, ComponentID( comp ) );
+#endif
       }
     }
   }
@@ -714,22 +745,39 @@ void SampleAdaptiveOffset::xPCMCURestoration(CodingStructure& cs, const UnitArea
         continue;
       }
 
+#if !JVET_O0525_REMOVE_PCM
       // restore PCM samples
       if ((cu.ipcm && sps.getPCMFilterDisableFlag()) || CU::isLosslessCoded(cu))
+#else
+      // restore lossless samples
+      if (CU::isLosslessCoded(cu))
+#endif
       {
         for (uint32_t comp = 1; comp < numComponents; comp++)
         {
+#if !JVET_O0525_REMOVE_PCM
           xPCMSampleRestoration(cu, ComponentID(comp));
+#else
+          xLosslessSampleRestoration(cu, ComponentID(comp));
+#endif
         }
       }
     }
   }
 }
 
+#if !JVET_O0525_REMOVE_PCM
 void SampleAdaptiveOffset::xPCMSampleRestoration(CodingUnit& cu, const ComponentID compID)
+#else
+void SampleAdaptiveOffset::xLosslessSampleRestoration(CodingUnit& cu, const ComponentID compID)
+#endif
 {
+#if !JVET_O0525_REMOVE_PCM
   const CompArea& ca = cu.block(compID);
   if( CU::isLosslessCoded( cu ) && !cu.ipcm )
+#else
+  if( CU::isLosslessCoded( cu ) )
+#endif
   {
     for( auto &currTU : CU::traverseTUs( cu ) )
     {
@@ -746,6 +794,7 @@ void SampleAdaptiveOffset::xPCMSampleRestoration(CodingUnit& cu, const Component
     return;
   }
 
+#if !JVET_O0525_REMOVE_PCM
   const TransformUnit& tu = *cu.firstTU; CHECK( cu.firstTU != cu.lastTU, "Multiple TUs present in a PCM CU" );
   const CPelBuf& pcmBuf   = tu.getPcmbuf( compID );
          PelBuf dstBuf    = cu.cs->getRecoBuf( ca );
@@ -763,6 +812,7 @@ void SampleAdaptiveOffset::xPCMSampleRestoration(CodingUnit& cu, const Component
   {
     dstBuf.rspSignal(m_pcReshape->getInvLUT());
   }
+#endif
 }
 
 void SampleAdaptiveOffset::deriveLoopFilterBoundaryAvailibility(CodingStructure& cs, const Position &pos,
diff --git a/source/Lib/CommonLib/SampleAdaptiveOffset.h b/source/Lib/CommonLib/SampleAdaptiveOffset.h
index c314eb6f6849984e2a582335d0812a18ef8bcdaf..b2cdcb3da82a2b79a0a37d162fd7ce572c93051f 100644
--- a/source/Lib/CommonLib/SampleAdaptiveOffset.h
+++ b/source/Lib/CommonLib/SampleAdaptiveOffset.h
@@ -91,9 +91,15 @@ protected:
   void reconstructBlkSAOParam(SAOBlkParam& recParam, SAOBlkParam* mergeList[NUM_SAO_MERGE_TYPES]);
   int  getMergeList(CodingStructure& cs, int ctuRsAddr, SAOBlkParam* blkParams, SAOBlkParam* mergeList[NUM_SAO_MERGE_TYPES]);
   void offsetCTU(const UnitArea& area, const CPelUnitBuf& src, PelUnitBuf& res, SAOBlkParam& saoblkParam, CodingStructure& cs);
+#if !JVET_O0525_REMOVE_PCM
   void xPCMLFDisableProcess(CodingStructure& cs);
   void xPCMCURestoration(CodingStructure& cs, const UnitArea &ctuArea);
   void xPCMSampleRestoration(CodingUnit& cu, const ComponentID compID);
+#else
+  void xLosslessDisableProcess(CodingStructure& cs);
+  void xLosslessCURestoration(CodingStructure& cs, const UnitArea &ctuArea);
+  void xLosslessSampleRestoration(CodingUnit& cu, const ComponentID compID);
+#endif
   void xReconstructBlkSAOParams(CodingStructure& cs, SAOBlkParam* saoBlkParams);
   bool isCrossedByVirtualBoundaries(const int xPos, const int yPos, const int width, const int height, int& numHorVirBndry, int& numVerVirBndry, int horVirBndryPos[], int verVirBndryPos[], const PPS* pps);
   inline bool isProcessDisabled(int xPos, int yPos, int numVerVirBndry, int numHorVirBndry, int verVirBndryPos[], int horVirBndryPos[])
diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp
index 2404f16821df58912232b775e2dd1a19a4a8b6dc..ff5fbb969e5c82a3cb48eaea795b28523ef79270 100644
--- a/source/Lib/CommonLib/Slice.cpp
+++ b/source/Lib/CommonLib/Slice.cpp
@@ -1413,9 +1413,11 @@ SPS::SPS()
 , m_allRplEntriesHasSameSignFlag ( true )
 , m_bLongTermRefsPresent      (false)
 // Tool list
+#if !JVET_O0525_REMOVE_PCM
 , m_pcmEnabledFlag            (false)
 , m_pcmLog2MaxSize            (  5)
 , m_uiPCMLog2MinSize          (  7)
+#endif
 #if JVET_O1136_TS_BDPCM_SIGNALLING
 , m_transformSkipEnabledFlag  (false)
 , m_BDPCMEnabledFlag          (false)
@@ -1423,7 +1425,9 @@ SPS::SPS()
 #if JVET_O0376_SPS_JOINTCBCR_FLAG
 , m_JointCbCrEnabledFlag      (false)
 #endif
+#if !JVET_O0525_REMOVE_PCM
 , m_bPCMFilterDisableFlag     (false)
+#endif
 , m_sbtmvpEnabledFlag         (false)
 , m_bdofEnabledFlag           (false)
 , m_fpelMmvdEnabledFlag       ( false )
@@ -1475,7 +1479,9 @@ SPS::SPS()
   for(int ch=0; ch<MAX_NUM_CHANNEL_TYPE; ch++)
   {
     m_bitDepths.recon[ch] = 8;
+#if !JVET_O0525_REMOVE_PCM
     m_pcmBitDepths[ch] = 8;
+#endif
     m_qpBDOffset   [ch] = 0;
   }
 
diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h
index bf8fa59fd884f8ffdcff9dffe16b26f7b4e71862..fea7245580fc3668a4137ca042c73087c7e3b0a0 100644
--- a/source/Lib/CommonLib/Slice.h
+++ b/source/Lib/CommonLib/Slice.h
@@ -188,7 +188,9 @@ class ConstraintInfo
   bool              m_noPartitionConstraintsOverrideConstraintFlag;
   bool              m_noSaoConstraintFlag;
   bool              m_noAlfConstraintFlag;
+#if !JVET_O0525_REMOVE_PCM
   bool              m_noPcmConstraintFlag;
+#endif
   bool              m_noRefWraparoundConstraintFlag;
   bool              m_noTemporalMvpConstraintFlag;
   bool              m_noSbtmvpConstraintFlag;
@@ -229,7 +231,9 @@ public:
     , m_noPartitionConstraintsOverrideConstraintFlag(false)
     , m_noSaoConstraintFlag      (false)
     , m_noAlfConstraintFlag      (false)
+#if !JVET_O0525_REMOVE_PCM
     , m_noPcmConstraintFlag      (false)
+#endif
     , m_noRefWraparoundConstraintFlag(false)
     , m_noTemporalMvpConstraintFlag(false)
     , m_noSbtmvpConstraintFlag   (false)
@@ -297,8 +301,10 @@ public:
   bool          getNoJointCbCrConstraintFlag() const { return m_noJointCbCrConstraintFlag; }
   void          setNoJointCbCrConstraintFlag(bool bVal) { m_noJointCbCrConstraintFlag = bVal; }
 #endif
+#if !JVET_O0525_REMOVE_PCM
   bool          getNoPcmConstraintFlag() const { return m_noPcmConstraintFlag; }
   void          setNoPcmConstraintFlag(bool bVal) { m_noPcmConstraintFlag = bVal; }
+#endif
   bool          getNoRefWraparoundConstraintFlag() const { return m_noRefWraparoundConstraintFlag; }
   void          setNoRefWraparoundConstraintFlag(bool bVal) { m_noRefWraparoundConstraintFlag = bVal; }
   bool          getNoTemporalMvpConstraintFlag() const { return m_noTemporalMvpConstraintFlag; }
@@ -771,9 +777,11 @@ private:
   int               m_numReorderPics[MAX_TLAYER];
 
   // Tool list
+#if !JVET_O0525_REMOVE_PCM
   bool                  m_pcmEnabledFlag;
   uint32_t              m_pcmLog2MaxSize;
   uint32_t              m_uiPCMLog2MinSize;
+#endif
 
 #if JVET_O1136_TS_BDPCM_SIGNALLING
   bool              m_transformSkipEnabledFlag;
@@ -788,8 +796,10 @@ private:
 #if JVET_O0919_TS_MIN_QP
   int               m_minQpMinus4[MAX_NUM_CHANNEL_TYPE]; //  QP_internal - QP_input;
 #endif
+#if !JVET_O0525_REMOVE_PCM
   int               m_pcmBitDepths[MAX_NUM_CHANNEL_TYPE];
   bool              m_bPCMFilterDisableFlag;
+#endif
 
   bool              m_sbtmvpEnabledFlag;
   bool              m_bdofEnabledFlag;
@@ -948,12 +958,14 @@ public:
   uint32_t                    getMaxCUHeight() const                                                          { return  m_uiMaxCUHeight;                                             }
   void                    setMaxCodingDepth( uint32_t u )                                                     { m_uiMaxCodingDepth = u;                                              }
   uint32_t                    getMaxCodingDepth() const                                                       { return  m_uiMaxCodingDepth;                                          }
+#if !JVET_O0525_REMOVE_PCM
   void                    setPCMEnabledFlag( bool b )                                                         { m_pcmEnabledFlag = b;                                                }
   bool                    getPCMEnabledFlag() const                                                           { return m_pcmEnabledFlag;                                             }
   void                    setPCMLog2MaxSize( uint32_t u )                                                     { m_pcmLog2MaxSize = u;                                                }
   uint32_t                    getPCMLog2MaxSize() const                                                       { return  m_pcmLog2MaxSize;                                            }
   void                    setPCMLog2MinSize( uint32_t u )                                                     { m_uiPCMLog2MinSize = u;                                              }
   uint32_t                    getPCMLog2MinSize() const                                                       { return  m_uiPCMLog2MinSize;                                          }
+#endif
 #if JVET_O1136_TS_BDPCM_SIGNALLING
   bool                    getTransformSkipEnabledFlag() const                                                 { return m_transformSkipEnabledFlag;                                   }
   void                    setTransformSkipEnabledFlag( bool b )                                               { m_transformSkipEnabledFlag = b;                                      }
@@ -1030,10 +1042,12 @@ public:
 
   bool                    getTemporalIdNestingFlag() const                                                { return m_bTemporalIdNestingFlag;                                     }
   void                    setTemporalIdNestingFlag( bool bValue )                                         { m_bTemporalIdNestingFlag = bValue;                                   }
+#if !JVET_O0525_REMOVE_PCM
   uint32_t                    getPCMBitDepth(ChannelType type) const                                          { return m_pcmBitDepths[type];                                         }
   void                    setPCMBitDepth(ChannelType type, uint32_t u)                                        { m_pcmBitDepths[type] = u;                                            }
   void                    setPCMFilterDisableFlag( bool bValue )                                          { m_bPCMFilterDisableFlag = bValue;                                    }
   bool                    getPCMFilterDisableFlag() const                                                 { return m_bPCMFilterDisableFlag;                                      }
+#endif
 
   bool                    getScalingListFlag() const                                                      { return m_scalingListEnabledFlag;                                     }
   void                    setScalingListFlag( bool b )                                                    { m_scalingListEnabledFlag  = b;                                       }
diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h
index 2a72e25f20a0d0882b52a6eef0c67e163ed636d4..85db89b0860226823bdfa1be74862dc5d7d99b12 100644
--- a/source/Lib/CommonLib/TypeDef.h
+++ b/source/Lib/CommonLib/TypeDef.h
@@ -177,6 +177,8 @@
 
 #define JVET_O0545_MAX_TB_SIGNALLING                      1 // JVET-O0545: Configurable maximum transform size
 
+#define JVET_O0525_REMOVE_PCM                             1 // JVET-O0525: Removal of PCM mode
+
 #define JVET_O0541_IMPLICIT_MTS_CONDITION                 1 // JVET_O0541: Decouple the intra implicit transform selection from an inter MTS related SPS flag
 #define JVET_O0163_REMOVE_SWITCHING_TMV                   1 // JVET-O0163/JVET-O0588: Remove switching between L0 and L1 for temporal MV
 #define JVET_O0655_422_CHROMA_DM_MAPPING_FIX              1 // JVET-O0655: modify chroma DM derivation table for 4:2:2 chroma format
@@ -245,7 +247,9 @@
 #define JVET_M0497_MATRIX_MULT                            0 // 0: Fast method; 1: Matrix multiplication
 
 #define APPLY_SBT_SL_ON_MTS                               1 // apply save & load fast algorithm on inter MTS when SBT is on
+#if !JVET_O0525_REMOVE_PCM
 #define FIX_PCM                                           1 // Fix PCM bugs in VTM3
+#endif
 
 #if JVET_O0545_MAX_TB_SIGNALLING
 #define MAX_TB_SIZE_SIGNALLING                            1
diff --git a/source/Lib/CommonLib/Unit.cpp b/source/Lib/CommonLib/Unit.cpp
index 05d8548154096179a7dfd48c31b027130137ed90..b603e3fe0383b0fa0733cf6de8faed1a1293bdc7 100644
--- a/source/Lib/CommonLib/Unit.cpp
+++ b/source/Lib/CommonLib/Unit.cpp
@@ -268,7 +268,9 @@ CodingUnit& CodingUnit::operator=( const CodingUnit& other )
   triangle          = other.triangle;
   transQuantBypass  = other.transQuantBypass;
   bdpcmMode         = other.bdpcmMode;
+#if !JVET_O0525_REMOVE_PCM
   ipcm              = other.ipcm;
+#endif
   qp                = other.qp;
   chromaQpAdj       = other.chromaQpAdj;
   rootCbf           = other.rootCbf;
@@ -322,7 +324,9 @@ void CodingUnit::initData()
   triangle          = false;
   transQuantBypass  = false;
   bdpcmMode         = 0;
+#if !JVET_O0525_REMOVE_PCM
   ipcm              = false;
+#endif
   qp                = 0;
   chromaQpAdj       = 0;
   rootCbf           = true;
diff --git a/source/Lib/CommonLib/Unit.h b/source/Lib/CommonLib/Unit.h
index f5c92b9d8093171afc666674cd9c562654d66e13..d2cd41d67e7d3c6736fdd98f08e8234c59ed716f 100644
--- a/source/Lib/CommonLib/Unit.h
+++ b/source/Lib/CommonLib/Unit.h
@@ -315,7 +315,9 @@ struct CodingUnit : public UnitArea
   bool           triangle;
   bool           transQuantBypass;
   int            bdpcmMode;
+#if !JVET_O0525_REMOVE_PCM
   bool           ipcm;
+#endif
   uint8_t          imv;
   bool           rootCbf;
   uint8_t        sbtInfo;
diff --git a/source/Lib/CommonLib/dtrace_blockstatistics.cpp b/source/Lib/CommonLib/dtrace_blockstatistics.cpp
index 38f9221ce4b1a07943cb7e0bdf970386551bccd0..99042a6cfa4a8fcca39da5d3824f1d40448596eb 100644
--- a/source/Lib/CommonLib/dtrace_blockstatistics.cpp
+++ b/source/Lib/CommonLib/dtrace_blockstatistics.cpp
@@ -672,14 +672,18 @@ void writeAllData(const CodingStructure& cs, const UnitArea& ctuArea)
         {
           if(chType == CHANNEL_TYPE_LUMA)
           {
+#if !JVET_O0525_REMOVE_PCM
             DTRACE_BLOCK_SCALAR(g_trace_ctx, D_BLOCK_STATISTICS_ALL, cu, GetBlockStatisticName(BlockStatistic::IPCM), cu.ipcm);
+#endif
             DTRACE_BLOCK_SCALAR(g_trace_ctx, D_BLOCK_STATISTICS_ALL, cu, GetBlockStatisticName(BlockStatistic::MIPFlag), cu.mipFlag);
             DTRACE_BLOCK_SCALAR(g_trace_ctx, D_BLOCK_STATISTICS_ALL, cu, GetBlockStatisticName(BlockStatistic::ISPMode), cu.ispMode);
           }
+#if !JVET_O0525_REMOVE_PCM
           else if(chType == CHANNEL_TYPE_CHROMA)
           {
             DTRACE_BLOCK_SCALAR_CHROMA(g_trace_ctx, D_BLOCK_STATISTICS_ALL, cu, GetBlockStatisticName(BlockStatistic::IPCM_Chroma), cu.ipcm);
           }
+#endif
 
           const uint32_t numChType = ::getNumberValidChannels( cu.chromaFormat );
 
@@ -806,6 +810,7 @@ void writeAllCodedData(const CodingStructure & cs, const UnitArea & ctuArea)
         // prediction mode and partitioning data
         DTRACE_BLOCK_SCALAR(g_trace_ctx, D_BLOCK_STATISTICS_CODED, cu, GetBlockStatisticName(BlockStatistic::PredMode), cu.predMode);
 
+#if !JVET_O0525_REMOVE_PCM
         if (CU::isIntra(cu))
         {
           if (!(!sps.getPCMEnabledFlag() || cu.lumaSize().width > (1 << sps.getPCMLog2MaxSize()) || cu.lumaSize().width < (1 << sps.getPCMLog2MinSize())))
@@ -813,6 +818,7 @@ void writeAllCodedData(const CodingStructure & cs, const UnitArea & ctuArea)
             DTRACE_BLOCK_SCALAR(g_trace_ctx, D_BLOCK_STATISTICS_CODED, cu, GetBlockStatisticName(BlockStatistic::IPCM), cu.ipcm);
           }
         }
+#endif
       }
       else if (chType == CHANNEL_TYPE_CHROMA )
       {
@@ -829,6 +835,7 @@ void writeAllCodedData(const CodingStructure & cs, const UnitArea & ctuArea)
           DTRACE_BLOCK_SCALAR_CHROMA(g_trace_ctx, D_BLOCK_STATISTICS_CODED, cu, GetBlockStatisticName(BlockStatistic::TransQuantBypassFlag_Chroma), cu.transQuantBypass);
         }
 
+#if !JVET_O0525_REMOVE_PCM
         if (CU::isIntra(cu))
         {
           if (!(!sps.getPCMEnabledFlag() || cu.lumaSize().width > (1 << sps.getPCMLog2MaxSize()) || cu.lumaSize().width < (1 << sps.getPCMLog2MinSize())))
@@ -836,6 +843,7 @@ void writeAllCodedData(const CodingStructure & cs, const UnitArea & ctuArea)
             DTRACE_BLOCK_SCALAR_CHROMA(g_trace_ctx, D_BLOCK_STATISTICS_CODED, cu, GetBlockStatisticName(BlockStatistic::IPCM_Chroma), cu.ipcm);
           }
         }
+#endif
       }
 
       for (const PredictionUnit &pu : CU::traversePUs(cu))
diff --git a/source/Lib/CommonLib/dtrace_blockstatistics.h b/source/Lib/CommonLib/dtrace_blockstatistics.h
index 865b1753a574b89f104420f68b78046c42b81144..80995171d30783e2c6a2557a1cabe3ab4ca1cc45 100644
--- a/source/Lib/CommonLib/dtrace_blockstatistics.h
+++ b/source/Lib/CommonLib/dtrace_blockstatistics.h
@@ -76,7 +76,9 @@ enum class BlockStatistic {
   RDPCM_Cr,
 
   // intra
+#if !JVET_O0525_REMOVE_PCM
   IPCM,
+#endif
   Luma_IntraMode,
   Chroma_IntraMode,
   MultiRefIdx,
@@ -132,7 +134,9 @@ enum class BlockStatistic {
   TransQuantBypassFlag_Chroma,
 
   // intra
+#if !JVET_O0525_REMOVE_PCM
   IPCM_Chroma,
+#endif
 
   NumBlockStatistics,
 };
@@ -157,7 +161,9 @@ static const std::map<BlockStatistic, std::tuple<std::string, BlockStatisticType
   { BlockStatistic::RegularMergeFlag,       std::tuple<std::string, BlockStatisticType, std::string>{"RegularMergeFlag",            BlockStatisticType::Flag,                   ""}},
   { BlockStatistic::MVL0,                   std::tuple<std::string, BlockStatisticType, std::string>{"MVL0",                        BlockStatisticType::Vector,                 "Scale: 4"}},
   { BlockStatistic::MVL1,                   std::tuple<std::string, BlockStatisticType, std::string>{"MVL1",                        BlockStatisticType::Vector,                 "Scale: 4"}},
+#if !JVET_O0525_REMOVE_PCM
   { BlockStatistic::IPCM,                   std::tuple<std::string, BlockStatisticType, std::string>{"IPCM",                        BlockStatisticType::Flag,                   ""}},
+#endif
   { BlockStatistic::Luma_IntraMode,         std::tuple<std::string, BlockStatisticType, std::string>{"Luma_IntraMode",              BlockStatisticType::Integer,                "[0, " + std::to_string(NUM_INTRA_MODE) + "]"}},
   { BlockStatistic::Chroma_IntraMode,       std::tuple<std::string, BlockStatisticType, std::string>{"Chroma_IntraMode",            BlockStatisticType::Integer,                "[0, " + std::to_string(NUM_INTRA_MODE) + "]"}},
   { BlockStatistic::SkipFlag,               std::tuple<std::string, BlockStatisticType, std::string>{"SkipFlag",                    BlockStatisticType::Flag,                   ""}},
@@ -223,7 +229,9 @@ static const std::map<BlockStatistic, std::tuple<std::string, BlockStatisticType
   { BlockStatistic::QP_Chroma,                     std::tuple<std::string, BlockStatisticType, std::string>{"QP_Chroma",                          BlockStatisticType::Integer,                "[0, 51]"}},
   { BlockStatistic::SplitSeries_Chroma,            std::tuple<std::string, BlockStatisticType, std::string>{"SplitSeries_Chroma",                 BlockStatisticType::Integer,                "[0, " + std::to_string(std::numeric_limits<SplitSeries>::max()) + "]"}},
   { BlockStatistic::TransQuantBypassFlag_Chroma,   std::tuple<std::string, BlockStatisticType, std::string>{"TransQuantBypassFlag_Chroma",        BlockStatisticType::Flag,                   ""}},
+#if !JVET_O0525_REMOVE_PCM
   { BlockStatistic::IPCM_Chroma,                   std::tuple<std::string, BlockStatisticType, std::string>{"IPCM_Chroma",                        BlockStatisticType::Flag,                   ""}},
+#endif
 
 };
 
diff --git a/source/Lib/CommonLib/x86/AdaptiveLoopFilterX86.h b/source/Lib/CommonLib/x86/AdaptiveLoopFilterX86.h
index 35790793977058e8bc416ae818e1e6f293ccd07e..5bf5a76354b543b1dd1121fba1b3d7f916a479ee 100644
--- a/source/Lib/CommonLib/x86/AdaptiveLoopFilterX86.h
+++ b/source/Lib/CommonLib/x86/AdaptiveLoopFilterX86.h
@@ -280,10 +280,12 @@ static void simdFilter5x5Blk(AlfClassifier **classifier, const PelUnitBuf &recDs
   CHECK((vbCTUHeight & (vbCTUHeight - 1)) != 0, "vbCTUHeight must be a power of 2");
   CHECK(!isChroma(compId), "ALF 5x5 filter is for chroma only");
 
+#if !JVET_O0525_REMOVE_PCM
   const SPS*     sps = cs.slice->getSPS();
   bool isDualTree = CS::isDualITree(cs);
   bool isPCMFilterDisabled = sps->getPCMFilterDisableFlag();
   ChromaFormat nChromaFormat = sps->getChromaFormatIdc();
+#endif
 
   const CPelBuf srcBuffer = recSrc.get(compId);
   PelBuf        dstBuffer = recDst.get(compId);
@@ -308,8 +310,10 @@ static void simdFilter5x5Blk(AlfClassifier **classifier, const PelUnitBuf &recDs
   const Pel *src = srcBuffer.buf + blk.y * srcStride + blk.x;
   Pel *      dst = dstBuffer.buf + blkDst.y * dstStride + blkDst.x;
 
+#if !JVET_O0525_REMOVE_PCM
   bool pcmFlags2x2[8] = {0,0,0,0,0,0,0,0};
   Pel  pcmRec2x2[32];
+#endif
 
   const __m128i mmOffset = _mm_set1_epi32(ROUND);
   const __m128i mmMin = _mm_set1_epi16( clpRng.min );
@@ -329,6 +333,7 @@ static void simdFilter5x5Blk(AlfClassifier **classifier, const PelUnitBuf &recDs
   {
     for (size_t j = 0; j < width; j += STEP_X)
     {
+#if !JVET_O0525_REMOVE_PCM
       if (isPCMFilterDisabled)
       {
         size_t blkX, blkY;
@@ -370,6 +375,7 @@ static void simdFilter5x5Blk(AlfClassifier **classifier, const PelUnitBuf &recDs
           }
         }
       }
+#endif
 
       for (size_t ii = 0; ii < STEP_Y; ii++)
       {
@@ -456,6 +462,7 @@ static void simdFilter5x5Blk(AlfClassifier **classifier, const PelUnitBuf &recDs
           _mm_storel_epi64((__m128i *) (dst + ii * dstStride + j), accumA);
         }
       }
+#if !JVET_O0525_REMOVE_PCM
       // restore 2x2 PCM chroma blocks
       if (isPCMFilterDisabled)
       {
@@ -476,6 +483,7 @@ static void simdFilter5x5Blk(AlfClassifier **classifier, const PelUnitBuf &recDs
           }
         }
       }
+#endif
 
     }
 
@@ -517,9 +525,11 @@ static void simdFilter7x7Blk(AlfClassifier **classifier, const PelUnitBuf &recDs
   CHECK((vbCTUHeight & (vbCTUHeight - 1)) != 0, "vbCTUHeight must be a power of 2");
   CHECK(isChroma(compId), "7x7 ALF filter is meant for luma only");
 
+#if !JVET_O0525_REMOVE_PCM
   const SPS *sps = cs.slice->getSPS();
 
   bool isPCMFilterDisabled = sps->getPCMFilterDisableFlag();
+#endif
 
   const CPelBuf srcBuffer = recSrc.get(compId);
   PelBuf        dstBuffer = recDst.get(compId);
@@ -569,6 +579,7 @@ static void simdFilter7x7Blk(AlfClassifier **classifier, const PelUnitBuf &recDs
         __m128i rawCoeff0, rawCoeff1;
         __m128i rawClip0, rawClip1;
 
+#if !JVET_O0525_REMOVE_PCM
         if (isPCMFilterDisabled && classIdx == AdaptiveLoopFilter::m_ALF_UNUSED_CLASSIDX
             && transposeIdx == AdaptiveLoopFilter::m_ALF_UNUSED_TRANSPOSIDX)
         {
@@ -579,12 +590,15 @@ static void simdFilter7x7Blk(AlfClassifier **classifier, const PelUnitBuf &recDs
         }
         else
         {
+#endif
           rawCoeff0 = _mm_loadu_si128((const __m128i *) (filterSet + classIdx * MAX_NUM_ALF_LUMA_COEFF));
           rawCoeff1 = _mm_loadl_epi64((const __m128i *) (filterSet + classIdx * MAX_NUM_ALF_LUMA_COEFF + 8));
 
           rawClip0 = _mm_loadu_si128((const __m128i *) (fClipSet + classIdx * MAX_NUM_ALF_LUMA_COEFF));
           rawClip1 = _mm_loadl_epi64((const __m128i *) (fClipSet + classIdx * MAX_NUM_ALF_LUMA_COEFF + 8));
+#if !JVET_O0525_REMOVE_PCM
         }
+#endif
 
         const __m128i s0 = _mm_loadu_si128((const __m128i *) shuffleTab[transposeIdx][0]);
         const __m128i s1 = _mm_xor_si128(s0, _mm_set1_epi8((char) 0x80));
diff --git a/source/Lib/DecoderLib/BinDecoder.cpp b/source/Lib/DecoderLib/BinDecoder.cpp
index 49b3ea2f3a2d91734b2acdda7f3d881c1673c878..03f63b0e62219b4b9fb04781ba507191acc09584 100644
--- a/source/Lib/DecoderLib/BinDecoder.cpp
+++ b/source/Lib/DecoderLib/BinDecoder.cpp
@@ -257,6 +257,7 @@ unsigned BinDecoderBase::decodeBinTrm()
 }
 
 
+#if !JVET_O0525_REMOVE_PCM
 unsigned BinDecoderBase::decodeBinsPCM( unsigned numBins )
 {
   unsigned bins = 0;
@@ -266,6 +267,7 @@ unsigned BinDecoderBase::decodeBinsPCM( unsigned numBins )
 #endif
   return bins;
 }
+#endif
 
 
 void BinDecoderBase::align()
diff --git a/source/Lib/DecoderLib/BinDecoder.h b/source/Lib/DecoderLib/BinDecoder.h
index 2e45c0d250b3e27208ffdc275f40f2dd5ead1cd8..6a8ef0e0d394c14c50e013bdff3e6368ea291602 100644
--- a/source/Lib/DecoderLib/BinDecoder.h
+++ b/source/Lib/DecoderLib/BinDecoder.h
@@ -73,7 +73,9 @@ public:
   unsigned          decodeBinsEP        ( unsigned numBins  );
   unsigned          decodeRemAbsEP      ( unsigned goRicePar, bool useLimitedPrefixLength, int maxLog2TrDynamicRange );
   unsigned          decodeBinTrm        ();
+#if !JVET_O0525_REMOVE_PCM
   unsigned          decodeBinsPCM       ( unsigned numBins  );
+#endif
   void              align               ();
   unsigned          getNumBitsRead      () { return m_Bitstream->getNumBitsRead() + m_bitsNeeded; }
 private:
diff --git a/source/Lib/DecoderLib/CABACReader.cpp b/source/Lib/DecoderLib/CABACReader.cpp
index 259ff38e6d2511263bb29f0db45a8e82a750a753..1ed746ee0ea6a40efc81a96b03d0550b95ddfe5e 100644
--- a/source/Lib/DecoderLib/CABACReader.cpp
+++ b/source/Lib/DecoderLib/CABACReader.cpp
@@ -832,8 +832,10 @@ PartSplit CABACReader::split_cu_mode( CodingStructure& cs, Partitioner &partitio
 //    void  cu_skip_flag              ( cu )
 //    void  pred_mode                 ( cu )
 //    void  part_mode                 ( cu )
+#if !JVET_O0525_REMOVE_PCM
 //    void  pcm_flag                  ( cu )
 //    void  pcm_samples               ( tu )
+#endif
 //    void  cu_pred_data              ( pus )
 //    void  cu_lic_flag               ( cu )
 //    void  intra_luma_pred_modes     ( pus )
@@ -904,6 +906,7 @@ bool CABACReader::coding_unit( CodingUnit &cu, Partitioner &partitioner, CUCtx&
   bdpcm_mode( cu, ComponentID( partitioner.chType ) );
 
   // --> create PUs
+#if !JVET_O0525_REMOVE_PCM
   // pcm samples
   if( CU::isIntra(cu) )
   {
@@ -916,6 +919,7 @@ bool CABACReader::coding_unit( CodingUnit &cu, Partitioner &partitioner, CUCtx&
     }
   }
 
+#endif
 
   // prediction data ( intra prediction modes / reference indexes + motion vectors )
   cu_pred_data( cu );
@@ -1323,6 +1327,7 @@ void CABACReader::bdpcm_mode( CodingUnit& cu, const ComponentID compID )
 
   DTRACE( g_trace_ctx, D_SYNTAX, "bdpcm_mode() x=%d, y=%d, w=%d, h=%d, bdpcm=%d\n", cu.lumaPos().x, cu.lumaPos().y, cu.lwidth(), cu.lheight(), cu.bdpcmMode );
 }
+#if !JVET_O0525_REMOVE_PCM
 void CABACReader::pcm_flag( CodingUnit& cu, Partitioner &partitioner )
 {
   const SPS& sps = *cu.cs->sps;
@@ -1335,6 +1340,7 @@ void CABACReader::pcm_flag( CodingUnit& cu, Partitioner &partitioner )
   cu.ipcm = ( m_BinDecoder.decodeBinTrm() );
 }
 
+#endif
 
 void CABACReader::cu_pred_data( CodingUnit &cu )
 {
@@ -1449,7 +1455,11 @@ void CABACReader::extend_ref_line(CodingUnit& cu)
 #if !ENABLE_JVET_L0283_MRL
   return;
 #endif
+#if !JVET_O0525_REMOVE_PCM
   if ( !cu.Y().valid() || cu.predMode != MODE_INTRA || !isLuma(cu.chType) || cu.ipcm || cu.bdpcmMode )
+#else
+  if ( !cu.Y().valid() || cu.predMode != MODE_INTRA || !isLuma(cu.chType) || cu.bdpcmMode )
+#endif
   {
     cu.firstPU->multiRefIdx = 0;
     return;
@@ -2906,6 +2916,7 @@ void CABACReader::MHIntra_flag(PredictionUnit& pu)
 
 
 
+#if !JVET_O0525_REMOVE_PCM
 //================================================================================
 //  clause 7.3.8.7
 //--------------------------------------------------------------------------------
@@ -2944,6 +2955,7 @@ void CABACReader::pcm_samples( TransformUnit& tu )
   }
   m_BinDecoder.start();
 }
+#endif
 
 //================================================================================
 //  clause 7.3.8.8
@@ -3671,7 +3683,11 @@ void CABACReader::mts_coding( TransformUnit& tu, ComponentID compID )
 
 void CABACReader::isp_mode( CodingUnit& cu )
 {
+#if !JVET_O0525_REMOVE_PCM
   if( !CU::isIntra( cu ) || !isLuma( cu.chType ) || cu.firstPU->multiRefIdx || cu.ipcm || !cu.cs->sps->getUseISP() || cu.bdpcmMode || !CU::canUseISP( cu, getFirstComponentOfChannel( cu.chType ) ) )
+#else
+  if( !CU::isIntra( cu ) || !isLuma( cu.chType ) || cu.firstPU->multiRefIdx || !cu.cs->sps->getUseISP() || cu.bdpcmMode || !CU::canUseISP( cu, getFirstComponentOfChannel( cu.chType ) ) )
+#endif
   {
     cu.ispMode = NOT_INTRA_SUBPARTITIONS;
     return;
diff --git a/source/Lib/DecoderLib/CABACReader.h b/source/Lib/DecoderLib/CABACReader.h
index ee35c9d7b837b204fac9b0bc4fd55d7a8e564fb9..a5f288714cd1fa1c2d9d23b211d8de48d501788b 100644
--- a/source/Lib/DecoderLib/CABACReader.h
+++ b/source/Lib/DecoderLib/CABACReader.h
@@ -83,7 +83,9 @@ public:
   void        cu_skip_flag              ( CodingUnit&                   cu );
   void        pred_mode                 ( CodingUnit&                   cu );
   void        bdpcm_mode                ( CodingUnit&                   cu,     const ComponentID compID );
+#if !JVET_O0525_REMOVE_PCM
   void        pcm_flag                  ( CodingUnit&                   cu,     Partitioner&    pm );
+#endif
   void        cu_pred_data              ( CodingUnit&                   cu );
   void        cu_gbi_flag               ( CodingUnit&                   cu );
   void        extend_ref_line           (CodingUnit&                     cu);
@@ -119,8 +121,10 @@ public:
   void        MHIntra_luma_pred_modes   ( CodingUnit&                   cu );
   void        smvd_mode              ( PredictionUnit&               pu );
 
+#if !JVET_O0525_REMOVE_PCM
   // pcm samples (clause 7.3.8.7)
   void        pcm_samples               ( TransformUnit&                tu );
+#endif
 
   // transform tree (clause 7.3.8.8)
 #if JVET_O0596_CBF_SIG_ALIGN_TO_SPEC
diff --git a/source/Lib/DecoderLib/DecCu.cpp b/source/Lib/DecoderLib/DecCu.cpp
index 0f012c2fd3a5bdcddb9dba52b01144ad2d8042d5..9f9831006192874acd95a180cdad6bec83f93e0c 100644
--- a/source/Lib/DecoderLib/DecCu.cpp
+++ b/source/Lib/DecoderLib/DecCu.cpp
@@ -175,7 +175,11 @@ void DecCu::decompressCtu( CodingStructure& cs, const UnitArea& ctuArea )
         break;
       }
 
+#if !JVET_O0525_REMOVE_PCM
       if( CU::isLosslessCoded( currCU ) && !currCU.ipcm )
+#else
+      if( CU::isLosslessCoded( currCU ) )
+#endif
       {
         xFillPCMBuffer( currCU );
       }
@@ -416,11 +420,13 @@ void DecCu::xIntraRecBlk( TransformUnit& tu, const ComponentID compID )
 
 void DecCu::xReconIntraQT( CodingUnit &cu )
 {
+#if !JVET_O0525_REMOVE_PCM
   if( cu.ipcm )
   {
     xReconPCM( *cu.firstTU );
     return;
   }
+#endif
 
 #if JVET_O0119_BASE_PALETTE_444
   if (CU::isPLT(cu))
@@ -540,6 +546,7 @@ void DecCu::xReconPLT(CodingUnit &cu, ComponentID compBegin, uint32_t numComp)
   }
 }
 #endif
+#if !JVET_O0525_REMOVE_PCM
 /** Function for deriving reconstructed luma/chroma samples of a PCM mode CU.
 * \param pcCU pointer to current CU
 * \param uiPartIdx part index
@@ -596,6 +603,7 @@ void DecCu::xReconPCM(TransformUnit &tu)
     xDecodePCMTexture(tu, compID);
   }
 }
+#endif
 
 /** Function for deriving reconstructed PU/CU chroma samples with QTree structure
 * \param pcRecoYuv pointer to reconstructed sample arrays
diff --git a/source/Lib/DecoderLib/DecCu.h b/source/Lib/DecoderLib/DecCu.h
index 2e6956d1b60685ef3957e6db4e78311562ba7bbb..21564ba03398bedd78775ed886ef88b32ae7c089 100644
--- a/source/Lib/DecoderLib/DecCu.h
+++ b/source/Lib/DecoderLib/DecCu.h
@@ -87,8 +87,10 @@ protected:
   void xFillPCMBuffer     ( CodingUnit&      cu );
 
   void xIntraRecBlk       ( TransformUnit&   tu, const ComponentID compID );
+#if !JVET_O0525_REMOVE_PCM
   void xReconPCM          ( TransformUnit&   tu);
   void xDecodePCMTexture  ( TransformUnit&   tu, const ComponentID compID );
+#endif
   void xDecodeInterTU     ( TransformUnit&   tu, const ComponentID compID );
 
   void xDeriveCUMV        ( CodingUnit&      cu );
diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp
index 43ec52ffbf19a27a395b469152dbac374e1c5a00..1e30714bd03e876704885214ff36fb8b14abf8f4 100644
--- a/source/Lib/DecoderLib/VLCReader.cpp
+++ b/source/Lib/DecoderLib/VLCReader.cpp
@@ -1289,6 +1289,7 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS)
   READ_FLAG( uiCode, "sps_sao_enabled_flag" );                      pcSPS->setSAOEnabledFlag ( uiCode ? true : false );
   READ_FLAG( uiCode, "sps_alf_enabled_flag" );                      pcSPS->setALFEnabledFlag ( uiCode ? true : false );
 
+#if !JVET_O0525_REMOVE_PCM
   READ_FLAG( uiCode, "sps_pcm_enabled_flag" );                          pcSPS->setPCMEnabledFlag( uiCode ? true : false );
   if( pcSPS->getPCMEnabledFlag() )
   {
@@ -1298,6 +1299,7 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS)
     READ_UVLC( uiCode, "log2_diff_max_min_pcm_luma_coding_block_size" ); pcSPS->setPCMLog2MaxSize ( uiCode+pcSPS->getPCMLog2MinSize() );
     READ_FLAG( uiCode, "pcm_loop_filter_disable_flag" );                 pcSPS->setPCMFilterDisableFlag ( uiCode ? true : false );
   }
+#endif
 
 #if JVET_O1136_TS_BDPCM_SIGNALLING
   READ_FLAG(uiCode, "sps_transform_skip_enabled_flag"); pcSPS->setTransformSkipEnabledFlag(uiCode ? true : false);
@@ -2460,7 +2462,9 @@ void HLSyntaxReader::parseConstraintInfo(ConstraintInfo *cinfo)
   READ_FLAG(symbol,  "no_joint_cbcr_constraint_flag");             cinfo->setNoJointCbCrConstraintFlag(symbol > 0 ? true : false);
 #endif
 
+#if !JVET_O0525_REMOVE_PCM
   READ_FLAG(symbol,  "no_pcm_constraint_flag");                    cinfo->setNoPcmConstraintFlag(symbol > 0 ? true : false);
+#endif
   READ_FLAG(symbol,  "no_ref_wraparound_constraint_flag");         cinfo->setNoRefWraparoundConstraintFlag(symbol > 0 ? true : false);
   READ_FLAG(symbol,  "no_temporal_mvp_constraint_flag");           cinfo->setNoTemporalMvpConstraintFlag(symbol > 0 ? true : false);
   READ_FLAG(symbol,  "no_sbtmvp_constraint_flag");                 cinfo->setNoSbtmvpConstraintFlag(symbol > 0 ? true : false);
diff --git a/source/Lib/EncoderLib/BinEncoder.cpp b/source/Lib/EncoderLib/BinEncoder.cpp
index ebad19d3e1a517e3a4cb087e59b9f29abc117329..3fd167fcd42da2059078375f1fbfa24cb26ad8e1 100644
--- a/source/Lib/EncoderLib/BinEncoder.cpp
+++ b/source/Lib/EncoderLib/BinEncoder.cpp
@@ -285,22 +285,26 @@ void BinEncoderBase::encodeBinTrm( unsigned bin )
   }
 }
 
+#if !JVET_O0525_REMOVE_PCM
 void BinEncoderBase::encodeBinsPCM( unsigned bins, unsigned numBins )
 {
   m_Bitstream->write( bins, numBins );
 }
+#endif
 
 void BinEncoderBase::align()
 {
   m_Range = 256;
 }
 
+#if !JVET_O0525_REMOVE_PCM
 void BinEncoderBase::pcmAlignBits()
 {
   finish();
   m_Bitstream->write( 1, 1 );
   m_Bitstream->writeAlignZero(); // pcm align zero
 }
+#endif
 
 void BinEncoderBase::encodeAlignedBinsEP( unsigned bins, unsigned numBins )
 {
@@ -488,6 +492,7 @@ void BitEstimatorBase::align()
   m_EstFracBits &= mask;
 }
 
+#if !JVET_O0525_REMOVE_PCM
 void BitEstimatorBase::pcmAlignBits()
 {
   uint64_t  numCurrBits = ( m_EstFracBits >> SCALE_BITS );
@@ -495,6 +500,7 @@ void BitEstimatorBase::pcmAlignBits()
   unsigned  bitsToAdd   = unsigned( ( filledBytes << 3 ) - numCurrBits );
   m_EstFracBits        += BinProbModelBase::estFracBitsEP( bitsToAdd );
 }
+#endif
 
 
 
diff --git a/source/Lib/EncoderLib/BinEncoder.h b/source/Lib/EncoderLib/BinEncoder.h
index 83c108c05e9a2ee58e1bf47ddd7181a573fe9ade..d829a04eee769ea38201205894734bed40e88ba1 100644
--- a/source/Lib/EncoderLib/BinEncoder.h
+++ b/source/Lib/EncoderLib/BinEncoder.h
@@ -121,9 +121,13 @@ public:
                                         bool     useLimitedPrefixLength,
                                         int      maxLog2TrDynamicRange    ) = 0;
   virtual void      encodeBinTrm      ( unsigned bin                      ) = 0;
+#if !JVET_O0525_REMOVE_PCM
   virtual void      encodeBinsPCM     ( unsigned bins,  unsigned numBins  ) = 0;
+#endif
   virtual void      align             ()                                    = 0;
+#if !JVET_O0525_REMOVE_PCM
   virtual void      pcmAlignBits      ()                                    = 0;
+#endif
 public:
   virtual uint32_t  getNumBins        ()                                    = 0;
   virtual bool      isEncoding        ()                                    = 0;
@@ -186,9 +190,13 @@ public:
                                   bool     useLimitedPrefixLength,
                                   int      maxLog2TrDynamicRange    );
   void      encodeBinTrm        ( unsigned bin                      );
+#if !JVET_O0525_REMOVE_PCM
   void      encodeBinsPCM       ( unsigned bins,  unsigned numBins  );
+#endif
   void      align               ();
+#if !JVET_O0525_REMOVE_PCM
   void      pcmAlignBits        ();
+#endif
   unsigned  getNumWrittenBits   () { return ( m_Bitstream->getNumberOfWrittenBits() + 8 * m_numBufferedBytes + 23 - m_bitsLeft ); }
 public:
   uint32_t  getNumBins          ()                          { return BinCounter::getAll(); }
@@ -253,9 +261,13 @@ public:
                                   unsigned goRicePar,
                                   bool     useLimitedPrefixLength,
                                   int      maxLog2TrDynamicRange    );
+#if !JVET_O0525_REMOVE_PCM
   void      encodeBinsPCM       ( unsigned bins,  unsigned numBins  ) { m_EstFracBits += BinProbModelBase::estFracBitsEP ( numBins ); }
+#endif
   void      align               ();
+#if !JVET_O0525_REMOVE_PCM
   void      pcmAlignBits        ();
+#endif
 public:
   uint32_t  getNumBins          ()                                      { THROW("Not supported"); return 0; }
   bool      isEncoding          ()                                      { return false; }
diff --git a/source/Lib/EncoderLib/CABACWriter.cpp b/source/Lib/EncoderLib/CABACWriter.cpp
index 15493bae3802a5ab1512d58fd473e34d7bf91742..286afa10b40d81e366e1b447f5e73ffe61f3b81e 100644
--- a/source/Lib/EncoderLib/CABACWriter.cpp
+++ b/source/Lib/EncoderLib/CABACWriter.cpp
@@ -634,8 +634,10 @@ void CABACWriter::split_cu_mode( const PartSplit split, const CodingStructure& c
 //    void  cu_skip_flag              ( cu )
 //    void  pred_mode                 ( cu )
 //    void  part_mode                 ( cu )
+#if !JVET_O0525_REMOVE_PCM
 //    void  pcm_flag                  ( cu )
 //    void  pcm_samples               ( tu )
+#endif
 //    void  cu_pred_data              ( pus )
 //    void  cu_lic_flag               ( cu )
 //    void  intra_luma_pred_modes     ( pus )
@@ -674,6 +676,7 @@ void CABACWriter::coding_unit( const CodingUnit& cu, Partitioner& partitioner, C
     return;
   }
 
+#if !JVET_O0525_REMOVE_PCM
 #if !FIX_PCM
   // pcm samples
   if( CU::isIntra(cu) )
@@ -685,6 +688,7 @@ void CABACWriter::coding_unit( const CodingUnit& cu, Partitioner& partitioner, C
       return;
     }
   }
+#endif
 #endif
 
   // prediction mode and partitioning data
@@ -717,6 +721,7 @@ void CABACWriter::coding_unit( const CodingUnit& cu, Partitioner& partitioner, C
 #endif
   bdpcm_mode( cu, ComponentID( partitioner.chType ) );
 
+#if !JVET_O0525_REMOVE_PCM
 #if FIX_PCM
   // pcm samples
   if( CU::isIntra(cu) )
@@ -728,6 +733,7 @@ void CABACWriter::coding_unit( const CodingUnit& cu, Partitioner& partitioner, C
       return;
     }
   }
+#endif
 #endif
 
   // prediction data ( intra prediction modes / reference indexes + motion vectors )
@@ -981,6 +987,7 @@ void CABACWriter::bdpcm_mode( const CodingUnit& cu, const ComponentID compID )
   }
   DTRACE( g_trace_ctx, D_SYNTAX, "bdpcm_mode() x=%d, y=%d, w=%d, h=%d, bdpcm=%d\n", cu.lumaPos().x, cu.lumaPos().y, cu.lwidth(), cu.lheight(), cu.bdpcmMode );
 }
+#if !JVET_O0525_REMOVE_PCM
 void CABACWriter::pcm_data( const CodingUnit& cu, Partitioner& partitioner  )
 {
   pcm_flag( cu, partitioner );
@@ -1001,6 +1008,7 @@ void CABACWriter::pcm_flag( const CodingUnit& cu, Partitioner& partitioner )
   }
   m_BinEncoder.encodeBinTrm( cu.ipcm );
 }
+#endif
 
 
 void CABACWriter::cu_pred_data( const CodingUnit& cu )
@@ -1146,7 +1154,11 @@ void CABACWriter::extend_ref_line(const CodingUnit& cu)
   return;
 #endif
 
+#if !JVET_O0525_REMOVE_PCM
   if ( !cu.Y().valid() || cu.predMode != MODE_INTRA || !isLuma(cu.chType) || cu.ipcm || cu.bdpcmMode )
+#else
+  if ( !cu.Y().valid() || cu.predMode != MODE_INTRA || !isLuma(cu.chType) || cu.bdpcmMode )
+#endif
   {
     return;
   }
@@ -2713,6 +2725,7 @@ void CABACWriter::MHIntra_flag(const PredictionUnit& pu)
 
 
 
+#if !JVET_O0525_REMOVE_PCM
 //================================================================================
 //  clause 7.3.8.7
 //--------------------------------------------------------------------------------
@@ -2751,6 +2764,7 @@ void CABACWriter::pcm_samples( const TransformUnit& tu )
   m_BinEncoder.restart();
 }
 
+#endif
 
 
 //================================================================================
@@ -3487,7 +3501,11 @@ void CABACWriter::mts_coding( const TransformUnit& tu, ComponentID compID )
 
 void CABACWriter::isp_mode( const CodingUnit& cu )
 {
+#if !JVET_O0525_REMOVE_PCM
   if( !CU::isIntra( cu ) || !isLuma( cu.chType ) || cu.firstPU->multiRefIdx || cu.ipcm || !cu.cs->sps->getUseISP() || cu.bdpcmMode || !CU::canUseISP( cu, getFirstComponentOfChannel( cu.chType ) ) )
+#else
+  if( !CU::isIntra( cu ) || !isLuma( cu.chType ) || cu.firstPU->multiRefIdx || !cu.cs->sps->getUseISP() || cu.bdpcmMode || !CU::canUseISP( cu, getFirstComponentOfChannel( cu.chType ) ) )
+#endif
   {
     CHECK( cu.ispMode != NOT_INTRA_SUBPARTITIONS, "cu.ispMode != 0" );
     return;
diff --git a/source/Lib/EncoderLib/CABACWriter.h b/source/Lib/EncoderLib/CABACWriter.h
index 4da4200c30bb9dfeb91b3def3aa62feb9074a316..4285192d67ef4b4b4fab57a75a979944cc657984 100644
--- a/source/Lib/EncoderLib/CABACWriter.h
+++ b/source/Lib/EncoderLib/CABACWriter.h
@@ -94,8 +94,10 @@ public:
   void        pred_mode                 ( const CodingUnit&             cu );
   void        bdpcm_mode                ( const CodingUnit&             cu,       const ComponentID compID );
 
+#if !JVET_O0525_REMOVE_PCM
   void        pcm_data                  ( const CodingUnit&             cu,       Partitioner&      pm );
   void        pcm_flag                  ( const CodingUnit&             cu,       Partitioner&      pm );
+#endif
   void        cu_pred_data              ( const CodingUnit&             cu );
   void        cu_gbi_flag               ( const CodingUnit&             cu );
   void        extend_ref_line           (const PredictionUnit&          pu );
@@ -138,8 +140,10 @@ public:
   void        MHIntra_luma_pred_modes   ( const CodingUnit&             cu );
   void        smvd_mode              ( const PredictionUnit&         pu );
 
+#if !JVET_O0525_REMOVE_PCM
   // pcm samples (clause 7.3.8.7)
   void        pcm_samples               ( const TransformUnit&          tu );
+#endif
 
   // transform tree (clause 7.3.8.8)
 #if JVET_O0596_CBF_SIG_ALIGN_TO_SPEC
diff --git a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp
index 2f6037cbb70d69c2fb554f4d672df85668fad650..7c6634315dedc127a687299b77f97fe273dcad8f 100644
--- a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp
+++ b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp
@@ -755,8 +755,10 @@ void EncAdaptiveLoopFilter::ALFProcess(CodingStructure& cs, const double *lambda
             const Area blkSrc( 0, 0, w, h );
             const Area blkDst( xStart, yStart, w, h );
             deriveClassification( m_classifier, buf.get(COMPONENT_Y), blkDst, blkSrc );
+#if !JVET_O0525_REMOVE_PCM
             Area blkPCM( xStart, yStart, w, h );
             resetPCMBlkClassInfo( cs, m_classifier, buf.get(COMPONENT_Y), blkPCM );
+#endif
 
             xStart = xEnd;
           }
@@ -768,8 +770,10 @@ void EncAdaptiveLoopFilter::ALFProcess(CodingStructure& cs, const double *lambda
       {
         Area blk( xPos, yPos, width, height );
         deriveClassification( m_classifier, recLuma, blk, blk );
+#if !JVET_O0525_REMOVE_PCM
         Area blkPCM( xPos, yPos, width, height );
         resetPCMBlkClassInfo( cs, m_classifier, recLuma, blkPCM );
+#endif
       }
     }
   }
diff --git a/source/Lib/EncoderLib/EncCfg.h b/source/Lib/EncoderLib/EncCfg.h
index b2e2501e94913cb7072942fc0f93c7b26651cb8e..7644bbd86dc1f5ab432f778a3e68d48a625b59b8 100644
--- a/source/Lib/EncoderLib/EncCfg.h
+++ b/source/Lib/EncoderLib/EncCfg.h
@@ -188,7 +188,9 @@ protected:
   bool      m_noPartitionConstraintsOverrideConstraintFlag;
   bool      m_bNoSaoConstraintFlag;
   bool      m_bNoAlfConstraintFlag;
+#if !JVET_O0525_REMOVE_PCM
   bool      m_bNoPcmConstraintFlag;
+#endif
   bool      m_bNoRefWraparoundConstraintFlag;
   bool      m_bNoTemporalMvpConstraintFlag;
   bool      m_bNoSbtmvpConstraintFlag;
@@ -463,10 +465,12 @@ protected:
   bool      m_bFastUDIUseMPMEnabled;
   bool      m_bFastMEForGenBLowDelayEnabled;
   bool      m_bUseBLambdaForNonKeyLowDelayPictures;
+#if !JVET_O0525_REMOVE_PCM
   bool      m_usePCM;
   int       m_PCMBitDepth[MAX_NUM_CHANNEL_TYPE];
   uint32_t      m_pcmLog2MaxSize;
   uint32_t      m_uiPCMLog2MinSize;
+#endif
   //====== Slice ========
   SliceConstraint m_sliceMode;
   int       m_sliceArgument;
@@ -475,8 +479,10 @@ protected:
   int       m_sliceSegmentArgument;
   bool      m_bLFCrossSliceBoundaryFlag;
 
+#if !JVET_O0525_REMOVE_PCM
   bool      m_bPCMInputBitDepthFlag;
   bool      m_bPCMFilterDisableFlag;
+#endif
   bool      m_intraSmoothingDisabledFlag;
   bool      m_loopFilterAcrossBricksEnabledFlag;
   bool      m_tileUniformSpacingFlag;
@@ -678,8 +684,10 @@ public:
   : m_tileColumnWidth()
   , m_tileRowHeight()
   {
+#if !JVET_O0525_REMOVE_PCM
     m_PCMBitDepth[CHANNEL_TYPE_LUMA]=8;
     m_PCMBitDepth[CHANNEL_TYPE_CHROMA]=8;
+#endif
   }
 
   virtual ~EncCfg()
@@ -705,8 +713,10 @@ public:
   void      setNoSaoConstraintFlag(bool bVal) { m_bNoSaoConstraintFlag = bVal; }
   bool      getNoAlfConstraintFlag() const { return m_bNoAlfConstraintFlag; }
   void      setNoAlfConstraintFlag(bool bVal) { m_bNoAlfConstraintFlag = bVal; }
+#if !JVET_O0525_REMOVE_PCM
   bool      getNoPcmConstraintFlag() const { return m_bNoPcmConstraintFlag; }
   void      setNoPcmConstraintFlag(bool bVal) { m_bNoPcmConstraintFlag = bVal; }
+#endif
   bool      getNoRefWraparoundConstraintFlag() const { return m_bNoRefWraparoundConstraintFlag; }
   void      setNoRefWraparoundConstraintFlag(bool bVal) { m_bNoRefWraparoundConstraintFlag = bVal; }
   bool      getNoTemporalMvpConstraintFlag() const { return m_bNoTemporalMvpConstraintFlag; }
@@ -1176,12 +1186,14 @@ public:
   void      setFastMEForGenBLowDelayEnabled ( bool  b )     { m_bFastMEForGenBLowDelayEnabled = b; }
   void      setUseBLambdaForNonKeyLowDelayPictures ( bool b ) { m_bUseBLambdaForNonKeyLowDelayPictures = b; }
 
+#if !JVET_O0525_REMOVE_PCM
   void      setPCMInputBitDepthFlag         ( bool  b )     { m_bPCMInputBitDepthFlag = b; }
   void      setPCMFilterDisableFlag         ( bool  b )     {  m_bPCMFilterDisableFlag = b; }
   void      setUsePCM                       ( bool  b )     {  m_usePCM = b;               }
   void      setPCMBitDepth( const ChannelType chType, int pcmBitDepthForChannel ) { m_PCMBitDepth[chType] = pcmBitDepthForChannel; }
   void      setPCMLog2MaxSize               ( uint32_t u )      { m_pcmLog2MaxSize = u;      }
   void      setPCMLog2MinSize               ( uint32_t u )     { m_uiPCMLog2MinSize = u;      }
+#endif
   void      setdQPs                         ( int*  p )     { m_aidQP       = p; }
   void      setDeltaQpRD                    ( uint32_t  u )     {m_uiDeltaQpRD  = u; }
   void      setFastDeltaQp                  ( bool  b )     {m_bFastDeltaQP = b; }
@@ -1203,11 +1215,13 @@ public:
   bool      getFastUDIUseMPMEnabled         ()      { return m_bFastUDIUseMPMEnabled; }
   bool      getFastMEForGenBLowDelayEnabled ()      { return m_bFastMEForGenBLowDelayEnabled; }
   bool      getUseBLambdaForNonKeyLowDelayPictures () { return m_bUseBLambdaForNonKeyLowDelayPictures; }
+#if !JVET_O0525_REMOVE_PCM
   bool      getPCMInputBitDepthFlag         ()      { return m_bPCMInputBitDepthFlag;   }
   bool      getPCMFilterDisableFlag         ()      { return m_bPCMFilterDisableFlag;   }
   bool      getUsePCM                       ()      { return m_usePCM;                 }
   uint32_t      getPCMLog2MaxSize               ()      { return m_pcmLog2MaxSize;  }
   uint32_t      getPCMLog2MinSize               ()      { return  m_uiPCMLog2MinSize;  }
+#endif
 
   bool      getCrossComponentPredictionEnabledFlag     ()                const { return m_crossComponentPredictionEnabledFlag;   }
   void      setCrossComponentPredictionEnabledFlag     (const bool value)      { m_crossComponentPredictionEnabledFlag = value;  }
diff --git a/source/Lib/EncoderLib/EncCu.cpp b/source/Lib/EncoderLib/EncCu.cpp
index da4f21f5113314c6c9a0811e6ae5f36b9354d737..41d4a4601414c6831836904522a9a60f21cacde7 100644
--- a/source/Lib/EncoderLib/EncCu.cpp
+++ b/source/Lib/EncoderLib/EncCu.cpp
@@ -594,7 +594,11 @@ bool EncCu::xCheckBestMode( CodingStructure *&tempCS, CodingStructure *&bestCS,
         // if tempCS is not a split-mode
         CodingUnit &cu = *tempCS->cus.front();
 
+#if !JVET_O0525_REMOVE_PCM
         if( CU::isLosslessCoded( cu ) && !cu.ipcm )
+#else
+        if( CU::isLosslessCoded( cu ) )
+#endif
         {
           xFillPCMBuffer( cu );
         }
@@ -866,10 +870,12 @@ void EncCu::xCompressCU( CodingStructure *&tempCS, CodingStructure *&bestCS, Par
     {
       xCheckRDCostIntra( tempCS, bestCS, partitioner, currTestMode );
     }
+#if !JVET_O0525_REMOVE_PCM
     else if( currTestMode.type == ETM_IPCM )
     {
       xCheckIntraPCM( tempCS, bestCS, partitioner, currTestMode );
     }
+#endif
 #if JVET_O0119_BASE_PALETTE_444
     else if (currTestMode.type == ETM_PALETTE)
     {
@@ -1943,7 +1949,9 @@ void EncCu::xCheckRDCostIntra( CodingStructure *&tempCS, CodingStructure *&bestC
           cu.transQuantBypass = encTestMode.lossless;
           cu.chromaQpAdj      = cu.transQuantBypass ? 0 : m_cuChromaQpOffsetIdxPlus1;
           cu.qp               = encTestMode.qp;
+#if !JVET_O0525_REMOVE_PCM
           //cu.ipcm             = false;
+#endif
           cu.lfnstIdx         = lfnstIdx;
           cu.mtsFlag          = mtsFlag;
           cu.ispMode          = NOT_INTRA_SUBPARTITIONS;
@@ -2059,7 +2067,9 @@ void EncCu::xCheckRDCostIntra( CodingStructure *&tempCS, CodingStructure *&bestC
             m_CABACEstimator->cu_skip_flag ( cu );
           }
           m_CABACEstimator->pred_mode      ( cu );
+#if !JVET_O0525_REMOVE_PCM
           m_CABACEstimator->pcm_data       ( cu, partitioner );
+#endif
           m_CABACEstimator->cu_pred_data   ( cu );
           m_CABACEstimator->bdpcm_mode     ( cu, ComponentID(partitioner.chType) );
 
@@ -2229,6 +2239,7 @@ void EncCu::xCheckRDCostIntra( CodingStructure *&tempCS, CodingStructure *&bestC
   } //trGrpIdx
 }
 
+#if !JVET_O0525_REMOVE_PCM
 void EncCu::xCheckIntraPCM(CodingStructure *&tempCS, CodingStructure *&bestCS, Partitioner &partitioner, const EncTestMode& encTestMode )
 {
   tempCS->initStructData( encTestMode.qp, encTestMode.lossless );
@@ -2289,6 +2300,7 @@ void EncCu::xCheckIntraPCM(CodingStructure *&tempCS, CodingStructure *&bestCS, P
 #endif
   xCheckBestMode( tempCS, bestCS, partitioner, encTestMode );
 }
+#endif
 
 #if JVET_O0119_BASE_PALETTE_444
 void EncCu::xCheckPLT(CodingStructure *&tempCS, CodingStructure *&bestCS, Partitioner &partitioner, const EncTestMode& encTestMode)
@@ -2305,7 +2317,9 @@ void EncCu::xCheckPLT(CodingStructure *&tempCS, CodingStructure *&bestCS, Partit
   cu.transQuantBypass = encTestMode.lossless;
   cu.chromaQpAdj = cu.transQuantBypass ? 0 : m_cuChromaQpOffsetIdxPlus1;
   cu.qp = encTestMode.qp;
+#if !JVET_O0525_REMOVE_PCM
   cu.ipcm = false;
+#endif
   cu.bdpcmMode = 0;
 
   tempCS->addPU(CS::getArea(*tempCS, tempCS->area, partitioner.chType), partitioner.chType);
diff --git a/source/Lib/EncoderLib/EncCu.h b/source/Lib/EncoderLib/EncCu.h
index 5a50a1c513beecc4a8c6fe16721721ab4c67dea6..274d98c152117b944f2638ee88598808e55e7f62 100644
--- a/source/Lib/EncoderLib/EncCu.h
+++ b/source/Lib/EncoderLib/EncCu.h
@@ -203,7 +203,9 @@ protected:
 #endif
 
   void xCheckRDCostIntra      ( CodingStructure *&tempCS, CodingStructure *&bestCS, Partitioner &pm, const EncTestMode& encTestMode );
+#if !JVET_O0525_REMOVE_PCM
   void xCheckIntraPCM         ( CodingStructure *&tempCS, CodingStructure *&bestCS, Partitioner &pm, const EncTestMode& encTestMode );
+#endif
 
   void xCheckDQP              ( CodingStructure& cs, Partitioner& partitioner, bool bKeepCtx = false);
   void xFillPCMBuffer         ( CodingUnit &cu);
diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp
index 61c625e9c55d4a4d1f8c4c9c43d5e1e823d37a2e..ed645b167162fd43dd1132daac4145dbe070e0b0 100644
--- a/source/Lib/EncoderLib/EncLib.cpp
+++ b/source/Lib/EncoderLib/EncLib.cpp
@@ -862,7 +862,9 @@ void EncLib::xInitSPS(SPS &sps)
   cinfo->setNoPartitionConstraintsOverrideConstraintFlag(m_noPartitionConstraintsOverrideConstraintFlag);
   cinfo->setNoSaoConstraintFlag(m_bNoSaoConstraintFlag);
   cinfo->setNoAlfConstraintFlag(m_bNoAlfConstraintFlag);
+#if !JVET_O0525_REMOVE_PCM
   cinfo->setNoPcmConstraintFlag(m_bNoPcmConstraintFlag);
+#endif
   cinfo->setNoRefWraparoundConstraintFlag(m_bNoRefWraparoundConstraintFlag);
   cinfo->setNoTemporalMvpConstraintFlag(m_bNoTemporalMvpConstraintFlag);
   cinfo->setNoSbtmvpConstraintFlag(m_bNoSbtmvpConstraintFlag);
@@ -1002,9 +1004,11 @@ void EncLib::xInitSPS(SPS &sps)
 
   sps.setLog2MinCodingBlockSize(log2MinCUSize);
 
+#if !JVET_O0525_REMOVE_PCM
   sps.setPCMLog2MinSize (m_uiPCMLog2MinSize);
   sps.setPCMEnabledFlag        ( m_usePCM           );
   sps.setPCMLog2MaxSize( m_pcmLog2MaxSize  );
+#endif
 
 #if JVET_O1136_TS_BDPCM_SIGNALLING
   sps.setTransformSkipEnabledFlag(m_useTransformSkip);
@@ -1024,7 +1028,9 @@ void EncLib::xInitSPS(SPS &sps)
 #if JVET_O0919_TS_MIN_QP
     sps.setMinQpPrimeTsMinus4(ChannelType(channelType), (6 * (m_bitDepth[channelType] - m_inputBitDepth[channelType])));
 #endif
+#if !JVET_O0525_REMOVE_PCM
     sps.setPCMBitDepth (ChannelType(channelType), m_PCMBitDepth[channelType]         );
+#endif
   }
 
 #if JVET_O0244_DELTA_POC
@@ -1045,7 +1051,9 @@ void EncLib::xInitSPS(SPS &sps)
     sps.setNumReorderPics(m_numReorderPics[i], i);
   }
 
+#if !JVET_O0525_REMOVE_PCM
   sps.setPCMFilterDisableFlag  ( m_bPCMFilterDisableFlag );
+#endif
   sps.setScalingListFlag ( (m_useScalingListId == SCALING_LIST_OFF) ? 0 : 1 );
   sps.setALFEnabledFlag( m_alf );
   sps.setVuiParametersPresentFlag(getVuiParametersPresentFlag());
diff --git a/source/Lib/EncoderLib/EncModeCtrl.cpp b/source/Lib/EncoderLib/EncModeCtrl.cpp
index fc7a30a4dd20a912565deea08baaa88dda8489fb..7c7e1ff124843e55d685b224518a996a521aae8c 100644
--- a/source/Lib/EncoderLib/EncModeCtrl.cpp
+++ b/source/Lib/EncoderLib/EncModeCtrl.cpp
@@ -1389,7 +1389,9 @@ void EncModeCtrlMTnoRQT::initCULevel( Partitioner &partitioner, const CodingStru
     if( tryIntraRdo )
     {
 #endif
+#if !JVET_O0525_REMOVE_PCM
     m_ComprCUCtxList.back().testModes.push_back( { ETM_IPCM,  ETO_STANDARD, qp, lossless } );
+#endif
 #if JVET_O0119_BASE_PALETTE_444
     if (cs.slice->getSPS()->getPLTMode() && ( cs.slice->isIRAP() || (cs.area.lwidth() == 4 && cs.area.lheight() == 4) ) && getPltEnc() )
     {
@@ -1540,8 +1542,10 @@ bool EncModeCtrlMTnoRQT::tryMode( const EncTestMode& encTestmode, const CodingSt
   const SPS&             sps         = *slice.getSPS();
   const uint32_t             numComp     = getNumberValidComponents( slice.getSPS()->getChromaFormatIdc() );
   const uint32_t             width       = partitioner.currArea().lumaSize().width;
+#if !JVET_O0525_REMOVE_PCM
 #if FIX_PCM
   const uint32_t             height       = partitioner.currArea().lumaSize().height;
+#endif
 #endif
   const CodingStructure *bestCS      = cuECtx.bestCS;
   const CodingUnit      *bestCU      = cuECtx.bestCU;
@@ -1667,6 +1671,7 @@ bool EncModeCtrlMTnoRQT::tryMode( const EncTestMode& encTestmode, const CodingSt
     return true;
   }
 #endif
+#if !JVET_O0525_REMOVE_PCM
   else if( encTestmode.type == ETM_IPCM )
   {
     if( getFastDeltaQp() )
@@ -1688,6 +1693,7 @@ bool EncModeCtrlMTnoRQT::tryMode( const EncTestMode& encTestmode, const CodingSt
     return sps.getPCMEnabledFlag() && width <= ( 1 << sps.getPCMLog2MaxSize() ) && width >= ( 1 << sps.getPCMLog2MinSize() );
 #endif
   }
+#endif
   else if (encTestmode.type == ETM_IBC || encTestmode.type == ETM_IBC_MERGE)
   {
     // IBC MODES
diff --git a/source/Lib/EncoderLib/EncModeCtrl.h b/source/Lib/EncoderLib/EncModeCtrl.h
index 32dabb5d277a58918103b79e181b6084b5d25510..b29cb082674f5b07c0eb1aae139ac413202547a5 100644
--- a/source/Lib/EncoderLib/EncModeCtrl.h
+++ b/source/Lib/EncoderLib/EncModeCtrl.h
@@ -63,7 +63,9 @@ enum EncTestModeType
   ETM_AFFINE,
   ETM_MERGE_TRIANGLE,
   ETM_INTRA,
+#if !JVET_O0525_REMOVE_PCM
   ETM_IPCM,
+#endif
 #if JVET_O0119_BASE_PALETTE_444
   ETM_PALETTE,
 #endif
diff --git a/source/Lib/EncoderLib/EncSampleAdaptiveOffset.cpp b/source/Lib/EncoderLib/EncSampleAdaptiveOffset.cpp
index 8962e86a2ac3820beae6ddcf504f3847aeac16c7..30bcc51ccb67832d212a42ad9e06963699829915 100644
--- a/source/Lib/EncoderLib/EncSampleAdaptiveOffset.cpp
+++ b/source/Lib/EncoderLib/EncSampleAdaptiveOffset.cpp
@@ -245,7 +245,11 @@ void EncSampleAdaptiveOffset::SAOProcess( CodingStructure& cs, bool* sliceEnable
   DTRACE    ( g_trace_ctx, D_CRC, "SAO" );
   DTRACE_CRC( g_trace_ctx, D_CRC, cs, cs.getRecoBuf() );
 
+#if !JVET_O0525_REMOVE_PCM
   xPCMLFDisableProcess(cs);
+#else
+  xLosslessDisableProcess(cs);
+#endif
 }
 
 
diff --git a/source/Lib/EncoderLib/IntraSearch.cpp b/source/Lib/EncoderLib/IntraSearch.cpp
index d9c2b821a47bc4ded731afc8c000f1eeaa4a7474..5bbf01bc8f5c5902a29ac110a5f764b762d6a0d0 100644
--- a/source/Lib/EncoderLib/IntraSearch.cpp
+++ b/source/Lib/EncoderLib/IntraSearch.cpp
@@ -1682,6 +1682,7 @@ void IntraSearch::estIntraPredChromaQT( CodingUnit &cu, Partitioner &partitioner
   }
 }
 
+#if !JVET_O0525_REMOVE_PCM
 void IntraSearch::IPCMSearch(CodingStructure &cs, Partitioner& partitioner)
 {
 #if JVET_O0050_LOCAL_DUAL_TREE
@@ -1742,6 +1743,7 @@ void IntraSearch::xEncPCM(CodingStructure &cs, Partitioner& partitioner, const C
     }
   }
 }
+#endif
 
 #if JVET_O0050_LOCAL_DUAL_TREE
 void IntraSearch::saveCuAreaCostInSCIPU( Area area, double cost )
@@ -2372,6 +2374,7 @@ void IntraSearch::xEncIntraHeader( CodingStructure &cs, Partitioner &partitioner
       }
 #endif
       m_CABACEstimator->bdpcm_mode  ( cu, ComponentID(partitioner.chType) );
+#if !JVET_O0525_REMOVE_PCM
       if( CU::isIntra(cu) )
       {
         m_CABACEstimator->pcm_data( cu, partitioner );
@@ -2380,6 +2383,7 @@ void IntraSearch::xEncIntraHeader( CodingStructure &cs, Partitioner &partitioner
           return;
         }
       }
+#endif
     }
 
     PredictionUnit &pu = *cs.getPU(partitioner.currArea().lumaPos(), partitioner.chType);
diff --git a/source/Lib/EncoderLib/IntraSearch.h b/source/Lib/EncoderLib/IntraSearch.h
index d3273bcc1a73f5432926e46449f76278f0a99d8b..a621ba2a4d5525593b5d9e1583f4b138ea794810 100644
--- a/source/Lib/EncoderLib/IntraSearch.h
+++ b/source/Lib/EncoderLib/IntraSearch.h
@@ -396,7 +396,9 @@ public:
 
   bool estIntraPredLumaQT         ( CodingUnit &cu, Partitioner& pm, const double bestCostSoFar  = MAX_DOUBLE, bool mtsCheckRangeFlag = false, int mtsFirstCheckId = 0, int mtsLastCheckId = 0, bool moreProbMTSIdxFirst = false );
   void estIntraPredChromaQT       ( CodingUnit &cu, Partitioner& pm, const double maxCostAllowed = MAX_DOUBLE );
+#if !JVET_O0525_REMOVE_PCM
   void IPCMSearch                 (CodingStructure &cs, Partitioner& partitioner);
+#endif
 #if JVET_O0119_BASE_PALETTE_444
   void PLTSearch                  ( CodingStructure &cs, Partitioner& partitioner, ComponentID compBegin, uint32_t numComp);
   void deriveRunAndCalcBits       ( CodingStructure& cs, Partitioner& partitioner, ComponentID compBegin, uint32_t numComp, PLTScanMode pltScanMode, uint64_t& bits);
@@ -410,7 +412,9 @@ protected:
   // T & Q & Q-1 & T-1
   // -------------------------------------------------------------------------------------------------------------------
 
+#if !JVET_O0525_REMOVE_PCM
   void xEncPCM                    (CodingStructure &cs, Partitioner& partitioner, const ComponentID &compID);
+#endif
 
   // -------------------------------------------------------------------------------------------------------------------
   // Intra search
diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp
index a2042418f128378eb9b83ed1a3db3bed4653d314..fd9960a92f16423670896f3bab698f3c1532e898 100644
--- a/source/Lib/EncoderLib/VLCWriter.cpp
+++ b/source/Lib/EncoderLib/VLCWriter.cpp
@@ -870,6 +870,7 @@ void HLSWriter::codeSPS( const SPS* pcSPS )
   WRITE_FLAG( pcSPS->getSAOEnabledFlag(),                                            "sps_sao_enabled_flag");
   WRITE_FLAG( pcSPS->getALFEnabledFlag(),                                            "sps_alf_enabled_flag" );
 
+#if !JVET_O0525_REMOVE_PCM
   WRITE_FLAG( pcSPS->getPCMEnabledFlag() ? 1 : 0,                                    "sps_pcm_enabled_flag");
   if( pcSPS->getPCMEnabledFlag() )
   {
@@ -879,6 +880,7 @@ void HLSWriter::codeSPS( const SPS* pcSPS )
     WRITE_UVLC( pcSPS->getPCMLog2MaxSize() - pcSPS->getPCMLog2MinSize(),             "log2_diff_max_min_pcm_luma_coding_block_size" );
     WRITE_FLAG( pcSPS->getPCMFilterDisableFlag()?1 : 0,                              "pcm_loop_filter_disable_flag");
   }
+#endif
 
 #if JVET_O1136_TS_BDPCM_SIGNALLING
   WRITE_FLAG(pcSPS->getTransformSkipEnabledFlag() ? 1 : 0, "sps_transform_skip_enabled_flag");
@@ -1673,7 +1675,9 @@ void  HLSWriter::codeConstraintInfo  ( const ConstraintInfo* cinfo )
 #if JVET_O0376_SPS_JOINTCBCR_FLAG
   WRITE_FLAG(cinfo->getNoJointCbCrConstraintFlag() ? 1 : 0, "no_joint_cbcr_constraint_flag");
 #endif
+#if !JVET_O0525_REMOVE_PCM
   WRITE_FLAG(cinfo->getNoPcmConstraintFlag() ? 1 : 0, "no_pcm_constraint_flag");
+#endif
   WRITE_FLAG(cinfo->getNoRefWraparoundConstraintFlag() ? 1 : 0, "no_ref_wraparound_constraint_flag");
   WRITE_FLAG(cinfo->getNoTemporalMvpConstraintFlag() ? 1 : 0, "no_temporal_mvp_constraint_flag");
   WRITE_FLAG(cinfo->getNoSbtmvpConstraintFlag() ? 1 : 0, "no_sbtmvp_constraint_flag");