diff --git a/source/Lib/DecoderLib/DecLib.cpp b/source/Lib/DecoderLib/DecLib.cpp
index 27e5483bd175579b9367a2e71bc9eb96c7450082..fe59551b3ad03e17642afd88c18c43220488ec49 100644
--- a/source/Lib/DecoderLib/DecLib.cpp
+++ b/source/Lib/DecoderLib/DecLib.cpp
@@ -428,6 +428,8 @@ bool tryDecodePicture( Picture* pcEncPic, const int expectedPoc, const std::stri
 
 DecLib::DecLib()
   : m_iMaxRefPicNum(0)
+  , m_isFirstGeneralHrd(true)
+  , m_prevGeneralHrdParams()
   , m_associatedIRAPType(NAL_UNIT_INVALID)
 #if JVET_P0978_RPL_RESTRICTIONS
   , m_associatedIRAPDecodingOrderNumber(0)
@@ -1447,7 +1449,47 @@ void DecLib::xActivateParameterSets( const int layerId )
   }
   xCheckParameterSetConstraints(layerId);
 }
+void DecLib::xCheckGeneralHrdParametersIdentical(const GeneralHrdParams* generalHrdParams1, const GeneralHrdParams* generalHrdParams2)
+{
+  bool isIdentical = true;
+  if ((generalHrdParams1->getNumUnitsInTick() != generalHrdParams2->getNumUnitsInTick())
+    || (generalHrdParams1->getTimeScale() != generalHrdParams2->getTimeScale())
+    || (generalHrdParams1->getGeneralNalHrdParametersPresentFlag() != generalHrdParams2->getGeneralNalHrdParametersPresentFlag())
+    || (generalHrdParams1->getGeneralVclHrdParametersPresentFlag() != generalHrdParams2->getGeneralVclHrdParametersPresentFlag())
+    || (generalHrdParams1->getGeneralSamPicTimingInAllOlsFlag() != generalHrdParams2->getGeneralSamPicTimingInAllOlsFlag())
+    || (generalHrdParams1->getGeneralDecodingUnitHrdParamsPresentFlag() != generalHrdParams2->getGeneralDecodingUnitHrdParamsPresentFlag())
+    || (generalHrdParams1->getGeneralDecodingUnitHrdParamsPresentFlag()?(generalHrdParams1->getTickDivisorMinus2() != generalHrdParams2->getTickDivisorMinus2()):0)
+    || (generalHrdParams1->getBitRateScale() != generalHrdParams2->getBitRateScale())
+    || (generalHrdParams1->getCpbSizeScale() != generalHrdParams2->getCpbSizeScale())
+    || (generalHrdParams1->getGeneralDecodingUnitHrdParamsPresentFlag() ? (generalHrdParams1->getCpbSizeDuScale() != generalHrdParams2->getCpbSizeDuScale()):0)
+    || (generalHrdParams1->getHrdCpbCntMinus1() != generalHrdParams2->getHrdCpbCntMinus1())
+    )
+  {
+    isIdentical = false;
+  }
+  CHECK(!isIdentical, "It is a requirement of bitstream conformance that the content of the general_hrd_parameters( ) syntax structure present in any VPSs or SPSs in the bitstream shall be identical");
+}
 
