diff --git a/source/App/EncoderApp/EncApp.cpp b/source/App/EncoderApp/EncApp.cpp
index 70d259c0ff355c3a10c3501f2c506643b6bb8607..aa4c1d8b044cac98bb22625a3968e6b3c87d7428 100644
--- a/source/App/EncoderApp/EncApp.cpp
+++ b/source/App/EncoderApp/EncApp.cpp
@@ -525,10 +525,8 @@ void EncApp::xInitLibCfg()
   m_cEncLib.setGdrEnabled                                        ( m_gdrEnabled );
   m_cEncLib.setGdrPeriod                                         ( m_gdrPeriod );
   m_cEncLib.setGdrPocStart                                       ( m_gdrPocStart );
-  m_cEncLib.setGdrFrequency                                      ( m_gdrFrequency);
-  m_cEncLib.setStartWithGdr                                      ( m_bStartWithGdr );
-  m_cEncLib.setNoHashForGdr                                      ( m_bNoHashForGdr );
-  m_cEncLib.setGdrPicOutput                                      ( m_bGdrPicOutput );
+  m_cEncLib.setGdrInterval                                       ( m_gdrInterval);  
+  m_cEncLib.setNoHashForGdr                                      ( m_bNoHashForGdr );  
 #endif
   m_cEncLib.setDecodingRefreshType                               ( m_iDecodingRefreshType );
   m_cEncLib.setGOPSize                                           ( m_iGOPSize );
diff --git a/source/App/EncoderApp/EncAppCfg.cpp b/source/App/EncoderApp/EncAppCfg.cpp
index 65334230bdc5ed18cfa6c15d390093566b2f9c0a..8c839683a5d0fff74f7748f114372fbcb3cc106a 100644
--- a/source/App/EncoderApp/EncAppCfg.cpp
+++ b/source/App/EncoderApp/EncAppCfg.cpp
@@ -1010,10 +1010,8 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] )
   ("GdrEnabled",                                      m_gdrEnabled,                                     false, "GDR enabled")
   ("GdrPocStart",                                     m_gdrPocStart,                                       -1, "GDR poc start")
   ("GdrPeriod",                                       m_gdrPeriod,                                         -1, "GDR period")
-  ("GdrFrequency",                                    m_gdrFrequency,                                      -1, "GDR freqency")
-  ("StartWithGDR",                                    m_bStartWithGdr,                                  false, "Start bitstream with GDR")
-  ("NoHashforGDR",                                    m_bNoHashForGdr,                                   true, "No Hash for GDR")
-  ("GdrPicOutput",                                    m_bGdrPicOutput,                                  false, "Picture Output for GDR")
+  ("GdrInterval",                                     m_gdrInterval,                                      -1, "GDR freqency")  
+  ("NoHashforGDR",                                    m_bNoHashForGdr,                                   true, "No Hash for GDR")  
 #endif
   ("DecodingRefreshType,-dr",                         m_iDecodingRefreshType,                               0, "Intra refresh type (0:none 1:CRA 2:IDR 3:RecPointSEI)")
   ("GOPSize,g",                                       m_iGOPSize,                                           1, "GOP size of temporal structure")
@@ -1546,22 +1544,20 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] )
     m_BIO  = false;
     m_DMVR = false;
     m_SMVD = false;
+    
+    if (m_gdrPeriod < 0)
+    {
+      m_gdrPeriod = m_iFrameRate * 2;
+    }
 
-
-    if (m_gdrFrequency < 0)
-      m_gdrFrequency = 2;
-
-    if (m_gdrPocStart < 0)
+    if (m_gdrInterval < 0)
     {
-      if (m_iIntraPeriod > 0)
-        m_gdrPocStart = m_iIntraPeriod;
-      else
-        m_gdrPocStart = m_iFrameRate * m_gdrFrequency;
+      m_gdrInterval = m_iFrameRate;
     }
 
-    if (m_gdrPeriod < 0)
+    if (m_gdrPocStart < 0)
     {
-      m_gdrPeriod = m_iFrameRate;
+      m_gdrPocStart = m_gdrPeriod;
     }
 
     if (m_iIntraPeriod == -1)
@@ -1570,7 +1566,7 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] )
       if (m_gdrPocStart % m_iFrameRate != 0)
         m_iIntraPeriod = -1;
       else
-        m_iIntraPeriod = m_iFrameRate * m_gdrFrequency;
+        m_iIntraPeriod = m_gdrPeriod;
     }
   }
 #endif
diff --git a/source/App/EncoderApp/EncAppCfg.h b/source/App/EncoderApp/EncAppCfg.h
index 23708acf1783f7ea8b2fd37cbf7e77776a337242..d70c8c8f4ec25fd359820d2eed9d1e89cf981bc6 100644
--- a/source/App/EncoderApp/EncAppCfg.h
+++ b/source/App/EncoderApp/EncAppCfg.h
@@ -222,10 +222,8 @@ protected:
   bool      m_gdrEnabled;
   int       m_gdrPocStart;
   int       m_gdrPeriod;
-  int       m_gdrFrequency;
-  bool      m_bStartWithGdr;
-  bool      m_bNoHashForGdr;
-  bool      m_bGdrPicOutput;
+  int       m_gdrInterval;  
+  bool      m_bNoHashForGdr;  
 #endif
   int       m_iDecodingRefreshType;                           ///< random access type
   int       m_iGOPSize;                                       ///< GOP size of hierarchical structure
diff --git a/source/Lib/CommonLib/CodingStructure.cpp b/source/Lib/CommonLib/CodingStructure.cpp
index a8c6e76715bc468a1f2506cdcd696b9ace07e0b9..39d15569279a1df1a3c01d39801a9f38afd0665e 100644
--- a/source/Lib/CommonLib/CodingStructure.cpp
+++ b/source/Lib/CommonLib/CodingStructure.cpp
@@ -356,7 +356,7 @@ bool CodingStructure::isClean(const Position &IntPos, Mv FracMv) const
   }
 
   PicHeader     *curPh = curPic->cs->picHeader;
