diff --git a/source/Lib/CommonLib/Contexts.h b/source/Lib/CommonLib/Contexts.h
index 33ff4acea7cd665dc0a3319b5e73254c25622167..11d9324ccb3b8b383cbce4041b626f6eded6fa1b 100644
--- a/source/Lib/CommonLib/Contexts.h
+++ b/source/Lib/CommonLib/Contexts.h
@@ -1130,8 +1130,8 @@ public:
   TempCtx ( CtxCache* cache, const Ctx& ctx    )  : m_ctx( *cache->get() ), m_cache( cache ) { m_ctx = ctx; }
   TempCtx ( CtxCache* cache, SubCtx&&   subCtx )  : m_ctx( *cache->get() ), m_cache( cache ) { m_ctx = std::forward<SubCtx>(subCtx); }
   ~TempCtx()                                      { m_cache->cache( &m_ctx ); }
-  const Ctx& operator=( const Ctx& ctx )          { return ( m_ctx = ctx ); }
-  SubCtx     operator=( SubCtx&&   subCtx )       { return m_ctx = std::forward<SubCtx>( subCtx ); }
+  void operator=( const Ctx& ctx )          { m_ctx = ctx ; }
+  void operator=( SubCtx&&   subCtx )       { m_ctx = std::forward<SubCtx>( subCtx ); }
   operator const Ctx& ()           const          { return m_ctx; }
   operator       Ctx& ()                          { return m_ctx; }
 private:
diff --git a/source/Lib/EncoderLib/CABACWriter.cpp b/source/Lib/EncoderLib/CABACWriter.cpp
index eb2141217d494edc0773e5b26fe0e45ac1b8531d..fd150405b40f7c9edba2b648c323125172827350 100644
--- a/source/Lib/EncoderLib/CABACWriter.cpp
+++ b/source/Lib/EncoderLib/CABACWriter.cpp
@@ -6518,7 +6518,7 @@ void CABACWriter::geo_merge_idx1(const PredictionUnit& pu)
 #if JVET_AG0112_REGRESSION_BASED_GPM_BLENDING
 uint64_t CABACWriter::geo_blend_est( const TempCtx& ctxStart, const int flag )
 {
-  getCtx() = ctxStart;
+  getCtx() = SubCtx(Ctx::GeoBlendFlag,ctxStart);
   resetBits();
 
   m_BinEncoder.encodeBin( flag, Ctx::GeoBlendFlag() );
@@ -6677,7 +6677,7 @@ uint64_t CABACWriter::geo_mmvdIdx_est(const TempCtx& ctxStart, const int geoMMVD
 #if JVET_AG0164_AFFINE_GPM
 uint64_t CABACWriter::geo_affFlag_est(const TempCtx& ctxStart, const int flag, int ctxOffset)
 {
-  getCtx() = ctxStart;
+  getCtx() = SubCtx(Ctx::AffineFlag,ctxStart);
   resetBits();
 
   m_BinEncoder.encodeBin(flag, Ctx::AffineFlag(ctxOffset));
@@ -6694,7 +6694,7 @@ uint64_t CABACWriter::geoBldFlagEst(const PredictionUnit& pu, const TempCtx& ctx
 uint64_t CABACWriter::geoBldFlagEst(const TempCtx& ctxStart, const int flag)
 #endif
 {
-  getCtx() = ctxStart;
+  getCtx() = SubCtx(Ctx::GeoBldFlag,ctxStart);
   resetBits();
 #if JVET_AH0314_ADAPTIVE_GPM_BLENDING_IMPROV
   int blkSizeSmall = pu.lwidth() < pu.lheight() ? pu.lwidth() : pu.lheight();
diff --git a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp
index c45943db0c459d982a5a2a4ee3746fcc643ca348..944ae6daf30388244b9151cea55754bd3cabd6ec 100644
--- a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp
+++ b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp
@@ -6377,7 +6377,7 @@ void  EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfParam& alfPar
             }
           }
 
-          m_CABACEstimator->getCtx() = ctxStart;
+          m_CABACEstimator->getCtx() = AlfCtx(ctxStart);
 
           for (int ctbIdx = 0; ctbIdx < m_numCTUsInPic; ctbIdx++)
           {
@@ -8284,7 +8284,7 @@ void EncAdaptiveLoopFilter::determineControlIdcValues(CodingStructure &cs, const
       const uint32_t numberOfChromaSamples = std::min<int>(buf->height - yCtu, ctuHeightC) * std::min<int>(buf->width - xCtu, ctuWidthC);
       const uint32_t thresholdC = (numberOfChromaSamples >> 2);
 
-      m_CABACEstimator->getCtx() = ctxBest;
+      m_CABACEstimator->getCtx() = SubCtx(Ctx::CcAlfFilterControlFlag,ctxBest);
       ctxStart                   = SubCtx(Ctx::CcAlfFilterControlFlag, m_CABACEstimator->getCtx());
 
       for (int filterIdx = 0; filterIdx <= MAX_NUM_CC_ALF_FILTERS; filterIdx++)
@@ -8303,7 +8303,7 @@ void EncAdaptiveLoopFilter::determineControlIdcValues(CodingStructure &cs, const
         {
           ssd = trainingDistortion[filterIdx][ctuIdx];
         }
-        m_CABACEstimator->getCtx() = ctxStart;
+        m_CABACEstimator->getCtx() = SubCtx(Ctx::CcAlfFilterControlFlag,ctxStart);
         m_CABACEstimator->resetBits();
         const Position lumaPos = Position({ xCtu << getComponentScaleX(compID, cs.pcv->chrFormat),
           yCtu << getComponentScaleY(compID, cs.pcv->chrFormat) });
@@ -8370,7 +8370,7 @@ void EncAdaptiveLoopFilter::determineControlIdcValues(CodingStructure &cs, const
     }
 
     curTotalRate = prevRate;
-    m_CABACEstimator->getCtx() = ctxInitial;
+    m_CABACEstimator->getCtx() = SubCtx(Ctx::CcAlfFilterControlFlag,ctxInitial);
     m_CABACEstimator->resetBits();
     int ctuIdx = 0;
     for (int y = 0; y < buf->height; y += ctuHeightC)
@@ -8394,7 +8394,7 @@ void EncAdaptiveLoopFilter::determineControlIdcValues(CodingStructure &cs, const
 #endif
 
   // restore for next iteration
-  m_CABACEstimator->getCtx() = ctxInitial;
+  m_CABACEstimator->getCtx() = SubCtx(Ctx::CcAlfFilterControlFlag,ctxInitial);
 }
 
 std::vector<int> EncAdaptiveLoopFilter::getAvailableCcAlfApsIds(CodingStructure& cs, ComponentID compID)
@@ -8655,7 +8655,7 @@ void EncAdaptiveLoopFilter::deriveCcAlfFilter( CodingStructure& cs, ComponentID
           }
         }
 
-        m_CABACEstimator->getCtx() = ctxStartCcAlfFilterControlFlag;
+        m_CABACEstimator->getCtx() = SubCtx(Ctx::CcAlfFilterControlFlag,ctxStartCcAlfFilterControlFlag);
 
         uint64_t curTotalDistortion = 0;
         double curTotalRate = 0;
diff --git a/source/Lib/EncoderLib/EncSampleAdaptiveOffset.cpp b/source/Lib/EncoderLib/EncSampleAdaptiveOffset.cpp
index 117a3a5a2ae3e13a13a448f2d4d4acec0cb363fe..e850b03daddc3ffb75168926810912c7463d2b68 100644
--- a/source/Lib/EncoderLib/EncSampleAdaptiveOffset.cpp
+++ b/source/Lib/EncoderLib/EncSampleAdaptiveOffset.cpp
@@ -6823,7 +6823,7 @@ void EncSampleAdaptiveOffset::determineCcSaoControlIdc(CodingStructure& cs, cons
       uint8_t  bestSetIdc = 0;
       uint8_t  bestSetIdx = 0;
 
-      m_CABACEstimator->getCtx() = ctxBest;
+      m_CABACEstimator->getCtx() = SubCtx(Ctx::CcSaoControlIdc,ctxBest);
       ctxStart                   = SubCtx(Ctx::CcSaoControlIdc, m_CABACEstimator->getCtx());
 
       for (int setIdx = 0; setIdx <= MAX_CCSAO_SET_NUM; setIdx++)
@@ -6832,7 +6832,7 @@ void EncSampleAdaptiveOffset::determineCcSaoControlIdc(CodingStructure& cs, cons
           continue;
 
         uint8_t setIdc = ccSaoParam.mapIdxToIdc[setIdx];
-        m_CABACEstimator->getCtx() = ctxStart;
+        m_CABACEstimator->getCtx() = SubCtx(Ctx::CcSaoControlIdc,ctxStart);
         m_CABACEstimator->resetBits();
         const Position lumaPos = Position({ xCtb << getComponentScaleX(compID, cs.pcv->chrFormat),
                                             yCtb << getComponentScaleY(compID, cs.pcv->chrFormat) });
@@ -6886,7 +6886,7 @@ void EncSampleAdaptiveOffset::determineCcSaoControlIdc(CodingStructure& cs, cons
   }
 
   curTotalRate = prevRate;
-  m_CABACEstimator->getCtx() = ctxInitial;
+  m_CABACEstimator->getCtx() = SubCtx(Ctx::CcSaoControlIdc,ctxInitial);
   m_CABACEstimator->resetBits();
   ctbIdx = 0;
   for (int yCtb = 0; yCtb < picHeightC; yCtb += ctuHeightC)
@@ -6908,7 +6908,7 @@ void EncSampleAdaptiveOffset::determineCcSaoControlIdc(CodingStructure& cs, cons
 #endif
 
   // restore for next iteration
-  m_CABACEstimator->getCtx() = ctxInitial;
+  m_CABACEstimator->getCtx() = SubCtx(Ctx::CcSaoControlIdc,ctxInitial);
 }
 
 int EncSampleAdaptiveOffset::lengthUvlc(int uiCode)
@@ -7117,7 +7117,7 @@ void EncSampleAdaptiveOffset::deriveCcSaoRDO(CodingStructure& cs, const Componen
       }
     }
 
-    m_CABACEstimator->getCtx() = ctxStartCcSaoControlFlag;
+    m_CABACEstimator->getCtx() = SubCtx(Ctx::CcSaoControlIdc,ctxStartCcSaoControlFlag);
 
     int64_t curTotalDist = 0;
     double  curTotalRate = 0;