+void DecLib::xCopyGeneralHrdParameters(GeneralHrdParams* generalHrdParamsDst, const GeneralHrdParams* generalHrdParamsSrc)
+{
+  generalHrdParamsDst->setNumUnitsInTick(generalHrdParamsSrc->getNumUnitsInTick());
+  generalHrdParamsDst->setTimeScale(generalHrdParamsSrc->getTimeScale());
+  generalHrdParamsDst->setGeneralNalHrdParametersPresentFlag(generalHrdParamsSrc->getGeneralNalHrdParametersPresentFlag());
+  generalHrdParamsDst->setGeneralVclHrdParametersPresentFlag(generalHrdParamsSrc->getGeneralVclHrdParametersPresentFlag());
+  generalHrdParamsDst->setGeneralSamPicTimingInAllOlsFlag(generalHrdParamsSrc->getGeneralSamPicTimingInAllOlsFlag());
+  generalHrdParamsDst->setGeneralDecodingUnitHrdParamsPresentFlag(generalHrdParamsSrc->getGeneralDecodingUnitHrdParamsPresentFlag());
+  if (generalHrdParamsDst->getGeneralDecodingUnitHrdParamsPresentFlag())
+  {
+    generalHrdParamsDst->setTickDivisorMinus2(generalHrdParamsSrc->getTickDivisorMinus2());
+  }
+  generalHrdParamsDst->setBitRateScale(generalHrdParamsSrc->getBitRateScale());
+  generalHrdParamsDst->setCpbSizeScale(generalHrdParamsSrc->getCpbSizeScale());
+  if (generalHrdParamsDst->getGeneralDecodingUnitHrdParamsPresentFlag())
+  {
+    generalHrdParamsDst->setCpbSizeDuScale(generalHrdParamsSrc->getCpbSizeDuScale());
+  }
+  generalHrdParamsDst->setHrdCpbCntMinus1(generalHrdParamsSrc->getHrdCpbCntMinus1());
+}
 void DecLib::xCheckParameterSetConstraints(const int layerId)
 {
   // Conformance checks
@@ -1457,7 +1499,22 @@ void DecLib::xCheckParameterSetConstraints(const int layerId)
 #if JVET_Q0814_DPB
   const VPS *vps = slice->getVPS();
 #endif
-
+  if (((vps!=nullptr)&&(vps->getVPSGeneralHrdParamsPresentFlag()))||(sps->getGeneralHrdParametersPresentFlag()))
+  {
+    if (((vps != nullptr) && (vps->getVPSGeneralHrdParamsPresentFlag())) && (sps->getGeneralHrdParametersPresentFlag()))
+    {
+      xCheckGeneralHrdParametersIdentical(vps->getGeneralHrdParameters(),sps->getGeneralHrdParameters());
+    }
+    if (m_isFirstGeneralHrd)
+    {
+      xCopyGeneralHrdParameters(&m_prevGeneralHrdParams, sps->getGeneralHrdParametersPresentFlag() ? sps->getGeneralHrdParameters() : vps->getGeneralHrdParameters());
+    } 
+    else
+    {
+      xCheckGeneralHrdParametersIdentical(&m_prevGeneralHrdParams, sps->getGeneralHrdParametersPresentFlag() ? sps->getGeneralHrdParameters() : vps->getGeneralHrdParameters());
+    }
+  }
+  m_isFirstGeneralHrd = false;
 #if SPS_ID_CHECK
   static std::unordered_map<int, int> m_clvssSPSid;
 
diff --git a/source/Lib/DecoderLib/DecLib.h b/source/Lib/DecoderLib/DecLib.h
index c9cc7f40e0785f8ba306a1f54afb18be81718b56..79088fead1635704e45da393c27341671e0e625c 100644
--- a/source/Lib/DecoderLib/DecLib.h
+++ b/source/Lib/DecoderLib/DecLib.h
@@ -69,6 +69,8 @@ class DecLib
 {
 private:
   int                     m_iMaxRefPicNum;
+  bool m_isFirstGeneralHrd;
+  GeneralHrdParams        m_prevGeneralHrdParams;
 
   NalUnitType             m_associatedIRAPType; ///< NAL unit type of the associated IRAP picture
 #if JVET_P0978_RPL_RESTRICTIONS
@@ -274,6 +276,8 @@ protected:
   void  xCreateUnavailablePicture(int iUnavailablePoc, bool longTermFlag, const int layerId, const bool interLayerRefPicFlag);
   void  xActivateParameterSets( const int layerId );
   void  xCheckParameterSetConstraints( const int layerId );
+  void  xCheckGeneralHrdParametersIdentical(const GeneralHrdParams* generalHrdParams1, const GeneralHrdParams* generalHrdParams2);
+  void  xCopyGeneralHrdParameters(GeneralHrdParams* generalHrdParamsDst, const GeneralHrdParams* generalHrdParamsSrc);
   void      xDecodePicHeader( InputNALUnit& nalu );
   bool      xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDisplay);
   void      xDecodeVPS( InputNALUnit& nalu );
diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp
index c2fc987af58a328e328326f3b4482998063659ff..418ff1c382e1d3b5246fa7b7007146b8f4e997b1 100644
--- a/source/Lib/DecoderLib/VLCReader.cpp
+++ b/source/Lib/DecoderLib/VLCReader.cpp
@@ -282,10 +282,6 @@ void FDReader::parseFillerData(InputBitstream* bs, uint32_t &fdSize)
 // ====================================================================================================================
 
 HLSyntaxReader::HLSyntaxReader()
-#if JVET_P0118_HRD_ASPECTS
-  : m_isFirstGeneralHrd(true)
-  , m_prevGeneralHrdParams(NULL)
-#endif
 {
 }
 
@@ -1335,32 +1331,6 @@ void HLSyntaxReader::parseGeneralHrdParameters(GeneralHrdParams *hrd)
   }
   READ_UVLC(symbol, "hrd_cpb_cnt_minus1");                      hrd->setHrdCpbCntMinus1(symbol);
   CHECK(symbol > 31,"The value of hrd_cpb_cnt_minus1 shall be in the range of 0 to 31, inclusive");