-  bool isCurGdrPicture = curPh->getInGdrPeriod();
+  bool isCurGdrPicture = curPh->getInGdrInterval();
 
   if (isCurGdrPicture)
   {
@@ -416,7 +416,7 @@ bool CodingStructure::isClean(const Position &IntPos, Mv FracMv, const Picture*
     return false;
   }
 
-  bool isRefGdrPicture = refPh->getInGdrPeriod();
+  bool isRefGdrPicture = refPh->getInGdrInterval();
 
   if (isRefGdrPicture)
   {
@@ -497,7 +497,7 @@ bool CodingStructure::isClean(const Position &IntPos, Mv FracMv, RefPicList e, i
     return false;
   }
     
-  bool isRefGdrPicture = refPh->getInGdrPeriod();
+  bool isRefGdrPicture = refPh->getInGdrInterval();
 
   if (isRefGdrPicture)
   {    
@@ -591,7 +591,7 @@ bool CodingStructure::isClean(const Position &IntPos, Mv FracMv, RefPicList e, i
     return false;
   }
 
-  bool isRefGdrPicture = refPh->getInGdrPeriod();
+  bool isRefGdrPicture = refPh->getInGdrInterval();
 
   if (isRefGdrPicture)
   {
@@ -655,7 +655,7 @@ bool CodingStructure::isClean(const Position &IntPos, RefPicList e, int refIdx)
   }
 
   PicHeader     *refPh = refPic->cs->picHeader;
-  bool isRefGdrPicture = refPh->getInGdrPeriod();
+  bool isRefGdrPicture = refPh->getInGdrInterval();
 
   if (isRefGdrPicture)
   {                
@@ -692,7 +692,7 @@ bool CodingStructure::isClean(const Position &IntPos, const Picture* const refPi
   }
 
   PicHeader     *refPh = refPic->cs->picHeader;
-  bool isRefGdrPicture = refPh->getInGdrPeriod();
+  bool isRefGdrPicture = refPh->getInGdrInterval();
 
   if (isRefGdrPicture)
   {
@@ -730,7 +730,7 @@ bool CodingStructure::isClean(const int Intx, const int Inty, const ChannelType
          pos in dirty area -> false
   */
   PicHeader     *curPh = picHeader;
-  bool isCurGdrPicture = curPh->getInGdrPeriod();
+  bool isCurGdrPicture = curPh->getInGdrInterval();
   if (isCurGdrPicture)
   {
     int virboundary_endx = curPh->getVirtualBoundariesPosX(0);
diff --git a/source/Lib/CommonLib/ContextModelling.cpp b/source/Lib/CommonLib/ContextModelling.cpp
index 38e1ca3ce026d56874b62e2d49b49484bffb5208..5edbb1cb887eed1fe6973011dda524adcbc83cce 100644
--- a/source/Lib/CommonLib/ContextModelling.cpp
+++ b/source/Lib/CommonLib/ContextModelling.cpp
@@ -367,7 +367,7 @@ void MergeCtx::setMergeInfo( PredictionUnit& pu, int candIdx )
   pu.mvpNum [REF_PIC_LIST_1] = NOT_VALID;
 #if GDR_ENABLED
   CodingStructure &cs = *pu.cs;
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
 
   if (isEncodeGdrClean) 
   {    
@@ -410,7 +410,7 @@ void MergeCtx::setMmvdMergeCandiInfo(PredictionUnit& pu, int candIdx)
 
 #if GDR_ENABLED
   const CodingStructure &cs = *pu.cs;  
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
 #endif
 
   tempIdx = candIdx;
diff --git a/source/Lib/CommonLib/InterPrediction.cpp b/source/Lib/CommonLib/InterPrediction.cpp
index e271546ca26604b1c303f4c9494c72017557d781..fe789d9eb94774c5bcb8da555e800cfe170ecf04 100644
--- a/source/Lib/CommonLib/InterPrediction.cpp
+++ b/source/Lib/CommonLib/InterPrediction.cpp
@@ -896,7 +896,7 @@ void InterPrediction::xPredAffineBlk(const ComponentID &compID, const Prediction
 #if GDR_ENABLED  
   bool allOk = true;
   const CodingStructure &cs = *pu.cs;
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
   const int pux = pu.lx();
   const int puy = pu.ly();
 #endif
diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp
index a00b007af2fdf018f76f5ac7989614819080e9dd..52996d84bccc3cae64c2bb30ac4e158b1e893a5d 100644
--- a/source/Lib/CommonLib/Slice.cpp
+++ b/source/Lib/CommonLib/Slice.cpp
@@ -2742,8 +2742,8 @@ void PicHeader::initPicHeader()
 
   m_alfApsIdsLuma.resize(0);
 #if GDR_ENABLED
-  m_inGdrPeriod      = false;
-  m_lastGdrPeriodPoc = -1;
+  m_inGdrInterval      = false;
+  m_lastGdrIntervalPoc = -1;
 #endif
 }
 
diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h
index df366b861e33f089bab5e76cae6d66670742c437..e47f8f3853580528465d8fd6f358668f0c5282f6 100644
--- a/source/Lib/CommonLib/Slice.h
+++ b/source/Lib/CommonLib/Slice.h
@@ -2333,8 +2333,8 @@ private:
   bool                        m_gdrOrIrapPicFlag;                                       //!< gdr or irap picture flag
   bool                        m_gdrPicFlag;                                             //!< gradual decoding refresh picture flag
 #if GDR_ENABLED
-  bool                        m_inGdrPeriod;
-  int                         m_lastGdrPeriodPoc;
+  bool                        m_inGdrInterval;
+  int                         m_lastGdrIntervalPoc;
 #endif
   uint32_t                    m_recoveryPocCnt;                                         //!< recovery POC count
   bool                        m_noOutputBeforeRecoveryFlag;                             //!< NoOutputBeforeRecoveryFlag
@@ -2423,8 +2423,8 @@ public:
   void                        setGdrPicFlag( bool b )                                   { m_gdrPicFlag = b;                                                                            }
   bool                        getGdrPicFlag() const                                     { return m_gdrPicFlag;                                                                         }
 #if GDR_ENABLED
-  void                        setInGdrPeriod(bool b)                                    { m_inGdrPeriod = b;                                                                            }
-  bool                        getInGdrPeriod() const                                    { return m_inGdrPeriod;                                                                         }  
+  void                        setInGdrInterval(bool b)                                    { m_inGdrInterval = b;                                                                            }
+  bool                        getInGdrInterval() const                                    { return m_inGdrInterval;                                                                         }  
 #endif
   void                        setRecoveryPocCnt( uint32_t u )                           { m_recoveryPocCnt = u;                                                                        }
   uint32_t                    getRecoveryPocCnt() const                                 { return m_recoveryPocCnt;                                                                     }
diff --git a/source/Lib/CommonLib/UnitTools.cpp b/source/Lib/CommonLib/UnitTools.cpp
index de9d7878f204733eff4361ec95610a75bed0ef04..d7e6d1097b448ba7f39b92cf822a012d6a613958 100644
--- a/source/Lib/CommonLib/UnitTools.cpp
+++ b/source/Lib/CommonLib/UnitTools.cpp
@@ -873,7 +873,7 @@ bool PU::addMergeHMVPCand(const CodingStructure &cs, MergeCtx &mrgCtx, const int
   int num_avai_candInLUT = (int)lut.size();
 
 #if GDR_ENABLED  
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
   
   bool  vbOnCtuBoundary = true;  
   if (isEncodeGdrClean) 
@@ -951,7 +951,7 @@ void PU::getIBCMergeCandidates(const PredictionUnit &pu, MergeCtx& mrgCtx, const
   const CodingStructure &cs = *pu.cs;
   const uint32_t maxNumMergeCand = pu.cs->sps->getMaxNumIBCMergeCand();
 #if GDR_ENABLED  
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
   bool  allCandSolidInAbove = true;
 #endif
 
@@ -1103,7 +1103,7 @@ void PU::getInterMergeCandidates( const PredictionUnit &pu, MergeCtx& mrgCtx,
   const uint32_t maxNumMergeCand = pu.cs->sps->getMaxNumMergeCand();
   CHECK (maxNumMergeCand > MRG_MAX_NUM_CANDS, "selected maximum number of merge candidate exceeds global limit");
 #if GDR_ENABLED  
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
   bool  allCandSolidInAbove = true;
 #endif
   for (uint32_t ui = 0; ui < maxNumMergeCand; ++ui)
@@ -1813,7 +1813,7 @@ void PU::getInterMMVDMergeCandidates(const PredictionUnit &pu, MergeCtx& mrgCtx,
 
 #if GDR_ENABLED
   const CodingStructure &cs = *pu.cs;
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
 #endif
 
 #if GDR_ENABLED
@@ -2209,7 +2209,7 @@ void PU::fillMvpCand(PredictionUnit &pu, const RefPicList &eRefPicList, const in
   Position posLB = pu.Y().bottomLeft();
 
 #if GDR_ENABLED
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
   bool &allCandSolidInAbove = amvpInfo.allCandSolidInAbove;
 #endif
   {
@@ -2342,7 +2342,7 @@ bool PU::addAffineMVPCandUnscaled( const PredictionUnit &pu, const RefPicList &r
   Position neibPos;
 
 #if GDR_ENABLED  
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
 #endif
   switch ( dir )
   {
@@ -2452,7 +2452,7 @@ bool PU::addAffineMVPCandUnscaled( const PredictionUnit &pu, const RefPicList &r
 void PU::xInheritedAffineMv(const PredictionUnit &pu, const PredictionUnit* puNeighbour, RefPicList eRefPicList, Mv rcMv[3], bool rcMvSolid[3], MvpType rcMvType[3], Position rcMvPos[3])
 {
   const CodingStructure &cs = *pu.cs;
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
 
   int posNeiX = puNeighbour->Y().pos().x;
   int posNeiY = puNeighbour->Y().pos().y;
@@ -2664,7 +2664,7 @@ void PU::fillAffineMvpCand(PredictionUnit &pu, const RefPicList &eRefPicList, co
 
 #if GDR_ENABLED
   const CodingStructure &cs = *pu.cs;
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
   bool &allCandSolidInAbove = affiAMVPInfo.allCandSolidInAbove;
 
   if (isEncodeGdrClean) 
@@ -3011,7 +3011,7 @@ bool PU::addMVPCandUnscaled( const PredictionUnit &pu, const RefPicList &eRefPic
         Position neibPos;
 
 #if GDR_ENABLED
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
   bool &allCandSolidInAbove = info.allCandSolidInAbove;
 #endif  
 
@@ -3088,7 +3088,7 @@ void PU::addAMVPHMVPCand(const PredictionUnit &pu, const RefPicList eRefPicList,
 
 #if GDR_ENABLED
   CodingStructure &cs = *pu.cs;
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));  
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));  
   bool &allCandSolidInAbove = info.allCandSolidInAbove;
 #endif
 
@@ -3356,7 +3356,7 @@ void PU::getAffineMergeCand( const PredictionUnit &pu, AffineMergeCtx& affMrgCtx
   const uint32_t maxNumAffineMergeCand = slice.getPicHeader()->getMaxNumAffineMergeCand();
   const unsigned plevel = pu.cs->sps->getLog2ParallelMergeLevelMinus2() + 2;
 #if GDR_ENABLED
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
 #endif
 
   for ( int i = 0; i < maxNumAffineMergeCand; i++ )
@@ -3922,7 +3922,7 @@ bool PU::getInterMergeSubPuMvpCand(const PredictionUnit &pu, MergeCtx& mrgCtx, b
 
 #if GDR_ENABLED
   const CodingStructure& cs = *pu.cs;
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
   bool isSubPuSolid[2] = { true, true };
 #endif
   if ( count )
@@ -4280,7 +4280,7 @@ void PU::getGeoMergeCandidates( const PredictionUnit &pu, MergeCtx& geoMrgCtx )
 
 #if GDR_ENABLED  
   CodingStructure &cs = *pu.cs;
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
 #endif
   for (int32_t i = 0; i < GEO_MAX_NUM_UNI_CANDS; i++)
   {
diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp
index dc9155a43942c9108e3a8e2c3a1c19068fe0b147..5861aa59d2d9f48c7129140ae39da1ce99492e6f 100644
--- a/source/Lib/DecoderLib/VLCReader.cpp
+++ b/source/Lib/DecoderLib/VLCReader.cpp
@@ -4348,11 +4348,11 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, PicHeader* picHeader, Par
 
   if (getLastGdrPoc() > 0 && (getLastGdrPoc() <= cur_poc) && (cur_poc < (getLastGdrPoc() + recovery_poc_cnt))) 
   {
-    picHeader->setInGdrPeriod(true);
+    picHeader->setInGdrInterval(true);
   }  
   else 
   {
-    picHeader->setInGdrPeriod(false);
+    picHeader->setInGdrInterval(false);
   }
 #endif
 
@@ -4360,7 +4360,7 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, PicHeader* picHeader, Par
   printf("-gdr_pic_flag:%d\n", picHeader->getGdrPicFlag() ? 1 : 0);
   printf("-recovery_poc_cnt:%d\n", picHeader->getRecoveryPocCnt());
 #if GDR_ENABLED
-  printf("-inGdrPeriod:%d\n", picHeader->getInGdrPeriod());
+  printf("-inGdrInterval:%d\n", picHeader->getInGdrInterval());
 #endif
 
   printf("-lmcs_enable : %d\n", picHeader->getLmcsEnabledFlag() ? 1 : 0);
diff --git a/source/Lib/EncoderLib/EncCfg.h b/source/Lib/EncoderLib/EncCfg.h
index 196675a7142d5dc631f2dc67648938ad25d9ab6f..85babab6d2a1963989afbd81110219d50db0a22b 100644
--- a/source/Lib/EncoderLib/EncCfg.h
+++ b/source/Lib/EncoderLib/EncCfg.h
@@ -303,13 +303,11 @@ protected:
   unsigned              m_subPicIdLen;
   std::vector<uint16_t> m_subPicId;
 #if GDR_ENABLED
-  bool      m_gdrEnabled;
-  unsigned  m_gdrPeriod;
+  bool      m_gdrEnabled;  
   unsigned  m_gdrPocStart;
-  int       m_gdrFrequency;
-  bool      m_bStartWithGdr;
-  bool      m_bNoHashForGdr;
-  bool      m_bGdrPicOutput;
+  unsigned  m_gdrPeriod;
+  int       m_gdrInterval;  
+  bool      m_bNoHashForGdr;  
 #endif
   bool      m_useSplitConsOverride;
   unsigned  m_uiMinQT[3]; //0: I slice; 1: P/B slice, 2: I slice chroma
@@ -1009,18 +1007,14 @@ public:
   void      setGdrEnabled(bool b)       { m_gdrEnabled = b;    }
   void      setGdrPeriod(unsigned  u)   { m_gdrPeriod   = u;   }
   void      setGdrPocStart(unsigned  u) { m_gdrPocStart = u;   }
-  void      setGdrFrequency(int i)      { m_gdrFrequency = i;  }
-  void      setStartWithGdr(bool b)     { m_bStartWithGdr = b; }
-  void      setNoHashForGdr(bool b)     { m_bNoHashForGdr = b; }  
-  void      setGdrPicOutput(bool b)     { m_bGdrPicOutput = b; }
+  void      setGdrInterval(int i)       { m_gdrInterval = i;   }  
+  void      setNoHashForGdr(bool b)     { m_bNoHashForGdr = b; }    
 
   bool      getGdrEnabled()             { return m_gdrEnabled;    }
   unsigned  getGdrPeriod()              { return m_gdrPeriod;     }
   unsigned  getGdrPocStart()            { return m_gdrPocStart;   }
-  int       getGdrFrequency()           { return m_gdrFrequency;  }
-  bool      getStartWithGdr()           { return m_bStartWithGdr; }
-  bool      getNoHashForGdr()           { return m_bNoHashForGdr; }
-  bool      getGdrPicOutput()           { return m_bGdrPicOutput; }
+  int       getGdrInterval()            { return m_gdrInterval;   }  
+  bool      getNoHashForGdr()           { return m_bNoHashForGdr; }  
 #endif
   void      setMaxMTTHierarchyDepth         ( unsigned uiMaxMTTHierarchyDepth, unsigned uiMaxMTTHierarchyDepthI, unsigned uiMaxMTTHierarchyDepthIChroma )
                                                              { m_uiMaxMTTHierarchyDepth = uiMaxMTTHierarchyDepth; m_uiMaxMTTHierarchyDepthI = uiMaxMTTHierarchyDepthI; m_uiMaxMTTHierarchyDepthIChroma = uiMaxMTTHierarchyDepthIChroma; }
diff --git a/source/Lib/EncoderLib/EncCu.cpp b/source/Lib/EncoderLib/EncCu.cpp
index 32240520b1f036db58ee6ec6413eb0e5a8a1bc58..5ae343983478ebb2ec55944e48d5e652a2ceaa22 100644
--- a/source/Lib/EncoderLib/EncCu.cpp
+++ b/source/Lib/EncoderLib/EncCu.cpp
@@ -556,83 +556,86 @@ void EncCu::xCompressCU( CodingStructure*& tempCS, CodingStructure*& bestCS, Par
 
   m_modeCtrl->initCULevel( partitioner, *tempCS );
 #if GDR_ENABLED 
-  bool isCurGdrPicture = slice.getPicHeader()->getInGdrPeriod();
-
-  // 1.0 applicable to inter picture only  
-  if (isCurGdrPicture)
+  if (m_pcEncCfg->getGdrEnabled())
   {
-    int gdrPocStart = m_pcEncCfg->getGdrPocStart();
-    int gdrPeriod = m_pcEncCfg->getGdrPeriod();
-
-    int picWidth = slice.getPPS()->getPicWidthInLumaSamples();
-    int m1, m2, n1;
+    bool isCurGdrPicture = slice.getPicHeader()->getInGdrInterval();
 
-    int curPoc = slice.getPOC();
-    int gdrPoc = (curPoc - gdrPocStart) % gdrPeriod;
+    // 1.0 applicable to inter picture only  
+    if (isCurGdrPicture)
+    {
+      int gdrPocStart = m_pcEncCfg->getGdrPocStart();
+      int gdrInterval = m_pcEncCfg->getGdrInterval();
 
-    int begGdrX = 0;
-    int endGdrX = 0;
+      int picWidth = slice.getPPS()->getPicWidthInLumaSamples();
+      int m1, m2, n1;
 
-    double dd = (picWidth / (double)gdrPeriod);
-    int mm = (int)((picWidth / (double)gdrPeriod) + 0.49999);
-    m1 = ((mm + 7) >> 3) << 3;
-    m2 = ((mm + 0) >> 3) << 3;
+      int curPoc = slice.getPOC();
+      int gdrPoc = (curPoc - gdrPocStart) % gdrInterval;
 
-    if (dd > mm && m1 == m2)
-    {
-      m1 = m1 + 8;
-    }
+      int begGdrX = 0;
+      int endGdrX = 0;
 
-    n1 = (picWidth - m2 * gdrPeriod) / 8;
+      double dd = (picWidth / (double)gdrInterval);
+      int mm = (int)((picWidth / (double)gdrInterval) + 0.49999);
+      m1 = ((mm + 7) >> 3) << 3;
+      m2 = ((mm + 0) >> 3) << 3;
 
-    if (gdrPoc < n1)
-    {
-      begGdrX = m1 * gdrPoc;
-      endGdrX = begGdrX + m1;
-    }
-    else
-    {
-      begGdrX = m1 * n1 + m2 * (gdrPoc - n1);
-      endGdrX = begGdrX + m2;
-      if (picWidth <= endGdrX)
+      if (dd > mm && m1 == m2)
       {
-        endGdrX = picWidth;
-        endGdrX = picWidth;
+        m1 = m1 + 8;
       }
-    }
 
-    bool isInRefreshArea = tempCS->withinRefresh(begGdrX, endGdrX);
+      n1 = (picWidth - m2 * gdrInterval) / 8;
 
-    if (isInRefreshArea)
-    {
-      m_modeCtrl->forceIntraMode();
-    }
-    else if (tempCS->containRefresh(begGdrX, endGdrX) || tempCS->overlapRefresh(begGdrX, endGdrX))
-    {
-      // 1.3.1 enable only vertical splits (QT, BT_V, TT_V)                  
-      m_modeCtrl->forceVerSplitOnly();
+      if (gdrPoc < n1)
+      {
+        begGdrX = m1 * gdrPoc;
+        endGdrX = begGdrX + m1;
+      }
+      else
+      {
+        begGdrX = m1 * n1 + m2 * (gdrPoc - n1);
+        endGdrX = begGdrX + m2;
+        if (picWidth <= endGdrX)
+        {
+          endGdrX = picWidth;
+          endGdrX = picWidth;
+        }
+      }
 
-      // 1.3.2 remove TT_V if it does not satisfy the condition
-      if (tempCS->refreshCrossTTV(begGdrX, endGdrX))
+      bool isInRefreshArea = tempCS->withinRefresh(begGdrX, endGdrX);
+
+      if (isInRefreshArea)
       {
-        m_modeCtrl->forceRemoveTTV();
+        m_modeCtrl->forceIntraMode();
       }
-    }
+      else if (tempCS->containRefresh(begGdrX, endGdrX) || tempCS->overlapRefresh(begGdrX, endGdrX))
+      {
+        // 1.3.1 enable only vertical splits (QT, BT_V, TT_V)                  
+        m_modeCtrl->forceVerSplitOnly();
 
-    if (tempCS->area.lwidth() != tempCS->area.lheight())
-    {
-      m_modeCtrl->forceRemoveQT();
-    }
+        // 1.3.2 remove TT_V if it does not satisfy the condition
+        if (tempCS->refreshCrossTTV(begGdrX, endGdrX))
+        {
+          m_modeCtrl->forceRemoveTTV();
+        }
+      }
 
-    if (!m_modeCtrl->anyPredModeLeft())
-    {
-      m_modeCtrl->forceRemoveDontSplit();
-    }
+      if (tempCS->area.lwidth() != tempCS->area.lheight())
+      {
+        m_modeCtrl->forceRemoveQT();
+      }
 
-    if (isInRefreshArea && !m_modeCtrl->anyIntraIBCMode() && (tempCS->area.lwidth() == 4 || tempCS->area.lheight() == 4))
-    {
-      m_modeCtrl->finishCULevel(partitioner);
-      return;
+      if (!m_modeCtrl->anyPredModeLeft())
+      {
+        m_modeCtrl->forceRemoveDontSplit();
+      }
+
+      if (isInRefreshArea && !m_modeCtrl->anyIntraIBCMode() && (tempCS->area.lwidth() == 4 || tempCS->area.lheight() == 4))
+      {
+        m_modeCtrl->finishCULevel(partitioner);
+        return;
+      }
     }
   }
 #endif
@@ -2151,7 +2154,7 @@ void EncCu::xCheckRDCostMerge2Nx2N( CodingStructure *&tempCS, CodingStructure *&
     pu.regularMergeFlag = true;
 #if GDR_ENABLED  
     cs = pu.cs;
-    isEncodeGdrClean = cs->sps->getGDREnabledFlag() && cs->pcv->isEncoder && ((cs->picHeader->getInGdrPeriod() && cs->isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs->picHeader->getNumVerVirtualBoundaries() == 0));
+    isEncodeGdrClean = cs->sps->getGDREnabledFlag() && cs->pcv->isEncoder && ((cs->picHeader->getInGdrInterval() && cs->isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs->picHeader->getNumVerVirtualBoundaries() == 0));
 #endif
   }
   bool candHasNoResidual[MRG_MAX_NUM_CANDS + MMVD_ADD_NUM];
@@ -2871,7 +2874,7 @@ void EncCu::xCheckRDCostMergeGeo2Nx2N(CodingStructure *&tempCS, CodingStructure
   PredictionUnit &pu = tempCS->addPU(cu, pm.chType);
 #if GDR_ENABLED  
   CodingStructure &cs = *pu.cs;
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
 #endif
   
   pu.mergeFlag = true;
@@ -3291,7 +3294,7 @@ void EncCu::xCheckRDCostAffineMerge2Nx2N( CodingStructure *&tempCS, CodingStruct
     pu.regularMergeFlag = false;
 #if GDR_ENABLED
     cs = pu.cs;
-    isEncodeGdrClean = cs->sps->getGDREnabledFlag() && cs->pcv->isEncoder && ((cs->picHeader->getInGdrPeriod() && cs->isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs->picHeader->getNumVerVirtualBoundaries() == 0));
+    isEncodeGdrClean = cs->sps->getGDREnabledFlag() && cs->pcv->isEncoder && ((cs->picHeader->getInGdrInterval() && cs->isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs->picHeader->getNumVerVirtualBoundaries() == 0));
 #endif
     PU::getAffineMergeCand( pu, affineMergeCtx );
 
@@ -3652,7 +3655,7 @@ void EncCu::xCheckRDCostIBCModeMerge2Nx2N(CodingStructure *&tempCS, CodingStruct
 #endif
   }
 #if GDR_ENABLED
-  const bool isEncodeGdrClean = tempCS->sps->getGDREnabledFlag() && tempCS->pcv->isEncoder && tempCS->picHeader->getInGdrPeriod() && gdrClean;
+  const bool isEncodeGdrClean = tempCS->sps->getGDREnabledFlag() && tempCS->pcv->isEncoder && tempCS->picHeader->getInGdrInterval() && gdrClean;
   bool *MrgSolid = nullptr;
   bool *MrgValid = nullptr;
 #endif
@@ -4118,7 +4121,7 @@ void EncCu::xCheckRDCostInter( CodingStructure *&tempCS, CodingStructure *&bestC
     bool    testBcw = (bcwIdx != BCW_DEFAULT);
 
 #if GDR_ENABLED    
-  const bool isEncodeGdrClean = tempCS->sps->getGDREnabledFlag() && tempCS->pcv->isEncoder && ((tempCS->picHeader->getInGdrPeriod() && tempCS->isClean(cu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (tempCS->picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = tempCS->sps->getGDREnabledFlag() && tempCS->pcv->isEncoder && ((tempCS->picHeader->getInGdrInterval() && tempCS->isClean(cu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (tempCS->picHeader->getNumVerVirtualBoundaries() == 0));
 #endif
     m_pcInterSearch->predInterSearch(cu, partitioner);
 
@@ -4336,7 +4339,7 @@ bool EncCu::xCheckRDCostInterIMV(CodingStructure *&tempCS, CodingStructure *&bes
   CU::addPUs( cu );
 
 #if GDR_ENABLED    
-    const bool isEncodeGdrClean = tempCS->sps->getGDREnabledFlag() && tempCS->pcv->isEncoder && ((tempCS->picHeader->getInGdrPeriod() && tempCS->isClean(cu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (tempCS->picHeader->getNumVerVirtualBoundaries() == 0));
+    const bool isEncodeGdrClean = tempCS->sps->getGDREnabledFlag() && tempCS->pcv->isEncoder && ((tempCS->picHeader->getInGdrInterval() && tempCS->isClean(cu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (tempCS->picHeader->getNumVerVirtualBoundaries() == 0));
 #endif
   if (testAltHpelFilter)
   {
diff --git a/source/Lib/EncoderLib/EncCu.h b/source/Lib/EncoderLib/EncCu.h
index 7682705aa0f2d56099e45642fd150d4aecc87a9e..f92d28304da3a366cb8b3b9a3c20e8c460c28dfe 100644
--- a/source/Lib/EncoderLib/EncCu.h
+++ b/source/Lib/EncoderLib/EncCu.h
@@ -88,36 +88,17 @@ struct SmallerThanComboCost
 {
   inline bool operator() (const GeoMergeCombo& first, const GeoMergeCombo& second)
   {
-#if GDR_ENABLED 
-    bool ret = true;
-    
-    ret = (first.cost < second.cost);
-    
-    if (first.cost == second.cost)
-    {
-      ret = first.splitDir < second.splitDir;
-      if (first.splitDir == second.splitDir)
-      {
-        ret = first.mergeIdx0 < second.mergeIdx0;
-        if (first.mergeIdx0 == second.mergeIdx0)
-        {
-          ret = first.mergeIdx1 < second.mergeIdx1;
-        }
-      }
-    }
-
-    return ret;
-#else
-      return (first.cost < second.cost);
-#endif
+    return (first.cost < second.cost);
   }
 };
+
 class GeoComboCostList
 {
 public:
   GeoComboCostList() {};
   ~GeoComboCostList() {};
-  std::vector<GeoMergeCombo> list;
+  std::vector<GeoMergeCombo> list;  
+  
   void sortByCost() { std::stable_sort(list.begin(), list.end(), SmallerThanComboCost()); };
 };
 struct SingleGeoMergeEntry
diff --git a/source/Lib/EncoderLib/EncGOP.cpp b/source/Lib/EncoderLib/EncGOP.cpp
index bdc6c26327f6799af94715bdf65d0888f6778a4a..7a7b32473906dc5b8c13d179f352021ff3a82fe6 100644
--- a/source/Lib/EncoderLib/EncGOP.cpp
+++ b/source/Lib/EncoderLib/EncGOP.cpp
@@ -313,7 +313,7 @@ void EncGOP::init ( EncLib* pcEncLib )
   }
 #endif
 #if GDR_ENABLED
-  m_lastGdrPeriodPoc = -1;
+  m_lastGdrIntervalPoc = -1;
 #endif
 }
 
@@ -1953,7 +1953,7 @@ void EncGOP::xPicInitLMCS(Picture *pic, PicHeader *picHeader, Slice *slice)
     picHeader->setLmcsChromaResidualScaleFlag(m_pcReshaper->getSliceReshaperInfo().getSliceReshapeChromaAdj() == 1);
 
 #if GDR_ENABLED   
-    if (picHeader->getInGdrPeriod()) 
+    if (picHeader->getInGdrInterval()) 
     {
       picHeader->setLmcsChromaResidualScaleFlag(false);
     }   
@@ -2164,7 +2164,7 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic,
     }
     pcSlice->setTLayer(m_pcCfg->getGOPEntry(iGOPid).m_temporalId);
 #if GDR_ENABLED
-    if (pocCurr >= m_pcCfg->getGdrPocStart() && ((pocCurr - m_pcCfg->getGdrPocStart()) % (m_pcCfg->getGdrPeriod() * m_pcCfg->getGdrFrequency()) == 0)) 
+    if (pocCurr >= m_pcCfg->getGdrPocStart() && ((pocCurr - m_pcCfg->getGdrPocStart()) % m_pcCfg->getGdrPeriod() == 0)) 
     {
       pcSlice->setSliceType(B_SLICE);
     }
@@ -2949,7 +2949,7 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic,
       {
         picHeader->setLmcsEnabledFlag(true);
 #if GDR_ENABLED
-        if (picHeader->getInGdrPeriod()) 
+        if (picHeader->getInGdrInterval()) 
         {
           picHeader->setLmcsChromaResidualScaleFlag(false);
         }       
@@ -3612,7 +3612,7 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic,
       std::string digestStr;
 #if GDR_ENABLED
       // note : generate hash sei only for non-gdr pictures
-      bool genHash = !(m_pcCfg->getNoHashForGdr() && pcSlice->getPicHeader()->getInGdrPeriod());
+      bool genHash = !(m_pcCfg->getNoHashForGdr() && pcSlice->getPicHeader()->getInGdrInterval());
       if (m_pcCfg->getDecodedPictureHashSEIType() != HASHTYPE_NONE && genHash)
 #else
       if (m_pcCfg->getDecodedPictureHashSEIType()!=HASHTYPE_NONE)
@@ -3658,7 +3658,7 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic,
       xWriteTrailingSEIMessages(trailingSeiMessages, accessUnit, pcSlice->getTLayer());
 
 #if GDR_ENABLED
-      if (!(m_pcCfg->getNoHashForGdr() && pcSlice->getPicHeader()->getInGdrPeriod())) 
+      if (!(m_pcCfg->getNoHashForGdr() && pcSlice->getPicHeader()->getInGdrInterval())) 
       {
           printHash(m_pcCfg->getDecodedPictureHashSEIType(), digestStr);
       }
@@ -5077,18 +5077,7 @@ NalUnitType EncGOP::getNalUnitType(int pocCurr, int lastIDR, bool isField)
 {
   if (pocCurr == 0)
   {
-#if GDR_ENABLED    
-    if (m_pcCfg->getStartWithGdr()) 
-    {
-      return NAL_UNIT_CODED_SLICE_GDR;
-    }
-    else 
-    {
-      return NAL_UNIT_CODED_SLICE_IDR_N_LP;
-    }
-#else
     return NAL_UNIT_CODED_SLICE_IDR_N_LP;
-#endif
   }
 
   if (m_pcCfg->getEfficientFieldIRAPEnabled() && isField && pocCurr == (m_pcCfg->getUseCompositeRef() ? 2: 1))
@@ -5101,7 +5090,7 @@ NalUnitType EncGOP::getNalUnitType(int pocCurr, int lastIDR, bool isField)
   if (m_pcCfg->getDecodingRefreshType() == 3 && (pocCurr >= m_pcCfg->getGdrPocStart()))
   {    
     int m = pocCurr - m_pcCfg->getGdrPocStart();
-    int n = m_pcCfg->getGdrPeriod() * m_pcCfg->getGdrFrequency();
+    int n = m_pcCfg->getGdrPeriod();
     if (m % n == 0) 
     {
       return NAL_UNIT_CODED_SLICE_GDR;
@@ -5149,7 +5138,7 @@ NalUnitType EncGOP::getNalUnitType(int pocCurr, int lastIDR, bool isField)
     }
   }
 #if GDR_ENABLED    
-  if (pocCurr >= m_pcCfg->getGdrPocStart() && ((pocCurr - m_pcCfg->getGdrPocStart()) % (m_pcCfg->getGdrPeriod() * m_pcCfg->getGdrFrequency()) == 0))
+  if (pocCurr >= m_pcCfg->getGdrPocStart() && ((pocCurr - m_pcCfg->getGdrPocStart()) % m_pcCfg->getGdrPeriod() == 0))
     return NAL_UNIT_CODED_SLICE_TRAIL;
   else
     return NAL_UNIT_CODED_SLICE_TRAIL;
diff --git a/source/Lib/EncoderLib/EncGOP.h b/source/Lib/EncoderLib/EncGOP.h
index 04df5eada3d616eeea8d7b96c8b758d66b993042..c80df5b27063af6ae17461f0e4970d958ebf9cd4 100644
--- a/source/Lib/EncoderLib/EncGOP.h
+++ b/source/Lib/EncoderLib/EncGOP.h
@@ -184,7 +184,7 @@ private:
 
   AUWriterIf*             m_AUWriterIf;
 #if GDR_ENABLED
-  int                     m_lastGdrPeriodPoc;  
+  int                     m_lastGdrIntervalPoc;  
 #endif
 
 #if JVET_O0756_CALCULATE_HDRMETRICS
@@ -238,8 +238,8 @@ public:
   int       getLastLTRefPoc() const { return m_lastLTRefPoc; }
 
 #if GDR_ENABLED
-  void      setLastGdrPeriodPoc(int p)  { m_lastGdrPeriodPoc = p; }
-  int       getLastGdrPeriodPoc() const { return m_lastGdrPeriodPoc; }
+  void      setLastGdrIntervalPoc(int p)  { m_lastGdrIntervalPoc = p; }
+  int       getLastGdrIntervalPoc() const { return m_lastGdrIntervalPoc; }
 #endif
 
   void  printOutSummary( uint32_t uiNumAllPicCoded, bool isField, const bool printMSEBasedSNR, const bool printSequenceMSE, 
diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp
index 7790989bd2cac9004b15a6b33804880ab42f7b7a..a9961681c8cae82242680dbefebfe996f4c3c568 100644
--- a/source/Lib/EncoderLib/EncLib.cpp
+++ b/source/Lib/EncoderLib/EncLib.cpp
@@ -1662,14 +1662,7 @@ void EncLib::xInitPPS(PPS &pps, const SPS &sps)
 
   pps.setUseWP( m_useWeightedPred );
   pps.setWPBiPred( m_useWeightedBiPred );
-#if GDR_ENABLED
-  if (getGdrPicOutput())
-    pps.setOutputFlagPresentFlag( true );
-  else
-    pps.setOutputFlagPresentFlag(false);
-#else
   pps.setOutputFlagPresentFlag(false);
-#endif
 
   if ( getDeblockingFilterMetric() )
   {
diff --git a/source/Lib/EncoderLib/EncModeCtrl.cpp b/source/Lib/EncoderLib/EncModeCtrl.cpp
index 58ae037bd17f2e480e276b72ebc10bf2ad8e5c54..925ee191822244d76086a2ce64cb33860269eb98 100644
--- a/source/Lib/EncoderLib/EncModeCtrl.cpp
+++ b/source/Lib/EncoderLib/EncModeCtrl.cpp
@@ -938,6 +938,9 @@ static bool interHadActive( const ComprCUCtx& ctx )
 
 void EncModeCtrlMTnoRQT::create( const EncCfg& cfg )
 {
+#if GDR_ENABLED
+  m_encCfg = cfg;
+#endif
   CacheBlkInfoCtrl::create();
 #if REUSE_CU_RESULTS
   BestEncInfoCache::create( cfg.getChromaFormatIdc() );
@@ -1266,10 +1269,13 @@ bool EncModeCtrlMTnoRQT::tryMode( const EncTestMode& encTestmode, const CodingSt
   ComprCUCtx& cuECtx = m_ComprCUCtxList.back();
 
   // Fast checks, partitioning depended
-#if !GDR_ENABLED 
-  if (cuECtx.isHashPerfectMatch && encTestmode.type != ETM_MERGE_SKIP && encTestmode.type != ETM_INTER_ME && encTestmode.type != ETM_AFFINE && encTestmode.type != ETM_MERGE_GEO)
+#if GDR_ENABLED 
+  if (!m_encCfg.getGdrEnabled())
   {
-    return false;
+    if (cuECtx.isHashPerfectMatch && encTestmode.type != ETM_MERGE_SKIP && encTestmode.type != ETM_INTER_ME && encTestmode.type != ETM_AFFINE && encTestmode.type != ETM_MERGE_GEO)
+    {
+      return false;
+    }
   }
 #endif
 
diff --git a/source/Lib/EncoderLib/EncModeCtrl.h b/source/Lib/EncoderLib/EncModeCtrl.h
index bb3eb1551ac6d097d1a7bf23ad9a28a48fc6784d..f9afc3e05c7853bc692e155ab1c6a9fee0db5ed6 100644
--- a/source/Lib/EncoderLib/EncModeCtrl.h
+++ b/source/Lib/EncoderLib/EncModeCtrl.h
@@ -915,6 +915,9 @@ class EncModeCtrlMTnoRQT : public EncModeCtrl, public CacheBlkInfoCtrl
   };
 
   unsigned m_skipThreshold;
+#if GDR_ENABLED
+  EncCfg m_encCfg;
+#endif
 
 public:
 
diff --git a/source/Lib/EncoderLib/EncSlice.cpp b/source/Lib/EncoderLib/EncSlice.cpp
index cfc58ce4e9e802257cc3df4367a3e74278a32060..58a8628382c962a9a2f12cfb77fb655e2bd09191 100644
--- a/source/Lib/EncoderLib/EncSlice.cpp
+++ b/source/Lib/EncoderLib/EncSlice.cpp
@@ -439,7 +439,7 @@ void EncSlice::initEncSlice(Picture* pcPic, const int pocLast, const int pocCurr
       {
         eSliceType = (pocLast == 0 || (pocCurr - (isField ? 1 : 0)) % (m_pcCfg->getIntraPeriod() * multipleFactor) == 0 || m_pcGOPEncoder->getGOPSize() == 0) && (!useIlRef) ? I_SLICE : eSliceType;
 #if GDR_ENABLED
-        if (pocCurr >= m_pcCfg->getGdrPocStart() && ((pocCurr - m_pcCfg->getGdrPocStart()) % (m_pcCfg->getGdrPeriod() * m_pcCfg->getGdrFrequency()) == 0)) 
+        if (m_pcCfg->getGdrEnabled() && (pocCurr >= m_pcCfg->getGdrPocStart()) && ((pocCurr - m_pcCfg->getGdrPocStart()) % m_pcCfg->getGdrPeriod() == 0))
         {
           eSliceType = B_SLICE;
         }
@@ -610,7 +610,7 @@ void EncSlice::initEncSlice(Picture* pcPic, const int pocLast, const int pocCurr
         {
           eSliceType = (pocLast == 0 || (pocCurr - (isField ? 1 : 0)) % (m_pcCfg->getIntraPeriod() * multipleFactor) == 0 || m_pcGOPEncoder->getGOPSize() == 0) && (!useIlRef) ? I_SLICE : eSliceType;
 #if GDR_ENABLED
-          if (pocCurr >= m_pcCfg->getGdrPocStart() && ((pocCurr - m_pcCfg->getGdrPocStart()) % (m_pcCfg->getGdrPeriod() * m_pcCfg->getGdrFrequency()) == 0)) 
+          if (m_pcCfg->getGdrEnabled() && (pocCurr >= m_pcCfg->getGdrPocStart()) && ((pocCurr - m_pcCfg->getGdrPocStart()) % m_pcCfg->getGdrPeriod() == 0))
           {
             eSliceType = B_SLICE;
           }
@@ -718,130 +718,117 @@ void EncSlice::initEncSlice(Picture* pcPic, const int pocLast, const int pocCurr
     m_pcCuEncoder->getIbcHashMap().init( pcPic->cs->pps->getPicWidthInLumaSamples(), pcPic->cs->pps->getPicHeightInLumaSamples() );
   }
 #if GDR_ENABLED
-  int gdrPocStart   = m_pcCuEncoder->getEncCfg()->getGdrPocStart();
-  int gdrPeriod     = m_pcCuEncoder->getEncCfg()->getGdrPeriod();
-  int gdr_frequency = m_pcCuEncoder->getEncCfg()->getGdrFrequency();
-
-  int picWidth    = rpcSlice->getPPS()->getPicWidthInLumaSamples();  
-  
-  int curPoc      = rpcSlice->getPOC();
-  int gdrPoc      = (curPoc - gdrPocStart) % gdrPeriod;  
-
-  pcPic->cs->picHeader->setGdrPicFlag(false);
-  pcPic->cs->picHeader->setRecoveryPocCnt(0);
-  pcPic->cs->picHeader->setInGdrPeriod(false);
-  
-  pcPic->cs->picHeader->setVirtualBoundariesPresentFlag(false);    
-
-  int  offset          = (curPoc < gdrPocStart) ? 0 : (((curPoc - gdrPocStart) / gdrPeriod) * gdrPeriod);
-  int  actualGdrStart  = gdrPocStart + offset;
-  int  actualGdrPeriod = min(gdrPeriod, (int)(pcPic->getPicWidthInLumaSamples() / 8));
-  int  actualGdrEndPoc = actualGdrStart + actualGdrPeriod - 1;
-
-  bool isActualGdrPeriod    = (curPoc >= gdrPocStart) && ((((curPoc - gdrPocStart) / gdrPeriod) % gdr_frequency) == 0);
-  bool isGdrPeriodOver      = (isActualGdrPeriod) && (curPoc > actualGdrEndPoc);
-  bool isGdrPic             = (actualGdrStart == curPoc);
-
-#if GDR_ENC_TRACE
-  printf("\n");
-  printf("-poc:%d actualGdrStart:%d actualGdrPeriod:%d actualGdrEndPoc:%d\n", rpcSlice->getPOC(), actualGdrStart, actualGdrPeriod, actualGdrEndPoc);
-#endif
-
-  // for first picture of the sequence (GDR picture with recovery_poc_cnt = 0)
-  if (curPoc == 0 && m_pcCfg->getStartWithGdr())
+  if (m_pcCfg->getGdrEnabled())
   {
-    pcPic->cs->picHeader->setGdrOrIrapPicFlag(true);
-    pcPic->cs->picHeader->setGdrPicFlag(true);
+    int gdrPocStart = m_pcCuEncoder->getEncCfg()->getGdrPocStart();
+    int gdrPeriod = m_pcCuEncoder->getEncCfg()->getGdrPeriod();
+    int gdrInterval = m_pcCuEncoder->getEncCfg()->getGdrInterval();
 
-    pcPic->cs->picHeader->setInGdrPeriod(true);
-    pcPic->cs->picHeader->setVirtualBoundariesPresentFlag(true);
+    int picWidth = rpcSlice->getPPS()->getPicWidthInLumaSamples();
 
-    if (m_pcCfg->getGdrPicOutput())
-      pcPic->cs->picHeader->setPicOutputFlag(true);
-    else
-      pcPic->cs->picHeader->setPicOutputFlag(false);
-    
+    int curPoc = rpcSlice->getPOC();
+    int gdrPoc = (curPoc - gdrPocStart) % gdrPeriod;
+
+    pcPic->cs->picHeader->setGdrPicFlag(false);
     pcPic->cs->picHeader->setRecoveryPocCnt(0);
-      
-    pcPic->cs->picHeader->setNumHorVirtualBoundaries(0);
-    pcPic->cs->picHeader->setNumVerVirtualBoundaries(1);
-    pcPic->cs->picHeader->setVirtualBoundariesPosX(picWidth, 0);
-  }
-  // for none gdr period pictures
-  else if ((curPoc < gdrPocStart) || !isActualGdrPeriod || isGdrPeriodOver)
-  {
-    pcPic->cs->picHeader->setInGdrPeriod(false);
+    pcPic->cs->picHeader->setInGdrInterval(false);
+
     pcPic->cs->picHeader->setVirtualBoundariesPresentFlag(false);
 
-    pcPic->cs->picHeader->setNumHorVirtualBoundaries(0);
-    pcPic->cs->picHeader->setNumVerVirtualBoundaries(0);
+    int  offset = (curPoc < gdrPocStart) ? 0 : (((curPoc - gdrPocStart) / gdrPeriod) * gdrPeriod);
+    int  actualGdrStart = gdrPocStart + offset;
+    int  actualGdrInterval = min(gdrInterval, (int)(pcPic->getPicWidthInLumaSamples() / 8));
+    int  recoveryPocCnt = actualGdrInterval - 1;
+    int  recoveryPicPoc = actualGdrStart + recoveryPocCnt;
 
-#if GDR_ENC_TRACE    
-    printf("-poc:%d no virtual boundary\n", rpcSlice->getPOC());
-#endif
-  }
-  // for gdr period pictures
-  else 
-  {             
-    pcPic->cs->picHeader->setInGdrPeriod(true);
-    pcPic->cs->picHeader->setVirtualBoundariesPresentFlag(true);
+    bool isInGdrInterval = (curPoc >= actualGdrStart) && (curPoc < recoveryPicPoc);
+    bool isOutGdrInterval = !isInGdrInterval;
+    bool isGdrPic = (actualGdrStart == curPoc);
 
-    if (m_pcCfg->getGdrPicOutput())
-      pcPic->cs->picHeader->setPicOutputFlag(true);
-    else
-      pcPic->cs->picHeader->setPicOutputFlag(false);
+#if GDR_ENC_TRACE
+    printf("\n");
+    printf("-poc:%d gdrPocStart:%d actualGdrStart:%d actualGdrInterval:%d actualGdrEndPoc:%d\n", rpcSlice->getPOC(), gdrPocStart, actualGdrStart, actualGdrInterval, recoveryPicPoc - 1);
+#endif
 
-    if (isGdrPic)
+    // for none gdr period pictures
+    if ((curPoc < gdrPocStart) || isOutGdrInterval)
     {
-      pcPic->cs->picHeader->setGdrOrIrapPicFlag(true);
-      pcPic->cs->picHeader->setGdrPicFlag(true);
-      
-      pcPic->cs->picHeader->setRecoveryPocCnt(actualGdrPeriod);
-      m_pcGOPEncoder->setLastGdrPeriodPoc(actualGdrStart + actualGdrPeriod - 1);
+      pcPic->cs->picHeader->setInGdrInterval(false);
+      pcPic->cs->picHeader->setVirtualBoundariesPresentFlag(false);
+
+      pcPic->cs->picHeader->setNumHorVirtualBoundaries(0);
+      pcPic->cs->picHeader->setNumVerVirtualBoundaries(0);
+
+#if GDR_ENC_TRACE    
+      printf("-poc:%d no virtual boundary\n", rpcSlice->getPOC());
+#endif
     }
+    // for gdr inteval pictures
+    else
+    {
+      if (curPoc == recoveryPicPoc)
+      {
+        pcPic->cs->picHeader->setInGdrInterval(false);
+      }
+      else
+      {
+        pcPic->cs->picHeader->setInGdrInterval(true);
+      }
 
-    pcPic->cs->picHeader->setNumHorVirtualBoundaries(0);
-    pcPic->cs->picHeader->setNumVerVirtualBoundaries(1);
+      pcPic->cs->picHeader->setVirtualBoundariesPresentFlag(true);
 
-    int begGdrX;
-    int endGdrX;
-    int m1, m2, n1;
+      if (isGdrPic)
+      {
+        pcPic->cs->picHeader->setGdrOrIrapPicFlag(true);
+        pcPic->cs->picHeader->setGdrPicFlag(true);
 
-    double dd = (picWidth / (double)gdrPeriod);
-    int mm = (int)((picWidth / (double)gdrPeriod) + 0.49999);
-    m1 = ((mm + 7) >> 3) << 3;
-    m2 = ((mm + 0) >> 3) << 3;
+        pcPic->cs->picHeader->setRecoveryPocCnt(recoveryPocCnt);
+        m_pcGOPEncoder->setLastGdrIntervalPoc(recoveryPicPoc - 1);
+      }
 
-    if (dd > mm && m1 == m2)
-    {
-      m1 = m1 + 8;
-    }
-     
-    n1 = (picWidth - m2 * gdrPeriod) / 8;    
+      pcPic->cs->picHeader->setNumHorVirtualBoundaries(0);
+      pcPic->cs->picHeader->setNumVerVirtualBoundaries(1);
 
-    if (gdrPoc < n1)
-    {
-      begGdrX = m1 * gdrPoc;
-      endGdrX = begGdrX + m1;
-    }
-    else
-    {
-      begGdrX = m1 * n1 + m2 * (gdrPoc - n1);
-      endGdrX   = begGdrX + m2;
-	    if (picWidth <= begGdrX)
-	    {
+      int begGdrX;
+      int endGdrX;
+      int m1, m2, n1;
+
+      double dd = (picWidth / (double)gdrInterval);
+      int mm = (int)((picWidth / (double)gdrInterval) + 0.49999);
+      m1 = ((mm + 7) >> 3) << 3;
+      m2 = ((mm + 0) >> 3) << 3;
+
+      if (dd > mm && m1 == m2)
+      {
+        m1 = m1 + 8;
+      }
+
+      n1 = (picWidth - m2 * gdrInterval) / 8;
+
+      if (gdrPoc < n1)
+      {
+        begGdrX = m1 * gdrPoc;
+        endGdrX = begGdrX + m1;
+      }
+      else
+      {
+        begGdrX = m1 * n1 + m2 * (gdrPoc - n1);
+        endGdrX = begGdrX + m2;
+        if (picWidth <= begGdrX)
+        {
           begGdrX = picWidth;
           endGdrX = picWidth;
-	    }
-    }
-         
-    pcPic->cs->picHeader->setVirtualBoundariesPosX(endGdrX, 0);
+        }
+      }
+
+      pcPic->cs->picHeader->setVirtualBoundariesPosX(endGdrX, 0);
 
 #if GDR_ENC_TRACE
-    printf("\n");
-    printf("-poc:%d beg:%d end:%d\n", rpcSlice->getPOC(), begGdrX, endGdrX);
+      printf("\n");
+      printf("-poc:%d beg:%d end:%d\n", rpcSlice->getPOC(), begGdrX, endGdrX);
 #endif    
-  } 
+    }
+  }
 #endif
 }
 
diff --git a/source/Lib/EncoderLib/InterSearch.cpp b/source/Lib/EncoderLib/InterSearch.cpp
index b5ebeb0ea72bd188049a376c7030ad08c6953f98..7bd68f39af10e0592543d4103d17aad84297d74e 100644
--- a/source/Lib/EncoderLib/InterSearch.cpp
+++ b/source/Lib/EncoderLib/InterSearch.cpp
@@ -756,7 +756,7 @@ Distortion InterSearch::xPatternRefinement( const CPelBuf* pcPatternKey,
 
 #if GDR_ENABLED
   const CodingStructure &cs = *pu.cs;
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
   bool uiDistOk = false;
   bool uiDistBestOk = false;
   bool allOk = true;
@@ -946,7 +946,7 @@ int InterSearch::xIBCSearchMVChromaRefine(PredictionUnit& pu,
 
 #if GDR_ENABLED
     CodingStructure &cs = *pu.cs;
-    const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+    const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
 
     if (isEncodeGdrClean)
     {
@@ -1071,7 +1071,7 @@ void InterSearch::xIntraPatternSearch(PredictionUnit& pu, IntTZSearchStruct&  cS
 
 #if GDR_ENABLED
   CodingStructure &cs = *pu.cs;
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
 #endif
 
   for (int cand = 0; cand < CHROMA_REFINEMENT_CANDIDATES; cand++)
@@ -1453,7 +1453,7 @@ void InterSearch::xIBCEstimation(PredictionUnit& pu, PelUnitBuf& origBuf,
 
 #if GDR_ENABLED
   CodingStructure &cs = *pu.cs;
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
 #endif
 
   if ((pu.cs->slice->getLmcsEnabledFlag() && m_pcReshape->getCTUFlag()))
@@ -1644,7 +1644,7 @@ bool InterSearch::predIBCSearch(CodingUnit& cu, Partitioner& partitioner, const
     CHECK(pu.cu != &cu, "PU is contained in another CU");
 #if GDR_ENABLED
     CodingStructure &cs = *pu.cs;
-    const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+    const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
 #endif
 
 #if GDR_ENABLED  
@@ -1795,7 +1795,7 @@ void InterSearch::xxIBCHashSearch(PredictionUnit& pu, Mv* mvPred, int numMvPred,
 
 #if GDR_ENABLED
   CodingStructure &cs = *pu.cs;
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
 #endif
   std::vector<Position> candPos;
   if (ibcHashMap.ibcHashMatch(pu.Y(), candPos, *pu.cs, m_pcEncCfg->getIBCHashSearchMaxCand(), m_pcEncCfg->getIBCHashSearchRange4SmallBlk()))
@@ -2035,7 +2035,7 @@ bool InterSearch::xRectHashInterEstimation(PredictionUnit& pu, RefPicList& bestR
 
 #if GDR_ENABLED
   CodingStructure &cs = *pu.cs;
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
 #endif
 
   for (int k = 0; k < baseNum; k++)
@@ -2229,7 +2229,10 @@ bool InterSearch::xRectHashInterEstimation(PredictionUnit& pu, RefPicList& bestR
               {
                 bool isSolid = currAMVPInfoPel.mvSolid[mvpIdxTemp];
                 allOk = allOk && isSolid;
-                if (allOk) anyCandOk = true;
+                if (allOk)
+                {
+                  anyCandOk = true;
+                }
               }
 #endif   
 
@@ -2251,12 +2254,15 @@ bool InterSearch::xRectHashInterEstimation(PredictionUnit& pu, RefPicList& bestR
                 m_pcRdCost->setPredictor(mvPred4Pel);
                 bitsMVP4Pel = m_pcRdCost->getBitsOfVectorWithPredictor(cMv.getHor(), cMv.getVer(), 4);
 #if GDR_ENABLED     
-                allOk = (bitsMVP1Pel < curMVPbits);
+                allOk = (bitsMVP4Pel < curMVPbits);                
                 if (isEncodeGdrClean)
                 {
                   bool isSolid = currAMVPInfo4Pel.mvSolid[mvpIdxTemp];
                   allOk = allOk && isSolid;
-                  if (allOk) anyCandOk = true;
+                  if (allOk)
+                  {
+                    anyCandOk = true;
+                  }
                 }
 #endif   
 
@@ -2353,7 +2359,7 @@ bool InterSearch::xHashInterEstimation(PredictionUnit& pu, RefPicList& bestRefPi
 
 #if GDR_ENABLED
   CodingStructure &cs = *pu.cs;
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
 #endif
   BlockHash currBlockHash;
   currBlockHash.x = xPos;
@@ -2561,7 +2567,7 @@ bool InterSearch::xHashInterEstimation(PredictionUnit& pu, RefPicList& bestRefPi
                 bitsMVP4Pel = m_pcRdCost->getBitsOfVectorWithPredictor(cMv.getHor(), cMv.getVer(), 4);
 
 #if GDR_ENABLED     
-                allOk = (bitsMVP1Pel < curMVPbits);
+                allOk = (bitsMVP4Pel < curMVPbits);
                 if (isEncodeGdrClean)
                 {
                   bool isSolid = currAMVPInfo4Pel.mvSolid[mvpIdxTemp];
@@ -2787,7 +2793,7 @@ void InterSearch::predInterSearch(CodingUnit& cu, Partitioner& partitioner)
   }
 
 #if GDR_ENABLED  
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
   const bool init_value = true;
 #endif
 
@@ -4532,7 +4538,7 @@ void InterSearch::xEstimateMvPredAMVP( PredictionUnit& pu, PelUnitBuf& origBuf,
   AMVPInfo*  pcAMVPInfo = &rAMVPInfo;
 #if GDR_ENABLED
   const CodingStructure &cs = *pu.cs;
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
 #endif  
 
 #if GDR_ENABLED
@@ -4688,7 +4694,7 @@ void InterSearch::xCheckBestMVP ( RefPicList eRefPicList, Mv cMv, Mv& rcMvPred,
 {
 #if GDR_ENABLED  
   const CodingStructure &cs = *pu.cs;
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
   bool iBestMvBitsOk = false;
   bool iMvBitsOk = false;
 #endif
@@ -5090,43 +5096,46 @@ void InterSearch::xSetSearchRange ( const PredictionUnit& pu,
   Mv mvTL(cFPMvPred.getHor() - (iSrchRng << iMvShift), cFPMvPred.getVer() - (iSrchRng << iMvShift));
   Mv mvBR(cFPMvPred.getHor() + (iSrchRng << iMvShift), cFPMvPred.getVer() + (iSrchRng << iMvShift));
 #if GDR_ENABLED
-  bool isRefGdrPicture = pu.cs->slice->getRefPic(eRefPicList, iRefIdx)->cs->picHeader->getInGdrPeriod();
-  if (isRefGdrPicture)
+  if (m_pcEncCfg->getGdrEnabled())
   {
-    mvTL = { cFPMvPred.getHor(), cFPMvPred.getVer() };
-    mvBR = { cFPMvPred.getHor(), cFPMvPred.getVer() };
+    bool isRefGdrPicture = pu.cs->slice->getRefPic(eRefPicList, iRefIdx)->cs->picHeader->getInGdrInterval();
+    if (isRefGdrPicture)
+    {
+      mvTL = { cFPMvPred.getHor(), cFPMvPred.getVer() };
+      mvBR = { cFPMvPred.getHor(), cFPMvPred.getVer() };
 
-    const int lumaPixelAway = 4;
-    const int chromaPixelAway = 5;
+      const int lumaPixelAway = 4;
+      const int chromaPixelAway = 5;
 
-    const Position LastPos = pu.Y().bottomRight();
+      const Position LastPos = pu.Y().bottomRight();
 
-    const int iMvShift = MV_FRACTIONAL_BITS_INTERNAL;
-    const int iMvLumaFrac = (1 << iMvShift);
-    const int iMvChromaFrac = (iMvLumaFrac << 1);
-    const int iFracOne = (1 << iMvShift);
+      const int iMvShift = MV_FRACTIONAL_BITS_INTERNAL;
+      const int iMvLumaFrac = (1 << iMvShift);
+      const int iMvChromaFrac = (iMvLumaFrac << 1);
+      const int iFracOne = (1 << iMvShift);
 
-    const bool isIntLumaMv = (cFPMvPred.getHor() % iMvLumaFrac) == 0;
-    const bool isIntChromaMv = (cFPMvPred.getHor() % iMvChromaFrac) == 0;
+      const bool isIntLumaMv = (cFPMvPred.getHor() % iMvLumaFrac) == 0;
+      const bool isIntChromaMv = (cFPMvPred.getHor() % iMvChromaFrac) == 0;
 
-    const int scaled_endx = pu.cs->slice->getRefPic(eRefPicList, iRefIdx)->cs->picHeader->getVirtualBoundariesPosX(0) << iMvShift;
+      const int scaled_endx = pu.cs->slice->getRefPic(eRefPicList, iRefIdx)->cs->picHeader->getVirtualBoundariesPosX(0) << iMvShift;
 
-    const Position OrigFracPos = Position(LastPos.x << iMvShift, LastPos.y << iMvShift);
-    const int last_luma_pos = ((OrigFracPos.x / iMvLumaFrac)   * iMvLumaFrac) + cFPMvPred.getHor() + (isIntLumaMv ? 0 : (lumaPixelAway << iMvShift));
-    const int last_chroma_pos = ((OrigFracPos.x / iMvChromaFrac) * iMvChromaFrac) + cFPMvPred.getHor() + (isIntChromaMv ? 0 : (chromaPixelAway << iMvShift));
+      const Position OrigFracPos = Position(LastPos.x << iMvShift, LastPos.y << iMvShift);
+      const int last_luma_pos = ((OrigFracPos.x / iMvLumaFrac)   * iMvLumaFrac) + cFPMvPred.getHor() + (isIntLumaMv ? 0 : (lumaPixelAway << iMvShift));
+      const int last_chroma_pos = ((OrigFracPos.x / iMvChromaFrac) * iMvChromaFrac) + cFPMvPred.getHor() + (isIntChromaMv ? 0 : (chromaPixelAway << iMvShift));
 
-    const int last_pel_pos = std::max(last_luma_pos, last_chroma_pos);
+      const int last_pel_pos = std::max(last_luma_pos, last_chroma_pos);
 
-    const int distance = Clip3(-(iSrchRng << iMvShift), (iSrchRng << iMvShift), scaled_endx - (last_pel_pos + iFracOne));
+      const int distance = Clip3(-(iSrchRng << iMvShift), (iSrchRng << iMvShift), scaled_endx - (last_pel_pos + iFracOne));
 
 
-    int srLeft = cFPMvPred.getHor() - (iSrchRng << iMvShift);
-    int srRight = cFPMvPred.getHor() + distance;
-    int srTop = cFPMvPred.getVer() - (iSrchRng << iMvShift);
-    int srBottom = cFPMvPred.getVer() + (iSrchRng << iMvShift);
+      int srLeft = cFPMvPred.getHor() - (iSrchRng << iMvShift);
+      int srRight = cFPMvPred.getHor() + distance;
+      int srTop = cFPMvPred.getVer() - (iSrchRng << iMvShift);
+      int srBottom = cFPMvPred.getVer() + (iSrchRng << iMvShift);
 
-    mvTL = { srLeft, srTop };
-    mvBR = { srRight, srBottom };
+      mvTL = { srLeft, srTop };
+      mvBR = { srRight, srBottom };
+    }
   }
 #endif
 
@@ -5295,7 +5304,7 @@ void InterSearch::xTZSearch( const PredictionUnit& pu,
 
 #if GDR_ENABLED
   const CodingStructure &cs = *pu.cs;
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
 #endif    
   int iSearchRange = m_iSearchRange;
   if( m_pcEncCfg->getMCTSEncConstraint() )
@@ -5847,7 +5856,7 @@ void InterSearch::xPatternSearchIntRefine(PredictionUnit& pu, IntTZSearchStruct&
 {
 #if GDR_ENABLED
   const CodingStructure &cs = *pu.cs;
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
 #endif
 
   CHECK( pu.cu->imv == 0 || pu.cu->imv == IMV_HPEL , "xPatternSearchIntRefine(): Sub-pel MV used.");
@@ -6058,6 +6067,8 @@ void InterSearch::xPatternSearchFracDIF(
 
     rcMvQter = rcMvInt;
     rcMvQter <<= 1;   // for mv-cost
+    rcMvQter += rcMvHalf;
+    rcMvQter <<= 1;
 #if GDR_ENABLED
     ruiCost = xPatternRefinement(pu, eRefPicList, iRefIdx, cStruct.pcPatternKey, baseRefMv, 1, rcMvQter, (!pu.cs->slice->getDisableSATDForRD()), rbCleanCandExist);
 #else
@@ -6128,7 +6139,7 @@ Distortion InterSearch::xSymmeticRefineMvSearch( PredictionUnit &pu, PelUnitBuf&
 {
 #if GDR_ENABLED  
   const CodingStructure &cs = *pu.cs;
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
   bool uiCostOk;
   bool uiMinCostOk = rOk;
 #endif
@@ -6357,7 +6368,7 @@ void InterSearch::xPredAffineInterSearch( PredictionUnit&       pu,
   bool      mvHevcSolid[3];
 
   const CodingStructure &cs = *pu.cs;
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
 #endif
   AffineAMVPInfo aacAffineAMVPInfo[2][33];
   AffineAMVPInfo affiAMVPInfoTemp[2];
@@ -8056,7 +8067,7 @@ void InterSearch::xCheckBestAffineMVP( PredictionUnit &pu, AffineAMVPInfo &affin
 {
 #if GDR_ENABLED
   const CodingStructure &cs = *pu.cs;
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
 #endif
 
   if ( affineAMVPInfo.numCand < 2 )
@@ -8185,7 +8196,7 @@ void InterSearch::xAffineMotionEstimation( PredictionUnit& pu,
   }
 #if GDR_ENABLED
   const CodingStructure &cs = *pu.cs;
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
   bool acMvValid[3];
 #endif
 
@@ -8803,7 +8814,7 @@ void InterSearch::xEstimateAffineAMVP( PredictionUnit&  pu,
 
 #if GDR_ENABLED
   const CodingStructure &cs = *pu.cs;
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
   bool uiBestCostOk = false;
 #endif
 
@@ -10972,7 +10983,7 @@ uint32_t InterSearch::xDetermineBestMvp( PredictionUnit& pu, Mv acMvTemp[3], int
   uint32_t minBits = std::numeric_limits<uint32_t>::max();
 #if GDR_ENABLED
   const CodingStructure &cs = *pu.cs;
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
 #endif
 
   for ( int i = 0; i < aamvpi.numCand; i++ )
@@ -11030,7 +11041,7 @@ void InterSearch::symmvdCheckBestMvp(
 {
 #if GDR_ENABLED  
   CodingStructure &cs = *pu.cs;
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
   bool bestCostOk = true;
   bool costOk = true;
   bool allOk;
diff --git a/source/Lib/EncoderLib/IntraSearch.cpp b/source/Lib/EncoderLib/IntraSearch.cpp
index 90b4dec0a06074edfc684688f7c5b7c158eca50a..dd02ff1f8cc46ee095c5d222868d1cf8d3baef6a 100644
--- a/source/Lib/EncoderLib/IntraSearch.cpp
+++ b/source/Lib/EncoderLib/IntraSearch.cpp
@@ -472,7 +472,7 @@ bool IntraSearch::isValidIntraPredLuma(PredictionUnit &pu, int luma_dirMode)
   bool isValid  = true;  
   PicHeader *ph = pu.cs->picHeader;
 
-  if (ph->getInGdrPeriod()) 
+  if (ph->getInGdrInterval()) 
   {
     int x = pu.Y().x;
 
@@ -496,7 +496,7 @@ bool IntraSearch::isValidIntraPredChroma(PredictionUnit &pu, int luma_dirMode, i
   CodingStructure *cs = pu.cs;
   PicHeader       *ph = cs->picHeader;
 
-  if (ph->getInGdrPeriod()) 
+  if (ph->getInGdrInterval()) 
   {
     // note: chroma cordinate
     int cbX = pu.Cb().x;
@@ -638,7 +638,7 @@ bool IntraSearch::estIntraPredLumaQT(CodingUnit &cu, Partitioner &partitioner, c
 
   auto &pu = *cu.firstPU;
 #if GDR_ENABLED  
-  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrPeriod() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
+  const bool isEncodeGdrClean = cs.sps->getGDREnabledFlag() && cs.pcv->isEncoder && ((cs.picHeader->getInGdrInterval() && cs.isClean(pu.Y().topRight(), CHANNEL_TYPE_LUMA)) || (cs.picHeader->getNumVerVirtualBoundaries() == 0));
 #endif
   bool validReturn = false;
   {
@@ -1799,7 +1799,11 @@ void IntraSearch::estIntraPredChromaQT( CodingUnit &cu, Partitioner &partitioner
 
         //----- compare -----
 #if GDR_ENABLED
-        if (dCost < dBestCost && isValidIntraPredChroma(pu, (int)PU::getCoLocatedIntraLumaMode(pu), chromaIntraMode))
+        bool allOk = (dCost < dBestCost);
+        if (m_pcEncCfg->getGdrEnabled())
+          allOk = allOk && dBestCost && isValidIntraPredChroma(pu, (int)PU::getCoLocatedIntraLumaMode(pu), chromaIntraMode);
+
+        if (allOk)
 #else
         if( dCost < dBestCost )
 #endif
diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp
index 6feb999a48420e09da67b995b483aac594486148..a004fa4f199b94c1189ad2fc0bfbd48a90f0998a 100644
--- a/source/Lib/EncoderLib/VLCWriter.cpp
+++ b/source/Lib/EncoderLib/VLCWriter.cpp
@@ -1549,7 +1549,7 @@ void HLSWriter::codePictureHeader( PicHeader* picHeader, bool writeRbspTrailingB
   {
     slice = picHeader->getPic()->cs->slice;
   }
-WRITE_FLAG(picHeader->getGdrOrIrapPicFlag(), "ph_gdr_or_irap_pic_flag");
+  WRITE_FLAG(picHeader->getGdrOrIrapPicFlag(), "ph_gdr_or_irap_pic_flag");
   WRITE_FLAG(picHeader->getNonReferencePictureFlag(), "ph_non_ref_pic_flag");
   if (picHeader->getGdrOrIrapPicFlag())
   {
@@ -1581,7 +1581,7 @@ WRITE_FLAG(picHeader->getGdrOrIrapPicFlag(), "ph_gdr_or_irap_pic_flag");
 #if GDR_ENC_TRACE
   printf("-gdr_pic_flag:%d\n", picHeader->getGdrPicFlag());  
   printf("-recovery_poc_cnt:%d\n", picHeader->getRecoveryPocCnt());
-  printf("-InGdrPeriod:%d\n", picHeader->getInGdrPeriod());
+  printf("-InGdrInterval:%d\n", picHeader->getInGdrInterval());
 #endif
   // PH extra bits are not written in the reference encoder
   // as these bits are reserved for future extensions