-  if (!m_isFirstGeneralHrd)
-  {
-    checkGeneralHrdParametersIdentical(hrd);
-  }
-  m_prevGeneralHrdParams = hrd;
-  m_isFirstGeneralHrd = false;
-}
-void HLSyntaxReader::checkGeneralHrdParametersIdentical(GeneralHrdParams *generalHrd)
-{
-  bool isIdentical = true;
-  if ( (generalHrd->getNumUnitsInTick()!= m_prevGeneralHrdParams->getNumUnitsInTick())
-    || (generalHrd->getTimeScale()!= m_prevGeneralHrdParams->getTimeScale())
-    || (generalHrd->getGeneralNalHrdParametersPresentFlag()!= m_prevGeneralHrdParams->getGeneralNalHrdParametersPresentFlag())
-    || (generalHrd->getGeneralVclHrdParametersPresentFlag()!= m_prevGeneralHrdParams->getGeneralVclHrdParametersPresentFlag())
-    || (generalHrd->getGeneralSamPicTimingInAllOlsFlag()!= m_prevGeneralHrdParams->getGeneralSamPicTimingInAllOlsFlag())
-    || (generalHrd->getGeneralDecodingUnitHrdParamsPresentFlag()!= m_prevGeneralHrdParams->getGeneralDecodingUnitHrdParamsPresentFlag())
-    || (generalHrd->getTickDivisorMinus2()!= m_prevGeneralHrdParams->getTickDivisorMinus2())
-    || (generalHrd->getBitRateScale()!= m_prevGeneralHrdParams->getBitRateScale())
-    || (generalHrd->getCpbSizeScale()!= m_prevGeneralHrdParams->getCpbSizeScale())
-    || (generalHrd->getCpbSizeDuScale()!= m_prevGeneralHrdParams->getCpbSizeDuScale())
-    || (generalHrd->getHrdCpbCntMinus1()!= m_prevGeneralHrdParams->getHrdCpbCntMinus1())
-    )
-  {
-    isIdentical = false;
-  }
-  CHECK(!isIdentical, "It is a requirement of bitstream conformance that the content of the general_hrd_parameters( ) syntax structure present in any VPSs or SPSs in the bitstream shall be identical");
 }
 #endif
 #if JVET_P0118_HRD_ASPECTS
diff --git a/source/Lib/DecoderLib/VLCReader.h b/source/Lib/DecoderLib/VLCReader.h
index 53be7eb0b49b89dd2fa9eec94ebedd5ead9a9716..c51828fc9bd0f71da47e9c65c335e5742d671592 100644
--- a/source/Lib/DecoderLib/VLCReader.h
+++ b/source/Lib/DecoderLib/VLCReader.h
@@ -146,11 +146,6 @@ public:
 
 class HLSyntaxReader : public VLCReader
 {
-#if JVET_P0118_HRD_ASPECTS
-private:
-  bool m_isFirstGeneralHrd;
-  GeneralHrdParams*      m_prevGeneralHrdParams;
-#endif
 public:
   HLSyntaxReader();
   virtual ~HLSyntaxReader();
@@ -181,7 +176,6 @@ public:
   void  parseProfileTierLevel ( ProfileTierLevel *ptl, int maxNumSubLayersMinus1);
 #endif
 #if JVET_P0118_HRD_ASPECTS
-  void  checkGeneralHrdParametersIdentical(GeneralHrdParams *generalHr);
   void  parseOlsHrdParameters(GeneralHrdParams* generalHrd, OlsHrdParams *olsHrd, uint32_t firstSubLayer, uint32_t tempLevelHigh);
 #else
   void  parseHrdParameters  ( HRDParameters *hrd, uint32_t firstSubLayer, uint32_t tempLevelHigh );